From 4139e079f4440bab034fb2d20f4cb096d9ff0863 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Sun, 22 Jun 2025 18:33:08 +0800 Subject: [PATCH 01/96] Dev (#52) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add biomek.py demo implementation * 更新LiquidHandlerBiomek类,添加资源创建功能,优化协议创建方法,修复部分代码格式问题,更新YAML配置以支持新功能。 * Test * fix biomek success type * Convert LH action to biomek. * Update biomek.py * 注册表上报handle和schema (param input) * 修复biomek缺少的字段 * delete 's' * Remove warnings * Update biomek.py * Biomek test * Update biomek.py * 新增transfer_biomek的msg * New transfer_biomek * Updated transfer_biomek * 更新transfer_biomek的msg * 更新transfer_biomek的msg * 支持Biomek创建 * new action * fix key name typo * New parameter for biomek to run. * Refine * Update * new actions * new actions * 1 * registry * fix biomek startup add action handles * fix handles not as default entry * biomek_test.py biomek_test.py是最新的版本,运行它会生成complete_biomek_protocol.json * Update biomek.py * biomek_test.py * fix liquid_handler.biomek handles * host node新增resource add时间统计 create_resource新增handle bump version to 0.9.2 * 修正物料上传时间 改用biomek_test 增加ResultInfoEncoder 支持返回结果上传 * 正确发送return_info结果 * 同步执行状态信息 * 取消raiseValueError提示 * Update biomek_test.py * 0608 DONE * 同步了Biomek.py 现在应可用 * biomek switch back to non-test * temp disable initialize resource * 37-biomek-i5i7 (#40) * add biomek.py demo implementation * 更新LiquidHandlerBiomek类,添加资源创建功能,优化协议创建方法,修复部分代码格式问题,更新YAML配置以支持新功能。 * Test * fix biomek success type * Convert LH action to biomek. * Update biomek.py * 注册表上报handle和schema (param input) * 修复biomek缺少的字段 * delete 's' * Remove warnings * Update biomek.py * Biomek test * Update biomek.py * 新增transfer_biomek的msg * New transfer_biomek * Updated transfer_biomek * 更新transfer_biomek的msg * 更新transfer_biomek的msg * 支持Biomek创建 * new action * fix key name typo * New parameter for biomek to run. * Refine * Update * new actions * new actions * 1 * registry * fix biomek startup add action handles * fix handles not as default entry * biomek_test.py biomek_test.py是最新的版本,运行它会生成complete_biomek_protocol.json * Update biomek.py * biomek_test.py * fix liquid_handler.biomek handles * host node新增resource add时间统计 create_resource新增handle bump version to 0.9.2 * 修正物料上传时间 改用biomek_test 增加ResultInfoEncoder 支持返回结果上传 * 正确发送return_info结果 * 同步执行状态信息 * 取消raiseValueError提示 * Update biomek_test.py * 0608 DONE * 同步了Biomek.py 现在应可用 * biomek switch back to non-test * temp disable initialize resource * Refine biomek * Refine copy issue * Refine --------- Co-authored-by: Junhan Chang Co-authored-by: Guangxin Zhang Co-authored-by: qxw138 * Device visualization (#39) * Update README and MQTTClient for installation instructions and code improvements * feat: 支持local_config启动 add: 增加对crt path的说明,为传入config.py的相对路径 move: web component * add: registry description * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * feat: node_info_update srv fix: OTDeck cant create * close #12 feat: slave node registry * feat: show machine name fix: host node registry not uploaded * feat: add hplc registry * feat: add hplc registry * fix: hplc status typo * fix: devices/ * 完成启动OT并联动rviz * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * fix: device.class possible null * fix: HPLC additions with online service * fix: slave mode spin not working * fix: slave mode spin not working * 修复rviz位置问题, 修复rviz位置问题, 在无tf变动时减缓发送频率 在backend中添加物料跟随方法 * feat: 多ProtocolNode 允许子设备ID相同 feat: 上报发现的ActionClient feat: Host重启动,通过discover机制要求slaveNode重新注册,实现信息及时上报 * feat: 支持env设置config * fix: running logic * fix: running logic * fix: missing ot * 在main中直接初始化republisher和物料的mesh节点 * 将joint_republisher和resource_mesh_manager添加进 main_slave_run.py中 * Device visualization (#14) * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * 修复rviz位置问题, 修复rviz位置问题, 在无tf变动时减缓发送频率 在backend中添加物料跟随方法 * fix: running logic * fix: running logic * fix: missing ot * 在main中直接初始化republisher和物料的mesh节点 * 将joint_republisher和resource_mesh_manager添加进 main_slave_run.py中 --------- Co-authored-by: zhangshixiang <@zhangshixiang> Co-authored-by: wznln <18435084+Xuwznln@users.noreply.github.com> * fix: missing hostname in devices_names fix: upload_file for model file * fix: missing paho-mqtt package bump version to 0.9.0 * fix startup add ResourceCreateFromOuter.action * fix type hint * update actions * update actions * host node add_resource_from_outer fix cmake list * pass device config to device class * add: bind_parent_ids to resource create action fix: message convert string * fix: host node should not be re_discovered * feat: resource tracker support dict * feat: add more necessary params * feat: fix boolean null in registry action data * feat: add outer resource * 编写mesh添加action * feat: append resource * add action * feat: vis 2d for plr * fix * fix: browser on rviz * fix: cloud bridge error fallback to local * fix: salve auto run rviz * 初始化两个plate * Device visualization (#22) * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * 修复rviz位置问题, 修复rviz位置问题, 在无tf变动时减缓发送频率 在backend中添加物料跟随方法 * fix: running logic * fix: running logic * fix: missing ot * 在main中直接初始化republisher和物料的mesh节点 * 将joint_republisher和resource_mesh_manager添加进 main_slave_run.py中 * 编写mesh添加action * add action * fix * fix: browser on rviz * fix: cloud bridge error fallback to local * fix: salve auto run rviz * 初始化两个plate --------- Co-authored-by: zhangshixiang <@zhangshixiang> Co-authored-by: wznln <18435084+Xuwznln@users.noreply.github.com> * fix: multi channel * fix: aspirate * fix: aspirate * fix: aspirate * fix: aspirate * 提交 * fix: jobadd * fix: jobadd * fix: msg converter * tijiao * add resource creat easy action * identify debug msg * mq client id * 提取lh的joint发布 * unify liquid_handler definition * 修改物料跟随与物料添加逻辑 修改物料跟随与物料添加逻辑 将joint_publisher类移出lh的backends,但仍需要对lh的backends进行一些改写 * Revert "修改物料跟随与物料添加逻辑" This reverts commit 498c997ad764263366f6d6207e0722fbc7a909a8. * Reapply "修改物料跟随与物料添加逻辑" This reverts commit 3a60d2ae8125a7b24506bb681e3baaf69f2ebf6b. * Revert "Merge remote-tracking branch 'upstream/dev' into device_visualization" This reverts commit fa727220afa8546b84f1763730818d6360c26251, reversing changes made to 498c997ad764263366f6d6207e0722fbc7a909a8. * 修改物料放下时的方法,如果选择 修改物料放下时的方法, 如果选择drop_trash,则删除物料显示 如果选择drop,则让其解除连接 * add biomek.py demo implementation * 更新LiquidHandlerBiomek类,添加资源创建功能,优化协议创建方法,修复部分代码格式问题,更新YAML配置以支持新功能。 * Test * fix biomek success type * Convert LH action to biomek. * Update biomek.py * 注册表上报handle和schema (param input) * 修复biomek缺少的字段 * delete 's' * Remove warnings * Update biomek.py * Biomek test * Update biomek.py * 新增transfer_biomek的msg * New transfer_biomek * Updated transfer_biomek * 更新transfer_biomek的msg * 更新transfer_biomek的msg * 支持Biomek创建 * new action * fix key name typo * New parameter for biomek to run. * Refine * Update * new actions * new actions * 1 * registry * fix biomek startup add action handles * fix handles not as default entry * unilab添加moveit启动 1,整合所有moveit节点到一个move_group中,并整合所有的controller依次激活 2,添加pymoveit2的节点,使用json可直接启动 3,修改机械臂规划方式,添加约束,让冗余关节不会进行过多移动 * biomek_test.py biomek_test.py是最新的版本,运行它会生成complete_biomek_protocol.json * Update biomek.py * biomek_test.py * fix liquid_handler.biomek handles * 修改物体attach时,多次赋值当前时间导致卡顿问题, * Revert "修改物体attach时,多次赋值当前时间导致卡顿问题," This reverts commit 56d45b94f55d1339d54d9725ffe3c8cca7cbb73a. * Reapply "修改物体attach时,多次赋值当前时间导致卡顿问题," This reverts commit 07d9db20c3b43bc8af048b9e2c4af210ec16d446. * 添加缺少物料:"plate_well_G12", * host node新增resource add时间统计 create_resource新增handle bump version to 0.9.2 * 修正物料上传时间 改用biomek_test 增加ResultInfoEncoder 支持返回结果上传 * 正确发送return_info结果 * 同步执行状态信息 * 取消raiseValueError提示 * Update biomek_test.py * 0608 DONE * 同步了Biomek.py 现在应可用 * biomek switch back to non-test * temp disable initialize resource * add * fix tip resource data * liquid states * change to debug level * Revert "change to debug level" This reverts commit 5d9953c3e58d9f33818f21232c3fdcc30a4f766c. * Reapply "change to debug level" This reverts commit 2487bb6ffc6590b2da13a3dd5226825e0a164993. * fix tip resource data * add full device * add moveit yaml * 修复moveit 增加post_init阶段,给予ros_node反向 * remove necessary node * fix moveit action client * remove necessary imports * Update moveit_interface.py * fix handler_key uppercase * json add liquids * fix setup * add * change to "sources" and "targets" for lh * bump version * remove parent's parent link --------- Co-authored-by: Harvey Que Co-authored-by: wznln <18435084+Xuwznln@users.noreply.github.com> Co-authored-by: zhangshixiang <@zhangshixiang> Co-authored-by: Junhan Chang Co-authored-by: Guangxin Zhang Co-authored-by: qxw138 * Device visualization (#41) * Update README and MQTTClient for installation instructions and code improvements * feat: 支持local_config启动 add: 增加对crt path的说明,为传入config.py的相对路径 move: web component * add: registry description * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * feat: node_info_update srv fix: OTDeck cant create * close #12 feat: slave node registry * feat: show machine name fix: host node registry not uploaded * feat: add hplc registry * feat: add hplc registry * fix: hplc status typo * fix: devices/ * 完成启动OT并联动rviz * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * fix: device.class possible null * fix: HPLC additions with online service * fix: slave mode spin not working * fix: slave mode spin not working * 修复rviz位置问题, 修复rviz位置问题, 在无tf变动时减缓发送频率 在backend中添加物料跟随方法 * feat: 多ProtocolNode 允许子设备ID相同 feat: 上报发现的ActionClient feat: Host重启动,通过discover机制要求slaveNode重新注册,实现信息及时上报 * feat: 支持env设置config * fix: running logic * fix: running logic * fix: missing ot * 在main中直接初始化republisher和物料的mesh节点 * 将joint_republisher和resource_mesh_manager添加进 main_slave_run.py中 * Device visualization (#14) * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * 修复rviz位置问题, 修复rviz位置问题, 在无tf变动时减缓发送频率 在backend中添加物料跟随方法 * fix: running logic * fix: running logic * fix: missing ot * 在main中直接初始化republisher和物料的mesh节点 * 将joint_republisher和resource_mesh_manager添加进 main_slave_run.py中 --------- Co-authored-by: zhangshixiang <@zhangshixiang> Co-authored-by: wznln <18435084+Xuwznln@users.noreply.github.com> * fix: missing hostname in devices_names fix: upload_file for model file * fix: missing paho-mqtt package bump version to 0.9.0 * fix startup add ResourceCreateFromOuter.action * fix type hint * update actions * update actions * host node add_resource_from_outer fix cmake list * pass device config to device class * add: bind_parent_ids to resource create action fix: message convert string * fix: host node should not be re_discovered * feat: resource tracker support dict * feat: add more necessary params * feat: fix boolean null in registry action data * feat: add outer resource * 编写mesh添加action * feat: append resource * add action * feat: vis 2d for plr * fix * fix: browser on rviz * fix: cloud bridge error fallback to local * fix: salve auto run rviz * 初始化两个plate * Device visualization (#22) * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * 修复rviz位置问题, 修复rviz位置问题, 在无tf变动时减缓发送频率 在backend中添加物料跟随方法 * fix: running logic * fix: running logic * fix: missing ot * 在main中直接初始化republisher和物料的mesh节点 * 将joint_republisher和resource_mesh_manager添加进 main_slave_run.py中 * 编写mesh添加action * add action * fix * fix: browser on rviz * fix: cloud bridge error fallback to local * fix: salve auto run rviz * 初始化两个plate --------- Co-authored-by: zhangshixiang <@zhangshixiang> Co-authored-by: wznln <18435084+Xuwznln@users.noreply.github.com> * fix: multi channel * fix: aspirate * fix: aspirate * fix: aspirate * fix: aspirate * 提交 * fix: jobadd * fix: jobadd * fix: msg converter * tijiao * add resource creat easy action * identify debug msg * mq client id * 提取lh的joint发布 * unify liquid_handler definition * 修改物料跟随与物料添加逻辑 修改物料跟随与物料添加逻辑 将joint_publisher类移出lh的backends,但仍需要对lh的backends进行一些改写 * Revert "修改物料跟随与物料添加逻辑" This reverts commit 498c997ad764263366f6d6207e0722fbc7a909a8. * Reapply "修改物料跟随与物料添加逻辑" This reverts commit 3a60d2ae8125a7b24506bb681e3baaf69f2ebf6b. * Revert "Merge remote-tracking branch 'upstream/dev' into device_visualization" This reverts commit fa727220afa8546b84f1763730818d6360c26251, reversing changes made to 498c997ad764263366f6d6207e0722fbc7a909a8. * 修改物料放下时的方法,如果选择 修改物料放下时的方法, 如果选择drop_trash,则删除物料显示 如果选择drop,则让其解除连接 * add biomek.py demo implementation * 更新LiquidHandlerBiomek类,添加资源创建功能,优化协议创建方法,修复部分代码格式问题,更新YAML配置以支持新功能。 * Test * fix biomek success type * Convert LH action to biomek. * Update biomek.py * 注册表上报handle和schema (param input) * 修复biomek缺少的字段 * delete 's' * Remove warnings * Update biomek.py * Biomek test * Update biomek.py * 新增transfer_biomek的msg * New transfer_biomek * Updated transfer_biomek * 更新transfer_biomek的msg * 更新transfer_biomek的msg * 支持Biomek创建 * new action * fix key name typo * New parameter for biomek to run. * Refine * Update * new actions * new actions * 1 * registry * fix biomek startup add action handles * fix handles not as default entry * unilab添加moveit启动 1,整合所有moveit节点到一个move_group中,并整合所有的controller依次激活 2,添加pymoveit2的节点,使用json可直接启动 3,修改机械臂规划方式,添加约束,让冗余关节不会进行过多移动 * biomek_test.py biomek_test.py是最新的版本,运行它会生成complete_biomek_protocol.json * Update biomek.py * biomek_test.py * fix liquid_handler.biomek handles * 修改物体attach时,多次赋值当前时间导致卡顿问题, * Revert "修改物体attach时,多次赋值当前时间导致卡顿问题," This reverts commit 56d45b94f55d1339d54d9725ffe3c8cca7cbb73a. * Reapply "修改物体attach时,多次赋值当前时间导致卡顿问题," This reverts commit 07d9db20c3b43bc8af048b9e2c4af210ec16d446. * 添加缺少物料:"plate_well_G12", * host node新增resource add时间统计 create_resource新增handle bump version to 0.9.2 * 修正物料上传时间 改用biomek_test 增加ResultInfoEncoder 支持返回结果上传 * 正确发送return_info结果 * 同步执行状态信息 * 取消raiseValueError提示 * Update biomek_test.py * 0608 DONE * 同步了Biomek.py 现在应可用 * biomek switch back to non-test * temp disable initialize resource * add * fix tip resource data * liquid states * change to debug level * Revert "change to debug level" This reverts commit 5d9953c3e58d9f33818f21232c3fdcc30a4f766c. * Reapply "change to debug level" This reverts commit 2487bb6ffc6590b2da13a3dd5226825e0a164993. * fix tip resource data * add full device * add moveit yaml * 修复moveit 增加post_init阶段,给予ros_node反向 * remove necessary node * fix moveit action client * remove necessary imports * Update moveit_interface.py * fix handler_key uppercase * json add liquids * fix setup * add * change to "sources" and "targets" for lh * bump version * remove parent's parent link * change arm's name * change name --------- Co-authored-by: Harvey Que Co-authored-by: zhangshixiang <@zhangshixiang> Co-authored-by: q434343 <73513873+q434343@users.noreply.github.com> Co-authored-by: Junhan Chang Co-authored-by: Guangxin Zhang Co-authored-by: qxw138 * fix move it * fix move it * create_resource * bump ver modify slot type * 增加modbus支持 调整protocol node以更好支持多种类型的read和write * 调整protocol node以更好支持多种类型的read和write * 补充日志 * Device visualization (#42) * Update README and MQTTClient for installation instructions and code improvements * feat: 支持local_config启动 add: 增加对crt path的说明,为传入config.py的相对路径 move: web component * add: registry description * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * feat: node_info_update srv fix: OTDeck cant create * close #12 feat: slave node registry * feat: show machine name fix: host node registry not uploaded * feat: add hplc registry * feat: add hplc registry * fix: hplc status typo * fix: devices/ * 完成启动OT并联动rviz * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * fix: device.class possible null * fix: HPLC additions with online service * fix: slave mode spin not working * fix: slave mode spin not working * 修复rviz位置问题, 修复rviz位置问题, 在无tf变动时减缓发送频率 在backend中添加物料跟随方法 * feat: 多ProtocolNode 允许子设备ID相同 feat: 上报发现的ActionClient feat: Host重启动,通过discover机制要求slaveNode重新注册,实现信息及时上报 * feat: 支持env设置config * fix: running logic * fix: running logic * fix: missing ot * 在main中直接初始化republisher和物料的mesh节点 * 将joint_republisher和resource_mesh_manager添加进 main_slave_run.py中 * Device visualization (#14) * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * 修复rviz位置问题, 修复rviz位置问题, 在无tf变动时减缓发送频率 在backend中添加物料跟随方法 * fix: running logic * fix: running logic * fix: missing ot * 在main中直接初始化republisher和物料的mesh节点 * 将joint_republisher和resource_mesh_manager添加进 main_slave_run.py中 --------- Co-authored-by: zhangshixiang <@zhangshixiang> Co-authored-by: wznln <18435084+Xuwznln@users.noreply.github.com> * fix: missing hostname in devices_names fix: upload_file for model file * fix: missing paho-mqtt package bump version to 0.9.0 * fix startup add ResourceCreateFromOuter.action * fix type hint * update actions * update actions * host node add_resource_from_outer fix cmake list * pass device config to device class * add: bind_parent_ids to resource create action fix: message convert string * fix: host node should not be re_discovered * feat: resource tracker support dict * feat: add more necessary params * feat: fix boolean null in registry action data * feat: add outer resource * 编写mesh添加action * feat: append resource * add action * feat: vis 2d for plr * fix * fix: browser on rviz * fix: cloud bridge error fallback to local * fix: salve auto run rviz * 初始化两个plate * Device visualization (#22) * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * 修复rviz位置问题, 修复rviz位置问题, 在无tf变动时减缓发送频率 在backend中添加物料跟随方法 * fix: running logic * fix: running logic * fix: missing ot * 在main中直接初始化republisher和物料的mesh节点 * 将joint_republisher和resource_mesh_manager添加进 main_slave_run.py中 * 编写mesh添加action * add action * fix * fix: browser on rviz * fix: cloud bridge error fallback to local * fix: salve auto run rviz * 初始化两个plate --------- Co-authored-by: zhangshixiang <@zhangshixiang> Co-authored-by: wznln <18435084+Xuwznln@users.noreply.github.com> * fix: multi channel * fix: aspirate * fix: aspirate * fix: aspirate * fix: aspirate * 提交 * fix: jobadd * fix: jobadd * fix: msg converter * tijiao * add resource creat easy action * identify debug msg * mq client id * 提取lh的joint发布 * unify liquid_handler definition * 修改物料跟随与物料添加逻辑 修改物料跟随与物料添加逻辑 将joint_publisher类移出lh的backends,但仍需要对lh的backends进行一些改写 * Revert "修改物料跟随与物料添加逻辑" This reverts commit 498c997ad764263366f6d6207e0722fbc7a909a8. * Reapply "修改物料跟随与物料添加逻辑" This reverts commit 3a60d2ae8125a7b24506bb681e3baaf69f2ebf6b. * Revert "Merge remote-tracking branch 'upstream/dev' into device_visualization" This reverts commit fa727220afa8546b84f1763730818d6360c26251, reversing changes made to 498c997ad764263366f6d6207e0722fbc7a909a8. * 修改物料放下时的方法,如果选择 修改物料放下时的方法, 如果选择drop_trash,则删除物料显示 如果选择drop,则让其解除连接 * unilab添加moveit启动 1,整合所有moveit节点到一个move_group中,并整合所有的controller依次激活 2,添加pymoveit2的节点,使用json可直接启动 3,修改机械臂规划方式,添加约束,让冗余关节不会进行过多移动 * 修改物体attach时,多次赋值当前时间导致卡顿问题, * Revert "修改物体attach时,多次赋值当前时间导致卡顿问题," This reverts commit 56d45b94f55d1339d54d9725ffe3c8cca7cbb73a. * Reapply "修改物体attach时,多次赋值当前时间导致卡顿问题," This reverts commit 07d9db20c3b43bc8af048b9e2c4af210ec16d446. * 添加缺少物料:"plate_well_G12", * add * fix tip resource data * liquid states * change to debug level * Revert "change to debug level" This reverts commit 5d9953c3e58d9f33818f21232c3fdcc30a4f766c. * Reapply "change to debug level" This reverts commit 2487bb6ffc6590b2da13a3dd5226825e0a164993. * fix tip resource data * add full device * add moveit yaml * 修复moveit 增加post_init阶段,给予ros_node反向 * remove necessary node * fix moveit action client * remove necessary imports * Update moveit_interface.py * fix handler_key uppercase * json add liquids * fix setup * add * change to "sources" and "targets" for lh * bump version * remove parent's parent link * change arm's name * change name * fix ik error --------- Co-authored-by: Harvey Que Co-authored-by: zhangshixiang <@zhangshixiang> Co-authored-by: q434343 <73513873+q434343@users.noreply.github.com> Co-authored-by: Junhan Chang * Add Mock Device for Organic Synthesis\添加有机合成的虚拟仪器和Protocol (#43) * Add Device MockChiller Add device MockChiller * Add Device MockFilter * Add Device MockPump * Add Device MockRotavap * Add Device MockSeparator * Add Device MockStirrer * Add Device MockHeater * Add Device MockVacuum * Add Device MockSolenoidValve * Add Device Mock \_init_.py * 规范模拟设备代码与注册表信息 * 更改Mock大写文件夹名 * 删除大写目录 * Edited Mock device json * Match mock device with action * Edit mock device yaml * Add new action * Add Virtual Device, Action, YAML, Protocol for Organic Syn * 单独分类测试的protocol文件夹 * 更名Action --------- Co-authored-by: Xuwznln <18435084+Xuwznln@users.noreply.github.com> * bump version & protocol fix * hotfix: Add macos_sdk_config (#46) Co-authored-by: quehh * include device_mesh when pip install * 测试自动构建 * try build fix * try build * test artifacts * hotfix: Add .certs in .gitignore * create container * container 添加和更新完成 * Device registry port (#49) * Update README and MQTTClient for installation instructions and code improvements * feat: 支持local_config启动 add: 增加对crt path的说明,为传入config.py的相对路径 move: web component * add: registry description * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * feat: node_info_update srv fix: OTDeck cant create * close #12 feat: slave node registry * feat: show machine name fix: host node registry not uploaded * feat: add hplc registry * feat: add hplc registry * fix: hplc status typo * fix: devices/ * 完成启动OT并联动rviz * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * fix: device.class possible null * fix: HPLC additions with online service * fix: slave mode spin not working * fix: slave mode spin not working * 修复rviz位置问题, 修复rviz位置问题, 在无tf变动时减缓发送频率 在backend中添加物料跟随方法 * feat: 多ProtocolNode 允许子设备ID相同 feat: 上报发现的ActionClient feat: Host重启动,通过discover机制要求slaveNode重新注册,实现信息及时上报 * feat: 支持env设置config * fix: running logic * fix: running logic * fix: missing ot * 在main中直接初始化republisher和物料的mesh节点 * 将joint_republisher和resource_mesh_manager添加进 main_slave_run.py中 * Device visualization (#14) * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * 修复rviz位置问题, 修复rviz位置问题, 在无tf变动时减缓发送频率 在backend中添加物料跟随方法 * fix: running logic * fix: running logic * fix: missing ot * 在main中直接初始化republisher和物料的mesh节点 * 将joint_republisher和resource_mesh_manager添加进 main_slave_run.py中 --------- Co-authored-by: zhangshixiang <@zhangshixiang> Co-authored-by: wznln <18435084+Xuwznln@users.noreply.github.com> * fix: missing hostname in devices_names fix: upload_file for model file * fix: missing paho-mqtt package bump version to 0.9.0 * fix startup add ResourceCreateFromOuter.action * fix type hint * update actions * update actions * host node add_resource_from_outer fix cmake list * pass device config to device class * add: bind_parent_ids to resource create action fix: message convert string * fix: host node should not be re_discovered * feat: resource tracker support dict * feat: add more necessary params * feat: fix boolean null in registry action data * feat: add outer resource * 编写mesh添加action * feat: append resource * add action * feat: vis 2d for plr * fix * fix: browser on rviz * fix: cloud bridge error fallback to local * fix: salve auto run rviz * 初始化两个plate * Device visualization (#22) * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * 修复rviz位置问题, 修复rviz位置问题, 在无tf变动时减缓发送频率 在backend中添加物料跟随方法 * fix: running logic * fix: running logic * fix: missing ot * 在main中直接初始化republisher和物料的mesh节点 * 将joint_republisher和resource_mesh_manager添加进 main_slave_run.py中 * 编写mesh添加action * add action * fix * fix: browser on rviz * fix: cloud bridge error fallback to local * fix: salve auto run rviz * 初始化两个plate --------- Co-authored-by: zhangshixiang <@zhangshixiang> Co-authored-by: wznln <18435084+Xuwznln@users.noreply.github.com> * fix: multi channel * fix: aspirate * fix: aspirate * fix: aspirate * fix: aspirate * 提交 * fix: jobadd * fix: jobadd * fix: msg converter * tijiao * add resource creat easy action * identify debug msg * mq client id * unify liquid_handler definition * Update virtual_device.yaml * 更正了stir和heater的连接方式 * 区分了虚拟仪器中的八通阀和电磁阀,添加了两个阀门的驱动 * 修改了add protocol * 修复了阀门更新版的bug * 修复了添加protocol前缀导致的不能启动的bug * Fix handles * bump version to 0.9.6 * add resource edge upload * update container registry and handles * add virtual_separator virtual_rotavap fix transfer_pump * fix container value add parent_name to edge device id * 大图的问题都修复好了,添加了gassource和vacuum pump的驱动以及注册表 * default resource upload mode is false * 添加了icon的文件名在注册表里面 * 修改了json图中link的格式 * fix resource and edge upload * fix device ports * Fix edge id * 移除device的父节点关联 * separate registry sync and resource_add * 默认不进行注册表报送,通过命令unilabos-register或者增加启动参数 * 完善tip * protocol node不再嵌套显示 * bump version to 0.9.7 新增一个测试PumpTransferProtocol的teststation,亲测可以运行,将八通阀们和转移泵与pump_protocol适配 * protocol node 执行action不应携带自身device id * 添加了一套简易双八通阀工作站JSON,亲测能跑 * 修复了很多protocol,亲测能跑 * 添加了run column和filter through的protocol,亲测能跑 * fix mock_reactor * 修改了大图和小图的json,但是在前端上没看到改变 --------- Co-authored-by: Harvey Que Co-authored-by: wznln <18435084+Xuwznln@users.noreply.github.com> Co-authored-by: zhangshixiang <@zhangshixiang> Co-authored-by: q434343 <73513873+q434343@users.noreply.github.com> Co-authored-by: Junhan Chang * 更新workstation注册表 * 添加了两个protocol的检索功能 (#51) * 添加了两个protocol的检索liquid type功能 * fix workstation registry * 修复了没连接的几个仪器的link,添加了container的icon * 修改了json和注册表,现在大图全部的device都链接上了 * 修复了小图的json图,线全部连上了 * add work_station protocol handles (ports) * fix workstation action handle --------- Co-authored-by: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Co-authored-by: Junhan Chang --------- Co-authored-by: Junhan Chang Co-authored-by: Guangxin Zhang Co-authored-by: qxw138 Co-authored-by: q434343 <73513873+q434343@users.noreply.github.com> Co-authored-by: Harvey Que Co-authored-by: Kongchang Feng <2100011801@stu.pku.edu.cn> Co-authored-by: hh. <103566763+Mile-Away@users.noreply.github.com> Co-authored-by: quehh Co-authored-by: Harvey Que Co-authored-by: Junhan Chang --- .../clean_vessel_protocol_test_station.json | 86 ++- .../comprehensive_station.json | 98 ++- unilabos/compile/__init__.py | 25 +- unilabos/compile/add_protocol.py | 316 ++++++++- unilabos/compile/clean_vessel_protocol.py | 163 ++++- unilabos/registry/devices/virtual_device.yaml | 8 + unilabos/registry/devices/work_station.yaml | 622 +++++++++++++++++- .../registry/resources/organic/container.yaml | 1 + 8 files changed, 1203 insertions(+), 116 deletions(-) diff --git a/test/experiments/Protocol_Test_Station/clean_vessel_protocol_test_station.json b/test/experiments/Protocol_Test_Station/clean_vessel_protocol_test_station.json index f4200f7..6d79345 100644 --- a/test/experiments/Protocol_Test_Station/clean_vessel_protocol_test_station.json +++ b/test/experiments/Protocol_Test_Station/clean_vessel_protocol_test_station.json @@ -301,9 +301,9 @@ } } ], - "links": [ + "links": [ { - "id": "link_pump1_valve1", + "id": "link_pump1_to_valve1", "source": "transfer_pump_1", "target": "multiway_valve_1", "type": "fluid", @@ -313,7 +313,7 @@ } }, { - "id": "link_pump2_valve2", + "id": "link_pump2_to_valve2", "source": "transfer_pump_2", "target": "multiway_valve_2", "type": "fluid", @@ -323,17 +323,7 @@ } }, { - "id": "link_valve1_air", - "source": "multiway_valve_1", - "target": "flask_air", - "type": "fluid", - "port": { - "multiway_valve_1": "6", - "flask_air": "top" - } - }, - { - "id": "link_valve1_water", + "id": "link_valve1_to_water", "source": "multiway_valve_1", "target": "flask_water", "type": "fluid", @@ -343,7 +333,7 @@ } }, { - "id": "link_valve1_acetone", + "id": "link_valve1_to_acetone", "source": "multiway_valve_1", "target": "flask_acetone", "type": "fluid", @@ -353,7 +343,7 @@ } }, { - "id": "link_valve1_ethanol", + "id": "link_valve1_to_ethanol", "source": "multiway_valve_1", "target": "flask_ethanol", "type": "fluid", @@ -363,17 +353,27 @@ } }, { - "id": "link_valve1_valve2", + "id": "link_valve1_to_air", + "source": "multiway_valve_1", + "target": "flask_air", + "type": "fluid", + "port": { + "multiway_valve_1": "6", + "flask_air": "top" + } + }, + { + "id": "link_valve1_to_valve2_for_cleaning", "source": "multiway_valve_1", "target": "multiway_valve_2", "type": "fluid", "port": { - "multiway_valve_1": "5", - "multiway_valve_2": "1" + "multiway_valve_1": "1", + "multiway_valve_2": "8" } }, { - "id": "link_valve2_main_reactor", + "id": "link_valve2_to_main_reactor_in", "source": "multiway_valve_2", "target": "main_reactor", "type": "fluid", @@ -383,7 +383,7 @@ } }, { - "id": "link_valve2_secondary_reactor", + "id": "link_valve2_to_secondary_reactor_in", "source": "multiway_valve_2", "target": "secondary_reactor", "type": "fluid", @@ -393,7 +393,27 @@ } }, { - "id": "link_valve2_waste", + "id": "link_main_reactor_out_to_valve2", + "source": "main_reactor", + "target": "multiway_valve_2", + "type": "fluid", + "port": { + "main_reactor": "bottom", + "multiway_valve_2": "6" + } + }, + { + "id": "link_secondary_reactor_out_to_valve2", + "source": "secondary_reactor", + "target": "multiway_valve_2", + "type": "fluid", + "port": { + "secondary_reactor": "bottom", + "multiway_valve_2": "7" + } + }, + { + "id": "link_valve2_to_waste", "source": "multiway_valve_2", "target": "waste_workup", "type": "fluid", @@ -403,17 +423,7 @@ } }, { - "id": "link_valve2_air_return", - "source": "multiway_valve_2", - "target": "flask_air", - "type": "fluid", - "port": { - "multiway_valve_2": "5", - "flask_air": "top" - } - }, - { - "id": "link_heatchill1_main_reactor", + "id": "link_heatchill1_to_main_reactor", "source": "heatchill_1", "target": "main_reactor", "type": "mechanical", @@ -421,6 +431,16 @@ "heatchill_1": "heatchill", "main_reactor": "bind" } + }, + { + "id": "link_heatchill1_to_secondary_reactor", + "source": "heatchill_1", + "target": "secondary_reactor", + "type": "mechanical", + "port": { + "heatchill_1": "heatchill", + "secondary_reactor": "bind" + } } ] } \ No newline at end of file diff --git a/test/experiments/comprehensive_protocol/comprehensive_station.json b/test/experiments/comprehensive_protocol/comprehensive_station.json index b0f1a1b..071d913 100644 --- a/test/experiments/comprehensive_protocol/comprehensive_station.json +++ b/test/experiments/comprehensive_protocol/comprehensive_station.json @@ -1,8 +1,8 @@ { "nodes": [ { - "id": "ComprehensiveProtocolStation", - "name": "综合协议测试工作站", + "id": "OrganicSynthesisStation", + "name": "有机化学流程综合测试工作站", "children": [ "multiway_valve_1", "multiway_valve_2", @@ -69,7 +69,7 @@ "id": "multiway_valve_1", "name": "八通阀门1", "children": [], - "parent": "ComprehensiveProtocolStation", + "parent": "OrganicSynthesisStation", "type": "device", "class": "virtual_multiway_valve", "position": { @@ -89,7 +89,7 @@ "id": "multiway_valve_2", "name": "八通阀门2", "children": [], - "parent": "ComprehensiveProtocolStation", + "parent": "OrganicSynthesisStation", "type": "device", "class": "virtual_multiway_valve", "position": { @@ -109,7 +109,7 @@ "id": "transfer_pump_1", "name": "转移泵1", "children": [], - "parent": "ComprehensiveProtocolStation", + "parent": "OrganicSynthesisStation", "type": "device", "class": "virtual_transfer_pump", "position": { @@ -130,7 +130,7 @@ "id": "transfer_pump_2", "name": "转移泵2", "children": [], - "parent": "ComprehensiveProtocolStation", + "parent": "OrganicSynthesisStation", "type": "device", "class": "virtual_transfer_pump", "position": { @@ -151,7 +151,7 @@ "id": "reagent_bottle_1", "name": "试剂瓶1-DMF", "children": [], - "parent": "ComprehensiveProtocolStation", + "parent": "OrganicSynthesisStation", "type": "container", "class": "container", "position": { @@ -172,7 +172,7 @@ "id": "reagent_bottle_2", "name": "试剂瓶2-乙酸乙酯", "children": [], - "parent": "ComprehensiveProtocolStation", + "parent": "OrganicSynthesisStation", "type": "container", "class": "container", "position": { @@ -193,7 +193,7 @@ "id": "reagent_bottle_3", "name": "试剂瓶3-己烷", "children": [], - "parent": "ComprehensiveProtocolStation", + "parent": "OrganicSynthesisStation", "type": "container", "class": "container", "position": { @@ -214,7 +214,7 @@ "id": "reagent_bottle_4", "name": "试剂瓶4-甲醇", "children": [], - "parent": "ComprehensiveProtocolStation", + "parent": "OrganicSynthesisStation", "type": "container", "class": "container", "position": { @@ -235,7 +235,7 @@ "id": "reagent_bottle_5", "name": "试剂瓶5-水", "children": [], - "parent": "ComprehensiveProtocolStation", + "parent": "OrganicSynthesisStation", "type": "container", "class": "container", "position": { @@ -256,7 +256,7 @@ "id": "centrifuge_1", "name": "离心机", "children": [], - "parent": "ComprehensiveProtocolStation", + "parent": "OrganicSynthesisStation", "type": "device", "class": "virtual_centrifuge", "position": { @@ -278,7 +278,7 @@ "id": "rotavap_1", "name": "旋转蒸发仪", "children": [], - "parent": "ComprehensiveProtocolStation", + "parent": "OrganicSynthesisStation", "type": "device", "class": "virtual_rotavap", "position": { @@ -300,7 +300,7 @@ "id": "main_reactor", "name": "主反应器", "children": [], - "parent": "ComprehensiveProtocolStation", + "parent": "OrganicSynthesisStation", "type": "container", "class": "container", "position": { @@ -324,7 +324,7 @@ "id": "heater_1", "name": "加热器", "children": [], - "parent": "ComprehensiveProtocolStation", + "parent": "OrganicSynthesisStation", "type": "device", "class": "virtual_heatchill", "position": { @@ -345,7 +345,7 @@ "id": "stirrer_1", "name": "搅拌器1", "children": [], - "parent": "ComprehensiveProtocolStation", + "parent": "OrganicSynthesisStation", "type": "device", "class": "virtual_stirrer", "position": { @@ -365,7 +365,7 @@ "id": "stirrer_2", "name": "搅拌器2", "children": [], - "parent": "ComprehensiveProtocolStation", + "parent": "OrganicSynthesisStation", "type": "device", "class": "virtual_stirrer", "position": { @@ -385,7 +385,7 @@ "id": "waste_bottle_1", "name": "废液瓶1", "children": [], - "parent": "ComprehensiveProtocolStation", + "parent": "OrganicSynthesisStation", "type": "container", "class": "container", "position": { @@ -404,7 +404,7 @@ "id": "waste_bottle_2", "name": "废液瓶2", "children": [], - "parent": "ComprehensiveProtocolStation", + "parent": "OrganicSynthesisStation", "type": "container", "class": "container", "position": { @@ -423,7 +423,7 @@ "id": "solenoid_valve_1", "name": "电磁阀1", "children": [], - "parent": "ComprehensiveProtocolStation", + "parent": "OrganicSynthesisStation", "type": "device", "class": "virtual_solenoid_valve", "position": { @@ -444,7 +444,7 @@ "id": "solenoid_valve_2", "name": "电磁阀2", "children": [], - "parent": "ComprehensiveProtocolStation", + "parent": "OrganicSynthesisStation", "type": "device", "class": "virtual_solenoid_valve", "position": { @@ -465,7 +465,7 @@ "id": "vacuum_pump_1", "name": "真空泵", "children": [], - "parent": "ComprehensiveProtocolStation", + "parent": "OrganicSynthesisStation", "type": "device", "class": "virtual_vacuum_pump", "position": { @@ -486,7 +486,7 @@ "id": "gas_source_1", "name": "气源", "children": [], - "parent": "ComprehensiveProtocolStation", + "parent": "OrganicSynthesisStation", "type": "device", "class": "virtual_gas_source", "position": { @@ -504,7 +504,7 @@ "id": "filter_1", "name": "过滤器", "children": [], - "parent": "ComprehensiveProtocolStation", + "parent": "OrganicSynthesisStation", "type": "device", "class": "virtual_filter", "position": { @@ -525,7 +525,7 @@ "id": "column_1", "name": "洗脱柱", "children": [], - "parent": "ComprehensiveProtocolStation", + "parent": "OrganicSynthesisStation", "type": "device", "class": "virtual_column", "position": { @@ -547,7 +547,7 @@ "id": "separator_1", "name": "分液器", "children": [], - "parent": "ComprehensiveProtocolStation", + "parent": "OrganicSynthesisStation", "type": "device", "class": "virtual_separator", "position": { @@ -568,7 +568,7 @@ "id": "collection_bottle_1", "name": "接收瓶1", "children": [], - "parent": "ComprehensiveProtocolStation", + "parent": "OrganicSynthesisStation", "type": "container", "class": "container", "position": { @@ -587,7 +587,7 @@ "id": "collection_bottle_2", "name": "接收瓶2", "children": [], - "parent": "ComprehensiveProtocolStation", + "parent": "OrganicSynthesisStation", "type": "container", "class": "container", "position": { @@ -606,7 +606,7 @@ "id": "collection_bottle_3", "name": "接收瓶3", "children": [], - "parent": "ComprehensiveProtocolStation", + "parent": "OrganicSynthesisStation", "type": "container", "class": "container", "position": { @@ -852,6 +852,46 @@ "heater_1": "heatchill", "main_reactor": "bind" } + }, + { + "id": "link_separator_waste2", + "source": "separator_1", + "target": "waste_bottle_2", + "type": "fluid", + "port": { + "separator_1": "top_phase_out", + "waste_bottle_2": "top" + } + }, + { + "id": "mech_stirrer2_separator", + "source": "stirrer_2", + "target": "separator_1", + "type": "mechanical", + "port": { + "stirrer_2": "stirrer", + "separator_1": "bind" + } + }, + { + "id": "link_filter_filtrate_to_collection1", + "source": "filter_1", + "target": "collection_bottle_1", + "type": "transport", + "port": { + "filter_1": "filtrate_out", + "collection_bottle_1": "top" + } + }, + { + "id": "link_filter_retentate_to_waste1", + "source": "filter_1", + "target": "waste_bottle_1", + "type": "transport", + "port": { + "filter_1": "retentate_out", + "waste_bottle_1": "top" + } } ] } \ No newline at end of file diff --git a/unilabos/compile/__init__.py b/unilabos/compile/__init__.py index 0b56a5d..98ea8a2 100644 --- a/unilabos/compile/__init__.py +++ b/unilabos/compile/__init__.py @@ -25,26 +25,25 @@ from .wash_solid_protocol import generate_wash_solid_protocol # Define a dictionary of protocol generators. action_protocol_generators = { - PumpTransferProtocol: generate_pump_protocol_with_rinsing, - CleanProtocol: generate_clean_protocol, - SeparateProtocol: generate_separate_protocol, - EvaporateProtocol: generate_evaporate_protocol, - EvacuateAndRefillProtocol: generate_evacuateandrefill_protocol, + AddProtocol: generate_add_protocol, AGVTransferProtocol: generate_agv_transfer_protocol, CentrifugeProtocol: generate_centrifuge_protocol, - AddProtocol: generate_add_protocol, + CleanProtocol: generate_clean_protocol, + CleanVesselProtocol: generate_clean_vessel_protocol, + DissolveProtocol: generate_dissolve_protocol, + EvacuateAndRefillProtocol: generate_evacuateandrefill_protocol, + EvaporateProtocol: generate_evaporate_protocol, FilterProtocol: generate_filter_protocol, + FilterThroughProtocol: generate_filter_through_protocol, HeatChillProtocol: generate_heat_chill_protocol, HeatChillStartProtocol: generate_heat_chill_start_protocol, HeatChillStopProtocol: generate_heat_chill_stop_protocol, - # HeatChillToTempProtocol: generate_heat_chill_to_temp_protocol, # **移除这行** - StirProtocol: generate_stir_protocol, + PumpTransferProtocol: generate_pump_protocol_with_rinsing, + RunColumnProtocol: generate_run_column_protocol, + SeparateProtocol: generate_separate_protocol, StartStirProtocol: generate_start_stir_protocol, + StirProtocol: generate_stir_protocol, StopStirProtocol: generate_stop_stir_protocol, TransferProtocol: generate_transfer_protocol, - CleanVesselProtocol: generate_clean_vessel_protocol, - DissolveProtocol: generate_dissolve_protocol, - FilterThroughProtocol: generate_filter_through_protocol, - RunColumnProtocol: generate_run_column_protocol, WashSolidProtocol: generate_wash_solid_protocol, -} +} \ No newline at end of file diff --git a/unilabos/compile/add_protocol.py b/unilabos/compile/add_protocol.py index a1398e6..144ec96 100644 --- a/unilabos/compile/add_protocol.py +++ b/unilabos/compile/add_protocol.py @@ -5,7 +5,10 @@ from .pump_protocol import generate_pump_protocol_with_rinsing def find_reagent_vessel(G: nx.DiGraph, reagent: str) -> str: """ - 根据试剂名称查找对应的试剂瓶 + 根据试剂名称查找对应的试剂瓶,支持多种匹配模式: + 1. 容器名称匹配(如 flask_DMF, reagent_bottle_1-DMF) + 2. 容器内液体类型匹配(如 liquid_type: "DMF", name: "ethanol") + 3. 试剂名称匹配(如 reagent_name: "DMF", config.reagent: "ethyl_acetate") Args: G: 网络图 @@ -17,23 +20,184 @@ def find_reagent_vessel(G: nx.DiGraph, reagent: str) -> str: Raises: ValueError: 如果找不到对应的试剂瓶 """ - # 按照pump_protocol的命名规则查找试剂瓶 - reagent_vessel_id = f"flask_{reagent}" + print(f"ADD_PROTOCOL: 正在查找试剂 '{reagent}' 的容器...") - if reagent_vessel_id in G.nodes(): - return reagent_vessel_id + # 第一步:通过容器名称匹配 + possible_names = [ + f"flask_{reagent}", # flask_DMF, flask_ethanol + f"bottle_{reagent}", # bottle_DMF, bottle_ethanol + f"vessel_{reagent}", # vessel_DMF, vessel_ethanol + f"{reagent}_flask", # DMF_flask, ethanol_flask + f"{reagent}_bottle", # DMF_bottle, ethanol_bottle + f"{reagent}", # 直接用试剂名 + f"reagent_{reagent}", # reagent_DMF, reagent_ethanol + f"reagent_bottle_{reagent}", # reagent_bottle_DMF + ] - # 如果直接匹配失败,尝试模糊匹配 - for node in G.nodes(): - if node.startswith('flask_') and reagent.lower() in node.lower(): - return node + # 尝试名称匹配 + for vessel_name in possible_names: + if vessel_name in G.nodes(): + print(f"ADD_PROTOCOL: 通过名称匹配找到容器: {vessel_name}") + return vessel_name - # 如果还是找不到,列出所有可用的试剂瓶 - available_flasks = [node for node in G.nodes() - if node.startswith('flask_') - and G.nodes[node].get('type') == 'container'] + # 第二步:通过模糊名称匹配(名称中包含试剂名) + for node_id in G.nodes(): + if G.nodes[node_id].get('type') == 'container': + # 检查节点ID或名称中是否包含试剂名 + node_name = G.nodes[node_id].get('name', '').lower() + if (reagent.lower() in node_id.lower() or + reagent.lower() in node_name): + print(f"ADD_PROTOCOL: 通过模糊名称匹配找到容器: {node_id} (名称: {node_name})") + return node_id - raise ValueError(f"找不到试剂 '{reagent}' 对应的试剂瓶。可用试剂瓶: {available_flasks}") + # 第三步:通过液体类型匹配 + for node_id in G.nodes(): + if G.nodes[node_id].get('type') == 'container': + vessel_data = G.nodes[node_id].get('data', {}) + liquids = vessel_data.get('liquid', []) + + for liquid in liquids: + if isinstance(liquid, dict): + # 支持两种格式的液体类型字段 + liquid_type = liquid.get('liquid_type') or liquid.get('name', '') + reagent_name = vessel_data.get('reagent_name', '') + config_reagent = G.nodes[node_id].get('config', {}).get('reagent', '') + + # 检查多个可能的字段 + if (liquid_type.lower() == reagent.lower() or + reagent_name.lower() == reagent.lower() or + config_reagent.lower() == reagent.lower()): + print(f"ADD_PROTOCOL: 通过液体类型匹配找到容器: {node_id}") + print(f" - liquid_type: {liquid_type}") + print(f" - reagent_name: {reagent_name}") + print(f" - config.reagent: {config_reagent}") + return node_id + + # 第四步:列出所有可用的容器信息帮助调试 + available_containers = [] + for node_id in G.nodes(): + if G.nodes[node_id].get('type') == 'container': + vessel_data = G.nodes[node_id].get('data', {}) + config_data = G.nodes[node_id].get('config', {}) + liquids = vessel_data.get('liquid', []) + + container_info = { + 'id': node_id, + 'name': G.nodes[node_id].get('name', ''), + 'liquid_types': [], + 'reagent_name': vessel_data.get('reagent_name', ''), + 'config_reagent': config_data.get('reagent', '') + } + + for liquid in liquids: + if isinstance(liquid, dict): + liquid_type = liquid.get('liquid_type') or liquid.get('name', '') + if liquid_type: + container_info['liquid_types'].append(liquid_type) + + available_containers.append(container_info) + + print(f"ADD_PROTOCOL: 可用容器列表:") + for container in available_containers: + print(f" - {container['id']}: {container['name']}") + print(f" 液体类型: {container['liquid_types']}") + print(f" 试剂名称: {container['reagent_name']}") + print(f" 配置试剂: {container['config_reagent']}") + + raise ValueError(f"找不到试剂 '{reagent}' 对应的试剂瓶。尝试了名称匹配: {possible_names}") + + +def find_reagent_vessel_by_any_match(G: nx.DiGraph, reagent: str) -> str: + """ + 增强版试剂容器查找,支持各种匹配方式的别名函数 + """ + return find_reagent_vessel(G, reagent) + + +def get_vessel_reagent_volume(G: nx.DiGraph, vessel: str) -> float: + """获取容器中的试剂体积""" + if vessel not in G.nodes(): + return 0.0 + + vessel_data = G.nodes[vessel].get('data', {}) + liquids = vessel_data.get('liquid', []) + + total_volume = 0.0 + for liquid in liquids: + if isinstance(liquid, dict): + # 支持两种格式:新格式 (name, volume) 和旧格式 (liquid_type, liquid_volume) + volume = liquid.get('volume') or liquid.get('liquid_volume', 0.0) + total_volume += volume + + return total_volume + + +def get_vessel_reagent_types(G: nx.DiGraph, vessel: str) -> List[str]: + """获取容器中所有试剂的类型""" + if vessel not in G.nodes(): + return [] + + vessel_data = G.nodes[vessel].get('data', {}) + liquids = vessel_data.get('liquid', []) + + reagent_types = [] + for liquid in liquids: + if isinstance(liquid, dict): + # 支持两种格式的试剂类型字段 + reagent_type = liquid.get('liquid_type') or liquid.get('name', '') + if reagent_type: + reagent_types.append(reagent_type) + + # 同时检查配置中的试剂信息 + config_reagent = G.nodes[vessel].get('config', {}).get('reagent', '') + reagent_name = vessel_data.get('reagent_name', '') + + if config_reagent and config_reagent not in reagent_types: + reagent_types.append(config_reagent) + if reagent_name and reagent_name not in reagent_types: + reagent_types.append(reagent_name) + + return reagent_types + + +def find_vessels_by_reagent(G: nx.DiGraph, reagent: str) -> List[str]: + """ + 根据试剂类型查找所有匹配的容器 + 返回匹配容器的ID列表 + """ + matching_vessels = [] + + for node_id in G.nodes(): + if G.nodes[node_id].get('type') == 'container': + # 检查容器名称匹配 + node_name = G.nodes[node_id].get('name', '').lower() + if reagent.lower() in node_id.lower() or reagent.lower() in node_name: + matching_vessels.append(node_id) + continue + + # 检查试剂类型匹配 + vessel_data = G.nodes[node_id].get('data', {}) + liquids = vessel_data.get('liquid', []) + config_data = G.nodes[node_id].get('config', {}) + + # 检查 reagent_name 和 config.reagent + reagent_name = vessel_data.get('reagent_name', '').lower() + config_reagent = config_data.get('reagent', '').lower() + + if (reagent.lower() == reagent_name or + reagent.lower() == config_reagent): + matching_vessels.append(node_id) + continue + + # 检查液体列表 + for liquid in liquids: + if isinstance(liquid, dict): + liquid_type = liquid.get('liquid_type') or liquid.get('name', '') + if liquid_type.lower() == reagent.lower(): + matching_vessels.append(node_id) + break + + return matching_vessels def find_connected_stirrer(G: nx.DiGraph, vessel: str) -> str: @@ -49,7 +213,7 @@ def find_connected_stirrer(G: nx.DiGraph, vessel: str) -> str: """ # 查找所有搅拌器节点 stirrer_nodes = [node for node in G.nodes() - if G.nodes[node].get('class') == 'virtual_stirrer'] + if (G.nodes[node].get('class') or '') == 'virtual_stirrer'] # 检查哪个搅拌器与目标容器相连 for stirrer in stirrer_nodes: @@ -74,10 +238,10 @@ def generate_add_protocol( purpose: str = "添加试剂" ) -> List[Dict[str, Any]]: """ - 生成添加试剂的协议序列 + 生成添加试剂的协议序列,支持智能试剂匹配 基于pump_protocol的成熟算法,实现试剂添加功能: - 1. 自动查找试剂瓶 + 1. 智能查找试剂瓶(支持名称匹配、液体类型匹配、试剂配置匹配) 2. **先启动搅拌,再进行转移** - 确保试剂添加更均匀 3. 使用pump_protocol实现液体转移 @@ -102,24 +266,41 @@ def generate_add_protocol( """ action_sequence = [] + print(f"ADD_PROTOCOL: 开始生成添加试剂协议") + print(f" - 目标容器: {vessel}") + print(f" - 试剂: {reagent}") + print(f" - 体积: {volume} mL") + print(f" - 质量: {mass} g") + print(f" - 搅拌: {stir} (速度: {stir_speed} RPM)") + print(f" - 粘稠: {viscous}") + print(f" - 目的: {purpose}") + # 1. 验证目标容器存在 if vessel not in G.nodes(): raise ValueError(f"目标容器 '{vessel}' 不存在于系统中") - # 2. 查找试剂瓶 + # 2. 智能查找试剂瓶 try: reagent_vessel = find_reagent_vessel(G, reagent) + print(f"ADD_PROTOCOL: 找到试剂容器: {reagent_vessel}") except ValueError as e: raise ValueError(f"无法找到试剂 '{reagent}': {str(e)}") - # 3. 验证是否存在从试剂瓶到目标容器的路径 + # 3. 验证试剂容器中的试剂体积 + available_volume = get_vessel_reagent_volume(G, reagent_vessel) + print(f"ADD_PROTOCOL: 试剂容器 {reagent_vessel} 中有 {available_volume} mL 试剂") + + if available_volume < volume: + print(f"ADD_PROTOCOL: 警告 - 试剂容器中的试剂不足!需要 {volume} mL,可用 {available_volume} mL") + + # 4. 验证是否存在从试剂瓶到目标容器的路径 try: path = nx.shortest_path(G, source=reagent_vessel, target=vessel) print(f"ADD_PROTOCOL: 找到路径 {reagent_vessel} -> {vessel}: {path}") except nx.NetworkXNoPath: raise ValueError(f"从试剂瓶 '{reagent_vessel}' 到目标容器 '{vessel}' 没有可用路径") - # 4. **先启动搅拌** - 关键改进! + # 5. **先启动搅拌** - 关键改进! if stir: try: stirrer_id = find_connected_stirrer(G, vessel) @@ -140,15 +321,21 @@ def generate_add_protocol( action_sequence.append(stir_action) print(f"ADD_PROTOCOL: 已添加搅拌动作,速度 {stir_speed} RPM") + + # 等待搅拌稳定 + action_sequence.append({ + "action_name": "wait", + "action_kwargs": {"time": 5} + }) else: print(f"ADD_PROTOCOL: 警告 - 需要搅拌但未找到与容器 {vessel} 相连的搅拌器") except Exception as e: print(f"ADD_PROTOCOL: 搅拌器配置出错: {str(e)}") - # 5. 如果指定了体积,执行液体转移 + # 6. 如果指定了体积,执行液体转移 if volume > 0: - # 5.1 计算流速参数 + # 6.1 计算流速参数 if time > 0: # 根据时间计算流速 transfer_flowrate = volume / time @@ -165,7 +352,7 @@ def generate_add_protocol( print(f"ADD_PROTOCOL: 准备转移 {volume} mL 从 {reagent_vessel} 到 {vessel}") print(f"ADD_PROTOCOL: 转移流速={transfer_flowrate} mL/s, 注入流速={flowrate} mL/s") - # 5.2 使用pump_protocol的核心算法实现液体转移 + # 6.2 使用pump_protocol的核心算法实现液体转移 try: pump_actions = generate_pump_protocol_with_rinsing( G=G, @@ -190,6 +377,8 @@ def generate_add_protocol( raise ValueError(f"生成泵协议时出错: {str(e)}") print(f"ADD_PROTOCOL: 生成了 {len(action_sequence)} 个动作") + print(f"ADD_PROTOCOL: 添加试剂协议生成完成") + return action_sequence @@ -210,7 +399,7 @@ def generate_add_protocol_with_cleaning( cleaning_repeats: int = 1 ) -> List[Dict[str, Any]]: """ - 生成带清洗的添加试剂协议 + 生成带清洗的添加试剂协议,支持智能试剂匹配 与普通添加协议的区别是会在添加后进行管道清洗 @@ -235,7 +424,7 @@ def generate_add_protocol_with_cleaning( """ action_sequence = [] - # 1. 查找试剂瓶 + # 1. 智能查找试剂瓶 reagent_vessel = find_reagent_vessel(G, reagent) # 2. **先启动搅拌** @@ -251,6 +440,12 @@ def generate_add_protocol_with_cleaning( "purpose": f"{purpose}: 启动搅拌,准备添加 {reagent}" } }) + + # 等待搅拌稳定 + action_sequence.append({ + "action_name": "wait", + "action_kwargs": {"time": 5} + }) # 3. 计算流速 if time > 0: @@ -296,7 +491,7 @@ def generate_sequential_add_protocol( final_stir_time: float = 300.0 ) -> List[Dict[str, Any]]: """ - 生成连续添加多种试剂的协议 + 生成连续添加多种试剂的协议,支持智能试剂匹配 Args: G: 网络图 @@ -313,13 +508,13 @@ def generate_sequential_add_protocol( Example: reagents = [ { - "reagent": "DMF", + "reagent": "DMF", # 会匹配 reagent_bottle_1 (reagent_name: "DMF") "volume": 10.0, "viscous": False, "stir_speed": 300.0 }, { - "reagent": "ethyl_acetate", + "reagent": "ethyl_acetate", # 会匹配 reagent_bottle_2 (reagent_name: "ethyl_acetate") "volume": 5.0, "viscous": False, "stir_speed": 350.0 @@ -328,14 +523,17 @@ def generate_sequential_add_protocol( """ action_sequence = [] + print(f"ADD_PROTOCOL: 开始连续添加 {len(reagents)} 种试剂到容器 {vessel}") + for i, reagent_params in enumerate(reagents): - print(f"ADD_PROTOCOL: 处理第 {i+1}/{len(reagents)} 个试剂: {reagent_params.get('reagent')}") + reagent_name = reagent_params.get('reagent') + print(f"ADD_PROTOCOL: 处理第 {i+1}/{len(reagents)} 个试剂: {reagent_name}") # 生成单个试剂的添加协议 add_actions = generate_add_protocol( G=G, vessel=vessel, - reagent=reagent_params.get('reagent'), + reagent=reagent_name, volume=reagent_params.get('volume', 0.0), mass=reagent_params.get('mass', 0.0), amount=reagent_params.get('amount', ''), @@ -343,7 +541,7 @@ def generate_sequential_add_protocol( stir=stir_between_additions, stir_speed=reagent_params.get('stir_speed', 300.0), viscous=reagent_params.get('viscous', False), - purpose=reagent_params.get('purpose', f'添加试剂 {i+1}') + purpose=reagent_params.get('purpose', f'添加试剂 {reagent_name} ({i+1}/{len(reagents)})') ) action_sequence.extend(add_actions) @@ -352,17 +550,23 @@ def generate_sequential_add_protocol( if i < len(reagents) - 1: # 不是最后一个试剂 action_sequence.append({ "action_name": "wait", - "action_kwargs": {"time": 2} + "action_kwargs": {"time": 10} # 试剂混合时间 }) # 最终搅拌 if final_stir: stirrer_id = find_connected_stirrer(G, vessel) if stirrer_id: + print(f"ADD_PROTOCOL: 添加最终搅拌动作,速度 {final_stir_speed} RPM,时间 {final_stir_time} 秒") action_sequence.extend([ { - "action_name": "wait", - "action_kwargs": {"time": final_stir_time} + "device_id": stirrer_id, + "action_name": "stir", + "action_kwargs": { + "stir_time": final_stir_time, + "stir_speed": final_stir_speed, + "settling_time": 30.0 + } } ]) @@ -370,10 +574,52 @@ def generate_sequential_add_protocol( return action_sequence +# 便捷函数:常用添加方案 +def generate_organic_add_protocol( + G: nx.DiGraph, + vessel: str, + organic_reagent: str, + volume: float, + stir_speed: float = 400.0 +) -> List[Dict[str, Any]]: + """有机试剂添加:慢速、搅拌""" + return generate_add_protocol( + G, vessel, organic_reagent, volume, 0.0, "", 0.0, + True, stir_speed, False, f"添加有机试剂 {organic_reagent}" + ) + + +def generate_viscous_add_protocol( + G: nx.DiGraph, + vessel: str, + viscous_reagent: str, + volume: float, + addition_time: float = 120.0 +) -> List[Dict[str, Any]]: + """粘稠试剂添加:慢速、长时间""" + return generate_add_protocol( + G, vessel, viscous_reagent, volume, 0.0, "", addition_time, + True, 250.0, True, f"缓慢添加粘稠试剂 {viscous_reagent}" + ) + + +def generate_solvent_add_protocol( + G: nx.DiGraph, + vessel: str, + solvent: str, + volume: float +) -> List[Dict[str, Any]]: + """溶剂添加:快速、无需特殊处理""" + return generate_add_protocol( + G, vessel, solvent, volume, 0.0, "", 0.0, + False, 300.0, False, f"添加溶剂 {solvent}" + ) + + # 使用示例和测试函数 def test_add_protocol(): """测试添加协议的示例""" - print("=== ADD PROTOCOL 测试 ===") + print("=== ADD PROTOCOL 智能匹配测试 ===") print("测试完成") diff --git a/unilabos/compile/clean_vessel_protocol.py b/unilabos/compile/clean_vessel_protocol.py index cf752fa..28abc95 100644 --- a/unilabos/compile/clean_vessel_protocol.py +++ b/unilabos/compile/clean_vessel_protocol.py @@ -5,9 +5,13 @@ from .pump_protocol import generate_pump_protocol def find_solvent_vessel(G: nx.DiGraph, solvent: str) -> str: """ - 查找溶剂容器,支持多种命名模式 + 查找溶剂容器,支持多种匹配模式: + 1. 容器名称匹配(如 flask_water, reagent_bottle_1-DMF) + 2. 容器内液体类型匹配(如 liquid_type: "DMF", "ethanol") """ - # 可能的溶剂容器命名模式 + print(f"CLEAN_VESSEL: 正在查找溶剂 '{solvent}' 的容器...") + + # 第一步:通过容器名称匹配 possible_names = [ f"flask_{solvent}", # flask_water, flask_ethanol f"bottle_{solvent}", # bottle_water, bottle_ethanol @@ -16,13 +20,87 @@ def find_solvent_vessel(G: nx.DiGraph, solvent: str) -> str: f"{solvent}_bottle", # water_bottle, ethanol_bottle f"{solvent}", # 直接用溶剂名 f"solvent_{solvent}", # solvent_water, solvent_ethanol + f"reagent_bottle_{solvent}", # reagent_bottle_DMF ] + # 尝试名称匹配 for vessel_name in possible_names: if vessel_name in G.nodes(): + print(f"CLEAN_VESSEL: 通过名称匹配找到容器: {vessel_name}") return vessel_name - raise ValueError(f"未找到溶剂 '{solvent}' 的容器。尝试了以下名称: {possible_names}") + # 第二步:通过模糊名称匹配(名称中包含溶剂名) + for node_id in G.nodes(): + if G.nodes[node_id].get('type') == 'container': + # 检查节点ID或名称中是否包含溶剂名 + node_name = G.nodes[node_id].get('name', '').lower() + if (solvent.lower() in node_id.lower() or + solvent.lower() in node_name): + print(f"CLEAN_VESSEL: 通过模糊名称匹配找到容器: {node_id} (名称: {node_name})") + return node_id + + # 第三步:通过液体类型匹配 + for node_id in G.nodes(): + if G.nodes[node_id].get('type') == 'container': + vessel_data = G.nodes[node_id].get('data', {}) + liquids = vessel_data.get('liquid', []) + + for liquid in liquids: + if isinstance(liquid, dict): + # 支持两种格式的液体类型字段 + liquid_type = liquid.get('liquid_type') or liquid.get('name', '') + reagent_name = vessel_data.get('reagent_name', '') + config_reagent = G.nodes[node_id].get('config', {}).get('reagent', '') + + # 检查多个可能的字段 + if (liquid_type.lower() == solvent.lower() or + reagent_name.lower() == solvent.lower() or + config_reagent.lower() == solvent.lower()): + print(f"CLEAN_VESSEL: 通过液体类型匹配找到容器: {node_id}") + print(f" - liquid_type: {liquid_type}") + print(f" - reagent_name: {reagent_name}") + print(f" - config.reagent: {config_reagent}") + return node_id + + # 第四步:列出所有可用的容器信息帮助调试 + available_containers = [] + for node_id in G.nodes(): + if G.nodes[node_id].get('type') == 'container': + vessel_data = G.nodes[node_id].get('data', {}) + config_data = G.nodes[node_id].get('config', {}) + liquids = vessel_data.get('liquid', []) + + container_info = { + 'id': node_id, + 'name': G.nodes[node_id].get('name', ''), + 'liquid_types': [], + 'reagent_name': vessel_data.get('reagent_name', ''), + 'config_reagent': config_data.get('reagent', '') + } + + for liquid in liquids: + if isinstance(liquid, dict): + liquid_type = liquid.get('liquid_type') or liquid.get('name', '') + if liquid_type: + container_info['liquid_types'].append(liquid_type) + + available_containers.append(container_info) + + print(f"CLEAN_VESSEL: 可用容器列表:") + for container in available_containers: + print(f" - {container['id']}: {container['name']}") + print(f" 液体类型: {container['liquid_types']}") + print(f" 试剂名称: {container['reagent_name']}") + print(f" 配置试剂: {container['config_reagent']}") + + raise ValueError(f"未找到溶剂 '{solvent}' 的容器。尝试了名称匹配: {possible_names}") + + +def find_solvent_vessel_by_any_match(G: nx.DiGraph, solvent: str) -> str: + """ + 增强版溶剂容器查找,支持各种匹配方式的别名函数 + """ + return find_solvent_vessel(G, solvent) def find_waste_vessel(G: nx.DiGraph) -> str: @@ -281,4 +359,81 @@ def generate_organic_clean_protocol( ) action_sequence.extend(water_actions) - return action_sequence \ No newline at end of file + return action_sequence + + +def get_vessel_liquid_volume(G: nx.DiGraph, vessel: str) -> float: + """获取容器中的液体体积(修复版)""" + if vessel not in G.nodes(): + return 0.0 + + vessel_data = G.nodes[vessel].get('data', {}) + liquids = vessel_data.get('liquid', []) + + total_volume = 0.0 + for liquid in liquids: + if isinstance(liquid, dict): + # 支持两种格式:新格式 (name, volume) 和旧格式 (liquid_type, liquid_volume) + volume = liquid.get('volume') or liquid.get('liquid_volume', 0.0) + total_volume += volume + + return total_volume + + +def get_vessel_liquid_types(G: nx.DiGraph, vessel: str) -> List[str]: + """获取容器中所有液体的类型""" + if vessel not in G.nodes(): + return [] + + vessel_data = G.nodes[vessel].get('data', {}) + liquids = vessel_data.get('liquid', []) + + liquid_types = [] + for liquid in liquids: + if isinstance(liquid, dict): + # 支持两种格式的液体类型字段 + liquid_type = liquid.get('liquid_type') or liquid.get('name', '') + if liquid_type: + liquid_types.append(liquid_type) + + return liquid_types + + +def find_vessel_by_content(G: nx.DiGraph, content: str) -> List[str]: + """ + 根据内容物查找所有匹配的容器 + 返回匹配容器的ID列表 + """ + matching_vessels = [] + + for node_id in G.nodes(): + if G.nodes[node_id].get('type') == 'container': + # 检查容器名称匹配 + node_name = G.nodes[node_id].get('name', '').lower() + if content.lower() in node_id.lower() or content.lower() in node_name: + matching_vessels.append(node_id) + continue + + # 检查液体类型匹配 + vessel_data = G.nodes[node_id].get('data', {}) + liquids = vessel_data.get('liquid', []) + config_data = G.nodes[node_id].get('config', {}) + + # 检查 reagent_name 和 config.reagent + reagent_name = vessel_data.get('reagent_name', '').lower() + config_reagent = config_data.get('reagent', '').lower() + + if (content.lower() == reagent_name or + content.lower() == config_reagent): + matching_vessels.append(node_id) + continue + + # 检查液体列表 + for liquid in liquids: + if isinstance(liquid, dict): + liquid_type = liquid.get('liquid_type') or liquid.get('name', '') + if liquid_type.lower() == content.lower(): + matching_vessels.append(node_id) + break + + return matching_vessels \ No newline at end of file diff --git a/unilabos/registry/devices/virtual_device.yaml b/unilabos/registry/devices/virtual_device.yaml index 26d620d..e25c0d6 100644 --- a/unilabos/registry/devices/virtual_device.yaml +++ b/unilabos/registry/devices/virtual_device.yaml @@ -845,6 +845,14 @@ virtual_separator: data_source: executor data_key: top_outlet description: "上相(轻相)液体输出口" + - handler_key: bind + label: bind + io_type: target + data_type: mechanical + side: WEST + data_source: handle + data_key: mechanical_port + description: "用于连接搅拌器等机械设备的接口" schema: type: object properties: diff --git a/unilabos/registry/devices/work_station.yaml b/unilabos/registry/devices/work_station.yaml index d3a3733..c8c0324 100644 --- a/unilabos/registry/devices/work_station.yaml +++ b/unilabos/registry/devices/work_station.yaml @@ -3,5 +3,623 @@ workstation: class: module: unilabos.ros.nodes.presets.protocol_node:ROS2ProtocolNode type: ros2 - schema: - properties: {} + action_value_mappings: + AddProtocol: + type: Add + goal: + vessel: vessel + reagent: reagent + volume: volume + mass: mass + amount: amount + time: time + stir: stir + stir_speed: stir_speed + viscous: viscous + purpose: purpose + feedback: {} + result: {} + handles: + input: + - handler_key: vessel + label: Vessel + data_type: resource + data_source: handle + data_key: vessel + - handler_key: reagent + label: Reagent + data_type: resource + data_source: handle + data_key: reagent + output: + - handler_key: vessel_out + label: Vessel + data_type: resource + data_source: executor + data_key: vessel + + AGVTransferProtocol: + type: AGVTransfer + goal: + from_repo: from_repo + from_repo_position: from_repo_position + to_repo: to_repo + to_repo_position: to_repo_position + feedback: {} + result: {} + + CentrifugeProtocol: + type: Centrifuge + goal: + vessel: vessel + speed: speed + time: time + temp: temp + feedback: {} + result: {} + handles: + input: + - handler_key: vessel + label: Vessel + data_type: resource + data_source: handle + data_key: vessel + output: + - handler_key: vessel_out + label: Vessel + data_type: resource + data_source: executor + data_key: vessel + + CleanProtocol: + type: Clean + goal: + vessel: vessel + solvent: solvent + volume: volume + temp: temp + repeats: repeats + feedback: {} + result: {} + handles: + input: + - handler_key: vessel + label: Vessel + data_type: resource + data_source: handle + data_key: vessel + - handler_key: solvent + label: Solvent + data_type: resource + data_source: handle + data_key: solvent + output: + - handler_key: vessel_out + label: Vessel + data_type: resource + data_source: executor + data_key: vessel + + CleanVesselProtocol: + type: CleanVessel + goal: + vessel: vessel + solvent: solvent + volume: volume + temp: temp + repeats: repeats + feedback: {} + result: {} + handles: + input: + - handler_key: vessel + label: Vessel + data_type: resource + data_source: handle + data_key: vessel + - handler_key: solvent + label: Solvent + data_type: resource + data_source: handle + data_key: solvent + output: + - handler_key: vessel_out + label: Vessel + data_type: resource + data_source: executor + data_key: vessel + + DissolveProtocol: + type: Dissolve + goal: + vessel: vessel + solvent: solvent + volume: volume + amount: amount + temp: temp + time: time + stir_speed: stir_speed + feedback: {} + result: {} + handles: + input: + - handler_key: vessel + label: Vessel + data_type: resource + data_source: handle + data_key: vessel + - handler_key: solvent + label: Solvent + data_type: resource + data_source: handle + data_key: solvent + output: + - handler_key: vessel_out + label: Vessel + data_type: resource + data_source: executor + data_key: vessel + + EvacuateAndRefillProtocol: + type: EvacuateAndRefill + goal: + vessel: vessel + gas: gas + repeats: repeats + feedback: {} + result: {} + handles: + input: + - handler_key: vessel + label: Vessel + data_type: resource + data_source: handle + data_key: vessel + output: + - handler_key: vessel_out + label: Vessel + data_type: resource + data_source: executor + data_key: vessel + + EvaporateProtocol: + type: Evaporate + goal: + vessel: vessel + pressure: pressure + temp: temp + time: time + stir_speed: stir_speed + feedback: {} + result: {} + handles: + input: + - handler_key: vessel + label: Vessel + data_type: resource + data_source: handle + data_key: vessel + output: + - handler_key: vessel_out + label: Vessel + data_type: resource + data_source: executor + data_key: vessel + + FilterProtocol: + type: Filter + goal: + vessel: vessel + filtrate_vessel: filtrate_vessel + stir: stir + stir_speed: stir_speed + temp: temp + continue_heatchill: continue_heatchill + volume: volume + feedback: {} + result: {} + handles: + input: + - handler_key: vessel + label: Vessel + data_type: resource + data_source: handle + data_key: vessel + - handler_key: filtrate_vessel + label: Filtrate Vessel + data_type: resource + data_source: handle + data_key: vessel + output: + - handler_key: vessel_out + label: Vessel + data_type: resource + data_source: executor + data_key: vessel + - handler_key: filtrate_out + label: Filtrate Vessel + data_type: resource + data_source: executor + data_key: vessel + + FilterThroughProtocol: + type: FilterThrough + goal: + from_vessel: from_vessel + to_vessel: to_vessel + filter_through: filter_through + eluting_solvent: eluting_solvent + eluting_volume: eluting_volume + eluting_repeats: eluting_repeats + residence_time: residence_time + feedback: {} + result: {} + handles: + input: + - handler_key: from_vessel + label: From Vessel + data_type: resource + data_source: handle + data_key: vessel + - handler_key: to_vessel + label: To Vessel + data_type: resource + data_source: executor + data_key: vessel + - handler_key: solvent + label: Eluting Solvent + data_type: resource + data_source: handle + data_key: solvent + output: + - handler_key: from_vessel_out + label: From Vessel + data_type: resource + data_source: handle + data_key: vessel + - handler_key: to_vessel_out + label: To Vessel + data_type: resource + data_source: executor + data_key: vessel + + HeatChillProtocol: + type: HeatChill + goal: + vessel: vessel + temp: temp + time: time + stir: stir + stir_speed: stir_speed + purpose: purpose + feedback: {} + result: {} + handles: + input: + - handler_key: vessel + label: Vessel + data_type: resource + data_source: handle + data_key: vessel + output: + - handler_key: vessel_out + label: Vessel + data_type: resource + data_source: executor + data_key: vessel + + HeatChillStartProtocol: + type: HeatChillStart + goal: + vessel: vessel + temp: temp + purpose: purpose + feedback: {} + result: {} + handles: + input: + - handler_key: vessel + label: Vessel + data_type: resource + data_source: handle + data_key: vessel + output: + - handler_key: vessel_out + label: Vessel + data_type: resource + data_source: executor + data_key: vessel + + HeatChillStopProtocol: + type: HeatChillStop + goal: + vessel: vessel + feedback: {} + result: {} + handles: + input: + - handler_key: vessel + label: Vessel + data_type: resource + data_source: handle + data_key: vessel + output: + - handler_key: vessel_out + label: Vessel + data_type: resource + data_source: executor + data_key: vessel + + PumpTransferProtocol: + type: PumpTransfer + goal: + from_vessel: from_vessel + to_vessel: to_vessel + volume: volume + amount: amount + time: time + viscous: viscous + rinsing_solvent: rinsing_solvent + rinsing_volume: rinsing_volume + rinsing_repeats: rinsing_repeats + solid: solid + feedback: {} + result: {} + handles: + input: + - handler_key: from_vessel + label: From Vessel + data_type: resource + data_source: handle + data_key: vessel + - handler_key: to_vessel + label: To Vessel + data_type: resource + data_source: executor + data_key: vessel + - handler_key: solvent + label: Rinsing Solvent + data_type: resource + data_source: handle + data_key: solvent + output: + - handler_key: from_vessel_out + label: From Vessel + data_type: resource + data_source: handle + data_key: vessel + - handler_key: to_vessel_out + label: To Vessel + data_type: resource + data_source: executor + data_key: vessel + + RunColumnProtocol: + type: RunColumn + goal: + from_vessel: from_vessel + to_vessel: to_vessel + column: column + feedback: {} + result: {} + handles: + input: + - handler_key: from_vessel + label: From Vessel + data_type: resource + data_source: handle + data_key: vessel + - handler_key: to_vessel + label: To Vessel + data_type: resource + data_source: executor + data_key: vessel + output: + - handler_key: from_vessel_out + label: From Vessel + data_type: resource + data_source: handle + data_key: vessel + - handler_key: to_vessel_out + label: To Vessel + data_type: resource + data_source: executor + data_key: vessel + + SeparateProtocol: + type: Separate + goal: + purpose: purpose + product_phase: product_phase + from_vessel: from_vessel + separation_vessel: separation_vessel + to_vessel: to_vessel + waste_phase_to_vessel: waste_phase_to_vessel + solvent: solvent + solvent_volume: solvent_volume + through: through + repeats: repeats + stir_time: stir_time + stir_speed: stir_speed + settling_time: settling_time + feedback: {} + result: {} + handles: + input: + - handler_key: from_vessel + label: From Vessel + data_type: resource + data_source: handle + data_key: vessel + - handler_key: to_vessel + label: To Vessel + data_type: resource + data_source: executor + data_key: vessel + - handler_key: solvent + label: Solvent + data_type: resource + data_source: handle + data_key: solvent + output: + - handler_key: from_vessel_out + label: From Vessel + data_type: resource + data_source: handle + data_key: vessel + - handler_key: to_vessel_out + label: To Vessel + data_type: resource + data_source: executor + data_key: vessel + + StartStirProtocol: + type: StartStir + goal: + vessel: vessel + stir_speed: stir_speed + purpose: purpose + feedback: {} + result: {} + handles: + input: + - handler_key: vessel + label: Vessel + data_type: resource + data_source: handle + data_key: vessel + output: + - handler_key: vessel_out + label: Vessel + data_type: resource + data_source: executor + data_key: vessel + + StirProtocol: + type: Stir + goal: + stir_time: stir_time + stir_speed: stir_speed + settling_time: settling_time + feedback: {} + result: {} + handles: + input: + - handler_key: vessel + label: Vessel + data_type: resource + data_source: handle + data_key: vessel + output: + - handler_key: vessel_out + label: Vessel + data_type: resource + data_source: executor + data_key: vessel + + StopStirProtocol: + type: StopStir + goal: + vessel: vessel + feedback: {} + result: {} + handles: + input: + - handler_key: vessel + label: Vessel + data_type: resource + data_source: handle + data_key: vessel + output: + - handler_key: vessel_out + label: Vessel + data_type: resource + data_source: executor + data_key: vessel + + TransferProtocol: + type: Transfer + goal: + from_vessel: from_vessel + to_vessel: to_vessel + volume: volume + amount: amount + time: time + viscous: viscous + rinsing_solvent: rinsing_solvent + rinsing_volume: rinsing_volume + rinsing_repeats: rinsing_repeats + solid: solid + feedback: {} + result: {} + handles: + input: + - handler_key: from_vessel + label: From Vessel + data_type: resource + data_source: handle + data_key: vessel + - handler_key: to_vessel + label: To Vessel + data_type: resource + data_source: executor + data_key: vessel + - handler_key: solvent + label: Rinsing Solvent + data_type: resource + data_source: handle + data_key: solvent + output: + - handler_key: from_vessel_out + label: From Vessel + data_type: resource + data_source: handle + data_key: vessel + - handler_key: to_vessel_out + label: To Vessel + data_type: resource + data_source: executor + data_key: vessel + + WashSolidProtocol: + type: WashSolid + goal: + vessel: vessel + solvent: solvent + volume: volume + filtrate_vessel: filtrate_vessel + temp: temp + stir: stir + stir_speed: stir_speed + time: time + repeats: repeats + feedback: {} + result: {} + handles: + input: + - handler_key: vessel + label: Vessel + data_type: resource + data_source: handle + data_key: vessel + - handler_key: solvent + label: Solvent + data_type: resource + data_source: handle + data_key: solvent + - handler_key: filtrate_vessel + label: Filtrate Vessel + data_type: resource + data_source: executor + data_key: vessel + output: + - handler_key: vessel_out + label: Vessel Out + data_type: resource + data_source: handle + data_key: vessel + - handler_key: filtrate_vessel_out + label: Filtrate Vessel + data_type: resource + data_source: executor + data_key: vessel \ No newline at end of file diff --git a/unilabos/registry/resources/organic/container.yaml b/unilabos/registry/resources/organic/container.yaml index bfdcba9..2186b70 100644 --- a/unilabos/registry/resources/organic/container.yaml +++ b/unilabos/registry/resources/organic/container.yaml @@ -1,5 +1,6 @@ container: description: regular organic container + icon: Flask.webp class: module: unilabos.resources.container:RegularContainer type: unilabos From bbc49e9aabd5e9f30e189cadcb1ee9441e5319d4 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Fri, 27 Jun 2025 23:45:05 +0800 Subject: [PATCH 02/96] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E8=A1=A8=E8=A1=A5=E5=85=A8=E5=8A=9F=E8=83=BD=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E5=A4=8DProtocol=E6=89=A7=E8=A1=8C=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- unilabos-win64.yaml | 23 +- unilabos/app/controler.py | 15 +- unilabos/app/register.py | 32 +- unilabos/app/web/client.py | 2 + unilabos/app/web/utils/action_utils.py | 2 + unilabos/devices/agv/ur_arm_task.py | 9 +- unilabos/devices/laiyu_add_solid/laiyu.py | 120 +- unilabos/devices/liquid_handling/revvity.py | 6 +- unilabos/devices/motor/iCL42.py | 2 +- unilabos/devices/raman_uv/home_made_raman.py | 2 +- unilabos/devices/zhida_hplc/zhida.py | 31 +- .../registry/device_comms/modbus_ioboard.yaml | 20 +- unilabos/registry/device_comms/serial.yaml | 116 +- .../devices/characterization_optic.yaml | 67 - unilabos/registry/devices/hotel.yaml | 54 +- .../registry/devices/laiyu_add_solid.yaml | 624 +- unilabos/registry/devices/liquid_handler.yaml | 5717 +++++++++++++++-- unilabos/registry/devices/mock_devices.yaml | 4875 +++++++++++--- unilabos/registry/devices/moveit_config.yaml | 362 +- .../devices/organic_miscellaneous.yaml | 541 +- unilabos/registry/devices/pump_and_valve.yaml | 1192 +++- unilabos/registry/devices/robot_agv.yaml | 147 +- unilabos/registry/devices/robot_arm.yaml | 219 +- unilabos/registry/devices/robot_gripper.yaml | 195 +- .../registry/devices/robot_linear_motion.yaml | 567 +- unilabos/registry/devices/sim_nodes.yaml | 352 +- unilabos/registry/devices/temperature.yaml | 909 ++- .../registry/devices/vacuum_and_purge.yaml | 605 +- unilabos/registry/devices/virtual_device.yaml | 4139 +++++++++--- unilabos/registry/devices/work_station.yaml | 2784 ++++++-- unilabos/registry/devices/zhida_hplc.yaml | 272 +- unilabos/registry/registry.py | 223 +- unilabos/ros/device_node_wrapper.py | 2 +- unilabos/ros/msgs/message_converter.py | 1 - unilabos/ros/nodes/base_device_node.py | 45 + unilabos/ros/nodes/presets/host_node.py | 18 +- unilabos/ros/nodes/presets/protocol_node.py | 209 +- unilabos/utils/import_manager.py | 590 +- unilabos/utils/type_check.py | 8 + 39 files changed, 21761 insertions(+), 3336 deletions(-) diff --git a/unilabos-win64.yaml b/unilabos-win64.yaml index 19a4008..9ae2243 100644 --- a/unilabos-win64.yaml +++ b/unilabos-win64.yaml @@ -6,12 +6,12 @@ channels: dependencies: # Basics - python=3.11.11 - - compilers - - cmake - - make - - ninja - - sphinx - - sphinx_rtd_theme + # - compilers + # - cmake + # - make + # - ninja + # - sphinx + # - sphinx_rtd_theme # Data Visualization - numpy - scipy @@ -23,7 +23,7 @@ dependencies: - pyserial - pyusb - pylibftdi - - pymodbus + - pymodbus==3.6.9 - python-can - pyvisa - opencv @@ -61,5 +61,12 @@ dependencies: # ros-humble-gazebo-ros // ignored because of the conflict with ign-gazebo # ilab equipments # ros-humble-unilabos-msgs + # driver + #- crcmod - pip: - - paho-mqtt \ No newline at end of file + - paho-mqtt + # driver + #- ur-rtde # set PYTHONUTF8=1 + #- pyautogui + #- pywinauto + #- pywinauto_recorder \ No newline at end of file diff --git a/unilabos/app/controler.py b/unilabos/app/controler.py index 5d55256..730578e 100644 --- a/unilabos/app/controler.py +++ b/unilabos/app/controler.py @@ -25,12 +25,13 @@ def job_add(req: JobAddReq) -> JobData: if req.job_id is None: req.job_id = str(uuid.uuid4()) action_name = req.data["action"] - action_kwargs = req.data["action_kwargs"] - req.data['action'] = action_name - if action_name == "execute_command_from_outer": - action_kwargs = {"command": json.dumps(action_kwargs)} - elif "command" in action_kwargs: - action_kwargs = action_kwargs["command"] + action_type = req.data.get("action_type", "LocalUnknown") + action_args = req.data.get("action_kwargs", None) # 兼容老版本,后续删除 + if action_args is None: + action_args = req.data.get("action_args") + else: + if "command" in action_args: + action_args = action_args["command"] # print(f"job_add:{req.device_id} {action_name} {action_kwargs}") - HostNode.get_instance().send_goal(req.device_id, action_name=action_name, action_kwargs=action_kwargs, goal_uuid=req.job_id, server_info=req.server_info) + HostNode.get_instance().send_goal(req.device_id, action_type=action_type, action_name=action_name, action_kwargs=action_args, goal_uuid=req.job_id, server_info=req.server_info) return JobData(jobId=req.job_id) diff --git a/unilabos/app/register.py b/unilabos/app/register.py index 76ad5a5..7d2f23c 100644 --- a/unilabos/app/register.py +++ b/unilabos/app/register.py @@ -13,17 +13,17 @@ def register_devices_and_resources(mqtt_client, lab_registry): """ logger.info("[UniLab Register] 开始注册设备和资源...") - # 注册设备信息 - for device_info in lab_registry.obtain_registry_device_info(): - mqtt_client.publish_registry(device_info["id"], device_info, False) - logger.debug(f"[UniLab Register] 注册设备: {device_info['id']}") - - # 注册资源信息 - for resource_info in lab_registry.obtain_registry_resource_info(): - mqtt_client.publish_registry(resource_info["id"], resource_info, False) - logger.debug(f"[UniLab Register] 注册资源: {resource_info['id']}") - - time.sleep(10) + # # 注册设备信息 + # for device_info in lab_registry.obtain_registry_device_info(): + # mqtt_client.publish_registry(device_info["id"], device_info, False) + # logger.debug(f"[UniLab Register] 注册设备: {device_info['id']}") + # + # # 注册资源信息 + # for resource_info in lab_registry.obtain_registry_resource_info(): + # mqtt_client.publish_registry(resource_info["id"], resource_info, False) + # logger.debug(f"[UniLab Register] 注册资源: {resource_info['id']}") + # + # time.sleep(10) logger.info("[UniLab Register] 设备和资源注册完成.") @@ -34,7 +34,7 @@ def main(): """ parser = argparse.ArgumentParser(description="注册设备和资源到 MQTT") parser.add_argument( - "--registry_path", + "--registry", type=str, default=None, action="append", @@ -46,10 +46,16 @@ def main(): default=None, help="配置文件路径,支持.py格式的Python配置文件", ) + parser.add_argument( + "--complete_registry", + action="store_true", + default=False, + help="是否补全注册表", + ) args = parser.parse_args() # 构建注册表 - build_registry(args.registry_path) + build_registry(args.registry, args.complete_registry) load_config_from_file(args.config) from unilabos.app.mq import mqtt_client diff --git a/unilabos/app/web/client.py b/unilabos/app/web/client.py index 09b6ede..9b9446a 100644 --- a/unilabos/app/web/client.py +++ b/unilabos/app/web/client.py @@ -40,6 +40,7 @@ class HTTPClient: Returns: Response: API响应对象 """ + return True response = requests.post( f"{self.remote_addr}/lab/resource/edge/batch_create/?database_process_later={1 if database_process_later else 0}", json=resources, @@ -60,6 +61,7 @@ class HTTPClient: Returns: Response: API响应对象 """ + return True response = requests.post( f"{self.remote_addr}/lab/resource/?database_process_later={1 if database_process_later else 0}", json=resources, diff --git a/unilabos/app/web/utils/action_utils.py b/unilabos/app/web/utils/action_utils.py index be2baa3..233506d 100644 --- a/unilabos/app/web/utils/action_utils.py +++ b/unilabos/app/web/utils/action_utils.py @@ -65,6 +65,8 @@ def get_yaml_from_goal_type(goal_type) -> str: Returns: str: 默认Goal参数的YAML格式字符串 """ + if isinstance(goal_type, str): + return "{}" if not goal_type: return "{}" diff --git a/unilabos/devices/agv/ur_arm_task.py b/unilabos/devices/agv/ur_arm_task.py index 47a7c93..f9d93b0 100644 --- a/unilabos/devices/agv/ur_arm_task.py +++ b/unilabos/devices/agv/ur_arm_task.py @@ -1,9 +1,12 @@ -import rtde_control -import dashboard_client +try: + import rtde_control + import dashboard_client + import rtde_receive +except ImportError as ex: + print("Import Error, Please Install Packages in ur_arm_task.py First!", ex) import time import json from unilabos.devices.agv.robotiq_gripper import RobotiqGripper -import rtde_receive from std_msgs.msg import Float64MultiArray from pydantic import BaseModel diff --git a/unilabos/devices/laiyu_add_solid/laiyu.py b/unilabos/devices/laiyu_add_solid/laiyu.py index 0959f9a..b1cc04a 100644 --- a/unilabos/devices/laiyu_add_solid/laiyu.py +++ b/unilabos/devices/laiyu_add_solid/laiyu.py @@ -234,71 +234,71 @@ class Laiyu: resp_reset = self.reset() return actual_mass_mg +if __name__ == "__main__": + + ''' + 样例:对单个粉筒进行称量 + ''' + + modbus = Laiyu(port="COM25") + + mass_test = modbus.add_powder_tube(1, 'h12', 6.0) + print(f"实际出料质量:{mass_test}mg") -''' -样例:对单个粉筒进行称量 -''' + ''' + 样例: 对一份excel文件记录的化合物进行称量 + ''' -modbus = Laiyu(port="COM25") + excel_file = r"C:\auto\laiyu\test1.xlsx" + # 定义输出文件路径,用于记录实际加样多少 + output_file = r"C:\auto\laiyu\test_output.xlsx" -mass_test = modbus.add_powder_tube(1, 'h12', 6.0) -print(f"实际出料质量:{mass_test}mg") + # 定义物料名称和料筒位置关系 + compound_positions = { + 'XPhos': '1', + 'Cu(OTf)2': '2', + 'CuSO4': '3', + 'PPh3': '4', + } + # read excel file + # excel_file = r"C:\auto\laiyu\test.xlsx" + df = pd.read_excel(excel_file, sheet_name='Sheet1') + # 读取Excel文件中的数据 + # 遍历每一行数据 + for index, row in df.iterrows(): + # 获取物料名称和质量 + copper_name = row['copper'] + copper_mass = row['copper_mass'] + ligand_name = row['ligand'] + ligand_mass = row['ligand_mass'] + target_tube_position = row['position'] + # 获取物料位置 from compound_positions + copper_position = compound_positions.get(copper_name) + ligand_position = compound_positions.get(ligand_name) + # 判断物料位置是否存在 + if copper_position is None: + print(f"物料位置不存在:{copper_name}") + continue + if ligand_position is None: + print(f"物料位置不存在:{ligand_name}") + continue + # 加铜 + copper_actual_mass = modbus.add_powder_tube(int(copper_position), target_tube_position, copper_mass) + time.sleep(1) + # 加配体 + ligand_actual_mass = modbus.add_powder_tube(int(ligand_position), target_tube_position, ligand_mass) + time.sleep(1) + # 保存至df + df.at[index, 'copper_actual_mass'] = copper_actual_mass + df.at[index, 'ligand_actual_mass'] = ligand_actual_mass -''' -样例: 对一份excel文件记录的化合物进行称量 -''' + # 保存修改后的数据到新的Excel文件 + df.to_excel(output_file, index=False) + print(f"已保存到文件:{output_file}") -excel_file = r"C:\auto\laiyu\test1.xlsx" -# 定义输出文件路径,用于记录实际加样多少 -output_file = r"C:\auto\laiyu\test_output.xlsx" - -# 定义物料名称和料筒位置关系 -compound_positions = { - 'XPhos': '1', - 'Cu(OTf)2': '2', - 'CuSO4': '3', - 'PPh3': '4', -} - -# read excel file -# excel_file = r"C:\auto\laiyu\test.xlsx" -df = pd.read_excel(excel_file, sheet_name='Sheet1') -# 读取Excel文件中的数据 -# 遍历每一行数据 -for index, row in df.iterrows(): - # 获取物料名称和质量 - copper_name = row['copper'] - copper_mass = row['copper_mass'] - ligand_name = row['ligand'] - ligand_mass = row['ligand_mass'] - target_tube_position = row['position'] - # 获取物料位置 from compound_positions - copper_position = compound_positions.get(copper_name) - ligand_position = compound_positions.get(ligand_name) - # 判断物料位置是否存在 - if copper_position is None: - print(f"物料位置不存在:{copper_name}") - continue - if ligand_position is None: - print(f"物料位置不存在:{ligand_name}") - continue - # 加铜 - copper_actual_mass = modbus.add_powder_tube(int(copper_position), target_tube_position, copper_mass) - time.sleep(1) - # 加配体 - ligand_actual_mass = modbus.add_powder_tube(int(ligand_position), target_tube_position, ligand_mass) - time.sleep(1) - # 保存至df - df.at[index, 'copper_actual_mass'] = copper_actual_mass - df.at[index, 'ligand_actual_mass'] = ligand_actual_mass - -# 保存修改后的数据到新的Excel文件 -df.to_excel(output_file, index=False) -print(f"已保存到文件:{output_file}") - -# 关闭串口 -modbus.ser.close() -print("串口已关闭") + # 关闭串口 + modbus.ser.close() + print("串口已关闭") diff --git a/unilabos/devices/liquid_handling/revvity.py b/unilabos/devices/liquid_handling/revvity.py index 5f37c45..d080ba0 100644 --- a/unilabos/devices/liquid_handling/revvity.py +++ b/unilabos/devices/liquid_handling/revvity.py @@ -3,7 +3,11 @@ import sys import io # sys.path.insert(0, r'C:\kui\winprep_cli\winprep_c_Uni-lab\x64\Debug') -import winprep_c +try: + import winprep_c +except ImportError as e: + print("Error importing winprep_c:", e) + print("Please ensure that the winprep_c module is correctly installed and accessible.") from queue import Queue diff --git a/unilabos/devices/motor/iCL42.py b/unilabos/devices/motor/iCL42.py index d937865..57bc467 100644 --- a/unilabos/devices/motor/iCL42.py +++ b/unilabos/devices/motor/iCL42.py @@ -21,7 +21,7 @@ except Exception as e: sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", ".."))) from unilabos.utils.pywinauto_util import connect_application, get_process_pid_by_name, get_ui_path_with_window_specification, print_wrapper_identifiers from unilabos.device_comms.universal_driver import UniversalDriver, SingleRunningExecutor - from unilabos.devices.template_driver import universal_driver as ud + from unilabos.device_comms import universal_driver as ud print(f"使用文件DEBUG运行: {e}") diff --git a/unilabos/devices/raman_uv/home_made_raman.py b/unilabos/devices/raman_uv/home_made_raman.py index dcc3b56..64d8319 100644 --- a/unilabos/devices/raman_uv/home_made_raman.py +++ b/unilabos/devices/raman_uv/home_made_raman.py @@ -9,7 +9,7 @@ from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg import time class RamanObj: - def __init__(self, port_laser,port_ccd, baudrate_laser=9600, baudrate_ccd=921600): + def __init__(self, port_laser, port_ccd, baudrate_laser=9600, baudrate_ccd=921600): self.port_laser = port_laser self.port_ccd = port_ccd diff --git a/unilabos/devices/zhida_hplc/zhida.py b/unilabos/devices/zhida_hplc/zhida.py index a6e1f9d..2320dbe 100644 --- a/unilabos/devices/zhida_hplc/zhida.py +++ b/unilabos/devices/zhida_hplc/zhida.py @@ -1,11 +1,9 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -import socket -import json import base64 -import argparse -import sys +import json +import socket import time @@ -96,17 +94,20 @@ class ZhidaClient: def abort(self) -> dict: return self._send_command({"command": "abort"}) -""" -a,b,c -1,2,4 -2,4,5 -""" -client = ZhidaClient() -# 连接 -client.connect() -# 获取状态 -print(client.status) +if __name__ == "__main__": + + """ + a,b,c + 1,2,4 + 2,4,5 + """ + + client = ZhidaClient() + # 连接 + client.connect() + # 获取状态 + print(client.status) -# 命令格式:python zhida.py [options] + # 命令格式:python zhida.py [options] diff --git a/unilabos/registry/device_comms/modbus_ioboard.yaml b/unilabos/registry/device_comms/modbus_ioboard.yaml index fcea4d7..1667e21 100644 --- a/unilabos/registry/device_comms/modbus_ioboard.yaml +++ b/unilabos/registry/device_comms/modbus_ioboard.yaml @@ -1,10 +1,10 @@ -io_snrd: - description: IO Board with 16 IOs - class: - module: ilabos.device_comms.SRND_16_IO:SRND_16_IO - type: python - hardware_interface: - name: modbus_client - extra_info: [] - read: read_io_coil - write: write_io_coil \ No newline at end of file +#io_snrd: +# description: IO Board with 16 IOs +# class: +# module: unilabos.device_comms.SRND_16_IO:SRND_16_IO +# type: python +# hardware_interface: +# name: modbus_client +# extra_info: [] +# read: read_io_coil +# write: write_io_coil \ No newline at end of file diff --git a/unilabos/registry/device_comms/serial.yaml b/unilabos/registry/device_comms/serial.yaml index 86cf7e5..3ed9b6b 100644 --- a/unilabos/registry/device_comms/serial.yaml +++ b/unilabos/registry/device_comms/serial.yaml @@ -1,7 +1,117 @@ serial: - description: Serial communication interface, used when sharing same serial port for multiple devices class: + action_value_mappings: + auto-handle_serial_request: + feedback: {} + goal: {} + goal_default: + request: null + response: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand handle_serial_request 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand handle_serial_request 的参数schema + properties: + request: + description: '参数: request' + type: string + response: + description: '参数: response' + type: string + required: + - request + - response + type: object + result: {} + required: + - goal + title: handle_serial_request 命令参数 + type: object + type: UniLabJsonCommand + auto-read_data: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand read_data 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand read_data 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: read_data 命令参数 + type: object + type: UniLabJsonCommand + auto-send_command: + feedback: {} + goal: {} + goal_default: + command: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand send_command 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand send_command 的参数schema + properties: + command: + description: '参数: command' + type: string + required: + - command + type: object + result: {} + required: + - goal + title: send_command 命令参数 + type: object + type: UniLabJsonCommand module: unilabos.ros.nodes.presets.serial_node:ROS2SerialNode + status_types: {} type: ros2 - schema: - properties: {} \ No newline at end of file + description: Serial communication interface, used when sharing same serial port + for multiple devices + handles: [] + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + baudrate: + default: 9600 + description: '参数: baudrate' + type: integer + device_id: + description: '参数: device_id' + type: string + port: + description: '参数: port' + type: string + resource_tracker: + description: '参数: resource_tracker' + type: string + required: + - device_id + - port + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object diff --git a/unilabos/registry/devices/characterization_optic.yaml b/unilabos/registry/devices/characterization_optic.yaml index 52ffc87..e69de29 100644 --- a/unilabos/registry/devices/characterization_optic.yaml +++ b/unilabos/registry/devices/characterization_optic.yaml @@ -1,67 +0,0 @@ -# 光学表征设备:红外、紫外可见、拉曼等 -raman_home_made: - description: Raman spectroscopy device - class: - module: unilabos.devices.raman_uv.home_made_raman:RamanObj - type: python - status_types: - status: String - action_value_mappings: - raman_cmd: - type: SendCmd - goal: - command: command - feedback: {} - result: - success: success - schema: - properties: - status: - type: string - required: - - status - additionalProperties: false - type: object -hplc.agilent: - description: HPLC device - class: - module: unilabos.devices.hplc.AgilentHPLC:HPLCDriver - type: python - status_types: - device_status: String - could_run: Bool - driver_init_ok: Bool - is_running: Bool - finish_status: String - status_text: String - action_value_mappings: - execute_command_from_outer: - type: SendCmd - goal: - command: command - feedback: {} - result: - success: success - schema: - properties: - device_status: - type: string - could_run: - type: boolean - driver_init_ok: - type: boolean - is_running: - type: boolean - finish_status: - type: string - status_text: - type: string - required: - - device_status - - could_run - - driver_init_ok - - is_running - - finish_status - - status_text - additionalProperties: false - type: object diff --git a/unilabos/registry/devices/hotel.yaml b/unilabos/registry/devices/hotel.yaml index 0f92511..6429f01 100644 --- a/unilabos/registry/devices/hotel.yaml +++ b/unilabos/registry/devices/hotel.yaml @@ -1,9 +1,55 @@ hotel.thermo_orbitor_rs2_hotel: - description: Thermo Orbitor RS2 Hotel - class: + class: + action_value_mappings: + auto-get_rotation: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_rotation 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_rotation 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_rotation 命令参数 + type: object + type: UniLabJsonCommand module: unilabos.devices.resource_container.container:HotelContainer + status_types: {} type: python + description: Thermo Orbitor RS2 Hotel + handles: [] + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + device_config: + description: '参数: device_config' + type: object + rotation: + description: '参数: rotation' + type: object + required: + - rotation + - device_config + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object model: - type: device mesh: thermo_orbitor_rs2_hotel - + type: device diff --git a/unilabos/registry/devices/laiyu_add_solid.yaml b/unilabos/registry/devices/laiyu_add_solid.yaml index 3554023..8e1e7be 100644 --- a/unilabos/registry/devices/laiyu_add_solid.yaml +++ b/unilabos/registry/devices/laiyu_add_solid.yaml @@ -1,56 +1,608 @@ laiyu_add_solid: - description: Laiyu Add Solid class: - module: unilabos.devices.laiyu_add_solid.laiyu:Laiyu - type: python - status_types: {} action_value_mappings: + add_powder_tube: + feedback: {} + goal: + compound_mass: compound_mass + powder_tube_number: powder_tube_number + target_tube_position: target_tube_position + goal_default: + compound_mass: 0.0 + powder_tube_number: 0 + target_tube_position: '' + handles: [] + result: + actual_mass_mg: actual_mass_mg + schema: + description: ROS Action SolidDispenseAddPowderTube 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: SolidDispenseAddPowderTube_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + compound_mass: + type: number + powder_tube_number: + maximum: 2147483647 + minimum: -2147483648 + type: integer + target_tube_position: + type: string + required: + - powder_tube_number + - target_tube_position + - compound_mass + title: SolidDispenseAddPowderTube_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + actual_mass_mg: + type: number + return_info: + type: string + success: + type: boolean + required: + - return_info + - actual_mass_mg + - success + title: SolidDispenseAddPowderTube_Result + type: object + required: + - goal + title: SolidDispenseAddPowderTube + type: object + type: SolidDispenseAddPowderTube + auto-add_powder_tube: + feedback: {} + goal: {} + goal_default: + compound_mass: null + powder_tube_number: null + target_tube_position: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand add_powder_tube 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand add_powder_tube 的参数schema + properties: + compound_mass: + description: '参数: compound_mass' + type: string + powder_tube_number: + description: '参数: powder_tube_number' + type: string + target_tube_position: + description: '参数: target_tube_position' + type: string + required: + - powder_tube_number + - target_tube_position + - compound_mass + type: object + result: {} + required: + - goal + title: add_powder_tube 命令参数 + type: object + type: UniLabJsonCommand + auto-calculate_crc: + feedback: {} + goal: {} + goal_default: + data: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand calculate_crc 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand calculate_crc 的参数schema + properties: + data: + description: '参数: data' + type: string + required: + - data + type: object + result: {} + required: + - goal + title: calculate_crc 命令参数 + type: object + type: UniLabJsonCommand + auto-discharge: + feedback: {} + goal: {} + goal_default: + float_in: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand discharge 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand discharge 的参数schema + properties: + float_in: + description: '参数: float_in' + type: number + required: + - float_in + type: object + result: {} + required: + - goal + title: discharge 命令参数 + type: object + type: UniLabJsonCommand + auto-move_to_plate: + feedback: {} + goal: {} + goal_default: + string: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand move_to_plate 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand move_to_plate 的参数schema + properties: + string: + description: '参数: string' + type: string + required: + - string + type: object + result: {} + required: + - goal + title: move_to_plate 命令参数 + type: object + type: UniLabJsonCommand + auto-move_to_xyz: + feedback: {} + goal: {} + goal_default: + x: null + y: null + z: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand move_to_xyz 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand move_to_xyz 的参数schema + properties: + x: + description: '参数: x' + type: number + y: + description: '参数: y' + type: number + z: + description: '参数: z' + type: number + required: + - x + - y + - z + type: object + result: {} + required: + - goal + title: move_to_xyz 命令参数 + type: object + type: UniLabJsonCommand + auto-pick_powder_tube: + feedback: {} + goal: {} + goal_default: + int_input: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand pick_powder_tube 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand pick_powder_tube 的参数schema + properties: + int_input: + description: '参数: int_input' + type: integer + required: + - int_input + type: object + result: {} + required: + - goal + title: pick_powder_tube 命令参数 + type: object + type: UniLabJsonCommand + auto-put_powder_tube: + feedback: {} + goal: {} + goal_default: + int_input: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand put_powder_tube 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand put_powder_tube 的参数schema + properties: + int_input: + description: '参数: int_input' + type: integer + required: + - int_input + type: object + result: {} + required: + - goal + title: put_powder_tube 命令参数 + type: object + type: UniLabJsonCommand + auto-reset: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand reset 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand reset 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: reset 命令参数 + type: object + type: UniLabJsonCommand + auto-send_command: + feedback: {} + goal: {} + goal_default: + command: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand send_command 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand send_command 的参数schema + properties: + command: + description: '参数: command' + type: string + required: + - command + type: object + result: {} + required: + - goal + title: send_command 命令参数 + type: object + type: UniLabJsonCommand + discharge: + feedback: {} + goal: + float_input: float_input + goal_default: + float_in: 0.0 + handles: [] + result: {} + schema: + description: ROS Action FloatSingleInput 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: FloatSingleInput_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + float_in: + type: number + required: + - float_in + title: FloatSingleInput_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: FloatSingleInput_Result + type: object + required: + - goal + title: FloatSingleInput + type: object + type: FloatSingleInput + move_to_plate: + feedback: {} + goal: + string: string + goal_default: + string: '' + handles: [] + result: {} + schema: + description: ROS Action StrSingleInput 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: StrSingleInput_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + string: + type: string + required: + - string + title: StrSingleInput_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: StrSingleInput_Result + type: object + required: + - goal + title: StrSingleInput + type: object + type: StrSingleInput move_to_xyz: - type: Point3DSeparateInput + feedback: {} goal: x: x y: y z: z - feedback: {} + goal_default: + x: 0.0 + y: 0.0 + z: 0.0 + handles: [] result: {} + schema: + description: ROS Action Point3DSeparateInput 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: Point3DSeparateInput_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point3DSeparateInput_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: Point3DSeparateInput_Result + type: object + required: + - goal + title: Point3DSeparateInput + type: object + type: Point3DSeparateInput pick_powder_tube: - type: IntSingleInput + feedback: {} goal: int_input: int_input - feedback: {} + goal_default: + int_input: 0 + handles: [] result: {} + schema: + description: ROS Action IntSingleInput 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: IntSingleInput_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + int_input: + maximum: 2147483647 + minimum: -2147483648 + type: integer + required: + - int_input + title: IntSingleInput_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: IntSingleInput_Result + type: object + required: + - goal + title: IntSingleInput + type: object + type: IntSingleInput put_powder_tube: - type: IntSingleInput + feedback: {} goal: int_input: int_input - feedback: {} + goal_default: + int_input: 0 + handles: [] result: {} + schema: + description: ROS Action IntSingleInput 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: IntSingleInput_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + int_input: + maximum: 2147483647 + minimum: -2147483648 + type: integer + required: + - int_input + title: IntSingleInput_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: IntSingleInput_Result + type: object + required: + - goal + title: IntSingleInput + type: object + type: IntSingleInput reset: - type: EmptyIn + feedback: {} goal: {} - feedback: {} + goal_default: {} + handles: [] result: {} - add_powder_tube: - type: SolidDispenseAddPowderTube - goal: - powder_tube_number: powder_tube_number - target_tube_position: target_tube_position - compound_mass: compound_mass - feedback: {} - result: - actual_mass_mg: actual_mass_mg - move_to_plate: - type: StrSingleInput - goal: - string: string - feedback: {} - result: {} - discharge: - type: FloatSingleInput - goal: - float_input: float_input - feedback: {} - result: {} - - schema: - properties: {} \ No newline at end of file + schema: + description: ROS Action EmptyIn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: EmptyIn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: {} + required: [] + title: EmptyIn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + required: + - return_info + title: EmptyIn_Result + type: object + required: + - goal + title: EmptyIn + type: object + type: EmptyIn + module: unilabos.devices.laiyu_add_solid.laiyu:Laiyu + status_types: + status: str + type: python + description: Laiyu Add Solid + handles: [] + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + baudrate: + default: 115200 + description: '参数: baudrate' + type: integer + port: + description: '参数: port' + type: string + timeout: + default: 0.5 + description: '参数: timeout' + type: number + required: + - port + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object diff --git a/unilabos/registry/devices/liquid_handler.yaml b/unilabos/registry/devices/liquid_handler.yaml index bb94b59..6fdb6e5 100644 --- a/unilabos/registry/devices/liquid_handler.yaml +++ b/unilabos/registry/devices/liquid_handler.yaml @@ -1,461 +1,5452 @@ 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 - status_types: - name: String action_value_mappings: - remove: - type: LiquidHandlerRemove - goal: - vols: vols - sources: sources - waste_liquid: waste_liquid - use_channels: use_channels - flow_rates: flow_rates - offsets: offsets - liquid_height: liquid_height - blow_out_air_volume: blow_out_air_volume - spread: spread - delays: delays - is_96_well: is_96_well - top: top - none_keys: none_keys - feedback: {} - result: {} add_liquid: - type: LiquidHandlerAdd + feedback: {} goal: asp_vols: asp_vols + blow_out_air_volume: blow_out_air_volume dis_vols: dis_vols + flow_rates: flow_rates + is_96_well: is_96_well + liquid_height: liquid_height + mix_liquid_height: mix_liquid_height + mix_rate: mix_rate + mix_time: mix_time + mix_vol: mix_vol + none_keys: none_keys + offsets: offsets reagent_sources: reagent_sources + spread: spread targets: targets use_channels: use_channels - flow_rates: flow_rates - offsets: offsets - liquid_height: liquid_height - blow_out_air_volume: blow_out_air_volume - spread: spread - is_96_well: is_96_well - mix_time: mix_time - mix_vol: mix_vol - mix_rate: mix_rate - mix_liquid_height: mix_liquid_height - none_keys: none_keys - 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: {} - mix: - type: LiquidHandlerMix - goal: - targets: targets - mix_time: mix_time - mix_vol: mix_vol - height_to_bottom: height_to_bottom - offsets: offsets - mix_rate: mix_rate - none_keys: none_keys - feedback: {} - result: {} - move_to: - type: LiquidHandlerMoveTo - goal: - well: well - dis_to_top: dis_to_top - channel: channel - feedback: {} + goal_default: + asp_vols: + - 0.0 + blow_out_air_volume: + - 0.0 + dis_vols: + - 0.0 + flow_rates: + - 0.0 + is_96_well: false + liquid_height: + - 0.0 + mix_liquid_height: 0.0 + mix_rate: 0 + mix_time: 0 + mix_vol: 0 + none_keys: + - '' + offsets: + - x: 0.0 + y: 0.0 + z: 0.0 + reagent_sources: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + spread: '' + targets: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + use_channels: + - 0 + handles: [] result: {} + schema: + description: ROS Action LiquidHandlerAdd 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerAdd_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + asp_vols: + items: + type: number + type: array + blow_out_air_volume: + items: + type: number + type: array + dis_vols: + items: + type: number + type: array + flow_rates: + items: + type: number + type: array + is_96_well: + type: boolean + liquid_height: + items: + type: number + type: array + mix_liquid_height: + type: number + mix_rate: + maximum: 2147483647 + minimum: -2147483648 + type: integer + mix_time: + maximum: 2147483647 + minimum: -2147483648 + type: integer + mix_vol: + maximum: 2147483647 + minimum: -2147483648 + type: integer + none_keys: + items: + type: string + type: array + offsets: + items: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + type: array + reagent_sources: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + spread: + type: string + targets: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + use_channels: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + required: + - asp_vols + - dis_vols + - reagent_sources + - targets + - use_channels + - flow_rates + - offsets + - liquid_height + - blow_out_air_volume + - spread + - is_96_well + - mix_time + - mix_vol + - mix_rate + - mix_liquid_height + - none_keys + title: LiquidHandlerAdd_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerAdd_Result + type: object + required: + - goal + title: LiquidHandlerAdd + type: object + type: LiquidHandlerAdd aspirate: - type: LiquidHandlerAspirate + feedback: {} goal: - resources: resources - vols: vols - use_channels: use_channels - flow_rates: flow_rates + blow_out_air_volume: blow_out_air_volume end_delay: end_delay - offsets: offsets + flow_rates: flow_rates liquid_height: liquid_height - blow_out_air_volume: blow_out_air_volume - feedback: {} - result: - name: name - discard_tips: - type: LiquidHandlerDiscardTips - goal: - use_channels: use_channels - feedback: {} - result: - name: name - dispense: - type: LiquidHandlerDispense - goal: + offsets: offsets resources: resources - vols: vols use_channels: use_channels + vols: vols + goal_default: + blow_out_air_volume: + - 0.0 + flow_rates: + - 0.0 + liquid_height: + - 0.0 + offsets: + - x: 0.0 + y: 0.0 + z: 0.0 + resources: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + spread: '' + use_channels: + - 0 + vols: + - 0.0 + handles: [] + result: + name: name + schema: + description: ROS Action LiquidHandlerAspirate 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerAspirate_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + blow_out_air_volume: + items: + type: number + type: array + flow_rates: + items: + type: number + type: array + liquid_height: + items: + type: number + type: array + offsets: + items: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + type: array + resources: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + spread: + type: string + use_channels: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + vols: + items: + type: number + type: array + required: + - resources + - vols + - use_channels + - flow_rates + - offsets + - liquid_height + - blow_out_air_volume + - spread + title: LiquidHandlerAspirate_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerAspirate_Result + type: object + required: + - goal + title: LiquidHandlerAspirate + type: object + type: LiquidHandlerAspirate + auto-iter_tips: + feedback: {} + goal: {} + goal_default: + tip_racks: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand iter_tips 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand iter_tips 的参数schema + properties: + tip_racks: + description: '参数: tip_racks' + type: string + required: + - tip_racks + type: object + result: {} + required: + - goal + title: iter_tips 命令参数 + type: object + type: UniLabJsonCommand + auto-set_tiprack: + feedback: {} + goal: {} + goal_default: + tip_racks: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_tiprack 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_tiprack 的参数schema + properties: + tip_racks: + description: '参数: tip_racks' + type: string + required: + - tip_racks + type: object + result: {} + required: + - goal + title: set_tiprack 命令参数 + type: object + type: UniLabJsonCommand + discard_tips: + feedback: {} + goal: + use_channels: use_channels + goal_default: + use_channels: + - 0 + handles: [] + result: + name: name + schema: + description: ROS Action LiquidHandlerDiscardTips 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerDiscardTips_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + use_channels: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + required: + - use_channels + title: LiquidHandlerDiscardTips_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerDiscardTips_Result + type: object + required: + - goal + title: LiquidHandlerDiscardTips + type: object + type: LiquidHandlerDiscardTips + dispense: + feedback: {} + goal: + blow_out_air_volume: blow_out_air_volume flow_rates: flow_rates offsets: offsets - blow_out_air_volume: blow_out_air_volume + resources: resources spread: spread - feedback: {} + use_channels: use_channels + vols: vols + goal_default: + blow_out_air_volume: + - 0 + flow_rates: + - 0.0 + offsets: + - x: 0.0 + y: 0.0 + z: 0.0 + resources: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + spread: '' + use_channels: + - 0 + vols: + - 0.0 + handles: [] result: name: name + schema: + description: ROS Action LiquidHandlerDispense 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerDispense_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + blow_out_air_volume: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + flow_rates: + items: + type: number + type: array + offsets: + items: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + type: array + resources: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + spread: + type: string + use_channels: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + vols: + items: + type: number + type: array + required: + - resources + - vols + - use_channels + - flow_rates + - offsets + - blow_out_air_volume + - spread + title: LiquidHandlerDispense_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerDispense_Result + type: object + required: + - goal + title: LiquidHandlerDispense + type: object + type: LiquidHandlerDispense drop_tips: + feedback: {} + goal: + allow_nonzero_volume: allow_nonzero_volume + offsets: offsets + tip_spots: tip_spots + use_channels: use_channels + goal_default: + allow_nonzero_volume: false + offsets: + - x: 0.0 + y: 0.0 + z: 0.0 + tip_spots: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + use_channels: + - 0 + handles: [] + result: + name: name + schema: + description: ROS Action LiquidHandlerDropTips 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerDropTips_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + allow_nonzero_volume: + type: boolean + offsets: + items: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + type: array + tip_spots: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + use_channels: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + required: + - tip_spots + - use_channels + - offsets + - allow_nonzero_volume + title: LiquidHandlerDropTips_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerDropTips_Result + type: object + required: + - goal + title: LiquidHandlerDropTips + type: object type: LiquidHandlerDropTips - goal: - tip_spots: tip_spots - use_channels: use_channels - offsets: offsets - allow_nonzero_volume: allow_nonzero_volume - feedback: {} - result: - name: name drop_tips96: - type: LiquidHandlerDropTips96 + feedback: {} goal: - tip_rack: tip_rack - offset: offset allow_nonzero_volume: allow_nonzero_volume - feedback: {} + offset: offset + tip_rack: tip_rack + goal_default: + allow_nonzero_volume: false + offset: + x: 0.0 + y: 0.0 + z: 0.0 + tip_rack: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + handles: [] result: name: name + schema: + description: ROS Action LiquidHandlerDropTips96 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerDropTips96_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + allow_nonzero_volume: + type: boolean + offset: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + tip_rack: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + required: + - tip_rack + - offset + - allow_nonzero_volume + title: LiquidHandlerDropTips96_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerDropTips96_Result + type: object + required: + - goal + title: LiquidHandlerDropTips96 + type: object + type: LiquidHandlerDropTips96 + mix: + feedback: {} + goal: + height_to_bottom: height_to_bottom + mix_rate: mix_rate + mix_time: mix_time + mix_vol: mix_vol + none_keys: none_keys + offsets: offsets + targets: targets + goal_default: + height_to_bottom: 0.0 + mix_rate: 0.0 + mix_time: 0 + mix_vol: 0 + none_keys: + - '' + offsets: + - x: 0.0 + y: 0.0 + z: 0.0 + targets: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + handles: [] + result: {} + schema: + description: ROS Action LiquidHandlerMix 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerMix_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + height_to_bottom: + type: number + mix_rate: + type: number + mix_time: + maximum: 2147483647 + minimum: -2147483648 + type: integer + mix_vol: + maximum: 2147483647 + minimum: -2147483648 + type: integer + none_keys: + items: + type: string + type: array + offsets: + items: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + type: array + targets: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + required: + - targets + - mix_time + - mix_vol + - height_to_bottom + - offsets + - mix_rate + - none_keys + title: LiquidHandlerMix_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerMix_Result + type: object + required: + - goal + title: LiquidHandlerMix + type: object + type: LiquidHandlerMix move_lid: - type: LiquidHandlerMoveLid + feedback: {} goal: + destination_offset: destination_offset + drop_direction: drop_direction + get_direction: get_direction + intermediate_locations: intermediate_locations lid: lid - to: to - intermediate_locations: intermediate_locations - resource_offset: resource_offset - destination_offset: destination_offset pickup_direction: pickup_direction - drop_direction: drop_direction - get_direction: get_direction - put_direction: put_direction pickup_distance_from_top: pickup_distance_from_top - feedback: {} + put_direction: put_direction + resource_offset: resource_offset + to: to + goal_default: + destination_offset: + x: 0.0 + y: 0.0 + z: 0.0 + drop_direction: '' + get_direction: '' + intermediate_locations: + - x: 0.0 + y: 0.0 + z: 0.0 + lid: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + pickup_direction: '' + pickup_distance_from_top: 0.0 + put_direction: '' + resource_offset: + x: 0.0 + y: 0.0 + z: 0.0 + to: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + handles: [] result: name: name + schema: + description: ROS Action LiquidHandlerMoveLid 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerMoveLid_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + destination_offset: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + drop_direction: + type: string + get_direction: + type: string + intermediate_locations: + items: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + type: array + lid: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + pickup_direction: + type: string + pickup_distance_from_top: + type: number + put_direction: + type: string + resource_offset: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + to: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + required: + - lid + - to + - intermediate_locations + - resource_offset + - destination_offset + - pickup_direction + - drop_direction + - get_direction + - put_direction + - pickup_distance_from_top + title: LiquidHandlerMoveLid_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerMoveLid_Result + type: object + required: + - goal + title: LiquidHandlerMoveLid + type: object + type: LiquidHandlerMoveLid move_plate: - type: LiquidHandlerMovePlate + feedback: {} goal: - plate: plate - to: to + destination_offset: destination_offset + drop_direction: drop_direction + get_direction: get_direction intermediate_locations: intermediate_locations - resource_offset: resource_offset + pickup_direction: pickup_direction pickup_offset: pickup_offset - destination_offset: destination_offset - pickup_direction: pickup_direction - drop_direction: drop_direction - get_direction: get_direction + plate: plate put_direction: put_direction - feedback: {} - result: - name: name - move_resource: - type: LiquidHandlerMoveResource - goal: - resource: resource - to: to - intermediate_locations: intermediate_locations resource_offset: resource_offset - destination_offset: destination_offset - pickup_distance_from_top: pickup_distance_from_top - pickup_direction: pickup_direction - drop_direction: drop_direction - get_direction: get_direction - put_direction: put_direction - feedback: {} + to: to + goal_default: + destination_offset: + x: 0.0 + y: 0.0 + z: 0.0 + drop_direction: '' + get_direction: '' + intermediate_locations: + - x: 0.0 + y: 0.0 + z: 0.0 + pickup_direction: '' + pickup_distance_from_top: 0.0 + pickup_offset: + x: 0.0 + y: 0.0 + z: 0.0 + plate: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + put_direction: '' + resource_offset: + x: 0.0 + y: 0.0 + z: 0.0 + to: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + handles: [] result: name: name - pick_up_tips: - type: LiquidHandlerPickUpTips + schema: + description: ROS Action LiquidHandlerMovePlate 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerMovePlate_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + destination_offset: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + drop_direction: + type: string + get_direction: + type: string + intermediate_locations: + items: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + type: array + pickup_direction: + type: string + pickup_distance_from_top: + type: number + pickup_offset: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + plate: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + put_direction: + type: string + resource_offset: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + to: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + required: + - plate + - to + - intermediate_locations + - resource_offset + - pickup_offset + - destination_offset + - pickup_direction + - drop_direction + - get_direction + - put_direction + - pickup_distance_from_top + title: LiquidHandlerMovePlate_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerMovePlate_Result + type: object + required: + - goal + title: LiquidHandlerMovePlate + type: object + type: LiquidHandlerMovePlate + move_resource: + feedback: {} goal: + destination_offset: destination_offset + drop_direction: drop_direction + get_direction: get_direction + intermediate_locations: intermediate_locations + pickup_direction: pickup_direction + pickup_distance_from_top: pickup_distance_from_top + put_direction: put_direction + resource: resource + resource_offset: resource_offset + to: to + goal_default: + destination_offset: + x: 0.0 + y: 0.0 + z: 0.0 + drop_direction: '' + get_direction: '' + intermediate_locations: + - x: 0.0 + y: 0.0 + z: 0.0 + pickup_direction: '' + pickup_distance_from_top: 0.0 + put_direction: '' + resource: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + resource_offset: + x: 0.0 + y: 0.0 + z: 0.0 + to: + x: 0.0 + y: 0.0 + z: 0.0 + handles: [] + result: + name: name + schema: + description: ROS Action LiquidHandlerMoveResource 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerMoveResource_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + destination_offset: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + drop_direction: + type: string + get_direction: + type: string + intermediate_locations: + items: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + type: array + pickup_direction: + type: string + pickup_distance_from_top: + type: number + put_direction: + type: string + resource: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + resource_offset: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + to: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - resource + - to + - intermediate_locations + - resource_offset + - destination_offset + - pickup_distance_from_top + - pickup_direction + - drop_direction + - get_direction + - put_direction + title: LiquidHandlerMoveResource_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerMoveResource_Result + type: object + required: + - goal + title: LiquidHandlerMoveResource + type: object + type: LiquidHandlerMoveResource + move_to: + feedback: {} + goal: + channel: channel + dis_to_top: dis_to_top + well: well + goal_default: + channel: 0 + dis_to_top: 0.0 + well: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + handles: [] + result: {} + schema: + description: ROS Action LiquidHandlerMoveTo 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerMoveTo_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + channel: + maximum: 2147483647 + minimum: -2147483648 + type: integer + dis_to_top: + type: number + well: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + required: + - well + - dis_to_top + - channel + title: LiquidHandlerMoveTo_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerMoveTo_Result + type: object + required: + - goal + title: LiquidHandlerMoveTo + type: object + type: LiquidHandlerMoveTo + pick_up_tips: + feedback: {} + goal: + offsets: offsets tip_spots: tip_spots use_channels: use_channels - offsets: offsets - feedback: {} + goal_default: + offsets: + - x: 0.0 + y: 0.0 + z: 0.0 + tip_spots: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + use_channels: + - 0 + handles: [] result: name: name + schema: + description: ROS Action LiquidHandlerPickUpTips 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerPickUpTips_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + offsets: + items: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + type: array + tip_spots: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + use_channels: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + required: + - tip_spots + - use_channels + - offsets + title: LiquidHandlerPickUpTips_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerPickUpTips_Result + type: object + required: + - goal + title: LiquidHandlerPickUpTips + type: object + type: LiquidHandlerPickUpTips pick_up_tips96: - type: LiquidHandlerPickUpTips96 + feedback: {} goal: - tip_rack: tip_rack offset: offset - feedback: {} + tip_rack: tip_rack + goal_default: + offset: + x: 0.0 + y: 0.0 + z: 0.0 + tip_rack: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + handles: [] result: name: name - return_tips: - type: LiquidHandlerReturnTips + schema: + description: ROS Action LiquidHandlerPickUpTips96 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerPickUpTips96_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + offset: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + tip_rack: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + required: + - tip_rack + - offset + title: LiquidHandlerPickUpTips96_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerPickUpTips96_Result + type: object + required: + - goal + title: LiquidHandlerPickUpTips96 + type: object + type: LiquidHandlerPickUpTips96 + remove: + feedback: {} goal: + blow_out_air_volume: blow_out_air_volume + delays: delays + flow_rates: flow_rates + is_96_well: is_96_well + liquid_height: liquid_height + none_keys: none_keys + offsets: offsets + sources: sources + spread: spread + top: top use_channels: use_channels - allow_nonzero_volume: allow_nonzero_volume + vols: vols + waste_liquid: waste_liquid + goal_default: + blow_out_air_volume: + - 0.0 + delays: + - 0 + flow_rates: + - 0.0 + is_96_well: false + liquid_height: + - 0.0 + none_keys: + - '' + offsets: + - x: 0.0 + y: 0.0 + z: 0.0 + sources: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + spread: '' + top: + - 0.0 + use_channels: + - 0 + vols: + - 0.0 + waste_liquid: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + handles: [] + result: {} + schema: + description: ROS Action LiquidHandlerRemove 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerRemove_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + blow_out_air_volume: + items: + type: number + type: array + delays: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + flow_rates: + items: + type: number + type: array + is_96_well: + type: boolean + liquid_height: + items: + type: number + type: array + none_keys: + items: + type: string + type: array + offsets: + items: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + type: array + sources: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + spread: + type: string + top: + items: + type: number + type: array + use_channels: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + vols: + items: + type: number + type: array + waste_liquid: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + required: + - vols + - sources + - waste_liquid + - use_channels + - flow_rates + - offsets + - liquid_height + - blow_out_air_volume + - spread + - delays + - is_96_well + - top + - none_keys + title: LiquidHandlerRemove_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerRemove_Result + type: object + required: + - goal + title: LiquidHandlerRemove + type: object + type: LiquidHandlerRemove + return_tips: feedback: {} + goal: + allow_nonzero_volume: allow_nonzero_volume + use_channels: use_channels + goal_default: + allow_nonzero_volume: false + use_channels: + - 0 + handles: [] result: name: name + schema: + description: ROS Action LiquidHandlerReturnTips 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerReturnTips_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + allow_nonzero_volume: + type: boolean + use_channels: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + required: + - use_channels + - allow_nonzero_volume + title: LiquidHandlerReturnTips_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerReturnTips_Result + type: object + required: + - goal + title: LiquidHandlerReturnTips + type: object + type: LiquidHandlerReturnTips return_tips96: - type: LiquidHandlerReturnTips96 + feedback: {} goal: allow_nonzero_volume: allow_nonzero_volume - feedback: {} + goal_default: + allow_nonzero_volume: false + handles: [] result: name: name + schema: + description: ROS Action LiquidHandlerReturnTips96 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerReturnTips96_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + allow_nonzero_volume: + type: boolean + required: + - allow_nonzero_volume + title: LiquidHandlerReturnTips96_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerReturnTips96_Result + type: object + required: + - goal + title: LiquidHandlerReturnTips96 + type: object + type: LiquidHandlerReturnTips96 stamp: - type: LiquidHandlerStamp + feedback: {} goal: + aspiration_flow_rate: aspiration_flow_rate + dispense_flow_rate: dispense_flow_rate source: source target: target volume: volume - aspiration_flow_rate: aspiration_flow_rate - dispense_flow_rate: dispense_flow_rate - feedback: {} + goal_default: + aspiration_flow_rate: 0.0 + dispense_flow_rate: 0.0 + source: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + target: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + volume: 0.0 + handles: [] result: name: name + schema: + description: ROS Action LiquidHandlerStamp 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerStamp_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + aspiration_flow_rate: + type: number + dispense_flow_rate: + type: number + source: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + target: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + volume: + type: number + required: + - source + - target + - volume + - aspiration_flow_rate + - dispense_flow_rate + title: LiquidHandlerStamp_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerStamp_Result + type: object + required: + - goal + title: LiquidHandlerStamp + type: object + type: LiquidHandlerStamp transfer: - type: LiquidHandlerTransfer goal: - source: source - targets: targets - source_vol: source_vol - ratios: ratios - 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: - name: - type: string - description: 液体处理仪器当前状态 - required: - - name - additionalProperties: false - -liquid_handler.revvity: - class: - module: unilabos.devices.liquid_handling.revvity:Revvity - type: python - status_types: - status: String - action_value_mappings: - run: - type: WorkStationRun - goal: - wf_name: file_path - params: params - resource: resource - feedback: - 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 + ratios: ratios + source: source + source_vol: source_vol + target_vols: target_vols targets: targets - tip_racks: tip_racks - use_channels: use_channels + goal_default: + asp_flow_rates: + - 0.0 + asp_vols: + - 0.0 + blow_out_air_volume: + - 0.0 + delays: + - 0 + dis_flow_rates: + - 0.0 + dis_vols: + - 0.0 + is_96_well: false + liquid_height: + - 0.0 + mix_liquid_height: 0.0 + mix_rate: 0 + mix_stage: '' + mix_times: + - 0 + mix_vol: 0 + none_keys: + - '' + offsets: + - x: 0.0 + y: 0.0 + z: 0.0 + sources: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + spread: '' + targets: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + tip_racks: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + touch_tip: false + use_channels: + - 0 + handles: [] + schema: + description: ROS Action LiquidHandlerTransfer 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerTransfer_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + asp_flow_rates: + items: + type: number + type: array + asp_vols: + items: + type: number + type: array + blow_out_air_volume: + items: + type: number + type: array + delays: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + dis_flow_rates: + items: + type: number + type: array + dis_vols: + items: + type: number + type: array + is_96_well: + type: boolean + liquid_height: + items: + type: number + type: array + mix_liquid_height: + type: number + mix_rate: + maximum: 2147483647 + minimum: -2147483648 + type: integer + mix_stage: + type: string + mix_times: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + mix_vol: + maximum: 2147483647 + minimum: -2147483648 + type: integer + none_keys: + items: + type: string + type: array + offsets: + items: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + type: array + sources: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + spread: + type: string + targets: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + tip_racks: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + touch_tip: + type: boolean + use_channels: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + required: + - asp_vols + - dis_vols + - sources + - targets + - tip_racks + - use_channels + - asp_flow_rates + - dis_flow_rates + - offsets + - touch_tip + - liquid_height + - blow_out_air_volume + - spread + - is_96_well + - mix_stage + - mix_times + - mix_vol + - mix_rate + - mix_liquid_height + - delays + - none_keys + title: LiquidHandlerTransfer_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerTransfer_Result + type: object + required: + - goal + title: LiquidHandlerTransfer + type: object + type: LiquidHandlerTransfer + transfer_liquid: + feedback: {} + goal: asp_flow_rates: asp_flow_rates - dis_flow_rates: dis_flow_rates - offsets: offsets - touch_tip: touch_tip - liquid_height: liquid_height + asp_vols: asp_vols blow_out_air_volume: blow_out_air_volume - spread: spread + delays: delays + dis_flow_rates: dis_flow_rates + dis_vols: dis_vols is_96_well: is_96_well + liquid_height: liquid_height + mix_liquid_height: mix_liquid_height + mix_rate: mix_rate 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: {} + offsets: offsets + sources: sources + spread: spread + targets: targets + tip_racks: tip_racks + touch_tip: touch_tip + use_channels: use_channels + goal_default: + asp_flow_rates: + - 0.0 + asp_vols: + - 0.0 + blow_out_air_volume: + - 0.0 + delays: + - 0 + dis_flow_rates: + - 0.0 + dis_vols: + - 0.0 + is_96_well: false + liquid_height: + - 0.0 + mix_liquid_height: 0.0 + mix_rate: 0 + mix_stage: '' + mix_times: + - 0 + mix_vol: 0 + none_keys: + - '' + offsets: + - x: 0.0 + y: 0.0 + z: 0.0 + sources: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + spread: '' + targets: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + tip_racks: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + touch_tip: false + use_channels: + - 0 + handles: [] result: {} + schema: + description: ROS Action LiquidHandlerTransfer 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerTransfer_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + asp_flow_rates: + items: + type: number + type: array + asp_vols: + items: + type: number + type: array + blow_out_air_volume: + items: + type: number + type: array + delays: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + dis_flow_rates: + items: + type: number + type: array + dis_vols: + items: + type: number + type: array + is_96_well: + type: boolean + liquid_height: + items: + type: number + type: array + mix_liquid_height: + type: number + mix_rate: + maximum: 2147483647 + minimum: -2147483648 + type: integer + mix_stage: + type: string + mix_times: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + mix_vol: + maximum: 2147483647 + minimum: -2147483648 + type: integer + none_keys: + items: + type: string + type: array + offsets: + items: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + type: array + sources: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + spread: + type: string + targets: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + tip_racks: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + touch_tip: + type: boolean + use_channels: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + required: + - asp_vols + - dis_vols + - sources + - targets + - tip_racks + - use_channels + - asp_flow_rates + - dis_flow_rates + - offsets + - touch_tip + - liquid_height + - blow_out_air_volume + - spread + - is_96_well + - mix_stage + - mix_times + - mix_vol + - mix_rate + - mix_liquid_height + - delays + - none_keys + title: LiquidHandlerTransfer_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerTransfer_Result + type: object + required: + - goal + title: LiquidHandlerTransfer + type: object + type: LiquidHandlerTransfer + module: unilabos.devices.liquid_handling.liquid_handler_abstract:LiquidHandlerAbstract + status_types: + name: String + type: python + description: Liquid handler device controlled by pylabrobot + handles: + input: + - data_key: liquid + data_source: handle + data_type: resource + handler_key: liquid-input + io_type: target + label: Liquid Input + output: + - data_key: liquid + data_source: executor + data_type: resource + handler_key: liquid-output + io_type: source + label: Liquid Output + icon: icon_yiyezhan.webp + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object +liquid_handler.biomek: + class: + action_value_mappings: + create_protocol: + feedback: {} + goal: + none_keys: none_keys + protocol_author: protocol_author + protocol_date: protocol_date + protocol_description: protocol_description + protocol_name: protocol_name + protocol_type: protocol_type + protocol_version: protocol_version + goal_default: + none_keys: + - '' + protocol_author: '' + protocol_date: '' + protocol_description: '' + protocol_name: '' + protocol_type: '' + protocol_version: '' + handles: [] + result: {} + schema: + description: ROS Action LiquidHandlerProtocolCreation 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerProtocolCreation_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + none_keys: + items: + type: string + type: array + protocol_author: + type: string + protocol_date: + type: string + protocol_description: + type: string + protocol_name: + type: string + protocol_type: + type: string + protocol_version: + type: string + required: + - protocol_name + - protocol_description + - protocol_version + - protocol_author + - protocol_date + - protocol_type + - none_keys + title: LiquidHandlerProtocolCreation_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + required: + - return_info + title: LiquidHandlerProtocolCreation_Result + type: object + required: + - goal + title: LiquidHandlerProtocolCreation + type: object + type: LiquidHandlerProtocolCreation + incubation_biomek: + feedback: {} + goal: + time: time + goal_default: + time: 0 handles: input: - - handler_key: liquid-input - label: Liquid Input - data_type: resource - io_type: target - data_source: handle - data_key: liquid + - data_key: liquid + data_source: handle + data_type: resource + handler_key: plate + label: plate output: - - handler_key: liquid-output - label: Liquid Output - data_type: resource - io_type: source - data_source: executor - data_key: liquid - transfer_biomek: - type: LiquidHandlerTransferBiomek + - data_key: liquid + data_source: handle + data_type: resource + handler_key: plate_out + label: plate + result: {} + schema: + description: ROS Action LiquidHandlerIncubateBiomek 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerIncubateBiomek_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + time: + maximum: 2147483647 + minimum: -2147483648 + type: integer + required: + - time + title: LiquidHandlerIncubateBiomek_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerIncubateBiomek_Result + type: object + required: + - goal + title: LiquidHandlerIncubateBiomek + type: object + type: LiquidHandlerIncubateBiomek + move_biomek: + feedback: {} goal: + source: sources + target: targets + goal_default: + sources: '' + targets: '' + handles: + input: + - data_key: liquid + data_source: handle + data_type: resource + handler_key: sources + label: sources + output: + - data_key: liquid + data_source: handle + data_type: resource + handler_key: targets + label: targets + result: + name: name + schema: + description: ROS Action LiquidHandlerMoveBiomek 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerMoveBiomek_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + sources: + type: string + targets: + type: string + required: + - sources + - targets + title: LiquidHandlerMoveBiomek_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerMoveBiomek_Result + type: object + required: + - goal + title: LiquidHandlerMoveBiomek + type: object + type: LiquidHandlerMoveBiomek + oscillation_biomek: + feedback: {} + goal: + rpm: rpm + time: time + goal_default: + rpm: 0 + time: 0 + handles: + input: + - data_key: liquid + data_source: handle + data_type: resource + handler_key: plate + label: plate + output: + - data_key: liquid + data_source: handle + data_type: resource + handler_key: plate_out + label: plate + result: {} + schema: + description: ROS Action LiquidHandlerOscillateBiomek 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerOscillateBiomek_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + rpm: + maximum: 2147483647 + minimum: -2147483648 + type: integer + time: + maximum: 2147483647 + minimum: -2147483648 + type: integer + required: + - rpm + - time + title: LiquidHandlerOscillateBiomek_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerOscillateBiomek_Result + type: object + required: + - goal + title: LiquidHandlerOscillateBiomek + type: object + type: LiquidHandlerOscillateBiomek + run_protocol: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: ROS Action EmptyIn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: EmptyIn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: {} + required: [] + title: EmptyIn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + required: + - return_info + title: EmptyIn_Result + type: object + required: + - goal + title: EmptyIn + type: object + type: EmptyIn + transfer_biomek: + feedback: {} + goal: + aspirate_techniques: aspirate_techniques + dispense_techniques: dispense_techniques sources: sources targets: targets tip_rack: tip_rack volume: volume - aspirate_techniques: aspirate_techniques - dispense_techniques: dispense_techniques - feedback: {} + goal_default: + aspirate_technique: '' + dispense_technique: '' + sources: '' + targets: '' + tip_rack: '' + volume: 0.0 + handles: + input: + - data_key: liquid + data_source: handle + data_type: resource + handler_key: sources + label: sources + - data_key: liquid + data_source: executor + data_type: resource + handler_key: targets + label: targets + - data_key: liquid + data_source: executor + data_type: resource + handler_key: tip_rack + label: tip_rack + output: + - data_key: liquid + data_source: handle + data_type: resource + handler_key: sources_out + label: sources + - data_key: liquid + data_source: executor + data_type: resource + handler_key: targets_out + label: targets result: {} + schema: + description: ROS Action LiquidHandlerTransferBiomek 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerTransferBiomek_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + aspirate_technique: + type: string + dispense_technique: + type: string + sources: + type: string + targets: + type: string + tip_rack: + type: string + volume: + type: number + required: + - sources + - targets + - tip_rack + - volume + - aspirate_technique + - dispense_technique + title: LiquidHandlerTransferBiomek_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerTransferBiomek_Result + type: object + required: + - goal + title: LiquidHandlerTransferBiomek + type: object + type: LiquidHandlerTransferBiomek + transfer_liquid: + feedback: {} + goal: + asp_flow_rates: asp_flow_rates + asp_vols: asp_vols + blow_out_air_volume: blow_out_air_volume + delays: delays + dis_flow_rates: dis_flow_rates + dis_vols: dis_vols + is_96_well: is_96_well + liquid_height: liquid_height + mix_liquid_height: mix_liquid_height + mix_rate: mix_rate + mix_stage: mix_stage + mix_times: mix_times + mix_vol: mix_vol + none_keys: none_keys + offsets: offsets + sources: sources + spread: spread + targets: targets + tip_racks: tip_racks + touch_tip: touch_tip + use_channels: use_channels + goal_default: + asp_flow_rates: + - 0.0 + asp_vols: + - 0.0 + blow_out_air_volume: + - 0.0 + delays: + - 0 + dis_flow_rates: + - 0.0 + dis_vols: + - 0.0 + is_96_well: false + liquid_height: + - 0.0 + mix_liquid_height: 0.0 + mix_rate: 0 + mix_stage: '' + mix_times: + - 0 + mix_vol: 0 + none_keys: + - '' + offsets: + - x: 0.0 + y: 0.0 + z: 0.0 + sources: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + spread: '' + targets: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + tip_racks: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + touch_tip: false + use_channels: + - 0 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 + - data_key: liquid + data_source: handle + data_type: resource + handler_key: liquid-input + io_type: target + label: Liquid Input 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: {} + - data_key: liquid + data_source: executor + data_type: resource + handler_key: liquid-output + io_type: source + label: Liquid Output 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: sources - target: targets - 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: + schema: + description: ROS Action LiquidHandlerTransfer 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerTransfer_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + asp_flow_rates: + items: + type: number + type: array + asp_vols: + items: + type: number + type: array + blow_out_air_volume: + items: + type: number + type: array + delays: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + dis_flow_rates: + items: + type: number + type: array + dis_vols: + items: + type: number + type: array + is_96_well: + type: boolean + liquid_height: + items: + type: number + type: array + mix_liquid_height: + type: number + mix_rate: + maximum: 2147483647 + minimum: -2147483648 + type: integer + mix_stage: + type: string + mix_times: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + mix_vol: + maximum: 2147483647 + minimum: -2147483648 + type: integer + none_keys: + items: + type: string + type: array + offsets: + items: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + type: array + sources: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + spread: + type: string + targets: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + tip_racks: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + touch_tip: + type: boolean + use_channels: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + required: + - asp_vols + - dis_vols + - sources + - targets + - tip_racks + - use_channels + - asp_flow_rates + - dis_flow_rates + - offsets + - touch_tip + - liquid_height + - blow_out_air_volume + - spread + - is_96_well + - mix_stage + - mix_times + - mix_vol + - mix_rate + - mix_liquid_height + - delays + - none_keys + title: LiquidHandlerTransfer_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerTransfer_Result + type: object + required: + - goal + title: LiquidHandlerTransfer + type: object + type: LiquidHandlerTransfer + module: unilabos.devices.liquid_handling.biomek:LiquidHandlerBiomek + status_types: {} + type: python + description: Biomek液体处理器设备,基于pylabrobot控制 + handles: [] + icon: icon_yiyezhan.webp + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object +liquid_handler.revvity: + class: + action_value_mappings: + run: + feedback: + status: status + goal: + params: params + resource: resource + wf_name: file_path + goal_default: + params: '' + resource: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + wf_name: '' + handles: [] + result: + success: success + schema: + description: ROS Action WorkStationRun 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + gantt: + type: string + status: + type: string + required: + - status + - gantt + title: WorkStationRun_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + params: + type: string + resource: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + wf_name: + type: string + required: + - wf_name + - params + - resource + title: WorkStationRun_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: WorkStationRun_Result + type: object + required: + - goal + title: WorkStationRun + type: object + type: WorkStationRun + module: unilabos.devices.liquid_handling.revvity:Revvity + status_types: + status: String + type: python + description: '' + handles: [] + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 type: object - properties: {} - required: [] - additionalProperties: false diff --git a/unilabos/registry/devices/mock_devices.yaml b/unilabos/registry/devices/mock_devices.yaml index 93f52a8..7ec0b60 100644 --- a/unilabos/registry/devices/mock_devices.yaml +++ b/unilabos/registry/devices/mock_devices.yaml @@ -1,892 +1,4157 @@ mock_chiller: - description: Mock Chiller Device class: - module: unilabos.devices.mock.mock_chiller:MockChiller - type: python - status_types: - current_temperature: Float64 - target_temperature: Float64 - status: String - is_cooling: Bool - is_heating: Bool - vessel: String # 新增 - purpose: String # 新增 action_value_mappings: - emergency_stop: - type: EmptyIn + auto-emergency_stop: + feedback: {} goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand emergency_stop 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand emergency_stop 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: emergency_stop 命令参数 + type: object + type: UniLabJsonCommand + auto-get_status_info: feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_status_info 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_status_info 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_status_info 命令参数 + type: object + type: UniLabJsonCommand + auto-heat_chill_start: + feedback: {} + goal: {} + goal_default: + purpose: null + temp: null + vessel: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand heat_chill_start 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand heat_chill_start 的参数schema + properties: + purpose: + description: '参数: purpose' + type: string + temp: + description: '参数: temp' + type: number + vessel: + description: '参数: vessel' + type: string + required: + - vessel + - temp + - purpose + type: object + result: {} + required: + - goal + title: heat_chill_start 命令参数 + type: object + type: UniLabJsonCommand + auto-heat_chill_stop: + feedback: {} + goal: {} + goal_default: + vessel: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand heat_chill_stop 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand heat_chill_stop 的参数schema + properties: + vessel: + description: '参数: vessel' + type: string + required: + - vessel + type: object + result: {} + required: + - goal + title: heat_chill_stop 命令参数 + type: object + type: UniLabJsonCommand + emergency_stop: + feedback: {} + goal: {} + goal_default: {} + handles: [] result: success: success + schema: + description: ROS Action EmptyIn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: EmptyIn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: {} + required: [] + title: EmptyIn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + required: + - return_info + title: EmptyIn_Result + type: object + required: + - goal + title: EmptyIn + type: object + type: EmptyIn heat_chill_start: - type: HeatChillStart + feedback: {} goal: - vessel: vessel - temp: temp purpose: purpose - feedback: {} + temp: temp + vessel: vessel + goal_default: + purpose: '' + temp: 0.0 + vessel: '' + handles: [] result: - success: success status: status + success: success + schema: + description: ROS Action HeatChillStart 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: HeatChillStart_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + purpose: + type: string + temp: + type: number + vessel: + type: string + required: + - vessel + - temp + - purpose + title: HeatChillStart_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: HeatChillStart_Result + type: object + required: + - goal + title: HeatChillStart + type: object + type: HeatChillStart heat_chill_stop: - type: HeatChillStop - goal: - vessel: vessel feedback: {} - result: - success: success - status: status - schema: - type: object - properties: - current_temperature: - type: number - description: Current temperature of the chiller in °C - target_temperature: - type: number - description: Target temperature setting in °C - status: - type: string - description: Current status of the device - is_cooling: - type: boolean - description: Whether the device is actively cooling - is_heating: - type: boolean - description: Whether the device is actively heating - vessel: # 新增 - type: string - description: Current vessel being processed - purpose: # 新增 - type: string - description: Purpose of the current operation - required: - - current_temperature - - target_temperature - - status - - vessel - - purpose - additionalProperties: false -mock_filter: - description: Mock Filter Device - class: - module: unilabos.devices.mock.mock_filter:MockFilter - type: python - status_types: - status: String - is_filtering: Bool - flow_rate: Float64 - pressure_drop: Float64 - filter_life: Float64 - vessel: String - filtrate_vessel: String - filtered_volume: Float64 - progress: Float64 - stir: Bool - stir_speed: Float64 - temperature: Float64 - continue_heatchill: Bool - target_volume: Float64 - action_value_mappings: - filter: - type: Filter goal: vessel: vessel + goal_default: + vessel: '' + handles: [] + result: + status: status + success: success + schema: + description: ROS Action HeatChillStop 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: HeatChillStop_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + vessel: + type: string + required: + - vessel + title: HeatChillStop_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: HeatChillStop_Result + type: object + required: + - goal + title: HeatChillStop + type: object + type: HeatChillStop + module: unilabos.devices.mock.mock_chiller:MockChiller + status_types: + current_temperature: float + is_cooling: bool + is_heating: bool + purpose: str + status: str + target_temperature: float + vessel: str + type: python + description: Mock Chiller Device + handles: [] + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + port: + default: MOCK + description: '参数: port' + type: string + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object +mock_filter: + class: + action_value_mappings: + auto-emergency_stop: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand emergency_stop 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand emergency_stop 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: emergency_stop 命令参数 + type: object + type: UniLabJsonCommand + auto-filter: + feedback: {} + goal: {} + goal_default: + continue_heatchill: false + filtrate_vessel: null + stir: false + stir_speed: 0.0 + temp: 25.0 + vessel: null + volume: 0.0 + handles: [] + result: {} + schema: + description: UniLabJsonCommand filter 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand filter 的参数schema + properties: + continue_heatchill: + default: false + description: '参数: continue_heatchill' + type: boolean + filtrate_vessel: + description: '参数: filtrate_vessel' + type: string + stir: + default: false + description: '参数: stir' + type: boolean + stir_speed: + default: 0.0 + description: '参数: stir_speed' + type: number + temp: + default: 25.0 + description: '参数: temp' + type: number + vessel: + description: '参数: vessel' + type: string + volume: + default: 0.0 + description: '参数: volume' + type: number + required: + - vessel + - filtrate_vessel + type: object + result: {} + required: + - goal + title: filter 命令参数 + type: object + type: UniLabJsonCommand + auto-get_status_info: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_status_info 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_status_info 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_status_info 命令参数 + type: object + type: UniLabJsonCommand + auto-replace_filter: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand replace_filter 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand replace_filter 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: replace_filter 命令参数 + type: object + type: UniLabJsonCommand + auto-stop_filtering: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand stop_filtering 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand stop_filtering 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: stop_filtering 命令参数 + type: object + type: UniLabJsonCommand + filter: + feedback: + current_status: current_status + current_temp: current_temp + filtered_volume: filtered_volume + progress: progress + goal: + continue_heatchill: continue_heatchill filtrate_vessel: filtrate_vessel stir: stir stir_speed: stir_speed temp: temp - continue_heatchill: continue_heatchill + vessel: vessel volume: volume - feedback: - progress: progress - current_temp: current_temp - filtered_volume: filtered_volume - current_status: current_status + goal_default: + continue_heatchill: false + filtrate_vessel: '' + stir: false + stir_speed: 0.0 + temp: 0.0 + vessel: '' + volume: 0.0 + handles: [] result: - success: success message: message - stop_filtering: - type: EmptyIn - goal: {} - feedback: {} - result: success: success + schema: + description: ROS Action Filter 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + current_status: + type: string + current_temp: + type: number + filtered_volume: + type: number + progress: + type: number + required: + - progress + - current_temp + - filtered_volume + - current_status + title: Filter_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + continue_heatchill: + type: boolean + filtrate_vessel: + type: string + stir: + type: boolean + stir_speed: + type: number + temp: + type: number + vessel: + type: string + volume: + type: number + required: + - vessel + - filtrate_vessel + - stir + - stir_speed + - temp + - continue_heatchill + - volume + title: Filter_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: Filter_Result + type: object + required: + - goal + title: Filter + type: object + type: Filter replace_filter: - type: EmptyIn - goal: {} feedback: {} + goal: {} + goal_default: {} + handles: [] result: success: success - schema: - type: object - properties: - status: - type: string - description: Current status of the filter - is_filtering: - type: boolean - description: Whether the filter is actively filtering - flow_rate: - type: number - description: Current flow rate in L/min - pressure_drop: - type: number - description: Pressure drop across the filter in Pa - filter_life: - type: number - description: Remaining filter life percentage - power_on: - type: boolean - description: Power state of the device - required: - - status - - is_filtering - - flow_rate - - filter_life - - vessel - - filtrate_vessel - - filtered_volume - - progress - additionalProperties: false -mock_heater: - description: Mock Heater Device - class: - module: unilabos.devices.mock.mock_heater:MockHeater - type: python + schema: + description: ROS Action EmptyIn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: EmptyIn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: {} + required: [] + title: EmptyIn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + required: + - return_info + title: EmptyIn_Result + type: object + required: + - goal + title: EmptyIn + type: object + type: EmptyIn + stop_filtering: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: + success: success + schema: + description: ROS Action EmptyIn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: EmptyIn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: {} + required: [] + title: EmptyIn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + required: + - return_info + title: EmptyIn_Result + type: object + required: + - goal + title: EmptyIn + type: object + type: EmptyIn + module: unilabos.devices.mock.mock_filter:MockFilter status_types: - current_temperature: Float64 - target_temperature: Float64 - status: String - is_heating: Bool - heating_power: Float64 - max_temperature: Float64 - vessel: String - purpose: String - stir: Bool - stir_speed: Float64 + continue_heatchill: bool + filter_life: float + filtered_volume: float + filtrate_vessel: str + flow_rate: float + is_filtering: bool + pressure_drop: float + progress: float + status: str + stir: bool + stir_speed: float + target_volume: float + temperature: float + vessel: str + type: python + description: Mock Filter Device + handles: [] + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + port: + default: MOCK + description: '参数: port' + type: string + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object +mock_heater: + class: action_value_mappings: - heat_chill_start: - type: HeatChillStart - goal: - vessel: vessel - temp: temp - purpose: purpose - feedback: - status: status - result: - success: success - heat_chill_stop: - type: HeatChillStop - goal: - vessel: vessel - feedback: - status: status + auto-emergency_stop: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand emergency_stop 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand emergency_stop 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: emergency_stop 命令参数 + type: object + type: UniLabJsonCommand + auto-get_status_info: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_status_info 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_status_info 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_status_info 命令参数 + type: object + type: UniLabJsonCommand + auto-heat_chill: + feedback: {} + goal: {} + goal_default: + purpose: Unknown + stir: false + stir_speed: 0.0 + temp: null + time: null + vessel: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand heat_chill 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand heat_chill 的参数schema + properties: + purpose: + default: Unknown + description: '参数: purpose' + type: string + stir: + default: false + description: '参数: stir' + type: boolean + stir_speed: + default: 0.0 + description: '参数: stir_speed' + type: number + temp: + description: '参数: temp' + type: number + time: + description: '参数: time' + type: number + vessel: + description: '参数: vessel' + type: string + required: + - vessel + - temp + - time + type: object + result: {} + required: + - goal + title: heat_chill 命令参数 + type: object + type: UniLabJsonCommand + auto-heat_chill_start: + feedback: {} + goal: {} + goal_default: + purpose: null + temp: null + vessel: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand heat_chill_start 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand heat_chill_start 的参数schema + properties: + purpose: + description: '参数: purpose' + type: string + temp: + description: '参数: temp' + type: number + vessel: + description: '参数: vessel' + type: string + required: + - vessel + - temp + - purpose + type: object + result: {} + required: + - goal + title: heat_chill_start 命令参数 + type: object + type: UniLabJsonCommand + auto-heat_chill_stop: + feedback: {} + goal: {} + goal_default: + vessel: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand heat_chill_stop 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand heat_chill_stop 的参数schema + properties: + vessel: + description: '参数: vessel' + type: string + required: + - vessel + type: object + result: {} + required: + - goal + title: heat_chill_stop 命令参数 + type: object + type: UniLabJsonCommand + auto-set_heating_power: + feedback: {} + goal: {} + goal_default: + power: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_heating_power 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_heating_power 的参数schema + properties: + power: + description: '参数: power' + type: number + required: + - power + type: object + result: {} + required: + - goal + title: set_heating_power 命令参数 + type: object + type: UniLabJsonCommand + auto-set_temperature: + feedback: {} + goal: {} + goal_default: + temperature: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_temperature 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_temperature 的参数schema + properties: + temperature: + description: '参数: temperature' + type: number + required: + - temperature + type: object + result: {} + required: + - goal + title: set_temperature 命令参数 + type: object + type: UniLabJsonCommand + emergency_stop: + feedback: {} + goal: {} + goal_default: {} + handles: [] result: success: success + schema: + description: ROS Action EmptyIn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: EmptyIn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: {} + required: [] + title: EmptyIn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + required: + - return_info + title: EmptyIn_Result + type: object + required: + - goal + title: EmptyIn + type: object + type: EmptyIn heat_chill: - type: HeatChill + feedback: + status: status goal: - vessel: vessel - temp: temp - time: time + purpose: purpose stir: stir stir_speed: stir_speed - purpose: purpose + temp: temp + time: time + vessel: vessel + goal_default: + purpose: '' + stir: false + stir_speed: 0.0 + temp: 0.0 + time: 0.0 + vessel: '' + handles: [] + result: + success: success + schema: + description: ROS Action HeatChill 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: HeatChill_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + purpose: + type: string + stir: + type: boolean + stir_speed: + type: number + temp: + type: number + time: + type: number + vessel: + type: string + required: + - vessel + - temp + - time + - stir + - stir_speed + - purpose + title: HeatChill_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: HeatChill_Result + type: object + required: + - goal + title: HeatChill + type: object + type: HeatChill + heat_chill_start: feedback: status: status - result: - success: success - emergency_stop: - type: EmptyIn - goal: {} - feedback: {} - result: - success: success - schema: - type: object - properties: - current_temperature: - type: number - description: Current temperature of the heater in °C - target_temperature: - type: number - description: Target temperature setting in °C - status: - type: string - description: Current status of the device - is_heating: - type: boolean - description: Whether the device is actively heating - heating_power: - type: number - description: Current heating power percentage - max_temperature: - type: number - description: Maximum temperature limit - vessel: - type: string - description: Current vessel being heated - purpose: - type: string - description: Purpose of the heating operation - stir: - type: boolean - description: Whether stirring is enabled - stir_speed: - type: number - description: Current stirring speed - required: - - current_temperature - - target_temperature - - status - - vessel - - purpose - additionalProperties: false -mock_pump: - description: Mock Pump Device - class: - module: unilabos.devices.mock.mock_pump:MockPump - type: python - status_types: - status: String - pump_state: String - flow_rate: Float64 - target_flow_rate: Float64 - pressure: Float64 - total_volume: Float64 - max_flow_rate: Float64 - max_pressure: Float64 - from_vessel: String - to_vessel: String - transfer_volume: Float64 - amount: String - transfer_time: Float64 - is_viscous: Bool - rinsing_solvent: String - rinsing_volume: Float64 - rinsing_repeats: Int32 - is_solid: Bool - time_spent: Float64 - time_remaining: Float64 - current_device: String - action_value_mappings: - pump_transfer: - type: PumpTransfer - goal: - from_vessel: from_vessel - to_vessel: to_vessel - volume: volume - amount: amount - time: time - viscous: viscous - rinsing_solvent: rinsing_solvent - rinsing_volume: rinsing_volume - rinsing_repeats: rinsing_repeats - solid: solid - feedback: - status: status - current_device: current_device - time_spent: time_spent - time_remaining: time_remaining - result: - success: success - pause_pump: - type: EmptyIn - goal: {} - feedback: {} - result: - success: success - resume_pump: - type: EmptyIn - goal: {} - feedback: {} - result: - success: success - reset_volume_counter: - type: EmptyIn - goal: {} - feedback: {} - result: - success: success - schema: - type: object - properties: - status: - type: string - description: Current status of the pump - pump_state: - type: string - description: Pump operation state (Running/Stopped/Paused) - flow_rate: - type: number - description: Current flow rate in mL/min - target_flow_rate: - type: number - description: Target flow rate in mL/min - pressure: - type: number - description: Current pressure in bar - total_volume: - type: number - description: Total accumulated volume in mL - max_flow_rate: - type: number - description: Maximum flow rate in mL/min - max_pressure: - type: number - description: Maximum pressure in bar - from_vessel: - type: string - description: Source vessel for transfer - to_vessel: - type: string - description: Target vessel for transfer - transfer_volume: - type: number - description: Volume to transfer in mL - amount: - type: string - description: Amount description - transfer_time: - type: number - description: Transfer time in seconds - is_viscous: - type: boolean - description: Whether the liquid is viscous - rinsing_solvent: - type: string - description: Solvent used for rinsing - rinsing_volume: - type: number - description: Volume used for rinsing - rinsing_repeats: - type: integer - description: Number of rinsing cycles - is_solid: - type: boolean - description: Whether transferring solid material - current_device: - type: string - description: Current device identifier - required: - - status - - pump_state - - flow_rate - - from_vessel - - to_vessel - additionalProperties: false -mock_rotavap: - description: Mock Rotavap Device - class: - module: unilabos.devices.mock.mock_rotavap:MockRotavap - type: python - status_types: - status: String - rotate_state: String - rotate_time: Float64 - rotate_speed: Float64 - pump_state: String - pump_time: Float64 - vacuum_level: Float64 - temperature: Float64 - target_temperature: Float64 - success: String - action_value_mappings: - set_timer: - type: StrSingleInput - goal: - string: command - feedback: {} - result: - success: success - set_rotate_time: - type: FloatSingleInput - goal: - float_in: time_seconds - feedback: {} - result: - success: success - set_pump_time: - type: FloatSingleInput - goal: - float_in: time_seconds - feedback: {} - result: - success: success - set_rotate_speed: - type: FloatSingleInput - goal: - float_in: speed - feedback: {} - result: - success: success - set_temperature: - type: FloatSingleInput - goal: - float_in: temperature - feedback: {} - result: - success: success - start_rotation: - type: EmptyIn - goal: {} - feedback: {} - result: - success: success - start_pump: - type: EmptyIn - goal: {} - feedback: {} - result: - success: success - schema: - type: object - properties: - status: - type: string - description: Current status of the rotavap - rotate_state: - type: string - description: Rotation state (Running/Stopped) - rotate_time: - type: number - description: Remaining rotation time in seconds - rotate_speed: - type: number - description: Rotation speed in rpm - pump_state: - type: string - description: Pump state (Running/Stopped) - pump_time: - type: number - description: Remaining pump time in seconds - vacuum_level: - type: number - description: Current vacuum level in mbar - temperature: - type: number - description: Current water bath temperature - target_temperature: - type: number - description: Target water bath temperature - success: - type: string - description: Operation success status - required: - - status - - rotate_time - - pump_time - - temperature - additionalProperties: false -mock_separator: - description: Simplified Mock Separator Device - class: - module: unilabos.devices.mock.mock_separator:MockSeparator - type: python - status_types: - status: String - settling_time: Float64 - valve_state: String - shake_time: Float64 - shake_status: String - current_device: String - purpose: String - product_phase: String - from_vessel: String - separation_vessel: String - to_vessel: String - waste_phase_to_vessel: String - solvent: String - solvent_volume: Float64 - through: String - repeats: Int32 - stir_time: Float64 - stir_speed: Float64 - time_spent: Float64 - time_remaining: Float64 - action_value_mappings: - separate: - type: Separate goal: purpose: purpose - product_phase: product_phase + temp: temp + vessel: vessel + goal_default: + purpose: '' + temp: 0.0 + vessel: '' + handles: [] + result: + success: success + schema: + description: ROS Action HeatChillStart 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: HeatChillStart_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + purpose: + type: string + temp: + type: number + vessel: + type: string + required: + - vessel + - temp + - purpose + title: HeatChillStart_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: HeatChillStart_Result + type: object + required: + - goal + title: HeatChillStart + type: object + type: HeatChillStart + heat_chill_stop: + feedback: + status: status + goal: + vessel: vessel + goal_default: + vessel: '' + handles: [] + result: + success: success + schema: + description: ROS Action HeatChillStop 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: HeatChillStop_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + vessel: + type: string + required: + - vessel + title: HeatChillStop_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: HeatChillStop_Result + type: object + required: + - goal + title: HeatChillStop + type: object + type: HeatChillStop + module: unilabos.devices.mock.mock_heater:MockHeater + status_types: + current_temperature: float + heating_power: float + is_heating: bool + max_temperature: float + purpose: str + status: str + stir: bool + stir_speed: float + target_temperature: float + vessel: str + type: python + description: Mock Heater Device + handles: [] + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + port: + default: MOCK + description: '参数: port' + type: string + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object +mock_pump: + class: + action_value_mappings: + auto-emergency_stop: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand emergency_stop 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand emergency_stop 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: emergency_stop 命令参数 + type: object + type: UniLabJsonCommand + auto-get_status_info: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_status_info 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_status_info 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_status_info 命令参数 + type: object + type: UniLabJsonCommand + auto-pause_pump: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand pause_pump 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand pause_pump 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: pause_pump 命令参数 + type: object + type: UniLabJsonCommand + auto-pump_transfer: + feedback: {} + goal: {} + goal_default: + amount: '' + from_vessel: null + rinsing_repeats: 0 + rinsing_solvent: '' + rinsing_volume: 0.0 + solid: false + time: 0.0 + to_vessel: null + viscous: false + volume: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand pump_transfer 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand pump_transfer 的参数schema + properties: + amount: + default: '' + description: '参数: amount' + type: string + from_vessel: + description: '参数: from_vessel' + type: string + rinsing_repeats: + default: 0 + description: '参数: rinsing_repeats' + type: integer + rinsing_solvent: + default: '' + description: '参数: rinsing_solvent' + type: string + rinsing_volume: + default: 0.0 + description: '参数: rinsing_volume' + type: number + solid: + default: false + description: '参数: solid' + type: boolean + time: + default: 0.0 + description: '参数: time' + type: number + to_vessel: + description: '参数: to_vessel' + type: string + viscous: + default: false + description: '参数: viscous' + type: boolean + volume: + description: '参数: volume' + type: number + required: + - from_vessel + - to_vessel + - volume + type: object + result: {} + required: + - goal + title: pump_transfer 命令参数 + type: object + type: UniLabJsonCommand + auto-reset_volume_counter: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand reset_volume_counter 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand reset_volume_counter 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: reset_volume_counter 命令参数 + type: object + type: UniLabJsonCommand + auto-resume_pump: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand resume_pump 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand resume_pump 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: resume_pump 命令参数 + type: object + type: UniLabJsonCommand + pause_pump: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: + success: success + schema: + description: ROS Action EmptyIn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: EmptyIn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: {} + required: [] + title: EmptyIn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + required: + - return_info + title: EmptyIn_Result + type: object + required: + - goal + title: EmptyIn + type: object + type: EmptyIn + pump_transfer: + feedback: + current_device: current_device + status: status + time_remaining: time_remaining + time_spent: time_spent + goal: + amount: amount from_vessel: from_vessel - separation_vessel: separation_vessel + rinsing_repeats: rinsing_repeats + rinsing_solvent: rinsing_solvent + rinsing_volume: rinsing_volume + solid: solid + time: time to_vessel: to_vessel - waste_phase_to_vessel: waste_phase_to_vessel + viscous: viscous + volume: volume + goal_default: + amount: '' + from_vessel: '' + rinsing_repeats: 0 + rinsing_solvent: '' + rinsing_volume: 0.0 + solid: false + time: 0.0 + to_vessel: '' + viscous: false + volume: 0.0 + handles: [] + result: + success: success + schema: + description: ROS Action PumpTransfer 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + current_device: + type: string + status: + type: string + time_remaining: + properties: + nanosec: + maximum: 4294967295 + minimum: 0 + type: integer + sec: + maximum: 2147483647 + minimum: -2147483648 + type: integer + required: + - sec + - nanosec + title: Duration + type: object + time_spent: + properties: + nanosec: + maximum: 4294967295 + minimum: 0 + type: integer + sec: + maximum: 2147483647 + minimum: -2147483648 + type: integer + required: + - sec + - nanosec + title: Duration + type: object + required: + - status + - current_device + - time_spent + - time_remaining + title: PumpTransfer_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + amount: + type: string + from_vessel: + type: string + rinsing_repeats: + maximum: 2147483647 + minimum: -2147483648 + type: integer + rinsing_solvent: + type: string + rinsing_volume: + type: number + solid: + type: boolean + time: + type: number + to_vessel: + type: string + viscous: + type: boolean + volume: + type: number + required: + - from_vessel + - to_vessel + - volume + - amount + - time + - viscous + - rinsing_solvent + - rinsing_volume + - rinsing_repeats + - solid + title: PumpTransfer_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: PumpTransfer_Result + type: object + required: + - goal + title: PumpTransfer + type: object + type: PumpTransfer + reset_volume_counter: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: + success: success + schema: + description: ROS Action EmptyIn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: EmptyIn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: {} + required: [] + title: EmptyIn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + required: + - return_info + title: EmptyIn_Result + type: object + required: + - goal + title: EmptyIn + type: object + type: EmptyIn + resume_pump: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: + success: success + schema: + description: ROS Action EmptyIn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: EmptyIn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: {} + required: [] + title: EmptyIn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + required: + - return_info + title: EmptyIn_Result + type: object + required: + - goal + title: EmptyIn + type: object + type: EmptyIn + module: unilabos.devices.mock.mock_pump:MockPump + status_types: + amount: str + current_device: str + flow_rate: float + from_vessel: str + is_solid: bool + is_viscous: bool + max_flow_rate: float + max_pressure: float + pressure: float + pump_state: str + rinsing_repeats: int + rinsing_solvent: str + rinsing_volume: float + status: str + target_flow_rate: float + time_remaining: float + time_spent: float + to_vessel: str + total_volume: float + transfer_time: float + transfer_volume: float + type: python + description: Mock Pump Device + handles: [] + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + port: + default: MOCK + description: '参数: port' + type: string + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object +mock_rotavap: + class: + action_value_mappings: + auto-emergency_stop: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand emergency_stop 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand emergency_stop 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: emergency_stop 命令参数 + type: object + type: UniLabJsonCommand + auto-get_status_info: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_status_info 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_status_info 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_status_info 命令参数 + type: object + type: UniLabJsonCommand + auto-set_pump_time: + feedback: {} + goal: {} + goal_default: + time_seconds: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_pump_time 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_pump_time 的参数schema + properties: + time_seconds: + description: '参数: time_seconds' + type: number + required: + - time_seconds + type: object + result: {} + required: + - goal + title: set_pump_time 命令参数 + type: object + type: UniLabJsonCommand + auto-set_rotate_speed: + feedback: {} + goal: {} + goal_default: + speed: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_rotate_speed 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_rotate_speed 的参数schema + properties: + speed: + description: '参数: speed' + type: number + required: + - speed + type: object + result: {} + required: + - goal + title: set_rotate_speed 命令参数 + type: object + type: UniLabJsonCommand + auto-set_rotate_time: + feedback: {} + goal: {} + goal_default: + time_seconds: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_rotate_time 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_rotate_time 的参数schema + properties: + time_seconds: + description: '参数: time_seconds' + type: number + required: + - time_seconds + type: object + result: {} + required: + - goal + title: set_rotate_time 命令参数 + type: object + type: UniLabJsonCommand + auto-set_temperature: + feedback: {} + goal: {} + goal_default: + temperature: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_temperature 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_temperature 的参数schema + properties: + temperature: + description: '参数: temperature' + type: number + required: + - temperature + type: object + result: {} + required: + - goal + title: set_temperature 命令参数 + type: object + type: UniLabJsonCommand + auto-set_timer: + feedback: {} + goal: {} + goal_default: + command: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_timer 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_timer 的参数schema + properties: + command: + description: '参数: command' + type: string + required: + - command + type: object + result: {} + required: + - goal + title: set_timer 命令参数 + type: object + type: UniLabJsonCommand + auto-start_pump: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand start_pump 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand start_pump 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: start_pump 命令参数 + type: object + type: UniLabJsonCommand + auto-start_rotation: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand start_rotation 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand start_rotation 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: start_rotation 命令参数 + type: object + type: UniLabJsonCommand + auto-stop_all_operations: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand stop_all_operations 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand stop_all_operations 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: stop_all_operations 命令参数 + type: object + type: UniLabJsonCommand + set_pump_time: + feedback: {} + goal: + float_in: time_seconds + goal_default: + float_in: 0.0 + handles: [] + result: + success: success + schema: + description: ROS Action FloatSingleInput 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: FloatSingleInput_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + float_in: + type: number + required: + - float_in + title: FloatSingleInput_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: FloatSingleInput_Result + type: object + required: + - goal + title: FloatSingleInput + type: object + type: FloatSingleInput + set_rotate_speed: + feedback: {} + goal: + float_in: speed + goal_default: + float_in: 0.0 + handles: [] + result: + success: success + schema: + description: ROS Action FloatSingleInput 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: FloatSingleInput_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + float_in: + type: number + required: + - float_in + title: FloatSingleInput_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: FloatSingleInput_Result + type: object + required: + - goal + title: FloatSingleInput + type: object + type: FloatSingleInput + set_rotate_time: + feedback: {} + goal: + float_in: time_seconds + goal_default: + float_in: 0.0 + handles: [] + result: + success: success + schema: + description: ROS Action FloatSingleInput 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: FloatSingleInput_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + float_in: + type: number + required: + - float_in + title: FloatSingleInput_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: FloatSingleInput_Result + type: object + required: + - goal + title: FloatSingleInput + type: object + type: FloatSingleInput + set_temperature: + feedback: {} + goal: + float_in: temperature + goal_default: + float_in: 0.0 + handles: [] + result: + success: success + schema: + description: ROS Action FloatSingleInput 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: FloatSingleInput_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + float_in: + type: number + required: + - float_in + title: FloatSingleInput_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: FloatSingleInput_Result + type: object + required: + - goal + title: FloatSingleInput + type: object + type: FloatSingleInput + set_timer: + feedback: {} + goal: + string: command + goal_default: + string: '' + handles: [] + result: + success: success + schema: + description: ROS Action StrSingleInput 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: StrSingleInput_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + string: + type: string + required: + - string + title: StrSingleInput_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: StrSingleInput_Result + type: object + required: + - goal + title: StrSingleInput + type: object + type: StrSingleInput + start_pump: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: + success: success + schema: + description: ROS Action EmptyIn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: EmptyIn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: {} + required: [] + title: EmptyIn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + required: + - return_info + title: EmptyIn_Result + type: object + required: + - goal + title: EmptyIn + type: object + type: EmptyIn + start_rotation: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: + success: success + schema: + description: ROS Action EmptyIn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: EmptyIn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: {} + required: [] + title: EmptyIn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + required: + - return_info + title: EmptyIn_Result + type: object + required: + - goal + title: EmptyIn + type: object + type: EmptyIn + module: unilabos.devices.mock.mock_rotavap:MockRotavap + status_types: + pump_state: str + pump_time: float + rotate_speed: float + rotate_state: str + rotate_time: float + status: str + success: String + target_temperature: float + temperature: float + vacuum_level: float + type: python + description: Mock Rotavap Device + handles: [] + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + port: + default: MOCK + description: '参数: port' + type: string + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object +mock_separator: + class: + action_value_mappings: + auto-get_status_info: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_status_info 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_status_info 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_status_info 命令参数 + type: object + type: UniLabJsonCommand + auto-separate: + feedback: {} + goal: {} + goal_default: + from_vessel: null + product_phase: null + purpose: null + repeats: 1 + separation_vessel: null + settling_time: 60.0 + solvent: '' + solvent_volume: 0.0 + stir_speed: 0.0 + stir_time: 0.0 + through: '' + to_vessel: null + waste_phase_to_vessel: '' + handles: [] + result: {} + schema: + description: UniLabJsonCommand separate 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand separate 的参数schema + properties: + from_vessel: + description: '参数: from_vessel' + type: string + product_phase: + description: '参数: product_phase' + type: string + purpose: + description: '参数: purpose' + type: string + repeats: + default: 1 + description: '参数: repeats' + type: integer + separation_vessel: + description: '参数: separation_vessel' + type: string + settling_time: + default: 60.0 + description: '参数: settling_time' + type: number + solvent: + default: '' + description: '参数: solvent' + type: string + solvent_volume: + default: 0.0 + description: '参数: solvent_volume' + type: number + stir_speed: + default: 0.0 + description: '参数: stir_speed' + type: number + stir_time: + default: 0.0 + description: '参数: stir_time' + type: number + through: + default: '' + description: '参数: through' + type: string + to_vessel: + description: '参数: to_vessel' + type: string + waste_phase_to_vessel: + default: '' + description: '参数: waste_phase_to_vessel' + type: string + required: + - purpose + - product_phase + - from_vessel + - separation_vessel + - to_vessel + type: object + result: {} + required: + - goal + title: separate 命令参数 + type: object + type: UniLabJsonCommand + auto-set_valve: + feedback: {} + goal: {} + goal_default: + command: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_valve 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_valve 的参数schema + properties: + command: + description: '参数: command' + type: string + required: + - command + type: object + result: {} + required: + - goal + title: set_valve 命令参数 + type: object + type: UniLabJsonCommand + auto-shake: + feedback: {} + goal: {} + goal_default: + shake_time: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand shake 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand shake 的参数schema + properties: + shake_time: + description: '参数: shake_time' + type: number + required: + - shake_time + type: object + result: {} + required: + - goal + title: shake 命令参数 + type: object + type: UniLabJsonCommand + auto-stop_operations: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand stop_operations 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand stop_operations 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: stop_operations 命令参数 + type: object + type: UniLabJsonCommand + separate: + feedback: + current_device: current_device + status: status + time_remaining: time_remaining + time_spent: time_spent + goal: + from_vessel: from_vessel + product_phase: product_phase + purpose: purpose + repeats: repeats + separation_vessel: separation_vessel + settling_time: settling_time solvent: solvent solvent_volume: solvent_volume - through: through - repeats: repeats - stir_time: stir_time stir_speed: stir_speed - settling_time: settling_time - feedback: - status: status - current_device: current_device - time_spent: time_spent - time_remaining: time_remaining - result: - success: success - shake: - type: FloatSingleInput - goal: - float_in: shake_time - feedback: - status: status - result: - success: success - stop_operations: - type: EmptyIn - goal: {} - feedback: {} + stir_time: stir_time + through: through + to_vessel: to_vessel + waste_phase_to_vessel: waste_phase_to_vessel + goal_default: + from_vessel: '' + product_phase: '' + purpose: '' + repeats: 0 + separation_vessel: '' + settling_time: 0.0 + solvent: '' + solvent_volume: 0.0 + stir_speed: 0.0 + stir_time: 0.0 + through: '' + to_vessel: '' + waste_phase_to_vessel: '' + handles: [] result: success: success + schema: + description: ROS Action Separate 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + current_device: + type: string + status: + type: string + time_remaining: + properties: + nanosec: + maximum: 4294967295 + minimum: 0 + type: integer + sec: + maximum: 2147483647 + minimum: -2147483648 + type: integer + required: + - sec + - nanosec + title: Duration + type: object + time_spent: + properties: + nanosec: + maximum: 4294967295 + minimum: 0 + type: integer + sec: + maximum: 2147483647 + minimum: -2147483648 + type: integer + required: + - sec + - nanosec + title: Duration + type: object + required: + - status + - current_device + - time_spent + - time_remaining + title: Separate_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + from_vessel: + type: string + product_phase: + type: string + purpose: + type: string + repeats: + maximum: 2147483647 + minimum: -2147483648 + type: integer + separation_vessel: + type: string + settling_time: + type: number + solvent: + type: string + solvent_volume: + type: number + stir_speed: + type: number + stir_time: + type: number + through: + type: string + to_vessel: + type: string + waste_phase_to_vessel: + type: string + required: + - purpose + - product_phase + - from_vessel + - separation_vessel + - to_vessel + - waste_phase_to_vessel + - solvent + - solvent_volume + - through + - repeats + - stir_time + - stir_speed + - settling_time + title: Separate_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: Separate_Result + type: object + required: + - goal + title: Separate + type: object + type: Separate set_valve: - type: StrSingleInput + feedback: {} goal: string: command - feedback: {} + goal_default: + string: '' + handles: [] result: success: success - schema: - type: object - properties: - status: - type: string - description: Current status of the separator - settling_time: - type: number - description: Settling time in seconds - valve_state: - type: string - description: Valve state (Open/Closed) - shake_time: - type: number - description: Remaining shake time in seconds - shake_status: - type: string - description: Current shake state - purpose: - type: string - description: Separation purpose (wash/extract) - product_phase: - type: string - description: Product phase (top/bottom) - from_vessel: - type: string - description: Source vessel - separation_vessel: - type: string - description: Vessel for separation - to_vessel: - type: string - description: Target vessel - required: - - status - - valve_state - - shake_status - - current_device - additionalProperties: false -mock_solenoid_valve: - description: Mock Solenoid Valve Device - class: - module: unilabos.devices.mock.mock_solenoid_valve:MockSolenoidValve - type: python - status_types: - status: String - valve_status: String - action_value_mappings: - set_valve_status: + schema: + description: ROS Action StrSingleInput 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: StrSingleInput_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + string: + type: string + required: + - string + title: StrSingleInput_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: StrSingleInput_Result + type: object + required: + - goal + title: StrSingleInput + type: object type: StrSingleInput - goal: - string: status - feedback: {} - result: - success: success - open_valve: - type: EmptyIn - goal: {} - feedback: {} - result: - success: success - close_valve: - type: EmptyIn - goal: {} - feedback: {} - result: - success: success - schema: - type: object - properties: - status: - type: string - description: Current status of the valve - valve_status: - type: string - description: Valve status (Open/Closed) - required: - - status - - valve_status - additionalProperties: false -mock_stirrer: - description: Mock Stirrer Device - class: - module: unilabos.devices.mock.mock_stirrer:MockStirrer - type: python - status_types: - status: String - stir_speed: Float64 - target_stir_speed: Float64 - stir_state: String - temperature: Float64 - target_temperature: Float64 - heating_state: String - heating_power: Float64 - max_stir_speed: Float64 - max_temperature: Float64 - action_value_mappings: - set_stir_speed: - type: FloatSingleInput - goal: - float_in: speed - feedback: {} - result: - success: success - set_temperature: - type: FloatSingleInput - goal: - float_in: temperature - feedback: {} - result: - success: success - start_stirring: - type: EmptyIn - goal: {} - feedback: {} - result: - success: success - stop_stirring: - type: EmptyIn - goal: {} - feedback: {} - result: - success: success - heating_control: - type: StrSingleInput - goal: - string: heating_state - feedback: {} - result: - success: success - schema: - type: object - properties: - status: - type: string - description: Current status of the stirrer - stir_speed: - type: number - description: Current stirring speed in rpm - target_stir_speed: - type: number - description: Target stirring speed in rpm - stir_state: - type: string - description: Stirring state (Running/Stopped) - temperature: - type: number - description: Current temperature in °C - target_temperature: - type: number - description: Target temperature in °C - heating_state: - type: string - description: Heating state (On/Off) - heating_power: - type: number - description: Current heating power percentage - max_stir_speed: - type: number - description: Maximum stirring speed in rpm - max_temperature: - type: number - description: Maximum temperature in °C - required: - - status - - stir_speed - - temperature - - power_state - additionalProperties: false -mock_stirrer_new: - description: Mock Stirrer Device (Copy Version) - class: - module: unilabos.devices.mock.mock_stirrer_new:MockStirrer_new - type: python - status_types: - status: String - vessel: String - purpose: String - stir_speed: Float64 - target_stir_speed: Float64 - stir_state: String - stir_time: Float64 - settling_time: Float64 - progress: Float64 - max_stir_speed: Float64 - action_value_mappings: - start_stir: - type: StartStir - goal: - vessel: vessel - stir_speed: stir_speed - purpose: purpose - feedback: - progress: progress - current_speed: stir_speed - current_status: status - result: - success: success - message: message - stir: - type: Stir - goal: - stir_time: stir_time - stir_speed: stir_speed - settling_time: settling_time + shake: feedback: status: status + goal: + float_in: shake_time + goal_default: + float_in: 0.0 + handles: [] result: success: success + schema: + description: ROS Action FloatSingleInput 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: FloatSingleInput_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + float_in: + type: number + required: + - float_in + title: FloatSingleInput_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: FloatSingleInput_Result + type: object + required: + - goal + title: FloatSingleInput + type: object + type: FloatSingleInput + stop_operations: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: + success: success + schema: + description: ROS Action EmptyIn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: EmptyIn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: {} + required: [] + title: EmptyIn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + required: + - return_info + title: EmptyIn_Result + type: object + required: + - goal + title: EmptyIn + type: object + type: EmptyIn + module: unilabos.devices.mock.mock_separator:MockSeparator + status_types: + current_device: str + from_vessel: str + product_phase: str + purpose: str + repeats: int + separation_vessel: str + settling_time: float + shake_status: str + shake_time: float + solvent: str + solvent_volume: float + status: str + stir_speed: float + stir_time: float + through: str + time_remaining: float + time_spent: float + to_vessel: str + valve_state: str + waste_phase_to_vessel: str + type: python + description: Simplified Mock Separator Device + handles: [] + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + port: + default: MOCK + description: '参数: port' + type: string + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object +mock_solenoid_valve: + class: + action_value_mappings: + auto-close_valve: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand close_valve 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand close_valve 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: close_valve 命令参数 + type: object + type: UniLabJsonCommand + auto-get_valve_status: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_valve_status 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_valve_status 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_valve_status 命令参数 + type: object + type: UniLabJsonCommand + auto-is_closed: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand is_closed 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand is_closed 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: is_closed 命令参数 + type: object + type: UniLabJsonCommand + auto-is_open: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand is_open 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand is_open 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: is_open 命令参数 + type: object + type: UniLabJsonCommand + auto-open_valve: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand open_valve 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand open_valve 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: open_valve 命令参数 + type: object + type: UniLabJsonCommand + auto-set_valve_status: + feedback: {} + goal: {} + goal_default: + status: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_valve_status 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_valve_status 的参数schema + properties: + status: + description: '参数: status' + type: string + required: + - status + type: object + result: {} + required: + - goal + title: set_valve_status 命令参数 + type: object + type: UniLabJsonCommand + close_valve: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: + success: success + schema: + description: ROS Action EmptyIn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: EmptyIn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: {} + required: [] + title: EmptyIn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + required: + - return_info + title: EmptyIn_Result + type: object + required: + - goal + title: EmptyIn + type: object + type: EmptyIn + open_valve: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: + success: success + schema: + description: ROS Action EmptyIn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: EmptyIn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: {} + required: [] + title: EmptyIn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + required: + - return_info + title: EmptyIn_Result + type: object + required: + - goal + title: EmptyIn + type: object + type: EmptyIn + set_valve_status: + feedback: {} + goal: + string: status + goal_default: + string: '' + handles: [] + result: + success: success + schema: + description: ROS Action StrSingleInput 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: StrSingleInput_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + string: + type: string + required: + - string + title: StrSingleInput_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: StrSingleInput_Result + type: object + required: + - goal + title: StrSingleInput + type: object + type: StrSingleInput + module: unilabos.devices.mock.mock_solenoid_valve:MockSolenoidValve + status_types: + status: str + valve_status: str + type: python + description: Mock Solenoid Valve Device + handles: [] + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + port: + default: MOCK + description: '参数: port' + type: string + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object +mock_stirrer: + class: + action_value_mappings: + auto-emergency_stop: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand emergency_stop 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand emergency_stop 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: emergency_stop 命令参数 + type: object + type: UniLabJsonCommand + auto-get_status_info: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_status_info 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_status_info 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_status_info 命令参数 + type: object + type: UniLabJsonCommand + auto-heating_control: + feedback: {} + goal: {} + goal_default: + heating_state: 'On' + handles: [] + result: {} + schema: + description: UniLabJsonCommand heating_control 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand heating_control 的参数schema + properties: + heating_state: + default: 'On' + description: '参数: heating_state' + type: string + required: [] + type: object + result: {} + required: + - goal + title: heating_control 命令参数 + type: object + type: UniLabJsonCommand + auto-set_stir_speed: + feedback: {} + goal: {} + goal_default: + speed: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_stir_speed 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_stir_speed 的参数schema + properties: + speed: + description: '参数: speed' + type: number + required: + - speed + type: object + result: {} + required: + - goal + title: set_stir_speed 命令参数 + type: object + type: UniLabJsonCommand + auto-set_temperature: + feedback: {} + goal: {} + goal_default: + temperature: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_temperature 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_temperature 的参数schema + properties: + temperature: + description: '参数: temperature' + type: number + required: + - temperature + type: object + result: {} + required: + - goal + title: set_temperature 命令参数 + type: object + type: UniLabJsonCommand + auto-start_stirring: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand start_stirring 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand start_stirring 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: start_stirring 命令参数 + type: object + type: UniLabJsonCommand + auto-stop_all_operations: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand stop_all_operations 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand stop_all_operations 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: stop_all_operations 命令参数 + type: object + type: UniLabJsonCommand + auto-stop_stirring: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand stop_stirring 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand stop_stirring 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: stop_stirring 命令参数 + type: object + type: UniLabJsonCommand + heating_control: + feedback: {} + goal: + string: heating_state + goal_default: + string: '' + handles: [] + result: + success: success + schema: + description: ROS Action StrSingleInput 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: StrSingleInput_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + string: + type: string + required: + - string + title: StrSingleInput_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: StrSingleInput_Result + type: object + required: + - goal + title: StrSingleInput + type: object + type: StrSingleInput + set_stir_speed: + feedback: {} + goal: + float_in: speed + goal_default: + float_in: 0.0 + handles: [] + result: + success: success + schema: + description: ROS Action FloatSingleInput 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: FloatSingleInput_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + float_in: + type: number + required: + - float_in + title: FloatSingleInput_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: FloatSingleInput_Result + type: object + required: + - goal + title: FloatSingleInput + type: object + type: FloatSingleInput + set_temperature: + feedback: {} + goal: + float_in: temperature + goal_default: + float_in: 0.0 + handles: [] + result: + success: success + schema: + description: ROS Action FloatSingleInput 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: FloatSingleInput_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + float_in: + type: number + required: + - float_in + title: FloatSingleInput_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: FloatSingleInput_Result + type: object + required: + - goal + title: FloatSingleInput + type: object + type: FloatSingleInput + start_stirring: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: + success: success + schema: + description: ROS Action EmptyIn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: EmptyIn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: {} + required: [] + title: EmptyIn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + required: + - return_info + title: EmptyIn_Result + type: object + required: + - goal + title: EmptyIn + type: object + type: EmptyIn + stop_stirring: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: + success: success + schema: + description: ROS Action EmptyIn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: EmptyIn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: {} + required: [] + title: EmptyIn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + required: + - return_info + title: EmptyIn_Result + type: object + required: + - goal + title: EmptyIn + type: object + type: EmptyIn + module: unilabos.devices.mock.mock_stirrer:MockStirrer + status_types: + heating_power: float + heating_state: str + max_stir_speed: float + max_temperature: float + status: str + stir_speed: float + stir_state: str + target_stir_speed: float + target_temperature: float + temperature: float + type: python + description: Mock Stirrer Device + handles: [] + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + port: + default: MOCK + description: '参数: port' + type: string + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object +mock_stirrer_new: + class: + action_value_mappings: + auto-get_status_info: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_status_info 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_status_info 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_status_info 命令参数 + type: object + type: UniLabJsonCommand + auto-start_stir: + feedback: {} + goal: {} + goal_default: + purpose: '' + stir_speed: 0.0 + vessel: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand start_stir 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand start_stir 的参数schema + properties: + purpose: + default: '' + description: '参数: purpose' + type: string + stir_speed: + default: 0.0 + description: '参数: stir_speed' + type: number + vessel: + description: '参数: vessel' + type: string + required: + - vessel + type: object + result: {} + required: + - goal + title: start_stir 命令参数 + type: object + type: UniLabJsonCommand + auto-stir: + feedback: {} + goal: {} + goal_default: + settling_time: null + stir_speed: null + stir_time: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand stir 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand stir 的参数schema + properties: + settling_time: + description: '参数: settling_time' + type: number + stir_speed: + description: '参数: stir_speed' + type: number + stir_time: + description: '参数: stir_time' + type: number + required: + - stir_time + - stir_speed + - settling_time + type: object + result: {} + required: + - goal + title: stir 命令参数 + type: object + type: UniLabJsonCommand + auto-stop_stir: + feedback: {} + goal: {} + goal_default: + vessel: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand stop_stir 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand stop_stir 的参数schema + properties: + vessel: + description: '参数: vessel' + type: string + required: + - vessel + type: object + result: {} + required: + - goal + title: stop_stir 命令参数 + type: object + type: UniLabJsonCommand + start_stir: + feedback: + current_speed: stir_speed + current_status: status + progress: progress + goal: + purpose: purpose + stir_speed: stir_speed + vessel: vessel + goal_default: + purpose: '' + stir_speed: 0.0 + vessel: '' + handles: [] + result: + message: message + success: success + schema: + description: ROS Action StartStir 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + current_speed: + type: number + current_status: + type: string + progress: + type: number + required: + - progress + - current_speed + - current_status + title: StartStir_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + purpose: + type: string + stir_speed: + type: number + vessel: + type: string + required: + - vessel + - stir_speed + - purpose + title: StartStir_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: StartStir_Result + type: object + required: + - goal + title: StartStir + type: object + type: StartStir + stir: + feedback: + status: status + goal: + settling_time: settling_time + stir_speed: stir_speed + stir_time: stir_time + goal_default: + settling_time: 0.0 + stir_speed: 0.0 + stir_time: 0.0 + handles: [] + result: + success: success + schema: + description: ROS Action Stir 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: Stir_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + settling_time: + type: number + stir_speed: + type: number + stir_time: + type: number + required: + - stir_time + - stir_speed + - settling_time + title: Stir_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: Stir_Result + type: object + required: + - goal + title: Stir + type: object + type: Stir stop_stir: - type: StopStir + feedback: + current_status: status + progress: progress goal: vessel: vessel - feedback: - progress: progress - current_status: status + goal_default: + vessel: '' + handles: [] + result: + message: message + success: success + schema: + description: ROS Action StopStir 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + current_status: + type: string + progress: + type: number + required: + - progress + - current_status + title: StopStir_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + vessel: + type: string + required: + - vessel + title: StopStir_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: StopStir_Result + type: object + required: + - goal + title: StopStir + type: object + type: StopStir + module: unilabos.devices.mock.mock_stirrer_new:MockStirrer_new + status_types: + max_stir_speed: float + progress: float + purpose: str + settling_time: float + status: str + stir_speed: float + stir_state: str + stir_time: float + target_stir_speed: float + vessel: str + type: python + description: Mock Stirrer Device (Copy Version) + handles: [] + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + port: + default: MOCK + description: '参数: port' + type: string + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object +mock_vacuum: + class: + action_value_mappings: + auto-emergency_stop: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand emergency_stop 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand emergency_stop 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: emergency_stop 命令参数 + type: object + type: UniLabJsonCommand + auto-get_status_info: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_status_info 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_status_info 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_status_info 命令参数 + type: object + type: UniLabJsonCommand + auto-pause_vacuum: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand pause_vacuum 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand pause_vacuum 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: pause_vacuum 命令参数 + type: object + type: UniLabJsonCommand + auto-power_control: + feedback: {} + goal: {} + goal_default: + power_state: 'On' + handles: [] + result: {} + schema: + description: UniLabJsonCommand power_control 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand power_control 的参数schema + properties: + power_state: + default: 'On' + description: '参数: power_state' + type: string + required: [] + type: object + result: {} + required: + - goal + title: power_control 命令参数 + type: object + type: UniLabJsonCommand + auto-resume_vacuum: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand resume_vacuum 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand resume_vacuum 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: resume_vacuum 命令参数 + type: object + type: UniLabJsonCommand + auto-set_vacuum_level: + feedback: {} + goal: {} + goal_default: + vacuum_level: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_vacuum_level 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_vacuum_level 的参数schema + properties: + vacuum_level: + description: '参数: vacuum_level' + type: number + required: + - vacuum_level + type: object + result: {} + required: + - goal + title: set_vacuum_level 命令参数 + type: object + type: UniLabJsonCommand + auto-start_vacuum: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand start_vacuum 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand start_vacuum 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: start_vacuum 命令参数 + type: object + type: UniLabJsonCommand + auto-stop_vacuum: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand stop_vacuum 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand stop_vacuum 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: stop_vacuum 命令参数 + type: object + type: UniLabJsonCommand + auto-vent_to_atmosphere: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand vent_to_atmosphere 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand vent_to_atmosphere 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: vent_to_atmosphere 命令参数 + type: object + type: UniLabJsonCommand + pause_vacuum: + feedback: {} + goal: {} + goal_default: {} + handles: [] result: success: success - message: message - schema: - type: object - properties: - status: - type: string - vessel: - type: string - purpose: - type: string - stir_speed: - type: number - target_stir_speed: - type: number - stir_state: - type: string - stir_time: - type: number - settling_time: - type: number - progress: - type: number - max_stir_speed: - type: number - required: - - status - - stir_speed - - stir_state - - vessel - additionalProperties: false -mock_vacuum: - description: Mock Vacuum Pump Device - class: - module: unilabos.devices.mock.mock_vacuum:MockVacuum - type: python - status_types: - status: String - power_state: String - pump_state: String - vacuum_level: Float64 - target_vacuum: Float64 - pump_speed: Float64 - pump_efficiency: Float64 - max_pump_speed: Float64 - action_value_mappings: + schema: + description: ROS Action EmptyIn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: EmptyIn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: {} + required: [] + title: EmptyIn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + required: + - return_info + title: EmptyIn_Result + type: object + required: + - goal + title: EmptyIn + type: object + type: EmptyIn power_control: - type: StrSingleInput + feedback: {} goal: string: power_state - feedback: {} + goal_default: + string: '' + handles: [] result: success: success + schema: + description: ROS Action StrSingleInput 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: StrSingleInput_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + string: + type: string + required: + - string + title: StrSingleInput_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: StrSingleInput_Result + type: object + required: + - goal + title: StrSingleInput + type: object + type: StrSingleInput + resume_vacuum: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: + success: success + schema: + description: ROS Action EmptyIn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: EmptyIn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: {} + required: [] + title: EmptyIn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + required: + - return_info + title: EmptyIn_Result + type: object + required: + - goal + title: EmptyIn + type: object + type: EmptyIn set_vacuum_level: - type: FloatSingleInput + feedback: {} goal: float_in: vacuum_level - feedback: {} + goal_default: + float_in: 0.0 + handles: [] result: success: success + schema: + description: ROS Action FloatSingleInput 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: FloatSingleInput_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + float_in: + type: number + required: + - float_in + title: FloatSingleInput_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: FloatSingleInput_Result + type: object + required: + - goal + title: FloatSingleInput + type: object + type: FloatSingleInput start_vacuum: - type: EmptyIn - goal: {} feedback: {} + goal: {} + goal_default: {} + handles: [] result: success: success + schema: + description: ROS Action EmptyIn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: EmptyIn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: {} + required: [] + title: EmptyIn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + required: + - return_info + title: EmptyIn_Result + type: object + required: + - goal + title: EmptyIn + type: object + type: EmptyIn stop_vacuum: - type: EmptyIn - goal: {} feedback: {} + goal: {} + goal_default: {} + handles: [] result: success: success - pause_vacuum: + schema: + description: ROS Action EmptyIn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: EmptyIn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: {} + required: [] + title: EmptyIn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + required: + - return_info + title: EmptyIn_Result + type: object + required: + - goal + title: EmptyIn + type: object type: EmptyIn - goal: {} - feedback: {} - result: - success: success - resume_vacuum: - type: EmptyIn - goal: {} - feedback: {} - result: - success: success vent_to_atmosphere: - type: EmptyIn - goal: {} feedback: {} + goal: {} + goal_default: {} + handles: [] result: success: success - schema: - type: object + schema: + description: ROS Action EmptyIn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: EmptyIn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: {} + required: [] + title: EmptyIn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + required: + - return_info + title: EmptyIn_Result + type: object + required: + - goal + title: EmptyIn + type: object + type: EmptyIn + module: unilabos.devices.mock.mock_vacuum:MockVacuum + status_types: + max_pump_speed: float + power_state: str + pump_efficiency: float + pump_speed: float + pump_state: str + status: str + target_vacuum: float + vacuum_level: float + type: python + description: Mock Vacuum Pump Device + handles: [] + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema properties: - status: - type: string - description: Current status of the vacuum pump - power_state: - type: string - description: Power state (On/Off) - pump_state: - type: string - description: Pump operation state (Running/Stopped/Paused) - vacuum_level: - type: number - description: Current vacuum level in mbar - target_vacuum: - type: number - description: Target vacuum level in mbar - pump_speed: - type: number - description: Current pump speed in L/s - pump_efficiency: - type: number - description: Pump efficiency percentage - max_pump_speed: - type: number - description: Maximum pump speed in L/s + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + port: + default: MOCK + description: '参数: port' + type: string + required: [] + type: object + result: {} required: - - status - - power_state - - pump_state - - vacuum_level - additionalProperties: false + - goal + title: __init__ 命令参数 + type: object diff --git a/unilabos/registry/devices/moveit_config.yaml b/unilabos/registry/devices/moveit_config.yaml index 6236855..2bc56a6 100644 --- a/unilabos/registry/devices/moveit_config.yaml +++ b/unilabos/registry/devices/moveit_config.yaml @@ -1,56 +1,328 @@ -moveit.toyo_xyz: - description: Toyo XYZ - class: - module: unilabos.devices.ros_dev.moveit_interface:MoveitInterface - type: python - action_value_mappings: - set_position: - type: SendCmd - goal: - command: command - feedback: { } - result: { } - pick_and_place: - type: SendCmd - goal: - command: command - feedback: { } - result: { } - set_status: - type: SendCmd - goal: - command: command - feedback: { } - result: { } - - model: - type: device - mesh: toyo_xyz - moveit.arm_slider: - description: Arm with Slider - model: - type: device - mesh: arm_slider class: - module: unilabos.devices.ros_dev.moveit_interface:MoveitInterface - type: python action_value_mappings: - set_position: - type: SendCmd - goal: - command: command - feedback: {} - result: {} pick_and_place: - type: SendCmd + feedback: {} goal: command: command - feedback: {} + goal_default: + command: '' + handles: [] result: {} + schema: + description: ROS Action SendCmd 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: SendCmd_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + command: + type: string + required: + - command + title: SendCmd_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: SendCmd_Result + type: object + required: + - goal + title: SendCmd + type: object + type: SendCmd + set_position: + feedback: {} + goal: + command: command + goal_default: + command: '' + handles: [] + result: {} + schema: + description: ROS Action SendCmd 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: SendCmd_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + command: + type: string + required: + - command + title: SendCmd_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: SendCmd_Result + type: object + required: + - goal + title: SendCmd + type: object + type: SendCmd set_status: - type: SendCmd + feedback: {} goal: command: command - feedback: {} + goal_default: + command: '' + handles: [] result: {} + schema: + description: ROS Action SendCmd 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: SendCmd_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + command: + type: string + required: + - command + title: SendCmd_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: SendCmd_Result + type: object + required: + - goal + title: SendCmd + type: object + type: SendCmd + module: unilabos.devices.ros_dev.moveit_interface:MoveitInterface + status_types: {} + type: python + description: Arm with Slider + handles: [] + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object + model: + mesh: arm_slider + type: device +moveit.toyo_xyz: + class: + action_value_mappings: + pick_and_place: + feedback: {} + goal: + command: command + goal_default: + command: '' + handles: [] + result: {} + schema: + description: ROS Action SendCmd 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: SendCmd_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + command: + type: string + required: + - command + title: SendCmd_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: SendCmd_Result + type: object + required: + - goal + title: SendCmd + type: object + type: SendCmd + set_position: + feedback: {} + goal: + command: command + goal_default: + command: '' + handles: [] + result: {} + schema: + description: ROS Action SendCmd 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: SendCmd_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + command: + type: string + required: + - command + title: SendCmd_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: SendCmd_Result + type: object + required: + - goal + title: SendCmd + type: object + type: SendCmd + set_status: + feedback: {} + goal: + command: command + goal_default: + command: '' + handles: [] + result: {} + schema: + description: ROS Action SendCmd 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: SendCmd_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + command: + type: string + required: + - command + title: SendCmd_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: SendCmd_Result + type: object + required: + - goal + title: SendCmd + type: object + type: SendCmd + module: unilabos.devices.ros_dev.moveit_interface:MoveitInterface + status_types: {} + type: python + description: Toyo XYZ + handles: [] + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object + model: + mesh: toyo_xyz + type: device diff --git a/unilabos/registry/devices/organic_miscellaneous.yaml b/unilabos/registry/devices/organic_miscellaneous.yaml index 74551e7..7f5a19d 100644 --- a/unilabos/registry/devices/organic_miscellaneous.yaml +++ b/unilabos/registry/devices/organic_miscellaneous.yaml @@ -1,73 +1,492 @@ -separator.homemade: - description: Separator device with homemade grbl controller - class: - module: unilabos.devices.separator.homemade_grbl_conductivity:SeparatorController - type: python - status_types: - sensordata: Float64 - status: String - action_value_mappings: - stir: - type: Stir - goal: - stir_time: stir_time, - stir_speed: stir_speed - settling_time: settling_time - feedback: - status: status - result: - success: success - valve_open_cmd: - type: SendCmd - goal: - command: command - feedback: - status: status - result": - success: success - schema: - type: object - properties: - status: - type: string - description: The status of the device - sensordata: - type: number - description: 电导传感器数据 - required: - - status - - sensordata - additionalProperties: false - rotavap.one: - description: Rotavap device class: + action_value_mappings: + auto-cmd_write: + feedback: {} + goal: {} + goal_default: + cmd: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand cmd_write 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand cmd_write 的参数schema + properties: + cmd: + description: '参数: cmd' + type: string + required: + - cmd + type: object + result: {} + required: + - goal + title: cmd_write 命令参数 + type: object + type: UniLabJsonCommand + auto-main_loop: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand main_loop 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand main_loop 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: main_loop 命令参数 + type: object + type: UniLabJsonCommand + auto-set_pump_time: + feedback: {} + goal: {} + goal_default: + time: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_pump_time 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_pump_time 的参数schema + properties: + time: + description: '参数: time' + type: string + required: + - time + type: object + result: {} + required: + - goal + title: set_pump_time 命令参数 + type: object + type: UniLabJsonCommand + auto-set_rotate_time: + feedback: {} + goal: {} + goal_default: + time: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_rotate_time 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_rotate_time 的参数schema + properties: + time: + description: '参数: time' + type: string + required: + - time + type: object + result: {} + required: + - goal + title: set_rotate_time 命令参数 + type: object + type: UniLabJsonCommand + auto-set_timer: + feedback: {} + goal: {} + goal_default: + command: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_timer 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_timer 的参数schema + properties: + command: + description: '参数: command' + type: string + required: + - command + type: object + result: {} + required: + - goal + title: set_timer 命令参数 + type: object + type: UniLabJsonCommand + set_timer: + feedback: {} + goal: + command: command + goal_default: + command: '' + handles: [] + result: + success: success + schema: + description: ROS Action SendCmd 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: SendCmd_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + command: + type: string + required: + - command + title: SendCmd_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: SendCmd_Result + type: object + required: + - goal + title: SendCmd + type: object + type: SendCmd module: unilabos.devices.rotavap.rotavap_one:RotavapOne - type: python status_types: pump_time: Float64 rotate_time: Float64 + type: python + description: Rotavap device + handles: [] + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + port: + description: '参数: port' + type: string + rate: + default: 9600 + description: '参数: rate' + type: integer + required: + - port + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object +separator.homemade: + class: action_value_mappings: - set_timer: - type: SendCmd - goal: - command: command + auto-read_sensor_loop: feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand read_sensor_loop 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand read_sensor_loop 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: read_sensor_loop 命令参数 + type: object + type: UniLabJsonCommand + auto-stir: + feedback: {} + goal: {} + goal_default: + settling_time: 10 + stir_speed: 300 + stir_time: 10 + handles: [] + result: {} + schema: + description: UniLabJsonCommand stir 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand stir 的参数schema + properties: + settling_time: + default: 10 + description: '参数: settling_time' + type: number + stir_speed: + default: 300 + description: '参数: stir_speed' + type: number + stir_time: + default: 10 + description: '参数: stir_time' + type: number + required: [] + type: object + result: {} + required: + - goal + title: stir 命令参数 + type: object + type: UniLabJsonCommand + auto-valve_open: + feedback: {} + goal: {} + goal_default: + condition: null + value: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand valve_open 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand valve_open 的参数schema + properties: + condition: + description: '参数: condition' + type: string + value: + description: '参数: value' + type: string + required: + - condition + - value + type: object + result: {} + required: + - goal + title: valve_open 命令参数 + type: object + type: UniLabJsonCommand + auto-valve_open_cmd: + feedback: {} + goal: {} + goal_default: + command: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand valve_open_cmd 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand valve_open_cmd 的参数schema + properties: + command: + description: '参数: command' + type: string + required: + - command + type: object + result: {} + required: + - goal + title: valve_open_cmd 命令参数 + type: object + type: UniLabJsonCommand + auto-write: + feedback: {} + goal: {} + goal_default: + data: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand write 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand write 的参数schema + properties: + data: + description: '参数: data' + type: string + required: + - data + type: object + result: {} + required: + - goal + title: write 命令参数 + type: object + type: UniLabJsonCommand + stir: + feedback: + status: status + goal: + settling_time: settling_time + stir_speed: stir_speed + stir_time: stir_time, + goal_default: + settling_time: 0.0 + stir_speed: 0.0 + stir_time: 0.0 + handles: [] result: success: success - schema: - type: object + schema: + description: ROS Action Stir 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: Stir_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + settling_time: + type: number + stir_speed: + type: number + stir_time: + type: number + required: + - stir_time + - stir_speed + - settling_time + title: Stir_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: Stir_Result + type: object + required: + - goal + title: Stir + type: object + type: Stir + valve_open_cmd: + feedback: + status: status + goal: + command: command + goal_default: + command: '' + handles: [] + result": + success: success + schema: + description: ROS Action SendCmd 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: SendCmd_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + command: + type: string + required: + - command + title: SendCmd_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: SendCmd_Result + type: object + required: + - goal + title: SendCmd + type: object + type: SendCmd + module: unilabos.devices.separator.homemade_grbl_conductivity:SeparatorController + status_types: + sensordata: Float64 + status: String + type: python + description: Separator device with homemade grbl controller + handles: [] + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema properties: - temperature: - type: number - description: 旋蒸水浴温度 - pump_time: - type: number - description: The pump time of the device - rotate_time: - type: number - description: The rotate time of the device + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + baudrate_executor: + default: 115200 + description: '参数: baudrate_executor' + type: integer + baudrate_sensor: + default: 115200 + description: '参数: baudrate_sensor' + type: integer + port_executor: + description: '参数: port_executor' + type: string + port_sensor: + description: '参数: port_sensor' + type: string + required: + - port_executor + - port_sensor + type: object + result: {} required: - - pump_time - - rotate_time - additionalProperties: false \ No newline at end of file + - goal + title: __init__ 命令参数 + type: object diff --git a/unilabos/registry/devices/pump_and_valve.yaml b/unilabos/registry/devices/pump_and_valve.yaml index 651a25f..e524dac 100644 --- a/unilabos/registry/devices/pump_and_valve.yaml +++ b/unilabos/registry/devices/pump_and_valve.yaml @@ -1,85 +1,1127 @@ -syringe_pump_with_valve.runze: - description: Runze Syringe pump with valve +solenoid_valve: class: - module: unilabos.devices.pump_and_valve.runze_backbone:RunzeSyringePump + action_value_mappings: + auto-close: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand close 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand close 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: close 命令参数 + type: object + type: UniLabJsonCommand + auto-get_valve_position: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_valve_position 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_valve_position 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_valve_position 命令参数 + type: object + type: UniLabJsonCommand + auto-is_closed: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand is_closed 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand is_closed 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: is_closed 命令参数 + type: object + type: UniLabJsonCommand + auto-is_open: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand is_open 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand is_open 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: is_open 命令参数 + type: object + type: UniLabJsonCommand + auto-open: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand open 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand open 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: open 命令参数 + type: object + type: UniLabJsonCommand + auto-read_data: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand read_data 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand read_data 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: read_data 命令参数 + type: object + type: UniLabJsonCommand + auto-send_command: + feedback: {} + goal: {} + goal_default: + command: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand send_command 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand send_command 的参数schema + properties: + command: + description: '参数: command' + type: string + required: + - command + type: object + result: {} + required: + - goal + title: send_command 命令参数 + type: object + type: UniLabJsonCommand + auto-set_valve_position: + feedback: {} + goal: {} + goal_default: + position: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_valve_position 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_valve_position 的参数schema + properties: + position: + description: '参数: position' + type: string + required: + - position + type: object + result: {} + required: + - goal + title: set_valve_position 命令参数 + type: object + type: UniLabJsonCommand + set_valve_position: + feedback: {} + goal: + string: position + goal_default: + string: '' + handles: [] + result: {} + schema: + description: ROS Action StrSingleInput 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: StrSingleInput_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + string: + type: string + required: + - string + title: StrSingleInput_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: StrSingleInput_Result + type: object + required: + - goal + title: StrSingleInput + type: object + type: StrSingleInput + module: unilabos.devices.pump_and_valve.solenoid_valve:SolenoidValve + status_types: + status: str + valve_position: str type: python + description: Solenoid valve + handles: [] + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + io_device_port: + description: '参数: io_device_port' + type: string + required: + - io_device_port + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object +solenoid_valve.mock: + class: + action_value_mappings: + auto-close: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand close 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand close 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: close 命令参数 + type: object + type: UniLabJsonCommand + auto-get_valve_position: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_valve_position 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_valve_position 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_valve_position 命令参数 + type: object + type: UniLabJsonCommand + auto-is_closed: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand is_closed 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand is_closed 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: is_closed 命令参数 + type: object + type: UniLabJsonCommand + auto-is_open: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand is_open 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand is_open 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: is_open 命令参数 + type: object + type: UniLabJsonCommand + auto-open: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand open 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand open 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: open 命令参数 + type: object + type: UniLabJsonCommand + auto-set_valve_position: + feedback: {} + goal: {} + goal_default: + position: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_valve_position 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_valve_position 的参数schema + properties: + position: + description: '参数: position' + type: string + required: + - position + type: object + result: {} + required: + - goal + title: set_valve_position 命令参数 + type: object + type: UniLabJsonCommand + close: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: ROS Action EmptyIn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: EmptyIn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: {} + required: [] + title: EmptyIn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + required: + - return_info + title: EmptyIn_Result + type: object + required: + - goal + title: EmptyIn + type: object + type: EmptyIn + open: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: ROS Action EmptyIn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: EmptyIn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: {} + required: [] + title: EmptyIn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + required: + - return_info + title: EmptyIn_Result + type: object + required: + - goal + title: EmptyIn + type: object + type: EmptyIn + module: unilabos.devices.pump_and_valve.solenoid_valve_mock:SolenoidValveMock + status_types: + status: str + valve_position: str + type: python + description: Mock solenoid valve + handles: + - data_type: fluid + handler_key: in + io_type: target + label: in + side: NORTH + - data_type: fluid + handler_key: out + io_type: source + label: out + side: SOUTH + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + port: + default: COM6 + description: '参数: port' + type: string + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object +syringe_pump_with_valve.runze: + class: + action_value_mappings: + auto-close: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand close 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand close 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: close 命令参数 + type: object + type: UniLabJsonCommand + auto-get_max_velocity: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_max_velocity 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_max_velocity 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_max_velocity 命令参数 + type: object + type: UniLabJsonCommand + auto-get_plunger_position: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_plunger_position 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_plunger_position 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_plunger_position 命令参数 + type: object + type: UniLabJsonCommand + auto-get_position: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_position 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_position 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_position 命令参数 + type: object + type: UniLabJsonCommand + auto-get_status: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_status 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_status 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_status 命令参数 + type: object + type: UniLabJsonCommand + auto-get_valve_position: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_valve_position 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_valve_position 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_valve_position 命令参数 + type: object + type: UniLabJsonCommand + auto-get_velocity_end: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_velocity_end 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_velocity_end 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_velocity_end 命令参数 + type: object + type: UniLabJsonCommand + auto-get_velocity_grade: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_velocity_grade 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_velocity_grade 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_velocity_grade 命令参数 + type: object + type: UniLabJsonCommand + auto-get_velocity_init: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_velocity_init 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_velocity_init 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_velocity_init 命令参数 + type: object + type: UniLabJsonCommand + auto-initialize: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand initialize 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand initialize 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: initialize 命令参数 + type: object + type: UniLabJsonCommand + auto-list: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand list 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand list 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: list 命令参数 + type: object + type: UniLabJsonCommand + auto-pull_plunger: + feedback: {} + goal: {} + goal_default: + volume: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand pull_plunger 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand pull_plunger 的参数schema + properties: + volume: + description: '参数: volume' + type: number + required: + - volume + type: object + result: {} + required: + - goal + title: pull_plunger 命令参数 + type: object + type: UniLabJsonCommand + auto-push_plunger: + feedback: {} + goal: {} + goal_default: + volume: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand push_plunger 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand push_plunger 的参数schema + properties: + volume: + description: '参数: volume' + type: number + required: + - volume + type: object + result: {} + required: + - goal + title: push_plunger 命令参数 + type: object + type: UniLabJsonCommand + auto-query_aux_input_status_1: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand query_aux_input_status_1 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand query_aux_input_status_1 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: query_aux_input_status_1 命令参数 + type: object + type: UniLabJsonCommand + auto-query_aux_input_status_2: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand query_aux_input_status_2 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand query_aux_input_status_2 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: query_aux_input_status_2 命令参数 + type: object + type: UniLabJsonCommand + auto-query_backlash_position: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand query_backlash_position 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand query_backlash_position 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: query_backlash_position 命令参数 + type: object + type: UniLabJsonCommand + auto-query_command_buffer_status: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand query_command_buffer_status 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand query_command_buffer_status 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: query_command_buffer_status 命令参数 + type: object + type: UniLabJsonCommand + auto-query_software_version: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand query_software_version 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand query_software_version 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: query_software_version 命令参数 + type: object + type: UniLabJsonCommand + auto-send_command: + feedback: {} + goal: {} + goal_default: + full_command: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand send_command 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand send_command 的参数schema + properties: + full_command: + description: '参数: full_command' + type: string + required: + - full_command + type: object + result: {} + required: + - goal + title: send_command 命令参数 + type: object + type: UniLabJsonCommand + auto-set_baudrate: + feedback: {} + goal: {} + goal_default: + baudrate: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_baudrate 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_baudrate 的参数schema + properties: + baudrate: + description: '参数: baudrate' + type: string + required: + - baudrate + type: object + result: {} + required: + - goal + title: set_baudrate 命令参数 + type: object + type: UniLabJsonCommand + auto-set_max_velocity: + feedback: {} + goal: {} + goal_default: + velocity: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_max_velocity 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_max_velocity 的参数schema + properties: + velocity: + description: '参数: velocity' + type: number + required: + - velocity + type: object + result: {} + required: + - goal + title: set_max_velocity 命令参数 + type: object + type: UniLabJsonCommand + auto-set_position: + feedback: {} + goal: {} + goal_default: + max_velocity: null + position: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_position 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_position 的参数schema + properties: + max_velocity: + description: '参数: max_velocity' + type: number + position: + description: '参数: position' + type: number + required: + - position + type: object + result: {} + required: + - goal + title: set_position 命令参数 + type: object + type: UniLabJsonCommand + auto-set_valve_position: + feedback: {} + goal: {} + goal_default: + position: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_valve_position 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_valve_position 的参数schema + properties: + position: + description: '参数: position' + type: string + required: + - position + type: object + result: {} + required: + - goal + title: set_valve_position 命令参数 + type: object + type: UniLabJsonCommand + auto-set_velocity_grade: + feedback: {} + goal: {} + goal_default: + velocity: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_velocity_grade 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_velocity_grade 的参数schema + properties: + velocity: + description: '参数: velocity' + type: string + required: + - velocity + type: object + result: {} + required: + - goal + title: set_velocity_grade 命令参数 + type: object + type: UniLabJsonCommand + auto-stop_operation: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand stop_operation 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand stop_operation 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: stop_operation 命令参数 + type: object + type: UniLabJsonCommand + auto-wait_error: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand wait_error 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand wait_error 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: wait_error 命令参数 + type: object + type: UniLabJsonCommand hardware_interface: name: hardware_interface read: send_command write: send_command - schema: - type: object - properties: - status: - type: string - description: The status of the device - position: - type: number - description: The volume of the syringe - speed_max: - type: number - description: The speed of the syringe - valve_position: - type: string - description: The position of the valve - required: - - 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 + module: unilabos.devices.pump_and_valve.runze_backbone:RunzeSyringePump status_types: - status: String - valve_position: String - action_value_mappings: - open: - type: EmptyIn - goal: {} - feedback: {} - result: {} - close: - type: EmptyIn - goal: {} - feedback: {} - result: {} - handles: - - handler_key: in - label: in - io_type: target - data_type: fluid - side: NORTH - - handler_key: out - label: out - io_type: source - data_type: fluid - side: SOUTH + max_velocity: float + mode: int + position: float + status: str + valve_position: str + type: python + description: Runze Syringe pump with valve + handles: [] + icon: '' init_param_schema: - type: object + description: UniLabJsonCommand __init__ 的参数schema properties: - port: - type: string - description: "通信端口" - default: "COM6" + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + address: + default: '1' + description: '参数: address' + type: string + max_volume: + default: 25.0 + description: '参数: max_volume' + type: number + mode: + description: '参数: mode' + type: string + port: + description: '参数: port' + type: string + required: + - port + type: object + result: {} required: - - port - -solenoid_valve: - description: Solenoid valve - class: - module: unilabos.devices.pump_and_valve.solenoid_valve:SolenoidValve - type: python - status_types: - status: String - valve_position: String - action_value_mappings: - set_valve_position: - type: StrSingleInput - goal: - string: position - feedback: {} - result: {} \ No newline at end of file + - goal + title: __init__ 命令参数 + type: object diff --git a/unilabos/registry/devices/robot_agv.yaml b/unilabos/registry/devices/robot_agv.yaml index a78107e..30639a0 100644 --- a/unilabos/registry/devices/robot_agv.yaml +++ b/unilabos/registry/devices/robot_agv.yaml @@ -1,29 +1,138 @@ -# 仙工智能底盘(知行使用) agv.SEER: - description: SEER AGV class: - module: unilabos.devices.agv.agv_navigator:AgvNavigator - type: python - status_types: - pose: Float64MultiArray - status: String action_value_mappings: + auto-send: + feedback: {} + goal: {} + goal_default: + cmd: null + ex_data: '' + obj: receive_socket + handles: [] + result: {} + schema: + description: UniLabJsonCommand send 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand send 的参数schema + properties: + cmd: + description: '参数: cmd' + type: string + ex_data: + default: '' + description: '参数: ex_data' + type: string + obj: + default: receive_socket + description: '参数: obj' + type: string + required: + - cmd + type: object + result: {} + required: + - goal + title: send 命令参数 + type: object + type: UniLabJsonCommand + auto-send_nav_task: + feedback: {} + goal: {} + goal_default: + command: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand send_nav_task 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand send_nav_task 的参数schema + properties: + command: + description: '参数: command' + type: string + required: + - command + type: object + result: {} + required: + - goal + title: send_nav_task 命令参数 + type: object + type: UniLabJsonCommand send_nav_task: - type: SendCmd + feedback: {} goal: command: command - feedback: {} + goal_default: + command: '' + handles: [] result: success: success - schema: + schema: + description: ROS Action SendCmd 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: SendCmd_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + command: + type: string + required: + - command + title: SendCmd_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: SendCmd_Result + type: object + required: + - goal + title: SendCmd + type: object + type: SendCmd + module: unilabos.devices.agv.agv_navigator:AgvNavigator + status_types: + pose: list + status: str + type: python + description: SEER AGV + handles: [] + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema properties: - pose: - type: array - items: - type: number - status: - type: string + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + host: + description: '参数: host' + type: string + required: + - host + type: object + result: {} required: - - status - additionalProperties: false - type: object \ No newline at end of file + - goal + title: __init__ 命令参数 + type: object diff --git a/unilabos/registry/devices/robot_arm.yaml b/unilabos/registry/devices/robot_arm.yaml index ba1e5f3..0e32da1 100644 --- a/unilabos/registry/devices/robot_arm.yaml +++ b/unilabos/registry/devices/robot_arm.yaml @@ -1,37 +1,202 @@ robotic_arm.UR: - description: UR robotic arm class: - module: unilabos.devices.agv.ur_arm_task:UrArmTask - type: python - status_types: - arm_pose: Float64MultiArray - gripper_pose: Float64 - arm_status: String - gripper_status: String action_value_mappings: + auto-arm_init: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand arm_init 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand arm_init 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: arm_init 命令参数 + type: object + type: UniLabJsonCommand + auto-load_pose_data: + feedback: {} + goal: {} + goal_default: + data: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand load_pose_data 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand load_pose_data 的参数schema + properties: + data: + description: '参数: data' + type: string + required: + - data + type: object + result: {} + required: + - goal + title: load_pose_data 命令参数 + type: object + type: UniLabJsonCommand + auto-load_pose_file: + feedback: {} + goal: {} + goal_default: + file: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand load_pose_file 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand load_pose_file 的参数schema + properties: + file: + description: '参数: file' + type: string + required: + - file + type: object + result: {} + required: + - goal + title: load_pose_file 命令参数 + type: object + type: UniLabJsonCommand + auto-move_pos_task: + feedback: {} + goal: {} + goal_default: + command: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand move_pos_task 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand move_pos_task 的参数schema + properties: + command: + description: '参数: command' + type: string + required: + - command + type: object + result: {} + required: + - goal + title: move_pos_task 命令参数 + type: object + type: UniLabJsonCommand + auto-reload_pose: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand reload_pose 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand reload_pose 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: reload_pose 命令参数 + type: object + type: UniLabJsonCommand move_pos_task: - type: SendCmd + feedback: {} goal: command: command - feedback: {} + goal_default: + command: '' + handles: [] result: success: success - schema: + schema: + description: ROS Action SendCmd 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: SendCmd_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + command: + type: string + required: + - command + title: SendCmd_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: SendCmd_Result + type: object + required: + - goal + title: SendCmd + type: object + type: SendCmd + module: unilabos.devices.agv.ur_arm_task:UrArmTask + status_types: + arm_pose: list + arm_status: str + gripper_pose: float + gripper_status: str + type: python + description: UR robotic arm + handles: [] + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema properties: - arm_pose: - type: array - items: - type: number - gripper_pose: - type: number - arm_status: - type: string - description: 机械臂设备状态 - gripper_status: - type: string - description: 机械爪设备状态 + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + host: + description: '参数: host' + type: string + retry: + default: 30 + description: '参数: retry' + type: integer + required: + - host + type: object + result: {} required: - - arm_status - - gripper_status - additionalProperties: false - type: object \ No newline at end of file + - goal + title: __init__ 命令参数 + type: object diff --git a/unilabos/registry/devices/robot_gripper.yaml b/unilabos/registry/devices/robot_gripper.yaml index bae970a..cd2b1aa 100644 --- a/unilabos/registry/devices/robot_gripper.yaml +++ b/unilabos/registry/devices/robot_gripper.yaml @@ -1,37 +1,174 @@ -gripper.mock: - description: Mock gripper - class: - module: unilabos.devices.gripper.mock:MockGripper - type: python - status_types: - position: Float64 - torque: Float64 - status: String - action_value_mappings: - push_to: - type: GripperCommand - goal: - command.position: position - command.max_effort: torque - feedback: - position: position - effort: torque - result: - position: position - effort: torque - gripper.misumi_rz: - description: Misumi RZ gripper class: - module: unilabos.devices.motor:Grasp.EleGripper - type: python - status_types: - status: String action_value_mappings: execute_command_from_outer: - type: SendCmd + feedback: {} goal: command: command - feedback: {} + goal_default: + command: '' + handles: [] result: success: success + schema: + description: ROS Action SendCmd 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: SendCmd_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + command: + type: string + required: + - command + title: SendCmd_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: SendCmd_Result + type: object + required: + - goal + title: SendCmd + type: object + type: SendCmd + module: unilabos.devices.motor.Grasp:EleGripper + status_types: + status: String + type: python + description: Misumi RZ gripper + handles: [] + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object +gripper.mock: + class: + action_value_mappings: + push_to: + feedback: + effort: torque + position: position + goal: + command.max_effort: torque + command.position: position + goal_default: + command: + max_effort: 0.0 + position: 0.0 + handles: [] + result: + effort: torque + position: position + schema: + description: ROS Action GripperCommand 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + effort: + type: number + position: + type: number + reached_goal: + type: boolean + stalled: + type: boolean + required: + - position + - effort + - stalled + - reached_goal + title: GripperCommand_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + command: + properties: + max_effort: + type: number + position: + type: number + required: + - position + - max_effort + title: GripperCommand + type: object + required: + - command + title: GripperCommand_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + effort: + type: number + position: + type: number + reached_goal: + type: boolean + stalled: + type: boolean + required: + - position + - effort + - stalled + - reached_goal + title: GripperCommand_Result + type: object + required: + - goal + title: GripperCommand + type: object + type: GripperCommand + module: unilabos.devices.gripper.mock:MockGripper + status_types: + position: Float64 + status: String + torque: Float64 + type: python + description: Mock gripper + handles: [] + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object diff --git a/unilabos/registry/devices/robot_linear_motion.yaml b/unilabos/registry/devices/robot_linear_motion.yaml index 91e253d..4d2812d 100644 --- a/unilabos/registry/devices/robot_linear_motion.yaml +++ b/unilabos/registry/devices/robot_linear_motion.yaml @@ -1,57 +1,542 @@ linear_motion.grbl: - description: Grbl CNC class: - module: unilabos.devices.cnc.grbl_sync:GrblCNC - type: python action_value_mappings: - move_through_points: &move_through_points - type: NavigateThroughPoses - goal: - poses[].pose.position: positions[] - feedback: + move_through_points: + feedback: current_pose.pose.position: position - navigation_time.sec: time_spent estimated_time_remaining.sec: time_remaining + navigation_time.sec: time_spent number_of_poses_remaining: pose_number_remaining - result: {} - set_spindle_speed: - type: SingleJointPosition goal: - position: spindle_speed + poses[].pose.position: positions[] + goal_default: + behavior_tree: '' + poses: + - header: + frame_id: '' + stamp: + nanosec: 0 + sec: 0 + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + handles: [] + result: {} + schema: + description: ROS Action NavigateThroughPoses 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + current_pose: + properties: + header: + properties: + frame_id: + type: string + stamp: + properties: + nanosec: + maximum: 4294967295 + minimum: 0 + type: integer + sec: + maximum: 2147483647 + minimum: -2147483648 + type: integer + required: + - sec + - nanosec + title: Time + type: object + required: + - stamp + - frame_id + title: Header + type: object + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + required: + - header + - pose + title: PoseStamped + type: object + distance_remaining: + type: number + estimated_time_remaining: + properties: + nanosec: + maximum: 4294967295 + minimum: 0 + type: integer + sec: + maximum: 2147483647 + minimum: -2147483648 + type: integer + required: + - sec + - nanosec + title: Duration + type: object + navigation_time: + properties: + nanosec: + maximum: 4294967295 + minimum: 0 + type: integer + sec: + maximum: 2147483647 + minimum: -2147483648 + type: integer + required: + - sec + - nanosec + title: Duration + type: object + number_of_poses_remaining: + maximum: 32767 + minimum: -32768 + type: integer + number_of_recoveries: + maximum: 32767 + minimum: -32768 + type: integer + required: + - current_pose + - navigation_time + - estimated_time_remaining + - number_of_recoveries + - distance_remaining + - number_of_poses_remaining + title: NavigateThroughPoses_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + behavior_tree: + type: string + poses: + items: + properties: + header: + properties: + frame_id: + type: string + stamp: + properties: + nanosec: + maximum: 4294967295 + minimum: 0 + type: integer + sec: + maximum: 2147483647 + minimum: -2147483648 + type: integer + required: + - sec + - nanosec + title: Time + type: object + required: + - stamp + - frame_id + title: Header + type: object + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + required: + - header + - pose + title: PoseStamped + type: object + type: array + required: + - poses + - behavior_tree + title: NavigateThroughPoses_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + result: + properties: {} + required: [] + title: Empty + type: object + required: + - result + title: NavigateThroughPoses_Result + type: object + required: + - goal + title: NavigateThroughPoses + type: object + type: NavigateThroughPoses + set_spindle_speed: feedback: position: spindle_speed + goal: + position: spindle_speed + goal_default: + max_velocity: 0.0 + min_duration: + nanosec: 0 + sec: 0 + position: 0.0 + handles: [] result: {} - schema: - type: object - properties: - position: - type: array - items: - type: number - description: The position of the device - spindle_speed: - type: number - description: The spindle speed of the device - required: - - position - - spindle_speed - additionalProperties: false - - -motor.iCL42: - description: iCL42 motor - class: - module: unilabos.devices.motor.iCL42:iCL42Driver + schema: + description: ROS Action SingleJointPosition 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + error: + type: number + header: + properties: + frame_id: + type: string + stamp: + properties: + nanosec: + maximum: 4294967295 + minimum: 0 + type: integer + sec: + maximum: 2147483647 + minimum: -2147483648 + type: integer + required: + - sec + - nanosec + title: Time + type: object + required: + - stamp + - frame_id + title: Header + type: object + position: + type: number + velocity: + type: number + required: + - header + - position + - velocity + - error + title: SingleJointPosition_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + max_velocity: + type: number + min_duration: + properties: + nanosec: + maximum: 4294967295 + minimum: 0 + type: integer + sec: + maximum: 2147483647 + minimum: -2147483648 + type: integer + required: + - sec + - nanosec + title: Duration + type: object + position: + type: number + required: + - position + - min_duration + - max_velocity + title: SingleJointPosition_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: {} + required: [] + title: SingleJointPosition_Result + type: object + required: + - goal + title: SingleJointPosition + type: object + type: SingleJointPosition + module: unilabos.devices.cnc.grbl_sync:GrblCNC + status_types: {} type: python - status_types: - motor_position: Int64 - is_executing_run: Bool - success: Bool + description: Grbl CNC + handles: [] + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object +motor.iCL42: + class: action_value_mappings: + auto-execute_run_motor: + feedback: {} + goal: {} + goal_default: + mode: null + position: null + velocity: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand execute_run_motor 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand execute_run_motor 的参数schema + properties: + mode: + description: '参数: mode' + type: string + position: + description: '参数: position' + type: number + velocity: + description: '参数: velocity' + type: integer + required: + - mode + - position + - velocity + type: object + result: {} + required: + - goal + title: execute_run_motor 命令参数 + type: object + type: UniLabJsonCommand + auto-init_device: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand init_device 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand init_device 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: init_device 命令参数 + type: object + type: UniLabJsonCommand + auto-run_motor: + feedback: {} + goal: {} + goal_default: + mode: null + position: null + velocity: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand run_motor 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand run_motor 的参数schema + properties: + mode: + description: '参数: mode' + type: string + position: + description: '参数: position' + type: number + velocity: + description: '参数: velocity' + type: integer + required: + - mode + - position + - velocity + type: object + result: {} + required: + - goal + title: run_motor 命令参数 + type: object + type: UniLabJsonCommand execute_command_from_outer: - type: SendCmd + feedback: {} goal: command: command - feedback: {} + goal_default: + command: '' + handles: [] result: - success: success \ No newline at end of file + success: success + schema: + description: ROS Action SendCmd 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: SendCmd_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + command: + type: string + required: + - command + title: SendCmd_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: SendCmd_Result + type: object + required: + - goal + title: SendCmd + type: object + type: SendCmd + module: unilabos.devices.motor.iCL42:iCL42Driver + status_types: + is_executing_run: bool + motor_position: int + success: bool + type: python + description: iCL42 motor + handles: [] + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + device_address: + default: 1 + description: '参数: device_address' + type: integer + device_com: + default: COM9 + description: '参数: device_com' + type: string + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object diff --git a/unilabos/registry/devices/sim_nodes.yaml b/unilabos/registry/devices/sim_nodes.yaml index de4d110..f8794f2 100644 --- a/unilabos/registry/devices/sim_nodes.yaml +++ b/unilabos/registry/devices/sim_nodes.yaml @@ -1,5 +1,355 @@ lh_joint_publisher: class: + action_value_mappings: + auto-check_tf_update_actions: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand check_tf_update_actions 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand check_tf_update_actions 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: check_tf_update_actions 命令参数 + type: object + type: UniLabJsonCommand + auto-find_resource_parent: + feedback: {} + goal: {} + goal_default: + resource_id: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand find_resource_parent 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand find_resource_parent 的参数schema + properties: + resource_id: + description: '参数: resource_id' + type: string + required: + - resource_id + type: object + result: {} + required: + - goal + title: find_resource_parent 命令参数 + type: object + type: UniLabJsonCommand + auto-inverse_kinematics: + feedback: {} + goal: {} + goal_default: + parent_id: null + x: null + x_joint: null + y: null + y_joint: null + z: null + z_joint: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand inverse_kinematics 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand inverse_kinematics 的参数schema + properties: + parent_id: + description: '参数: parent_id' + type: string + x: + description: '参数: x' + type: string + x_joint: + description: '参数: x_joint' + type: object + y: + description: '参数: y' + type: string + y_joint: + description: '参数: y_joint' + type: object + z: + description: '参数: z' + type: string + z_joint: + description: '参数: z_joint' + type: object + required: + - x + - y + - z + - parent_id + - x_joint + - y_joint + - z_joint + type: object + result: {} + required: + - goal + title: inverse_kinematics 命令参数 + type: object + type: UniLabJsonCommand + auto-lh_joint_action_callback: + feedback: {} + goal: {} + goal_default: + goal_handle: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand lh_joint_action_callback 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand lh_joint_action_callback 的参数schema + properties: + goal_handle: + description: '参数: goal_handle' + type: string + required: + - goal_handle + type: object + result: {} + required: + - goal + title: lh_joint_action_callback 命令参数 + type: object + type: UniLabJsonCommand + auto-lh_joint_pub_callback: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand lh_joint_pub_callback 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand lh_joint_pub_callback 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: lh_joint_pub_callback 命令参数 + type: object + type: UniLabJsonCommand + auto-move_joints: + feedback: {} + goal: {} + goal_default: + option: null + resource_names: null + speed: 0.1 + x: null + x_joint: null + y: null + y_joint: null + z: null + z_joint: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand move_joints 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand move_joints 的参数schema + properties: + option: + description: '参数: option' + type: string + resource_names: + description: '参数: resource_names' + type: string + speed: + default: 0.1 + description: '参数: speed' + type: number + x: + description: '参数: x' + type: string + x_joint: + description: '参数: x_joint' + type: string + y: + description: '参数: y' + type: string + y_joint: + description: '参数: y_joint' + type: string + z: + description: '参数: z' + type: string + z_joint: + description: '参数: z_joint' + type: string + required: + - resource_names + - x + - y + - z + - option + type: object + result: {} + required: + - goal + title: move_joints 命令参数 + type: object + type: UniLabJsonCommand + auto-move_to: + feedback: {} + goal: {} + goal_default: + joint_positions: null + parent_id: null + speed: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand move_to 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand move_to 的参数schema + properties: + joint_positions: + description: '参数: joint_positions' + type: string + parent_id: + description: '参数: parent_id' + type: string + speed: + description: '参数: speed' + type: string + required: + - joint_positions + - speed + - parent_id + type: object + result: {} + required: + - goal + title: move_to 命令参数 + type: object + type: UniLabJsonCommand + auto-resource_move: + feedback: {} + goal: {} + goal_default: + channels: null + link_name: null + resource_id: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand resource_move 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand resource_move 的参数schema + properties: + channels: + description: '参数: channels' + type: string + link_name: + description: '参数: link_name' + type: string + resource_id: + description: '参数: resource_id' + type: string + required: + - resource_id + - link_name + - channels + type: object + result: {} + required: + - goal + title: resource_move 命令参数 + type: object + type: UniLabJsonCommand + auto-send_resource_action: + feedback: {} + goal: {} + goal_default: + link_name: null + resource_id_list: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand send_resource_action 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand send_resource_action 的参数schema + properties: + link_name: + description: '参数: link_name' + type: string + resource_id_list: + description: '参数: resource_id_list' + type: string + required: + - resource_id_list + - link_name + type: object + result: {} + required: + - goal + title: send_resource_action 命令参数 + type: object + type: UniLabJsonCommand module: unilabos.devices.ros_dev.liquid_handler_joint_publisher:LiquidHandlerJointPublisher + status_types: {} type: ros2 - + description: '' + handles: [] + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + device_id: + default: lh_joint_publisher + description: '参数: device_id' + type: string + rate: + default: 50 + description: '参数: rate' + type: integer + resource_tracker: + description: '参数: resource_tracker' + type: string + resources_config: + description: '参数: resources_config' + type: array + required: + - resources_config + - resource_tracker + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object diff --git a/unilabos/registry/devices/temperature.yaml b/unilabos/registry/devices/temperature.yaml index 662ee01..b40810a 100644 --- a/unilabos/registry/devices/temperature.yaml +++ b/unilabos/registry/devices/temperature.yaml @@ -1,65 +1,884 @@ -heaterstirrer.dalong: - description: DaLong heater stirrer +chiller: class: - module: unilabos.devices.heaterstirrer.dalong:HeaterStirrer_DaLong - type: python - status_types: - temp: Float64 - temp_warning: Float64 - stir_speed: Float64 action_value_mappings: - set_temp_warning: - type: SendCmd - goal: - command: temp + auto-build_modbus_frame: feedback: {} + goal: {} + goal_default: + device_address: null + function_code: null + register_address: null + value: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand build_modbus_frame 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand build_modbus_frame 的参数schema + properties: + device_address: + description: '参数: device_address' + type: integer + function_code: + description: '参数: function_code' + type: integer + register_address: + description: '参数: register_address' + type: integer + value: + description: '参数: value' + type: integer + required: + - device_address + - function_code + - register_address + - value + type: object + result: {} + required: + - goal + title: build_modbus_frame 命令参数 + type: object + type: UniLabJsonCommand + auto-convert_temperature_to_modbus_value: + feedback: {} + goal: {} + goal_default: + decimal_points: 1 + temperature: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand convert_temperature_to_modbus_value 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand convert_temperature_to_modbus_value 的参数schema + properties: + decimal_points: + default: 1 + description: '参数: decimal_points' + type: integer + temperature: + description: '参数: temperature' + type: number + required: + - temperature + type: object + result: {} + required: + - goal + title: convert_temperature_to_modbus_value 命令参数 + type: object + type: UniLabJsonCommand + auto-modbus_crc: + feedback: {} + goal: {} + goal_default: + data: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand modbus_crc 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand modbus_crc 的参数schema + properties: + data: + description: '参数: data' + type: string + required: + - data + type: object + result: {} + required: + - goal + title: modbus_crc 命令参数 + type: object + type: UniLabJsonCommand + auto-set_temperature: + feedback: {} + goal: {} + goal_default: + command: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_temperature 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_temperature 的参数schema + properties: + command: + description: '参数: command' + type: string + required: + - command + type: object + result: {} + required: + - goal + title: set_temperature 命令参数 + type: object + type: UniLabJsonCommand + auto-stop: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand stop 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand stop 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: stop 命令参数 + type: object + type: UniLabJsonCommand + set_temperature: + feedback: {} + goal: + command: command + goal_default: + command: '' + handles: [] result: success: success - set_temp_target: + schema: + description: ROS Action SendCmd 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: SendCmd_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + command: + type: string + required: + - command + title: SendCmd_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: SendCmd_Result + type: object + required: + - goal + title: SendCmd + type: object type: SendCmd - goal: - command: temp + module: unilabos.devices.temperature.chiller:Chiller + status_types: {} + type: python + description: Chiller + handles: [] + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + port: + description: '参数: port' + type: string + rate: + default: 9600 + description: '参数: rate' + type: integer + required: + - port + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object +heaterstirrer.dalong: + class: + action_value_mappings: + auto-close: feedback: {} - result: - success: success + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand close 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand close 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: close 命令参数 + type: object + type: UniLabJsonCommand + auto-get_status: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_status 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_status 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_status 命令参数 + type: object + type: UniLabJsonCommand + auto-get_temp: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_temp 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_temp 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_temp 命令参数 + type: object + type: UniLabJsonCommand + auto-heatchill: + feedback: {} + goal: {} + goal_default: + purpose: reaction + stir: true + stir_speed: 300 + temp: null + time: 3600 + vessel: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand heatchill 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand heatchill 的参数schema + properties: + purpose: + default: reaction + description: '参数: purpose' + type: string + stir: + default: true + description: '参数: stir' + type: boolean + stir_speed: + default: 300 + description: '参数: stir_speed' + type: number + temp: + description: '参数: temp' + type: number + time: + default: 3600 + description: '参数: time' + type: number + vessel: + description: '参数: vessel' + type: string + required: + - vessel + - temp + type: object + result: {} + required: + - goal + title: heatchill 命令参数 + type: object + type: UniLabJsonCommand + auto-set_stir_speed: + feedback: {} + goal: {} + goal_default: + speed: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_stir_speed 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_stir_speed 的参数schema + properties: + speed: + description: '参数: speed' + type: number + required: + - speed + type: object + result: {} + required: + - goal + title: set_stir_speed 命令参数 + type: object + type: UniLabJsonCommand + auto-set_temp_inner: + feedback: {} + goal: {} + goal_default: + temp: null + type: warning + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_temp_inner 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_temp_inner 的参数schema + properties: + temp: + description: '参数: temp' + type: number + type: + default: warning + description: '参数: type' + type: string + required: + - temp + type: object + result: {} + required: + - goal + title: set_temp_inner 命令参数 + type: object + type: UniLabJsonCommand + auto-set_temp_target: + feedback: {} + goal: {} + goal_default: + temp: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_temp_target 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_temp_target 的参数schema + properties: + temp: + description: '参数: temp' + type: string + required: + - temp + type: object + result: {} + required: + - goal + title: set_temp_target 命令参数 + type: object + type: UniLabJsonCommand + auto-set_temp_warning: + feedback: {} + goal: {} + goal_default: + temp: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_temp_warning 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_temp_warning 的参数schema + properties: + temp: + description: '参数: temp' + type: string + required: + - temp + type: object + result: {} + required: + - goal + title: set_temp_warning 命令参数 + type: object + type: UniLabJsonCommand heatchill: - type: HeatChill - goal: - vessel: vessel - temp: temp - time: time - purpose: purpose feedback: status: status - result: - success: success - -chiller: - description: Chiller - class: - module: unilabos.devices.temperature.chiller:Chiller - type: python - action_value_mappings: - set_temperature: - type: SendCmd goal: - command: command - feedback: {} + purpose: purpose + temp: temp + time: time + vessel: vessel + goal_default: + purpose: '' + stir: false + stir_speed: 0.0 + temp: 0.0 + time: 0.0 + vessel: '' + handles: [] result: success: success -tempsensor: - description: Temperature sensor - class: - module: unilabos.devices.temperature.sensor_node:TempSensorNode - type: python + schema: + description: ROS Action HeatChill 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: HeatChill_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + purpose: + type: string + stir: + type: boolean + stir_speed: + type: number + temp: + type: number + time: + type: number + vessel: + type: string + required: + - vessel + - temp + - time + - stir + - stir_speed + - purpose + title: HeatChill_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: HeatChill_Result + type: object + required: + - goal + title: HeatChill + type: object + type: HeatChill + set_temp_target: + feedback: {} + goal: + command: temp + goal_default: + command: '' + handles: [] + result: + success: success + schema: + description: ROS Action SendCmd 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: SendCmd_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + command: + type: string + required: + - command + title: SendCmd_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: SendCmd_Result + type: object + required: + - goal + title: SendCmd + type: object + type: SendCmd + set_temp_warning: + feedback: {} + goal: + command: temp + goal_default: + command: '' + handles: [] + result: + success: success + schema: + description: ROS Action SendCmd 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: SendCmd_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + command: + type: string + required: + - command + title: SendCmd_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: SendCmd_Result + type: object + required: + - goal + title: SendCmd + type: object + type: SendCmd + module: unilabos.devices.heaterstirrer.dalong:HeaterStirrer_DaLong status_types: - value: Float64 - warning: Float64 + status: str + stir_speed: float + temp: float + temp_target: float + temp_warning: float + type: python + description: DaLong heater stirrer + handles: [] + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + baudrate: + default: 9600 + description: '参数: baudrate' + type: integer + port: + default: COM6 + description: '参数: port' + type: string + temp_warning: + default: 50.0 + description: '参数: temp_warning' + type: number + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object +tempsensor: + class: action_value_mappings: + auto-build_modbus_request: + feedback: {} + goal: {} + goal_default: + device_id: null + function_code: null + register_address: null + register_count: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand build_modbus_request 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand build_modbus_request 的参数schema + properties: + device_id: + description: '参数: device_id' + type: string + function_code: + description: '参数: function_code' + type: string + register_address: + description: '参数: register_address' + type: string + register_count: + description: '参数: register_count' + type: string + required: + - device_id + - function_code + - register_address + - register_count + type: object + result: {} + required: + - goal + title: build_modbus_request 命令参数 + type: object + type: UniLabJsonCommand + auto-calculate_crc: + feedback: {} + goal: {} + goal_default: + data: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand calculate_crc 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand calculate_crc 的参数schema + properties: + data: + description: '参数: data' + type: string + required: + - data + type: object + result: {} + required: + - goal + title: calculate_crc 命令参数 + type: object + type: UniLabJsonCommand + auto-read_modbus_response: + feedback: {} + goal: {} + goal_default: + response: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand read_modbus_response 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand read_modbus_response 的参数schema + properties: + response: + description: '参数: response' + type: string + required: + - response + type: object + result: {} + required: + - goal + title: read_modbus_response 命令参数 + type: object + type: UniLabJsonCommand + auto-send_prototype_command: + feedback: {} + goal: {} + goal_default: + command: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand send_prototype_command 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand send_prototype_command 的参数schema + properties: + command: + description: '参数: command' + type: string + required: + - command + type: object + result: {} + required: + - goal + title: send_prototype_command 命令参数 + type: object + type: UniLabJsonCommand + auto-set_warning: + feedback: {} + goal: {} + goal_default: + command: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_warning 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_warning 的参数schema + properties: + command: + description: '参数: command' + type: string + required: + - command + type: object + result: {} + required: + - goal + title: set_warning 命令参数 + type: object + type: UniLabJsonCommand set_warning: - type: SendCmd + feedback: {} goal: command: command - feedback: {} + goal_default: + command: '' + handles: [] result: success: success + schema: + description: ROS Action SendCmd 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: SendCmd_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + command: + type: string + required: + - command + title: SendCmd_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: SendCmd_Result + type: object + required: + - goal + title: SendCmd + type: object + type: SendCmd + module: unilabos.devices.temperature.sensor_node:TempSensorNode + status_types: + value: float + warning: Float64 + type: python + description: Temperature sensor + handles: [] + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + address: + description: '参数: address' + type: string + baudrate: + default: 9600 + description: '参数: baudrate' + type: integer + port: + description: '参数: port' + type: string + warning: + description: '参数: warning' + type: string + required: + - port + - warning + - address + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object diff --git a/unilabos/registry/devices/vacuum_and_purge.yaml b/unilabos/registry/devices/vacuum_and_purge.yaml index 84fb58c..d17593b 100644 --- a/unilabos/registry/devices/vacuum_and_purge.yaml +++ b/unilabos/registry/devices/vacuum_and_purge.yaml @@ -1,81 +1,556 @@ -vacuum_pump.mock: - description: Mock vacuum pump - 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: - - handler_key: out - label: out - data_type: fluid - io_type: source - data_source: handle - data_key: fluid_in - 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: {} + auto-close: feedback: {} + goal: {} + goal_default: {} + handles: [] result: {} + schema: + description: UniLabJsonCommand close 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand close 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: close 命令参数 + type: object + type: UniLabJsonCommand + auto-get_status: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_status 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_status 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_status 命令参数 + type: object + type: UniLabJsonCommand + auto-is_closed: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand is_closed 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand is_closed 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: is_closed 命令参数 + type: object + type: UniLabJsonCommand + auto-is_open: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand is_open 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand is_open 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: is_open 命令参数 + type: object + type: UniLabJsonCommand + auto-open: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand open 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand open 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: open 命令参数 + type: object + type: UniLabJsonCommand + auto-set_status: + feedback: {} + goal: {} + goal_default: + string: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_status 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_status 的参数schema + properties: + string: + description: '参数: string' + type: string + required: + - string + type: object + result: {} + required: + - goal + title: set_status 命令参数 + type: object + type: UniLabJsonCommand close: - type: EmptyIn - goal: {} feedback: {} + goal: {} + goal_default: {} + handles: [] result: {} + schema: + description: ROS Action EmptyIn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: EmptyIn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: {} + required: [] + title: EmptyIn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + required: + - return_info + title: EmptyIn_Result + type: object + required: + - goal + title: EmptyIn + type: object + type: EmptyIn + open: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: ROS Action EmptyIn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: EmptyIn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: {} + required: [] + title: EmptyIn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + required: + - return_info + title: EmptyIn_Result + type: object + required: + - goal + title: EmptyIn + type: object + type: EmptyIn set_status: - type: StrSingleInput + feedback: {} goal: string: string - feedback: {} + goal_default: + string: '' + handles: [] result: {} + schema: + description: ROS Action StrSingleInput 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: StrSingleInput_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + string: + type: string + required: + - string + title: StrSingleInput_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: StrSingleInput_Result + type: object + required: + - goal + title: StrSingleInput + type: object + type: StrSingleInput + module: unilabos.devices.pump_and_valve.vacuum_pump_mock:VacuumPumpMock + status_types: + status: str + type: python + description: Mock gas source handles: - - handler_key: out - label: out - data_type: fluid - io_type: source - data_source: executor - data_key: fluid_out + - data_key: fluid_out + data_source: executor + data_type: fluid + handler_key: out + io_type: source + label: out + icon: '' init_param_schema: - type: object + description: UniLabJsonCommand __init__ 的参数schema properties: - port: - type: string - description: "通信端口" - default: "COM6" + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + port: + default: COM6 + description: '参数: port' + type: string + required: [] + type: object + result: {} required: - - port \ No newline at end of file + - goal + title: __init__ 命令参数 + type: object +vacuum_pump.mock: + class: + action_value_mappings: + auto-close: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand close 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand close 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: close 命令参数 + type: object + type: UniLabJsonCommand + auto-get_status: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_status 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_status 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_status 命令参数 + type: object + type: UniLabJsonCommand + auto-is_closed: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand is_closed 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand is_closed 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: is_closed 命令参数 + type: object + type: UniLabJsonCommand + auto-is_open: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand is_open 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand is_open 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: is_open 命令参数 + type: object + type: UniLabJsonCommand + auto-open: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand open 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand open 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: open 命令参数 + type: object + type: UniLabJsonCommand + auto-set_status: + feedback: {} + goal: {} + goal_default: + string: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_status 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_status 的参数schema + properties: + string: + description: '参数: string' + type: string + required: + - string + type: object + result: {} + required: + - goal + title: set_status 命令参数 + type: object + type: UniLabJsonCommand + close: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: ROS Action EmptyIn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: EmptyIn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: {} + required: [] + title: EmptyIn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + required: + - return_info + title: EmptyIn_Result + type: object + required: + - goal + title: EmptyIn + type: object + type: EmptyIn + open: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: ROS Action EmptyIn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: EmptyIn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: {} + required: [] + title: EmptyIn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + required: + - return_info + title: EmptyIn_Result + type: object + required: + - goal + title: EmptyIn + type: object + type: EmptyIn + set_status: + feedback: {} + goal: + string: string + goal_default: + string: '' + handles: [] + result: {} + schema: + description: ROS Action StrSingleInput 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: StrSingleInput_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + string: + type: string + required: + - string + title: StrSingleInput_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: StrSingleInput_Result + type: object + required: + - goal + title: StrSingleInput + type: object + type: StrSingleInput + module: unilabos.devices.pump_and_valve.vacuum_pump_mock:VacuumPumpMock + status_types: + status: str + type: python + description: Mock vacuum pump + handles: + - data_key: fluid_in + data_source: handle + data_type: fluid + handler_key: out + io_type: source + label: out + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + port: + default: COM6 + description: '参数: port' + type: string + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object diff --git a/unilabos/registry/devices/virtual_device.yaml b/unilabos/registry/devices/virtual_device.yaml index e25c0d6..af6af57 100644 --- a/unilabos/registry/devices/virtual_device.yaml +++ b/unilabos/registry/devices/virtual_device.yaml @@ -1,961 +1,3342 @@ -# 虚拟设备清单及连接特性 - -# 1. virtual_pump - 虚拟泵 -# 描述:具有多通道阀门特性的泵,根据valve_position可连接多个容器 -# 连接特性:1个输入口 + 1个输出口 -# 数据类型:fluid(流体连接) - -# 2. virtual_stirrer - 虚拟搅拌器 -# 描述:机械连接设备,提供搅拌功能 -# 连接特性:1个连接点 -# 数据类型:mechanical(机械连接) - -# 3a. virtual_valve - 虚拟八通阀门 -# 描述:8通阀门,可切换流向 -# 连接特性:1个口连接注射泵 + 多个输出口 -# 数据类型:fluid(流体连接) - -# 3b. virtual_solenoid_valve (电磁阀门) -# 描述:简单的开关型电磁阀,只有开启和关闭两个状态 -# 连接特性:1个输入口 + 1个输出口,控制通断 -# 数据类型:fluid(流体连接) - -# 4. virtual_centrifuge - 虚拟离心机 -# 描述:单个样品处理设备,原地处理样品 -# 连接特性:1个输入口 + 1个输出口 -# 数据类型:resource(资源/样品连接) - -# 5. virtual_filter - 虚拟过滤器 -# 描述:分离设备,将样品分离为滤液和滤渣 -# 连接特性:1个输入口 + 2个输出口(滤液和滤渣) -# 数据类型:resource(资源/样品连接) - -# 6. virtual_heatchill - 虚拟加热/冷却器 -# 描述:温控设备,容器直接放置在设备上进行温度控制 -# 连接特性:1个连接点 -# 数据类型:mechanical(机械/物理接触连接) - -# 7. virtual_transfer_pump - 虚拟转移泵(注射器式) -# 描述:注射器式转移泵,通过同一个口吸入和排出液体 -# 连接特性:1个连接点 -# 数据类型:fluid(流体连接) - -# 8. virtual_column - 虚拟色谱柱 -# 描述:分离纯化设备,用于样品纯化 -# 连接特性:1个输入口 + 1个输出口 -# 数据类型:resource(资源/样品连接) - -# 9. virtual_rotavap - 虚拟旋转蒸发仪 -# 描述:旋转蒸发仪用于溶剂蒸发和浓缩,具有加热、旋转和真空功能 -# 连接特性:1个输入口(样品),1个输出口(浓缩物),1个冷凝器出口(回收溶剂) -# 数据类型:resource(资源/样品连接) - -# 10. virtual_separator - 虚拟分液器 -# 描述:分液器用于两相液体的分离,可进行萃取和洗涤操作 -# 连接特性:1个输入口(混合液),2个输出口(上相和下相) -# 数据类型:fluid(流体连接) - -# 11. virtual_vacuum_pump - 虚拟真空泵 -# 描述:真空泵设备,用于抽真空操作和真空/充气循环 -# 连接特性:1个输出口(连接需要抽真空的系统) -# 数据类型:fluid(流体连接) - -# 12. virtual_gas_source - 虚拟气源 -# 描述:气源设备,用于充气操作和真空/充气循环 -# 连接特性:1个输出口(向系统提供加压气体) -# 数据类型:fluid(流体连接) - -virtual_pump: - description: Virtual Pump for PumpTransferProtocol Testing - class: - module: unilabos.devices.virtual.virtual_pump:VirtualPump - type: python - status_types: - status: String - position: Float64 - valve_position: Int32 - max_volume: Float64 - current_volume: Float64 - action_value_mappings: - transfer: - type: PumpTransfer - goal: - from_vessel: from_vessel - to_vessel: to_vessel - volume: volume - amount: amount - time: time - viscous: viscous - rinsing_solvent: rinsing_solvent - rinsing_volume: rinsing_volume - rinsing_repeats: rinsing_repeats - solid: solid - feedback: - status: status - result: - success: success - set_valve_position: - type: FloatSingleInput - goal: - float_in: valve_position - feedback: - status: status - result: - success: success - handles: - - handler_key: pumpio - label: pumpio - data_type: fluid - io_type: source - data_source: handle - data_key: fluid_in - description: "泵的输出口" - schema: - type: object - properties: - port: - type: string - default: "VIRTUAL" - max_volume: - type: number - default: 25.0 - additionalProperties: false - -virtual_stirrer: - description: Virtual Stirrer for StirProtocol Testing - icon: Stirrer.webp - class: - module: unilabos.devices.virtual.virtual_stirrer:VirtualStirrer - type: python - status_types: - status: String - operation_mode: String - current_vessel: String - current_speed: Float64 - is_stirring: Bool - remaining_time: Float64 - action_value_mappings: - stir: - type: Stir - goal: - stir_time: stir_time - stir_speed: stir_speed - settling_time: settling_time - feedback: - status: status - result: - success: success - start_stir: - type: StartStir - goal: - vessel: vessel - stir_speed: stir_speed - purpose: purpose - feedback: - status: status - result: - success: success - stop_stir: - type: StopStir - goal: - vessel: vessel - feedback: - status: status - result: - success: success - handles: - - handler_key: stirrer - label: stirrer - data_type: mechanical - side: NORTH - io_type: source - data_source: handle - data_key: vessel - description: "搅拌器的机械连接口" - schema: - type: object - properties: - port: - type: string - default: "VIRTUAL" - max_speed: - type: number - default: 1500.0 - min_speed: - type: number - default: 50.0 - additionalProperties: false - -virtual_multiway_valve: - description: Virtual 8-Way Valve for flow direction control - icon: EightPipeline.webp - class: - module: unilabos.devices.virtual.virtual_multiway_valve:VirtualMultiwayValve - type: python - status_types: - status: String - valve_state: String - current_position: Int32 - target_position: Int32 - max_positions: Int32 - action_value_mappings: - set_position: - type: SendCmd - goal: - command: command - feedback: {} - result: - success: success - set_valve_position: - type: SendCmd - goal: - command: command - feedback: {} - result: - success: success - handles: - - handler_key: transferpump - label: transferpump - data_type: fluid - side: NORTH - io_type: target - data_source: handle - data_key: fluid_in - description: "八通阀门进液口" - - handler_key: 1 - label: 1 - data_type: fluid - side: NORTH - io_type: source - data_source: executor - data_key: fluid_port_1 - description: "八通阀门端口1" - - handler_key: 2 - label: 2 - data_type: fluid - side: EAST - io_type: source - data_source: executor - data_key: fluid_port_2 - description: "八通阀门端口2" - - handler_key: 3 - label: 3 - data_type: fluid - side: EAST - io_type: source - data_source: executor - data_key: fluid_port_3 - description: "八通阀门端口3" - - handler_key: 4 - label: 4 - data_type: fluid - side: SOUTH - io_type: source - data_source: executor - data_key: fluid_port_4 - description: "八通阀门端口4" - - handler_key: 5 - label: 5 - data_type: fluid - side: SOUTH - io_type: source - data_source: executor - data_key: fluid_port_5 - description: "八通阀门端口5" - - handler_key: 6 - label: 6 - data_type: fluid - side: WEST - io_type: source - data_source: executor - data_key: fluid_port_6 - description: "八通阀门端口6" - - handler_key: 7 - label: 7 - data_type: fluid - side: WEST - io_type: source - data_source: executor - data_key: fluid_port_7 - description: "八通阀门端口7" - - handler_key: 8 - label: 8 - data_type: fluid - side: NORTH - io_type: source - data_source: executor - data_key: fluid_port_8 - description: "八通阀门端口8" - schema: - type: object - properties: - port: - type: string - default: "VIRTUAL" - positions: - type: integer - default: 8 - additionalProperties: false - -virtual_solenoid_valve: - description: Virtual Solenoid Valve for simple on/off flow control - class: - module: unilabos.devices.virtual.virtual_solenoid_valve:VirtualSolenoidValve - type: python - status_types: - status: String - valve_state: String - is_open: Bool - action_value_mappings: - set_valve_position: - type: SendCmd - goal: - command: command - feedback: {} - result: - success: success - open: - type: SendCmd - goal: - command: "OPEN" - feedback: {} - result: - success: success - close: - type: SendCmd - goal: - command: "CLOSED" - feedback: {} - result: - success: success - set_state: - type: SendCmd - goal: - command: command - feedback: {} - result: - success: success - handles: - - handler_key: in - label: in - data_type: fluid - side: NORTH - io_type: target - data_source: handle - data_key: fluid_port_in - description: "电磁阀的进液口" - - handler_key: out - label: out - data_type: fluid - side: SOUTH - io_type: source - data_source: handle - data_key: fluid_port_out - description: "电磁阀的出液口" - schema: - type: object - properties: - port: - type: string - default: "VIRTUAL" - voltage: - type: number - default: 12.0 - response_time: - type: number - default: 0.1 - additionalProperties: false - virtual_centrifuge: - description: Virtual Centrifuge for CentrifugeProtocol Testing class: - module: unilabos.devices.virtual.virtual_centrifuge:VirtualCentrifuge - type: python - status_types: - status: String - current_speed: Float64 - target_speed: Float64 - current_temp: Float64 - target_temp: Float64 - max_speed: Float64 - max_temp: Float64 - min_temp: Float64 - centrifuge_state: String - time_remaining: Float64 - progress: Float64 - message: String action_value_mappings: centrifuge: - type: Centrifuge - goal: - vessel: vessel - speed: speed - time: time - temp: temp feedback: - progress: progress current_speed: current_speed - current_temp: current_temp current_status: status + current_temp: current_temp + progress: progress + goal: + speed: speed + temp: temp + time: time + vessel: vessel + goal_default: + speed: 0.0 + temp: 0.0 + time: 0.0 + vessel: '' + handles: [] result: - success: success message: message - handles: - - handler_key: centrifuge - label: centrifuge - data_type: transport - side: NORTH - io_type: target - data_source: handle - data_key: vessel - description: "需要离心的样品容器" - schema: - type: object - properties: - port: - type: string - default: "VIRTUAL" - max_speed: - type: number - default: 15000.0 - max_temp: - type: number - default: 40.0 - min_temp: - type: number - default: 4.0 - additionalProperties: false - -virtual_filter: - description: Virtual Filter for FilterProtocol Testing - class: - module: unilabos.devices.virtual.virtual_filter:VirtualFilter - type: python + success: success + schema: + description: ROS Action Centrifuge 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + current_speed: + type: number + current_status: + type: string + current_temp: + type: number + progress: + type: number + required: + - progress + - current_speed + - current_temp + - current_status + title: Centrifuge_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + speed: + type: number + temp: + type: number + time: + type: number + vessel: + type: string + required: + - vessel + - speed + - time + - temp + title: Centrifuge_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: Centrifuge_Result + type: object + required: + - goal + title: Centrifuge + type: object + type: Centrifuge + module: unilabos.devices.virtual.virtual_centrifuge:VirtualCentrifuge status_types: - status: String - progress: Float64 - current_temp: Float64 - filtered_volume: Float64 - current_status: String - message: String - max_temp: Float64 - max_stir_speed: Float64 - max_volume: Float64 + centrifuge_state: str + current_speed: float + current_temp: float + max_speed: float + max_temp: float + message: str + min_temp: float + progress: float + status: str + target_speed: float + target_temp: float + time_remaining: float + type: python + description: Virtual Centrifuge for CentrifugeProtocol Testing + handles: + - data_key: vessel + data_source: handle + data_type: transport + description: 需要离心的样品容器 + handler_key: centrifuge + io_type: target + label: centrifuge + side: NORTH + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + config: + description: '参数: config' + type: string + device_id: + description: '参数: device_id' + type: string + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object +virtual_column: + class: + action_value_mappings: + run_column: + feedback: + current_status: current_status + processed_volume: processed_volume + progress: progress + goal: + column: column + from_vessel: from_vessel + to_vessel: to_vessel + goal_default: + column: '' + from_vessel: '' + to_vessel: '' + handles: [] + result: + message: current_status + return_info: current_status + success: success + schema: + description: ROS Action RunColumn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + progress: + type: number + status: + type: string + required: + - status + - progress + title: RunColumn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + column: + type: string + from_vessel: + type: string + to_vessel: + type: string + required: + - from_vessel + - to_vessel + - column + title: RunColumn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: RunColumn_Result + type: object + required: + - goal + title: RunColumn + type: object + type: RunColumn + module: unilabos.devices.virtual.virtual_column:VirtualColumn + status_types: + column_diameter: float + column_length: float + column_state: str + current_flow_rate: float + current_status: str + max_flow_rate: float + processed_volume: float + progress: float + status: str + type: python + description: Virtual Column Chromatography Device for RunColumn Protocol Testing + handles: + - data_key: from_vessel + data_source: handle + data_type: transport + description: 样品输入口 + handler_key: columnin + io_type: target + label: columnin + side: WEST + - data_key: to_vessel + data_source: handle + data_type: transport + description: 产物输出口 + handler_key: columnout + io_type: source + label: columnout + side: EAST + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + config: + description: '参数: config' + type: string + device_id: + description: '参数: device_id' + type: string + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object +virtual_filter: + class: action_value_mappings: filter: - type: Filter + feedback: + current_status: current_status + current_temp: current_temp + filtered_volume: filtered_volume + progress: progress goal: - vessel: vessel + continue_heatchill: continue_heatchill filtrate_vessel: filtrate_vessel stir: stir stir_speed: stir_speed temp: temp - continue_heatchill: continue_heatchill + vessel: vessel volume: volume - feedback: - progress: progress - current_temp: current_temp - filtered_volume: filtered_volume - current_status: current_status + goal_default: + continue_heatchill: false + filtrate_vessel: '' + stir: false + stir_speed: 0.0 + temp: 0.0 + vessel: '' + volume: 0.0 + handles: [] result: - success: success message: message return_info: message - handles: - - handler_key: filter_in - label: filter_in - data_type: transport - side: NORTH - io_type: target - data_source: handle - data_key: vessel_in - description: "需要过滤的样品容器" - - handler_key: filtrate_out - label: filtrate_out - data_type: transport - side: SOUTH - io_type: source - data_source: handle - data_key: filtrate_out - description: "滤液出口" - - handler_key: retentate_out - label: retentate_out - data_type: transport - side: EAST - io_type: source - data_source: handle - data_key: retentate_out - description: "滤渣/固体出口" - schema: - type: object - properties: - port: - type: string - default: "VIRTUAL" - max_temp: - type: number - default: 100.0 - max_stir_speed: - type: number - default: 1000.0 - max_volume: - type: number - default: 500.0 - additionalProperties: false - -virtual_heatchill: - description: Virtual HeatChill for HeatChillProtocol Testing - icon: Heater.webp - class: - module: unilabos.devices.virtual.virtual_heatchill:VirtualHeatChill - type: python + success: success + schema: + description: ROS Action Filter 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + current_status: + type: string + current_temp: + type: number + filtered_volume: + type: number + progress: + type: number + required: + - progress + - current_temp + - filtered_volume + - current_status + title: Filter_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + continue_heatchill: + type: boolean + filtrate_vessel: + type: string + stir: + type: boolean + stir_speed: + type: number + temp: + type: number + vessel: + type: string + volume: + type: number + required: + - vessel + - filtrate_vessel + - stir + - stir_speed + - temp + - continue_heatchill + - volume + title: Filter_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: Filter_Result + type: object + required: + - goal + title: Filter + type: object + type: Filter + module: unilabos.devices.virtual.virtual_filter:VirtualFilter status_types: - status: String - operation_mode: String - is_stirring: Bool - stir_speed: Float64 + current_status: str + current_temp: float + filtered_volume: float + max_stir_speed: float + max_temp: float + max_volume: float + message: str + progress: float + status: str + type: python + description: Virtual Filter for FilterProtocol Testing + handles: + - data_key: vessel_in + data_source: handle + data_type: transport + description: 需要过滤的样品容器 + handler_key: filter_in + io_type: target + label: filter_in + side: NORTH + - data_key: filtrate_out + data_source: handle + data_type: transport + description: 滤液出口 + handler_key: filtrate_out + io_type: source + label: filtrate_out + side: SOUTH + - data_key: retentate_out + data_source: handle + data_type: transport + description: 滤渣/固体出口 + handler_key: retentate_out + io_type: source + label: retentate_out + side: EAST + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + config: + description: '参数: config' + type: string + device_id: + description: '参数: device_id' + type: string + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object +virtual_gas_source: + class: + action_value_mappings: + auto-close: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand close 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand close 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: close 命令参数 + type: object + type: UniLabJsonCommand + auto-get_status: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_status 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_status 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_status 命令参数 + type: object + type: UniLabJsonCommand + auto-is_closed: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand is_closed 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand is_closed 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: is_closed 命令参数 + type: object + type: UniLabJsonCommand + auto-is_open: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand is_open 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand is_open 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: is_open 命令参数 + type: object + type: UniLabJsonCommand + auto-open: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand open 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand open 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: open 命令参数 + type: object + type: UniLabJsonCommand + auto-set_status: + feedback: {} + goal: {} + goal_default: + string: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_status 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_status 的参数schema + properties: + string: + description: '参数: string' + type: string + required: + - string + type: object + result: {} + required: + - goal + title: set_status 命令参数 + type: object + type: UniLabJsonCommand + close: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: ROS Action EmptyIn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: EmptyIn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: {} + required: [] + title: EmptyIn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + required: + - return_info + title: EmptyIn_Result + type: object + required: + - goal + title: EmptyIn + type: object + type: EmptyIn + open: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: ROS Action EmptyIn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: EmptyIn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: {} + required: [] + title: EmptyIn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + required: + - return_info + title: EmptyIn_Result + type: object + required: + - goal + title: EmptyIn + type: object + type: EmptyIn + set_status: + feedback: {} + goal: + string: string + goal_default: + string: '' + handles: [] + result: {} + schema: + description: ROS Action StrSingleInput 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: StrSingleInput_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + string: + type: string + required: + - string + title: StrSingleInput_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: StrSingleInput_Result + type: object + required: + - goal + title: StrSingleInput + type: object + type: StrSingleInput + module: unilabos.devices.virtual.virtual_gas_source:VirtualGasSource + status_types: + status: str + type: python + description: Virtual gas source + handles: + - data_key: fluid_out + data_source: executor + data_type: fluid + description: 气源出气口 + handler_key: gassource + io_type: source + label: gassource + side: SOUTH + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + config: + description: '参数: config' + type: string + device_id: + description: '参数: device_id' + type: string + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object +virtual_heatchill: + class: action_value_mappings: heat_chill: - type: HeatChill + feedback: + status: status goal: - vessel: vessel - temp: temp - time: time + purpose: purpose stir: stir stir_speed: stir_speed - purpose: purpose - feedback: - status: status - result: - success: success - heat_chill_start: - type: HeatChillStart - goal: - vessel: vessel temp: temp - purpose: purpose - feedback: - status: status + time: time + vessel: vessel + goal_default: + purpose: '' + stir: false + stir_speed: 0.0 + temp: 0.0 + time: 0.0 + vessel: '' + handles: [] result: success: success + schema: + description: ROS Action HeatChill 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: HeatChill_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + purpose: + type: string + stir: + type: boolean + stir_speed: + type: number + temp: + type: number + time: + type: number + vessel: + type: string + required: + - vessel + - temp + - time + - stir + - stir_speed + - purpose + title: HeatChill_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: HeatChill_Result + type: object + required: + - goal + title: HeatChill + type: object + type: HeatChill + heat_chill_start: + feedback: + status: status + goal: + purpose: purpose + temp: temp + vessel: vessel + goal_default: + purpose: '' + temp: 0.0 + vessel: '' + handles: [] + result: + success: success + schema: + description: ROS Action HeatChillStart 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: HeatChillStart_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + purpose: + type: string + temp: + type: number + vessel: + type: string + required: + - vessel + - temp + - purpose + title: HeatChillStart_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: HeatChillStart_Result + type: object + required: + - goal + title: HeatChillStart + type: object + type: HeatChillStart heat_chill_stop: - type: HeatChillStop + feedback: + status: status goal: vessel: vessel - feedback: - status: status + goal_default: + vessel: '' + handles: [] result: success: success - handles: - - handler_key: heatchill - label: heatchill - data_type: mechanical - side: NORTH - io_type: source - data_source: handle - data_key: vessel - description: "加热/冷却器的物理连接口" - schema: - type: object - properties: - port: - type: string - default: "VIRTUAL" - max_temp: - type: number - default: 200.0 - min_temp: - type: number - default: -80 - max_stir_speed: - type: number - default: 1000.0 - additionalProperties: false - -virtual_transfer_pump: - description: Virtual Transfer Pump for TransferProtocol Testing (Syringe-style) - icon: Pump.webp - class: - module: unilabos.devices.virtual.virtual_transferpump:VirtualTransferPump - type: python + schema: + description: ROS Action HeatChillStop 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: HeatChillStop_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + vessel: + type: string + required: + - vessel + title: HeatChillStop_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: HeatChillStop_Result + type: object + required: + - goal + title: HeatChillStop + type: object + type: HeatChillStop + module: unilabos.devices.virtual.virtual_heatchill:VirtualHeatChill status_types: - status: String - current_volume: Float64 - max_volume: Float64 - transfer_rate: Float64 - position: Float64 + is_stirring: bool + operation_mode: str + remaining_time: float + status: str + stir_speed: float + type: python + description: Virtual HeatChill for HeatChillProtocol Testing + handles: + - data_key: vessel + data_source: handle + data_type: mechanical + description: 加热/冷却器的物理连接口 + handler_key: heatchill + io_type: source + label: heatchill + side: NORTH + icon: Heater.webp + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + config: + description: '参数: config' + type: string + device_id: + description: '参数: device_id' + type: string + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object +virtual_multiway_valve: + class: action_value_mappings: - transfer: - type: Transfer + auto-close: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand close 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand close 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: close 命令参数 + type: object + type: UniLabJsonCommand + auto-get_available_ports: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_available_ports 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_available_ports 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_available_ports 命令参数 + type: object + type: UniLabJsonCommand + auto-get_available_positions: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_available_positions 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_available_positions 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_available_positions 命令参数 + type: object + type: UniLabJsonCommand + auto-get_current_port: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_current_port 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_current_port 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_current_port 命令参数 + type: object + type: UniLabJsonCommand + auto-get_current_position: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_current_position 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_current_position 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_current_position 命令参数 + type: object + type: UniLabJsonCommand + auto-get_flow_path: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_flow_path 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_flow_path 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_flow_path 命令参数 + type: object + type: UniLabJsonCommand + auto-get_info: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_info 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_info 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_info 命令参数 + type: object + type: UniLabJsonCommand + auto-get_valve_position: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_valve_position 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_valve_position 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_valve_position 命令参数 + type: object + type: UniLabJsonCommand + auto-is_at_port: + feedback: {} + goal: {} + goal_default: + port_number: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand is_at_port 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand is_at_port 的参数schema + properties: + port_number: + description: '参数: port_number' + type: integer + required: + - port_number + type: object + result: {} + required: + - goal + title: is_at_port 命令参数 + type: object + type: UniLabJsonCommand + auto-is_at_position: + feedback: {} + goal: {} + goal_default: + position: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand is_at_position 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand is_at_position 的参数schema + properties: + position: + description: '参数: position' + type: integer + required: + - position + type: object + result: {} + required: + - goal + title: is_at_position 命令参数 + type: object + type: UniLabJsonCommand + auto-is_at_pump_position: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand is_at_pump_position 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand is_at_pump_position 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: is_at_pump_position 命令参数 + type: object + type: UniLabJsonCommand + auto-open: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand open 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand open 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: open 命令参数 + type: object + type: UniLabJsonCommand + auto-reset: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand reset 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand reset 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: reset 命令参数 + type: object + type: UniLabJsonCommand + auto-set_position: + feedback: {} + goal: {} + goal_default: + command: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_position 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_position 的参数schema + properties: + command: + description: '参数: command' + type: string + required: + - command + type: object + result: {} + required: + - goal + title: set_position 命令参数 + type: object + type: UniLabJsonCommand + auto-set_to_port: + feedback: {} + goal: {} + goal_default: + port_number: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_to_port 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_to_port 的参数schema + properties: + port_number: + description: '参数: port_number' + type: integer + required: + - port_number + type: object + result: {} + required: + - goal + title: set_to_port 命令参数 + type: object + type: UniLabJsonCommand + auto-set_to_pump_position: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_to_pump_position 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_to_pump_position 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: set_to_pump_position 命令参数 + type: object + type: UniLabJsonCommand + auto-set_valve_position: + feedback: {} + goal: {} + goal_default: + command: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_valve_position 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_valve_position 的参数schema + properties: + command: + description: '参数: command' + type: string + required: + - command + type: object + result: {} + required: + - goal + title: set_valve_position 命令参数 + type: object + type: UniLabJsonCommand + auto-switch_between_pump_and_port: + feedback: {} + goal: {} + goal_default: + port_number: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand switch_between_pump_and_port 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand switch_between_pump_and_port 的参数schema + properties: + port_number: + description: '参数: port_number' + type: integer + required: + - port_number + type: object + result: {} + required: + - goal + title: switch_between_pump_and_port 命令参数 + type: object + type: UniLabJsonCommand + set_position: + feedback: {} + goal: + command: command + goal_default: + command: '' + handles: [] + result: + success: success + schema: + description: ROS Action SendCmd 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: SendCmd_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + command: + type: string + required: + - command + title: SendCmd_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: SendCmd_Result + type: object + required: + - goal + title: SendCmd + type: object + type: SendCmd + set_valve_position: + feedback: {} + goal: + command: command + goal_default: + command: '' + handles: [] + result: + success: success + schema: + description: ROS Action SendCmd 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: SendCmd_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + command: + type: string + required: + - command + title: SendCmd_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: SendCmd_Result + type: object + required: + - goal + title: SendCmd + type: object + type: SendCmd + module: unilabos.devices.virtual.virtual_multiway_valve:VirtualMultiwayValve + status_types: + current_position: int + max_positions: Int32 + status: str + target_position: int + valve_state: str + type: python + description: Virtual 8-Way Valve for flow direction control + handles: + - data_key: fluid_in + data_source: handle + data_type: fluid + description: 八通阀门进液口 + handler_key: transferpump + io_type: target + label: transferpump + side: NORTH + - data_key: fluid_port_1 + data_source: executor + data_type: fluid + description: 八通阀门端口1 + handler_key: 1 + io_type: source + label: 1 + side: NORTH + - data_key: fluid_port_2 + data_source: executor + data_type: fluid + description: 八通阀门端口2 + handler_key: 2 + io_type: source + label: 2 + side: EAST + - data_key: fluid_port_3 + data_source: executor + data_type: fluid + description: 八通阀门端口3 + handler_key: 3 + io_type: source + label: 3 + side: EAST + - data_key: fluid_port_4 + data_source: executor + data_type: fluid + description: 八通阀门端口4 + handler_key: 4 + io_type: source + label: 4 + side: SOUTH + - data_key: fluid_port_5 + data_source: executor + data_type: fluid + description: 八通阀门端口5 + handler_key: 5 + io_type: source + label: 5 + side: SOUTH + - data_key: fluid_port_6 + data_source: executor + data_type: fluid + description: 八通阀门端口6 + handler_key: 6 + io_type: source + label: 6 + side: WEST + - data_key: fluid_port_7 + data_source: executor + data_type: fluid + description: 八通阀门端口7 + handler_key: 7 + io_type: source + label: 7 + side: WEST + - data_key: fluid_port_8 + data_source: executor + data_type: fluid + description: 八通阀门端口8 + handler_key: 8 + io_type: source + label: 8 + side: NORTH + icon: EightPipeline.webp + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + port: + default: VIRTUAL + description: '参数: port' + type: string + positions: + default: 8 + description: '参数: positions' + type: integer + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object +virtual_pump: + class: + action_value_mappings: + set_valve_position: + feedback: + status: status + goal: + float_in: valve_position + goal_default: + float_in: 0.0 + handles: [] + result: + success: success + schema: + description: ROS Action FloatSingleInput 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: FloatSingleInput_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + float_in: + type: number + required: + - float_in + title: FloatSingleInput_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: FloatSingleInput_Result + type: object + required: + - goal + title: FloatSingleInput + type: object + type: FloatSingleInput + transfer: + feedback: + status: status goal: - from_vessel: from_vessel - to_vessel: to_vessel - volume: volume amount: amount - time: time - viscous: viscous + from_vessel: from_vessel + rinsing_repeats: rinsing_repeats rinsing_solvent: rinsing_solvent rinsing_volume: rinsing_volume - rinsing_repeats: rinsing_repeats solid: solid - feedback: - progress: progress - transferred_volume: transferred_volume - current_status: current_status - result: - success: success - message: message - set_position: - type: SetPumpPosition - goal: - position: position - max_velocity: max_velocity - feedback: - status: status - current_position: current_position - progress: progress - result: - success: success - message: message - handles: - - handler_key: transferpump - label: transferpump - data_type: fluid - side: SOUTH - io_type: source - data_source: handle - data_key: fluid_port - description: "注射器式转移泵的连接口" - schema: - type: object - properties: - port: - type: string - default: "VIRTUAL" - description: "通信端口" - max_volume: - type: number - default: 50.0 - description: "最大注射器容量 (mL)" - transfer_rate: - type: number - default: 5.0 - description: "默认转移速率 (mL/s)" - additionalProperties: false - -virtual_column: - description: Virtual Column Chromatography Device for RunColumn Protocol Testing - class: - module: unilabos.devices.virtual.virtual_column:VirtualColumn - type: python - status_types: - status: String - column_state: String - current_flow_rate: Float64 - max_flow_rate: Float64 - column_length: Float64 - column_diameter: Float64 - processed_volume: Float64 - progress: Float64 - current_status: String - action_value_mappings: - run_column: - type: RunColumn - goal: - from_vessel: from_vessel + time: time to_vessel: to_vessel - column: column - feedback: - progress: progress - processed_volume: processed_volume - current_status: current_status + viscous: viscous + volume: volume + goal_default: + amount: '' + from_vessel: '' + rinsing_repeats: 0 + rinsing_solvent: '' + rinsing_volume: 0.0 + solid: false + time: 0.0 + to_vessel: '' + viscous: false + volume: 0.0 + handles: [] result: success: success - message: current_status - return_info: current_status - handles: - - handler_key: columnin - label: columnin - data_type: transport - side: WEST - io_type: target - data_source: handle - data_key: from_vessel - description: "样品输入口" - - handler_key: columnout - label: columnout - data_type: transport - side: EAST - io_type: source - data_source: handle - data_key: to_vessel - description: "产物输出口" - schema: - type: object - properties: - port: - type: string - default: "VIRTUAL" - max_flow_rate: - type: number - default: 10.0 - column_length: - type: number - default: 25.0 - column_diameter: - type: number - default: 2.0 - additionalProperties: false - -virtual_rotavap: - description: Virtual Rotary Evaporator for EvaporateProtocol Testing - icon: Rotaryevaporator.webp - class: - module: unilabos.devices.virtual.virtual_rotavap:VirtualRotavap - type: python + schema: + description: ROS Action PumpTransfer 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + current_device: + type: string + status: + type: string + time_remaining: + properties: + nanosec: + maximum: 4294967295 + minimum: 0 + type: integer + sec: + maximum: 2147483647 + minimum: -2147483648 + type: integer + required: + - sec + - nanosec + title: Duration + type: object + time_spent: + properties: + nanosec: + maximum: 4294967295 + minimum: 0 + type: integer + sec: + maximum: 2147483647 + minimum: -2147483648 + type: integer + required: + - sec + - nanosec + title: Duration + type: object + required: + - status + - current_device + - time_spent + - time_remaining + title: PumpTransfer_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + amount: + type: string + from_vessel: + type: string + rinsing_repeats: + maximum: 2147483647 + minimum: -2147483648 + type: integer + rinsing_solvent: + type: string + rinsing_volume: + type: number + solid: + type: boolean + time: + type: number + to_vessel: + type: string + viscous: + type: boolean + volume: + type: number + required: + - from_vessel + - to_vessel + - volume + - amount + - time + - viscous + - rinsing_solvent + - rinsing_volume + - rinsing_repeats + - solid + title: PumpTransfer_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: PumpTransfer_Result + type: object + required: + - goal + title: PumpTransfer + type: object + type: PumpTransfer + module: unilabos.devices.virtual.virtual_pump:VirtualPump status_types: - status: String - rotavap_state: String - current_temp: Float64 - rotation_speed: Float64 - vacuum_pressure: Float64 - evaporated_volume: Float64 - progress: Float64 - remaining_time: Float64 - message: String - max_temp: Float64 - max_rotation_speed: Float64 + current_status: str + current_volume: float + from_vessel: str + max_volume: float + position: Float64 + progress: float + status: str + to_vessel: str + transfer_rate: float + transferred_volume: float + valve_position: int + type: python + description: Virtual Pump for PumpTransferProtocol Testing + handles: + - data_key: fluid_in + data_source: handle + data_type: fluid + description: 泵的输出口 + handler_key: pumpio + io_type: source + label: pumpio + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + config: + description: '参数: config' + type: string + device_id: + description: '参数: device_id' + type: string + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object +virtual_rotavap: + class: action_value_mappings: evaporate: - type: Evaporate - goal: - vessel: vessel - pressure: pressure - temp: temp - time: time - stir_speed: stir_speed feedback: - progress: progress current_temp: current_temp evaporated_volume: evaporated_volume + progress: progress status: status + goal: + pressure: pressure + stir_speed: stir_speed + temp: temp + time: time + vessel: vessel + goal_default: + pressure: 0.0 + stir_speed: 0.0 + temp: 0.0 + time: 0.0 + vessel: '' + handles: [] result: - success: success message: message - handles: - - handler_key: sample_in - label: sample_in - data_type: fluid - side: NORTH - io_type: target - data_source: handle - data_key: vessel_in - description: "样品连接口" - - handler_key: product_out - label: product_out - data_type: fluid - side: SOUTH - io_type: source - data_source: handle - data_key: product_out - description: "浓缩产物出口" - - handler_key: solvent_out - label: solvent_out - data_type: fluid - side: EAST - io_type: source - data_source: handle - data_key: solvent_out - description: "冷凝溶剂出口" - schema: - type: object - properties: - port: - type: string - default: "VIRTUAL" - max_temp: - type: number - default: 180.0 - max_rotation_speed: - type: number - default: 280.0 - additionalProperties: false - -virtual_separator: - description: Virtual Separator for SeparateProtocol Testing - icon: Separator.webp - class: - module: unilabos.devices.virtual.virtual_separator:VirtualSeparator - type: python + success: success + schema: + description: ROS Action Evaporate 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + current_device: + type: string + status: + type: string + time_remaining: + properties: + nanosec: + maximum: 4294967295 + minimum: 0 + type: integer + sec: + maximum: 2147483647 + minimum: -2147483648 + type: integer + required: + - sec + - nanosec + title: Duration + type: object + time_spent: + properties: + nanosec: + maximum: 4294967295 + minimum: 0 + type: integer + sec: + maximum: 2147483647 + minimum: -2147483648 + type: integer + required: + - sec + - nanosec + title: Duration + type: object + required: + - status + - current_device + - time_spent + - time_remaining + title: Evaporate_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + pressure: + type: number + stir_speed: + type: number + temp: + type: number + time: + type: number + vessel: + type: string + required: + - vessel + - pressure + - temp + - time + - stir_speed + title: Evaporate_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: Evaporate_Result + type: object + required: + - goal + title: Evaporate + type: object + type: Evaporate + module: unilabos.devices.virtual.virtual_rotavap:VirtualRotavap status_types: - status: String - separator_state: String - volume: Float64 - has_phases: Bool - phase_separation: Bool - stir_speed: Float64 - settling_time: Float64 - progress: Float64 - message: String + current_temp: float + evaporated_volume: float + max_rotation_speed: float + max_temp: float + message: str + progress: float + remaining_time: float + rotation_speed: float + rotavap_state: str + status: str + vacuum_pressure: float + type: python + description: Virtual Rotary Evaporator for EvaporateProtocol Testing + handles: + - data_key: vessel_in + data_source: handle + data_type: fluid + description: 样品连接口 + handler_key: sample_in + io_type: target + label: sample_in + side: NORTH + - data_key: product_out + data_source: handle + data_type: fluid + description: 浓缩产物出口 + handler_key: product_out + io_type: source + label: product_out + side: SOUTH + - data_key: solvent_out + data_source: handle + data_type: fluid + description: 冷凝溶剂出口 + handler_key: solvent_out + io_type: source + label: solvent_out + side: EAST + icon: Rotaryevaporator.webp + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + config: + description: '参数: config' + type: string + device_id: + description: '参数: device_id' + type: string + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object +virtual_separator: + class: action_value_mappings: separate: - type: Separate + feedback: + current_status: status + progress: progress goal: - purpose: purpose - product_phase: product_phase from_vessel: from_vessel + product_phase: product_phase + purpose: purpose + repeats: repeats separation_vessel: separation_vessel - to_vessel: to_vessel - waste_phase_to_vessel: waste_phase_to_vessel + settling_time: settling_time solvent: solvent solvent_volume: solvent_volume - through: through - repeats: repeats - stir_time: stir_time stir_speed: stir_speed - settling_time: settling_time - feedback: - progress: progress - current_status: status + stir_time: stir_time + through: through + to_vessel: to_vessel + waste_phase_to_vessel: waste_phase_to_vessel + goal_default: + from_vessel: '' + product_phase: '' + purpose: '' + repeats: 0 + separation_vessel: '' + settling_time: 0.0 + solvent: '' + solvent_volume: 0.0 + stir_speed: 0.0 + stir_time: 0.0 + through: '' + to_vessel: '' + waste_phase_to_vessel: '' + handles: [] + result: + message: message + success: success + schema: + description: ROS Action Separate 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + current_device: + type: string + status: + type: string + time_remaining: + properties: + nanosec: + maximum: 4294967295 + minimum: 0 + type: integer + sec: + maximum: 2147483647 + minimum: -2147483648 + type: integer + required: + - sec + - nanosec + title: Duration + type: object + time_spent: + properties: + nanosec: + maximum: 4294967295 + minimum: 0 + type: integer + sec: + maximum: 2147483647 + minimum: -2147483648 + type: integer + required: + - sec + - nanosec + title: Duration + type: object + required: + - status + - current_device + - time_spent + - time_remaining + title: Separate_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + from_vessel: + type: string + product_phase: + type: string + purpose: + type: string + repeats: + maximum: 2147483647 + minimum: -2147483648 + type: integer + separation_vessel: + type: string + settling_time: + type: number + solvent: + type: string + solvent_volume: + type: number + stir_speed: + type: number + stir_time: + type: number + through: + type: string + to_vessel: + type: string + waste_phase_to_vessel: + type: string + required: + - purpose + - product_phase + - from_vessel + - separation_vessel + - to_vessel + - waste_phase_to_vessel + - solvent + - solvent_volume + - through + - repeats + - stir_time + - stir_speed + - settling_time + title: Separate_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: Separate_Result + type: object + required: + - goal + title: Separate + type: object + type: Separate + module: unilabos.devices.virtual.virtual_separator:VirtualSeparator + status_types: + has_phases: bool + message: str + phase_separation: bool + progress: float + separator_state: str + settling_time: float + status: str + stir_speed: float + volume: float + type: python + description: Virtual Separator for SeparateProtocol Testing + handles: + - data_key: from_vessel + data_source: handle + data_type: fluid + description: 需要分离的混合液体输入口 + handler_key: separator_in + io_type: target + label: separator_in + side: NORTH + - data_key: bottom_outlet + data_source: executor + data_type: fluid + description: 下相(重相)液体输出口 + handler_key: bottom_phase_out + io_type: source + label: bottom_phase_out + side: SOUTH + - data_key: top_outlet + data_source: executor + data_type: fluid + description: 上相(轻相)液体输出口 + handler_key: top_phase_out + io_type: source + label: top_phase_out + side: EAST + - data_key: mechanical_port + data_source: handle + data_type: mechanical + description: 用于连接搅拌器等机械设备的接口 + handler_key: bind + io_type: target + label: bind + side: WEST + icon: Separator.webp + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + config: + description: '参数: config' + type: string + device_id: + description: '参数: device_id' + type: string + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object +virtual_solenoid_valve: + class: + action_value_mappings: + auto-get_state: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_state 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_state 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_state 命令参数 + type: object + type: UniLabJsonCommand + auto-get_valve_position: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_valve_position 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_valve_position 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_valve_position 命令参数 + type: object + type: UniLabJsonCommand + auto-is_closed: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand is_closed 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand is_closed 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: is_closed 命令参数 + type: object + type: UniLabJsonCommand + auto-toggle: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand toggle 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand toggle 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: toggle 命令参数 + type: object + type: UniLabJsonCommand + close: + feedback: {} + goal: + command: CLOSED + goal_default: + command: '' + handles: [] result: success: success - message: message + schema: + description: ROS Action SendCmd 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: SendCmd_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + command: + type: string + required: + - command + title: SendCmd_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: SendCmd_Result + type: object + required: + - goal + title: SendCmd + type: object + type: SendCmd + open: + feedback: {} + goal: + command: OPEN + goal_default: + command: '' + handles: [] + result: + success: success + schema: + description: ROS Action SendCmd 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: SendCmd_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + command: + type: string + required: + - command + title: SendCmd_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: SendCmd_Result + type: object + required: + - goal + title: SendCmd + type: object + type: SendCmd + set_state: + feedback: {} + goal: + command: command + goal_default: + command: '' + handles: [] + result: + success: success + schema: + description: ROS Action SendCmd 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: SendCmd_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + command: + type: string + required: + - command + title: SendCmd_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: SendCmd_Result + type: object + required: + - goal + title: SendCmd + type: object + type: SendCmd + set_valve_position: + feedback: {} + goal: + command: command + goal_default: + command: '' + handles: [] + result: + success: success + schema: + description: ROS Action SendCmd 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: SendCmd_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + command: + type: string + required: + - command + title: SendCmd_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: SendCmd_Result + type: object + required: + - goal + title: SendCmd + type: object + type: SendCmd + module: unilabos.devices.virtual.virtual_solenoid_valve:VirtualSolenoidValve + status_types: + is_open: bool + status: str + valve_state: str + type: python + description: Virtual Solenoid Valve for simple on/off flow control handles: - - handler_key: separator_in - label: separator_in + - data_key: fluid_port_in + data_source: handle data_type: fluid + description: 电磁阀的进液口 + handler_key: in + io_type: target + label: in side: NORTH - io_type: target + - data_key: fluid_port_out data_source: handle - data_key: from_vessel - description: "需要分离的混合液体输入口" - - handler_key: bottom_phase_out - label: bottom_phase_out data_type: fluid + description: 电磁阀的出液口 + handler_key: out + io_type: source + label: out side: SOUTH - io_type: source - data_source: executor - data_key: bottom_outlet - description: "下相(重相)液体输出口" - - handler_key: top_phase_out - label: top_phase_out - data_type: fluid - side: EAST - io_type: source - data_source: executor - data_key: top_outlet - description: "上相(轻相)液体输出口" - - handler_key: bind - label: bind - io_type: target + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + config: + description: '参数: config' + type: object + device_id: + description: '参数: device_id' + type: string + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object +virtual_stirrer: + class: + action_value_mappings: + start_stir: + feedback: + status: status + goal: + purpose: purpose + stir_speed: stir_speed + vessel: vessel + goal_default: + purpose: '' + stir_speed: 0.0 + vessel: '' + handles: [] + result: + success: success + schema: + description: ROS Action StartStir 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + current_speed: + type: number + current_status: + type: string + progress: + type: number + required: + - progress + - current_speed + - current_status + title: StartStir_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + purpose: + type: string + stir_speed: + type: number + vessel: + type: string + required: + - vessel + - stir_speed + - purpose + title: StartStir_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: StartStir_Result + type: object + required: + - goal + title: StartStir + type: object + type: StartStir + stir: + feedback: + status: status + goal: + settling_time: settling_time + stir_speed: stir_speed + stir_time: stir_time + goal_default: + settling_time: 0.0 + stir_speed: 0.0 + stir_time: 0.0 + handles: [] + result: + success: success + schema: + description: ROS Action Stir 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: Stir_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + settling_time: + type: number + stir_speed: + type: number + stir_time: + type: number + required: + - stir_time + - stir_speed + - settling_time + title: Stir_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: Stir_Result + type: object + required: + - goal + title: Stir + type: object + type: Stir + stop_stir: + feedback: + status: status + goal: + vessel: vessel + goal_default: + vessel: '' + handles: [] + result: + success: success + schema: + description: ROS Action StopStir 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + current_status: + type: string + progress: + type: number + required: + - progress + - current_status + title: StopStir_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + vessel: + type: string + required: + - vessel + title: StopStir_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: StopStir_Result + type: object + required: + - goal + title: StopStir + type: object + type: StopStir + module: unilabos.devices.virtual.virtual_stirrer:VirtualStirrer + status_types: + current_speed: float + current_vessel: str + is_stirring: bool + operation_mode: str + remaining_time: float + status: str + type: python + description: Virtual Stirrer for StirProtocol Testing + handles: + - data_key: vessel + data_source: handle data_type: mechanical - side: WEST - data_source: handle - data_key: mechanical_port - description: "用于连接搅拌器等机械设备的接口" - schema: - type: object + description: 搅拌器的机械连接口 + handler_key: stirrer + io_type: source + label: stirrer + side: NORTH + icon: Stirrer.webp + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema properties: - port: - type: string - default: "VIRTUAL" - volume: - type: number - default: 250.0 - has_phases: - type: boolean - default: true - additionalProperties: false - + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + config: + description: '参数: config' + type: string + device_id: + description: '参数: device_id' + type: string + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object +virtual_transfer_pump: + class: + action_value_mappings: + auto-get_current_volume: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_current_volume 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_current_volume 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_current_volume 命令参数 + type: object + type: UniLabJsonCommand + auto-get_position: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_position 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_position 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_position 命令参数 + type: object + type: UniLabJsonCommand + auto-get_pump_info: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_pump_info 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_pump_info 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_pump_info 命令参数 + type: object + type: UniLabJsonCommand + auto-get_remaining_capacity: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_remaining_capacity 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_remaining_capacity 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_remaining_capacity 命令参数 + type: object + type: UniLabJsonCommand + auto-get_status: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_status 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_status 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_status 命令参数 + type: object + type: UniLabJsonCommand + auto-is_empty: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand is_empty 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand is_empty 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: is_empty 命令参数 + type: object + type: UniLabJsonCommand + auto-is_full: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand is_full 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand is_full 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: is_full 命令参数 + type: object + type: UniLabJsonCommand + auto-set_max_velocity: + feedback: {} + goal: {} + goal_default: + velocity: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_max_velocity 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_max_velocity 的参数schema + properties: + velocity: + description: '参数: velocity' + type: number + required: + - velocity + type: object + result: {} + required: + - goal + title: set_max_velocity 命令参数 + type: object + type: UniLabJsonCommand + set_position: + feedback: + current_position: current_position + progress: progress + status: status + goal: + max_velocity: max_velocity + position: position + goal_default: + max_velocity: 0.0 + position: 0.0 + handles: [] + result: + message: message + success: success + schema: + description: ROS Action SetPumpPosition 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + current_position: + type: number + progress: + type: number + status: + type: string + required: + - status + - current_position + - progress + title: SetPumpPosition_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + max_velocity: + type: number + position: + type: number + required: + - position + - max_velocity + title: SetPumpPosition_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + - message + title: SetPumpPosition_Result + type: object + required: + - goal + title: SetPumpPosition + type: object + type: SetPumpPosition + transfer: + feedback: + current_status: current_status + progress: progress + transferred_volume: transferred_volume + goal: + amount: amount + from_vessel: from_vessel + rinsing_repeats: rinsing_repeats + rinsing_solvent: rinsing_solvent + rinsing_volume: rinsing_volume + solid: solid + time: time + to_vessel: to_vessel + viscous: viscous + volume: volume + goal_default: + amount: '' + from_vessel: '' + rinsing_repeats: 0 + rinsing_solvent: '' + rinsing_volume: 0.0 + solid: false + time: 0.0 + to_vessel: '' + viscous: false + volume: 0.0 + handles: [] + result: + message: message + success: success + schema: + description: ROS Action Transfer 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + current_status: + type: string + progress: + type: number + transferred_volume: + type: number + required: + - progress + - transferred_volume + - current_status + title: Transfer_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + amount: + type: string + from_vessel: + type: string + rinsing_repeats: + maximum: 2147483647 + minimum: -2147483648 + type: integer + rinsing_solvent: + type: string + rinsing_volume: + type: number + solid: + type: boolean + time: + type: number + to_vessel: + type: string + viscous: + type: boolean + volume: + type: number + required: + - from_vessel + - to_vessel + - volume + - amount + - time + - viscous + - rinsing_solvent + - rinsing_volume + - rinsing_repeats + - solid + title: Transfer_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: Transfer_Result + type: object + required: + - goal + title: Transfer + type: object + type: Transfer + module: unilabos.devices.virtual.virtual_transferpump:VirtualTransferPump + status_types: + current_volume: float + max_velocity: float + max_volume: Float64 + position: float + status: str + transfer_rate: float + type: python + description: Virtual Transfer Pump for TransferProtocol Testing (Syringe-style) + handles: + - data_key: fluid_port + data_source: handle + data_type: fluid + description: 注射器式转移泵的连接口 + handler_key: transferpump + io_type: source + label: transferpump + side: SOUTH + icon: Pump.webp + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + config: + description: '参数: config' + type: object + device_id: + description: '参数: device_id' + type: string + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object virtual_vacuum_pump: - description: Virtual vacuum pump - icon: Vacuum.webp class: + action_value_mappings: + auto-close: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand close 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand close 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: close 命令参数 + type: object + type: UniLabJsonCommand + auto-get_status: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_status 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_status 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_status 命令参数 + type: object + type: UniLabJsonCommand + auto-is_closed: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand is_closed 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand is_closed 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: is_closed 命令参数 + type: object + type: UniLabJsonCommand + auto-is_open: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand is_open 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand is_open 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: is_open 命令参数 + type: object + type: UniLabJsonCommand + auto-open: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand open 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand open 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: open 命令参数 + type: object + type: UniLabJsonCommand + auto-set_status: + feedback: {} + goal: {} + goal_default: + string: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_status 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_status 的参数schema + properties: + string: + description: '参数: string' + type: string + required: + - string + type: object + result: {} + required: + - goal + title: set_status 命令参数 + type: object + type: UniLabJsonCommand + close: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: ROS Action EmptyIn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: EmptyIn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: {} + required: [] + title: EmptyIn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + required: + - return_info + title: EmptyIn_Result + type: object + required: + - goal + title: EmptyIn + type: object + type: EmptyIn + open: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: ROS Action EmptyIn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: EmptyIn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: {} + required: [] + title: EmptyIn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + required: + - return_info + title: EmptyIn_Result + type: object + required: + - goal + title: EmptyIn + type: object + type: EmptyIn + set_status: + feedback: {} + goal: + string: string + goal_default: + string: '' + handles: [] + result: {} + schema: + description: ROS Action StrSingleInput 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: StrSingleInput_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + string: + type: string + required: + - string + title: StrSingleInput_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: StrSingleInput_Result + type: object + required: + - goal + title: StrSingleInput + type: object + type: StrSingleInput module: unilabos.devices.virtual.virtual_vacuum_pump:VirtualVacuumPump - 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: {} + status: str + type: python + description: Virtual vacuum pump handles: - - handler_key: vacuumpump - label: vacuumpump - data_type: fluid - side: SOUTH - io_type: source + - data_key: fluid_in data_source: handle - data_key: fluid_in - description: "真空泵进气口" - schema: - type: object - properties: - port: - type: string - default: "VIRTUAL" - description: "通信端口" - additionalProperties: false - -virtual_gas_source: - description: Virtual gas source - class: - module: unilabos.devices.virtual.virtual_gas_source:VirtualGasSource - 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: - - handler_key: gassource - label: gassource data_type: fluid - side: SOUTH + description: 真空泵进气口 + handler_key: vacuumpump io_type: source - data_source: executor - data_key: fluid_out - description: "气源出气口" - schema: - type: object + label: vacuumpump + side: SOUTH + icon: Vacuum.webp + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema properties: - port: - type: string - default: "VIRTUAL" - description: "通信端口" - gas_type: - type: string - default: "nitrogen" - description: "气体类型" - max_pressure: - type: number - default: 5.0 - description: "最大输出压力 (bar)" - additionalProperties: false \ No newline at end of file + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + config: + description: '参数: config' + type: string + device_id: + description: '参数: device_id' + type: string + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object diff --git a/unilabos/registry/devices/work_station.yaml b/unilabos/registry/devices/work_station.yaml index c8c0324..293060a 100644 --- a/unilabos/registry/devices/work_station.yaml +++ b/unilabos/registry/devices/work_station.yaml @@ -1,625 +1,2367 @@ workstation: - description: Workstation class: - module: unilabos.ros.nodes.presets.protocol_node:ROS2ProtocolNode - type: ros2 action_value_mappings: - AddProtocol: - type: Add - goal: - vessel: vessel - reagent: reagent - volume: volume - mass: mass - amount: amount - time: time - stir: stir - stir_speed: stir_speed - viscous: viscous - purpose: purpose - feedback: {} - result: {} - handles: - input: - - handler_key: vessel - label: Vessel - data_type: resource - data_source: handle - data_key: vessel - - handler_key: reagent - label: Reagent - data_type: resource - data_source: handle - data_key: reagent - output: - - handler_key: vessel_out - label: Vessel - data_type: resource - data_source: executor - data_key: vessel - AGVTransferProtocol: - type: AGVTransfer + feedback: {} goal: from_repo: from_repo from_repo_position: from_repo_position to_repo: to_repo to_repo_position: to_repo_position - feedback: {} + goal_default: + from_repo: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + from_repo_position: '' + to_repo: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + to_repo_position: '' + handles: [] result: {} - - CentrifugeProtocol: - type: Centrifuge - goal: - vessel: vessel - speed: speed - time: time - temp: temp + schema: + description: ROS Action AGVTransfer 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: AGVTransfer_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + from_repo: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + from_repo_position: + type: string + to_repo: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + to_repo_position: + type: string + required: + - from_repo + - from_repo_position + - to_repo + - to_repo_position + title: AGVTransfer_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: AGVTransfer_Result + type: object + required: + - goal + title: AGVTransfer + type: object + type: AGVTransfer + AddProtocol: feedback: {} - result: {} - handles: - input: - - handler_key: vessel - label: Vessel - data_type: resource - data_source: handle - data_key: vessel - output: - - handler_key: vessel_out - label: Vessel - data_type: resource - data_source: executor - data_key: vessel - - CleanProtocol: - type: Clean goal: - vessel: vessel - solvent: solvent - volume: volume - temp: temp - repeats: repeats - feedback: {} - result: {} - handles: - input: - - handler_key: vessel - label: Vessel - data_type: resource - data_source: handle - data_key: vessel - - handler_key: solvent - label: Solvent - data_type: resource - data_source: handle - data_key: solvent - output: - - handler_key: vessel_out - label: Vessel - data_type: resource - data_source: executor - data_key: vessel - - CleanVesselProtocol: - type: CleanVessel - goal: - vessel: vessel - solvent: solvent - volume: volume - temp: temp - repeats: repeats - feedback: {} - result: {} - handles: - input: - - handler_key: vessel - label: Vessel - data_type: resource - data_source: handle - data_key: vessel - - handler_key: solvent - label: Solvent - data_type: resource - data_source: handle - data_key: solvent - output: - - handler_key: vessel_out - label: Vessel - data_type: resource - data_source: executor - data_key: vessel - - DissolveProtocol: - type: Dissolve - goal: - vessel: vessel - solvent: solvent - volume: volume amount: amount - temp: temp - time: time + mass: mass + purpose: purpose + reagent: reagent + stir: stir stir_speed: stir_speed - feedback: {} - result: {} + time: time + vessel: vessel + viscous: viscous + volume: volume + goal_default: + amount: '' + mass: 0.0 + purpose: '' + reagent: '' + stir: false + stir_speed: 0.0 + time: 0.0 + vessel: '' + viscous: false + volume: 0.0 handles: input: - - handler_key: vessel - label: Vessel - data_type: resource - data_source: handle - data_key: vessel - - handler_key: solvent - label: Solvent - data_type: resource - data_source: handle - data_key: solvent + - data_key: vessel + data_source: handle + data_type: resource + handler_key: vessel + label: Vessel + - data_key: reagent + data_source: handle + data_type: resource + handler_key: reagent + label: Reagent output: - - handler_key: vessel_out - label: Vessel - data_type: resource - data_source: executor - data_key: vessel - - EvacuateAndRefillProtocol: - type: EvacuateAndRefill + - data_key: vessel + data_source: executor + data_type: resource + handler_key: vessel_out + label: Vessel + result: {} + schema: + description: ROS Action Add 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + current_status: + type: string + progress: + type: number + required: + - progress + - current_status + title: Add_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + amount: + type: string + mass: + type: number + purpose: + type: string + reagent: + type: string + stir: + type: boolean + stir_speed: + type: number + time: + type: number + vessel: + type: string + viscous: + type: boolean + volume: + type: number + required: + - vessel + - reagent + - volume + - mass + - amount + - time + - stir + - stir_speed + - viscous + - purpose + title: Add_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: Add_Result + type: object + required: + - goal + title: Add + type: object + type: Add + CentrifugeProtocol: + feedback: {} goal: + speed: speed + temp: temp + time: time vessel: vessel + goal_default: + speed: 0.0 + temp: 0.0 + time: 0.0 + vessel: '' + handles: + input: + - data_key: vessel + data_source: handle + data_type: resource + handler_key: vessel + label: Vessel + output: + - data_key: vessel + data_source: executor + data_type: resource + handler_key: vessel_out + label: Vessel + result: {} + schema: + description: ROS Action Centrifuge 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + current_speed: + type: number + current_status: + type: string + current_temp: + type: number + progress: + type: number + required: + - progress + - current_speed + - current_temp + - current_status + title: Centrifuge_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + speed: + type: number + temp: + type: number + time: + type: number + vessel: + type: string + required: + - vessel + - speed + - time + - temp + title: Centrifuge_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: Centrifuge_Result + type: object + required: + - goal + title: Centrifuge + type: object + type: Centrifuge + CleanProtocol: + feedback: {} + goal: + repeats: repeats + solvent: solvent + temp: temp + vessel: vessel + volume: volume + goal_default: + repeats: 0 + solvent: '' + temp: 0.0 + vessel: '' + volume: 0.0 + handles: + input: + - data_key: vessel + data_source: handle + data_type: resource + handler_key: vessel + label: Vessel + - data_key: solvent + data_source: handle + data_type: resource + handler_key: solvent + label: Solvent + output: + - data_key: vessel + data_source: executor + data_type: resource + handler_key: vessel_out + label: Vessel + result: {} + schema: + description: ROS Action Clean 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + current_device: + type: string + status: + type: string + time_remaining: + properties: + nanosec: + maximum: 4294967295 + minimum: 0 + type: integer + sec: + maximum: 2147483647 + minimum: -2147483648 + type: integer + required: + - sec + - nanosec + title: Duration + type: object + time_spent: + properties: + nanosec: + maximum: 4294967295 + minimum: 0 + type: integer + sec: + maximum: 2147483647 + minimum: -2147483648 + type: integer + required: + - sec + - nanosec + title: Duration + type: object + required: + - status + - current_device + - time_spent + - time_remaining + title: Clean_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + repeats: + maximum: 2147483647 + minimum: -2147483648 + type: integer + solvent: + type: string + temp: + type: number + vessel: + type: string + volume: + type: number + required: + - vessel + - solvent + - volume + - temp + - repeats + title: Clean_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: Clean_Result + type: object + required: + - goal + title: Clean + type: object + type: Clean + CleanVesselProtocol: + feedback: {} + goal: + repeats: repeats + solvent: solvent + temp: temp + vessel: vessel + volume: volume + goal_default: + repeats: 0 + solvent: '' + temp: 0.0 + vessel: '' + volume: 0.0 + handles: + input: + - data_key: vessel + data_source: handle + data_type: resource + handler_key: vessel + label: Vessel + - data_key: solvent + data_source: handle + data_type: resource + handler_key: solvent + label: Solvent + output: + - data_key: vessel + data_source: executor + data_type: resource + handler_key: vessel_out + label: Vessel + result: {} + schema: + description: ROS Action CleanVessel 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + progress: + type: number + status: + type: string + required: + - status + - progress + title: CleanVessel_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + repeats: + maximum: 2147483647 + minimum: -2147483648 + type: integer + solvent: + type: string + temp: + type: number + vessel: + type: string + volume: + type: number + required: + - vessel + - solvent + - volume + - temp + - repeats + title: CleanVessel_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: CleanVessel_Result + type: object + required: + - goal + title: CleanVessel + type: object + type: CleanVessel + DissolveProtocol: + feedback: {} + goal: + amount: amount + solvent: solvent + stir_speed: stir_speed + temp: temp + time: time + vessel: vessel + volume: volume + goal_default: + amount: '' + solvent: '' + stir_speed: 0.0 + temp: 0.0 + time: 0.0 + vessel: '' + volume: 0.0 + handles: + input: + - data_key: vessel + data_source: handle + data_type: resource + handler_key: vessel + label: Vessel + - data_key: solvent + data_source: handle + data_type: resource + handler_key: solvent + label: Solvent + output: + - data_key: vessel + data_source: executor + data_type: resource + handler_key: vessel_out + label: Vessel + result: {} + schema: + description: ROS Action Dissolve 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + progress: + type: number + status: + type: string + required: + - status + - progress + title: Dissolve_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + amount: + type: string + solvent: + type: string + stir_speed: + type: number + temp: + type: number + time: + type: number + vessel: + type: string + volume: + type: number + required: + - vessel + - solvent + - volume + - amount + - temp + - time + - stir_speed + title: Dissolve_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: Dissolve_Result + type: object + required: + - goal + title: Dissolve + type: object + type: Dissolve + EvacuateAndRefillProtocol: + feedback: {} + goal: gas: gas repeats: repeats - feedback: {} - result: {} + vessel: vessel + goal_default: + gas: '' + repeats: 0 + vessel: '' handles: input: - - handler_key: vessel - label: Vessel - data_type: resource - data_source: handle - data_key: vessel + - data_key: vessel + data_source: handle + data_type: resource + handler_key: vessel + label: Vessel output: - - handler_key: vessel_out - label: Vessel - data_type: resource - data_source: executor - data_key: vessel - + - data_key: vessel + data_source: executor + data_type: resource + handler_key: vessel_out + label: Vessel + result: {} + schema: + description: ROS Action EvacuateAndRefill 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + current_device: + type: string + status: + type: string + time_remaining: + properties: + nanosec: + maximum: 4294967295 + minimum: 0 + type: integer + sec: + maximum: 2147483647 + minimum: -2147483648 + type: integer + required: + - sec + - nanosec + title: Duration + type: object + time_spent: + properties: + nanosec: + maximum: 4294967295 + minimum: 0 + type: integer + sec: + maximum: 2147483647 + minimum: -2147483648 + type: integer + required: + - sec + - nanosec + title: Duration + type: object + required: + - status + - current_device + - time_spent + - time_remaining + title: EvacuateAndRefill_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + gas: + type: string + repeats: + maximum: 2147483647 + minimum: -2147483648 + type: integer + vessel: + type: string + required: + - vessel + - gas + - repeats + title: EvacuateAndRefill_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: EvacuateAndRefill_Result + type: object + required: + - goal + title: EvacuateAndRefill + type: object + type: EvacuateAndRefill EvaporateProtocol: - type: Evaporate + feedback: {} goal: - vessel: vessel pressure: pressure + stir_speed: stir_speed temp: temp time: time - stir_speed: stir_speed - feedback: {} - result: {} + vessel: vessel + goal_default: + pressure: 0.0 + stir_speed: 0.0 + temp: 0.0 + time: 0.0 + vessel: '' handles: input: - - handler_key: vessel - label: Vessel - data_type: resource - data_source: handle - data_key: vessel + - data_key: vessel + data_source: handle + data_type: resource + handler_key: vessel + label: Vessel output: - - handler_key: vessel_out - label: Vessel - data_type: resource - data_source: executor - data_key: vessel - + - data_key: vessel + data_source: executor + data_type: resource + handler_key: vessel_out + label: Vessel + result: {} + schema: + description: ROS Action Evaporate 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + current_device: + type: string + status: + type: string + time_remaining: + properties: + nanosec: + maximum: 4294967295 + minimum: 0 + type: integer + sec: + maximum: 2147483647 + minimum: -2147483648 + type: integer + required: + - sec + - nanosec + title: Duration + type: object + time_spent: + properties: + nanosec: + maximum: 4294967295 + minimum: 0 + type: integer + sec: + maximum: 2147483647 + minimum: -2147483648 + type: integer + required: + - sec + - nanosec + title: Duration + type: object + required: + - status + - current_device + - time_spent + - time_remaining + title: Evaporate_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + pressure: + type: number + stir_speed: + type: number + temp: + type: number + time: + type: number + vessel: + type: string + required: + - vessel + - pressure + - temp + - time + - stir_speed + title: Evaporate_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: Evaporate_Result + type: object + required: + - goal + title: Evaporate + type: object + type: Evaporate FilterProtocol: - type: Filter + feedback: {} goal: - vessel: vessel + continue_heatchill: continue_heatchill filtrate_vessel: filtrate_vessel stir: stir stir_speed: stir_speed temp: temp - continue_heatchill: continue_heatchill + vessel: vessel volume: volume - feedback: {} - result: {} + goal_default: + continue_heatchill: false + filtrate_vessel: '' + stir: false + stir_speed: 0.0 + temp: 0.0 + vessel: '' + volume: 0.0 handles: input: - - handler_key: vessel - label: Vessel - data_type: resource - data_source: handle - data_key: vessel - - handler_key: filtrate_vessel - label: Filtrate Vessel - data_type: resource - data_source: handle - data_key: vessel + - data_key: vessel + data_source: handle + data_type: resource + handler_key: vessel + label: Vessel + - data_key: vessel + data_source: handle + data_type: resource + handler_key: filtrate_vessel + label: Filtrate Vessel output: - - handler_key: vessel_out - label: Vessel - data_type: resource - data_source: executor - data_key: vessel - - handler_key: filtrate_out - label: Filtrate Vessel - data_type: resource - data_source: executor - data_key: vessel - + - data_key: vessel + data_source: executor + data_type: resource + handler_key: vessel_out + label: Vessel + - data_key: vessel + data_source: executor + data_type: resource + handler_key: filtrate_out + label: Filtrate Vessel + result: {} + schema: + description: ROS Action Filter 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + current_status: + type: string + current_temp: + type: number + filtered_volume: + type: number + progress: + type: number + required: + - progress + - current_temp + - filtered_volume + - current_status + title: Filter_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + continue_heatchill: + type: boolean + filtrate_vessel: + type: string + stir: + type: boolean + stir_speed: + type: number + temp: + type: number + vessel: + type: string + volume: + type: number + required: + - vessel + - filtrate_vessel + - stir + - stir_speed + - temp + - continue_heatchill + - volume + title: Filter_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: Filter_Result + type: object + required: + - goal + title: Filter + type: object + type: Filter FilterThroughProtocol: - type: FilterThrough + feedback: {} goal: - from_vessel: from_vessel - to_vessel: to_vessel - filter_through: filter_through + eluting_repeats: eluting_repeats eluting_solvent: eluting_solvent eluting_volume: eluting_volume - eluting_repeats: eluting_repeats + filter_through: filter_through + from_vessel: from_vessel residence_time: residence_time - feedback: {} - result: {} + to_vessel: to_vessel + goal_default: + eluting_repeats: 0 + eluting_solvent: '' + eluting_volume: 0.0 + filter_through: '' + from_vessel: '' + residence_time: 0.0 + to_vessel: '' handles: input: - - handler_key: from_vessel - label: From Vessel - data_type: resource - data_source: handle - data_key: vessel - - handler_key: to_vessel - label: To Vessel - data_type: resource - data_source: executor - data_key: vessel - - handler_key: solvent - label: Eluting Solvent - data_type: resource - data_source: handle - data_key: solvent + - data_key: vessel + data_source: handle + data_type: resource + handler_key: from_vessel + label: From Vessel + - data_key: vessel + data_source: executor + data_type: resource + handler_key: to_vessel + label: To Vessel + - data_key: solvent + data_source: handle + data_type: resource + handler_key: solvent + label: Eluting Solvent output: - - handler_key: from_vessel_out - label: From Vessel - data_type: resource - data_source: handle - data_key: vessel - - handler_key: to_vessel_out - label: To Vessel - data_type: resource - data_source: executor - data_key: vessel - + - data_key: vessel + data_source: handle + data_type: resource + handler_key: from_vessel_out + label: From Vessel + - data_key: vessel + data_source: executor + data_type: resource + handler_key: to_vessel_out + label: To Vessel + result: {} + schema: + description: ROS Action FilterThrough 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + progress: + type: number + status: + type: string + required: + - status + - progress + title: FilterThrough_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + eluting_repeats: + maximum: 2147483647 + minimum: -2147483648 + type: integer + eluting_solvent: + type: string + eluting_volume: + type: number + filter_through: + type: string + from_vessel: + type: string + residence_time: + type: number + to_vessel: + type: string + required: + - from_vessel + - to_vessel + - filter_through + - eluting_solvent + - eluting_volume + - eluting_repeats + - residence_time + title: FilterThrough_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: FilterThrough_Result + type: object + required: + - goal + title: FilterThrough + type: object + type: FilterThrough HeatChillProtocol: - type: HeatChill + feedback: {} goal: - vessel: vessel - temp: temp - time: time + purpose: purpose stir: stir stir_speed: stir_speed - purpose: purpose - feedback: {} - result: {} - handles: - input: - - handler_key: vessel - label: Vessel - data_type: resource - data_source: handle - data_key: vessel - output: - - handler_key: vessel_out - label: Vessel - data_type: resource - data_source: executor - data_key: vessel - - HeatChillStartProtocol: - type: HeatChillStart - goal: - vessel: vessel temp: temp - purpose: purpose - feedback: {} - result: {} + time: time + vessel: vessel + goal_default: + purpose: '' + stir: false + stir_speed: 0.0 + temp: 0.0 + time: 0.0 + vessel: '' handles: input: - - handler_key: vessel - label: Vessel - data_type: resource - data_source: handle - data_key: vessel + - data_key: vessel + data_source: handle + data_type: resource + handler_key: vessel + label: Vessel output: - - handler_key: vessel_out - label: Vessel - data_type: resource - data_source: executor - data_key: vessel - + - data_key: vessel + data_source: executor + data_type: resource + handler_key: vessel_out + label: Vessel + result: {} + schema: + description: ROS Action HeatChill 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: HeatChill_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + purpose: + type: string + stir: + type: boolean + stir_speed: + type: number + temp: + type: number + time: + type: number + vessel: + type: string + required: + - vessel + - temp + - time + - stir + - stir_speed + - purpose + title: HeatChill_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: HeatChill_Result + type: object + required: + - goal + title: HeatChill + type: object + type: HeatChill + HeatChillStartProtocol: + feedback: {} + goal: + purpose: purpose + temp: temp + vessel: vessel + goal_default: + purpose: '' + temp: 0.0 + vessel: '' + handles: + input: + - data_key: vessel + data_source: handle + data_type: resource + handler_key: vessel + label: Vessel + output: + - data_key: vessel + data_source: executor + data_type: resource + handler_key: vessel_out + label: Vessel + result: {} + schema: + description: ROS Action HeatChillStart 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: HeatChillStart_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + purpose: + type: string + temp: + type: number + vessel: + type: string + required: + - vessel + - temp + - purpose + title: HeatChillStart_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: HeatChillStart_Result + type: object + required: + - goal + title: HeatChillStart + type: object + type: HeatChillStart HeatChillStopProtocol: - type: HeatChillStop + feedback: {} goal: vessel: vessel - feedback: {} - result: {} + goal_default: + vessel: '' handles: input: - - handler_key: vessel - label: Vessel - data_type: resource - data_source: handle - data_key: vessel + - data_key: vessel + data_source: handle + data_type: resource + handler_key: vessel + label: Vessel output: - - handler_key: vessel_out - label: Vessel - data_type: resource - data_source: executor - data_key: vessel - + - data_key: vessel + data_source: executor + data_type: resource + handler_key: vessel_out + label: Vessel + result: {} + schema: + description: ROS Action HeatChillStop 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: HeatChillStop_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + vessel: + type: string + required: + - vessel + title: HeatChillStop_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: HeatChillStop_Result + type: object + required: + - goal + title: HeatChillStop + type: object + type: HeatChillStop PumpTransferProtocol: - type: PumpTransfer + feedback: {} goal: - from_vessel: from_vessel - to_vessel: to_vessel - volume: volume amount: amount - time: time - viscous: viscous + from_vessel: from_vessel + rinsing_repeats: rinsing_repeats rinsing_solvent: rinsing_solvent rinsing_volume: rinsing_volume - rinsing_repeats: rinsing_repeats solid: solid - feedback: {} - result: {} + time: time + to_vessel: to_vessel + viscous: viscous + volume: volume + goal_default: + amount: '' + from_vessel: '' + rinsing_repeats: 0 + rinsing_solvent: '' + rinsing_volume: 0.0 + solid: false + time: 0.0 + to_vessel: '' + viscous: false + volume: 0.0 handles: input: - - handler_key: from_vessel - label: From Vessel - data_type: resource - data_source: handle - data_key: vessel - - handler_key: to_vessel - label: To Vessel - data_type: resource - data_source: executor - data_key: vessel - - handler_key: solvent - label: Rinsing Solvent - data_type: resource - data_source: handle - data_key: solvent + - data_key: vessel + data_source: handle + data_type: resource + handler_key: from_vessel + label: From Vessel + - data_key: vessel + data_source: executor + data_type: resource + handler_key: to_vessel + label: To Vessel + - data_key: solvent + data_source: handle + data_type: resource + handler_key: solvent + label: Rinsing Solvent output: - - handler_key: from_vessel_out - label: From Vessel - data_type: resource - data_source: handle - data_key: vessel - - handler_key: to_vessel_out - label: To Vessel - data_type: resource - data_source: executor - data_key: vessel - + - data_key: vessel + data_source: handle + data_type: resource + handler_key: from_vessel_out + label: From Vessel + - data_key: vessel + data_source: executor + data_type: resource + handler_key: to_vessel_out + label: To Vessel + result: {} + schema: + description: ROS Action PumpTransfer 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + current_device: + type: string + status: + type: string + time_remaining: + properties: + nanosec: + maximum: 4294967295 + minimum: 0 + type: integer + sec: + maximum: 2147483647 + minimum: -2147483648 + type: integer + required: + - sec + - nanosec + title: Duration + type: object + time_spent: + properties: + nanosec: + maximum: 4294967295 + minimum: 0 + type: integer + sec: + maximum: 2147483647 + minimum: -2147483648 + type: integer + required: + - sec + - nanosec + title: Duration + type: object + required: + - status + - current_device + - time_spent + - time_remaining + title: PumpTransfer_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + amount: + type: string + from_vessel: + type: string + rinsing_repeats: + maximum: 2147483647 + minimum: -2147483648 + type: integer + rinsing_solvent: + type: string + rinsing_volume: + type: number + solid: + type: boolean + time: + type: number + to_vessel: + type: string + viscous: + type: boolean + volume: + type: number + required: + - from_vessel + - to_vessel + - volume + - amount + - time + - viscous + - rinsing_solvent + - rinsing_volume + - rinsing_repeats + - solid + title: PumpTransfer_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: PumpTransfer_Result + type: object + required: + - goal + title: PumpTransfer + type: object + type: PumpTransfer RunColumnProtocol: - type: RunColumn + feedback: {} goal: + column: column from_vessel: from_vessel to_vessel: to_vessel - column: column - feedback: {} - result: {} + goal_default: + column: '' + from_vessel: '' + to_vessel: '' handles: input: - - handler_key: from_vessel - label: From Vessel - data_type: resource - data_source: handle - data_key: vessel - - handler_key: to_vessel - label: To Vessel - data_type: resource - data_source: executor - data_key: vessel + - data_key: vessel + data_source: handle + data_type: resource + handler_key: from_vessel + label: From Vessel + - data_key: vessel + data_source: executor + data_type: resource + handler_key: to_vessel + label: To Vessel output: - - handler_key: from_vessel_out - label: From Vessel - data_type: resource - data_source: handle - data_key: vessel - - handler_key: to_vessel_out - label: To Vessel - data_type: resource - data_source: executor - data_key: vessel - + - data_key: vessel + data_source: handle + data_type: resource + handler_key: from_vessel_out + label: From Vessel + - data_key: vessel + data_source: executor + data_type: resource + handler_key: to_vessel_out + label: To Vessel + result: {} + schema: + description: ROS Action RunColumn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + progress: + type: number + status: + type: string + required: + - status + - progress + title: RunColumn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + column: + type: string + from_vessel: + type: string + to_vessel: + type: string + required: + - from_vessel + - to_vessel + - column + title: RunColumn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: RunColumn_Result + type: object + required: + - goal + title: RunColumn + type: object + type: RunColumn SeparateProtocol: - type: Separate + feedback: {} goal: - purpose: purpose - product_phase: product_phase from_vessel: from_vessel + product_phase: product_phase + purpose: purpose + repeats: repeats separation_vessel: separation_vessel - to_vessel: to_vessel - waste_phase_to_vessel: waste_phase_to_vessel + settling_time: settling_time solvent: solvent solvent_volume: solvent_volume + stir_speed: stir_speed + stir_time: stir_time through: through - repeats: repeats - stir_time: stir_time - stir_speed: stir_speed - settling_time: settling_time - feedback: {} - result: {} - handles: - input: - - handler_key: from_vessel - label: From Vessel - data_type: resource - data_source: handle - data_key: vessel - - handler_key: to_vessel - label: To Vessel - data_type: resource - data_source: executor - data_key: vessel - - handler_key: solvent - label: Solvent - data_type: resource - data_source: handle - data_key: solvent - output: - - handler_key: from_vessel_out - label: From Vessel - data_type: resource - data_source: handle - data_key: vessel - - handler_key: to_vessel_out - label: To Vessel - data_type: resource - data_source: executor - data_key: vessel - - StartStirProtocol: - type: StartStir - goal: - vessel: vessel - stir_speed: stir_speed - purpose: purpose - feedback: {} - result: {} - handles: - input: - - handler_key: vessel - label: Vessel - data_type: resource - data_source: handle - data_key: vessel - output: - - handler_key: vessel_out - label: Vessel - data_type: resource - data_source: executor - data_key: vessel - - StirProtocol: - type: Stir - goal: - stir_time: stir_time - stir_speed: stir_speed - settling_time: settling_time - feedback: {} - result: {} - handles: - input: - - handler_key: vessel - label: Vessel - data_type: resource - data_source: handle - data_key: vessel - output: - - handler_key: vessel_out - label: Vessel - data_type: resource - data_source: executor - data_key: vessel - - StopStirProtocol: - type: StopStir - goal: - vessel: vessel - feedback: {} - result: {} - handles: - input: - - handler_key: vessel - label: Vessel - data_type: resource - data_source: handle - data_key: vessel - output: - - handler_key: vessel_out - label: Vessel - data_type: resource - data_source: executor - data_key: vessel - - TransferProtocol: - type: Transfer - goal: - from_vessel: from_vessel to_vessel: to_vessel - volume: volume + waste_phase_to_vessel: waste_phase_to_vessel + goal_default: + from_vessel: '' + product_phase: '' + purpose: '' + repeats: 0 + separation_vessel: '' + settling_time: 0.0 + solvent: '' + solvent_volume: 0.0 + stir_speed: 0.0 + stir_time: 0.0 + through: '' + to_vessel: '' + waste_phase_to_vessel: '' + handles: + input: + - data_key: vessel + data_source: handle + data_type: resource + handler_key: from_vessel + label: From Vessel + - data_key: vessel + data_source: executor + data_type: resource + handler_key: to_vessel + label: To Vessel + - data_key: solvent + data_source: handle + data_type: resource + handler_key: solvent + label: Solvent + output: + - data_key: vessel + data_source: handle + data_type: resource + handler_key: from_vessel_out + label: From Vessel + - data_key: vessel + data_source: executor + data_type: resource + handler_key: to_vessel_out + label: To Vessel + result: {} + schema: + description: ROS Action Separate 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + current_device: + type: string + status: + type: string + time_remaining: + properties: + nanosec: + maximum: 4294967295 + minimum: 0 + type: integer + sec: + maximum: 2147483647 + minimum: -2147483648 + type: integer + required: + - sec + - nanosec + title: Duration + type: object + time_spent: + properties: + nanosec: + maximum: 4294967295 + minimum: 0 + type: integer + sec: + maximum: 2147483647 + minimum: -2147483648 + type: integer + required: + - sec + - nanosec + title: Duration + type: object + required: + - status + - current_device + - time_spent + - time_remaining + title: Separate_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + from_vessel: + type: string + product_phase: + type: string + purpose: + type: string + repeats: + maximum: 2147483647 + minimum: -2147483648 + type: integer + separation_vessel: + type: string + settling_time: + type: number + solvent: + type: string + solvent_volume: + type: number + stir_speed: + type: number + stir_time: + type: number + through: + type: string + to_vessel: + type: string + waste_phase_to_vessel: + type: string + required: + - purpose + - product_phase + - from_vessel + - separation_vessel + - to_vessel + - waste_phase_to_vessel + - solvent + - solvent_volume + - through + - repeats + - stir_time + - stir_speed + - settling_time + title: Separate_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: Separate_Result + type: object + required: + - goal + title: Separate + type: object + type: Separate + StartStirProtocol: + feedback: {} + goal: + purpose: purpose + stir_speed: stir_speed + vessel: vessel + goal_default: + purpose: '' + stir_speed: 0.0 + vessel: '' + handles: + input: + - data_key: vessel + data_source: handle + data_type: resource + handler_key: vessel + label: Vessel + output: + - data_key: vessel + data_source: executor + data_type: resource + handler_key: vessel_out + label: Vessel + result: {} + schema: + description: ROS Action StartStir 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + current_speed: + type: number + current_status: + type: string + progress: + type: number + required: + - progress + - current_speed + - current_status + title: StartStir_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + purpose: + type: string + stir_speed: + type: number + vessel: + type: string + required: + - vessel + - stir_speed + - purpose + title: StartStir_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: StartStir_Result + type: object + required: + - goal + title: StartStir + type: object + type: StartStir + StirProtocol: + feedback: {} + goal: + settling_time: settling_time + stir_speed: stir_speed + stir_time: stir_time + goal_default: + settling_time: 0.0 + stir_speed: 0.0 + stir_time: 0.0 + handles: + input: + - data_key: vessel + data_source: handle + data_type: resource + handler_key: vessel + label: Vessel + output: + - data_key: vessel + data_source: executor + data_type: resource + handler_key: vessel_out + label: Vessel + result: {} + schema: + description: ROS Action Stir 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: Stir_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + settling_time: + type: number + stir_speed: + type: number + stir_time: + type: number + required: + - stir_time + - stir_speed + - settling_time + title: Stir_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: Stir_Result + type: object + required: + - goal + title: Stir + type: object + type: Stir + StopStirProtocol: + feedback: {} + goal: + vessel: vessel + goal_default: + vessel: '' + handles: + input: + - data_key: vessel + data_source: handle + data_type: resource + handler_key: vessel + label: Vessel + output: + - data_key: vessel + data_source: executor + data_type: resource + handler_key: vessel_out + label: Vessel + result: {} + schema: + description: ROS Action StopStir 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + current_status: + type: string + progress: + type: number + required: + - progress + - current_status + title: StopStir_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + vessel: + type: string + required: + - vessel + title: StopStir_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: StopStir_Result + type: object + required: + - goal + title: StopStir + type: object + type: StopStir + TransferProtocol: + feedback: {} + goal: amount: amount - time: time - viscous: viscous + from_vessel: from_vessel + rinsing_repeats: rinsing_repeats rinsing_solvent: rinsing_solvent rinsing_volume: rinsing_volume - rinsing_repeats: rinsing_repeats solid: solid - feedback: {} - result: {} + time: time + to_vessel: to_vessel + viscous: viscous + volume: volume + goal_default: + amount: '' + from_vessel: '' + rinsing_repeats: 0 + rinsing_solvent: '' + rinsing_volume: 0.0 + solid: false + time: 0.0 + to_vessel: '' + viscous: false + volume: 0.0 handles: input: - - handler_key: from_vessel - label: From Vessel - data_type: resource - data_source: handle - data_key: vessel - - handler_key: to_vessel - label: To Vessel - data_type: resource - data_source: executor - data_key: vessel - - handler_key: solvent - label: Rinsing Solvent - data_type: resource - data_source: handle - data_key: solvent + - data_key: vessel + data_source: handle + data_type: resource + handler_key: from_vessel + label: From Vessel + - data_key: vessel + data_source: executor + data_type: resource + handler_key: to_vessel + label: To Vessel + - data_key: solvent + data_source: handle + data_type: resource + handler_key: solvent + label: Rinsing Solvent output: - - handler_key: from_vessel_out - label: From Vessel - data_type: resource - data_source: handle - data_key: vessel - - handler_key: to_vessel_out - label: To Vessel - data_type: resource - data_source: executor - data_key: vessel - + - data_key: vessel + data_source: handle + data_type: resource + handler_key: from_vessel_out + label: From Vessel + - data_key: vessel + data_source: executor + data_type: resource + handler_key: to_vessel_out + label: To Vessel + result: {} + schema: + description: ROS Action Transfer 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + current_status: + type: string + progress: + type: number + transferred_volume: + type: number + required: + - progress + - transferred_volume + - current_status + title: Transfer_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + amount: + type: string + from_vessel: + type: string + rinsing_repeats: + maximum: 2147483647 + minimum: -2147483648 + type: integer + rinsing_solvent: + type: string + rinsing_volume: + type: number + solid: + type: boolean + time: + type: number + to_vessel: + type: string + viscous: + type: boolean + volume: + type: number + required: + - from_vessel + - to_vessel + - volume + - amount + - time + - viscous + - rinsing_solvent + - rinsing_volume + - rinsing_repeats + - solid + title: Transfer_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: Transfer_Result + type: object + required: + - goal + title: Transfer + type: object + type: Transfer WashSolidProtocol: - type: WashSolid + feedback: {} goal: - vessel: vessel - solvent: solvent - volume: volume filtrate_vessel: filtrate_vessel - temp: temp + repeats: repeats + solvent: solvent stir: stir stir_speed: stir_speed + temp: temp time: time - repeats: repeats - feedback: {} - result: {} + vessel: vessel + volume: volume + goal_default: + filtrate_vessel: '' + repeats: 0 + solvent: '' + stir: false + stir_speed: 0.0 + temp: 0.0 + time: 0.0 + vessel: '' + volume: 0.0 handles: input: - - handler_key: vessel - label: Vessel - data_type: resource - data_source: handle - data_key: vessel - - handler_key: solvent - label: Solvent - data_type: resource - data_source: handle - data_key: solvent - - handler_key: filtrate_vessel - label: Filtrate Vessel - data_type: resource - data_source: executor - data_key: vessel + - data_key: vessel + data_source: handle + data_type: resource + handler_key: vessel + label: Vessel + - data_key: solvent + data_source: handle + data_type: resource + handler_key: solvent + label: Solvent + - data_key: vessel + data_source: executor + data_type: resource + handler_key: filtrate_vessel + label: Filtrate Vessel output: - - handler_key: vessel_out - label: Vessel Out - data_type: resource - data_source: handle - data_key: vessel - - handler_key: filtrate_vessel_out - label: Filtrate Vessel - data_type: resource - data_source: executor - data_key: vessel \ No newline at end of file + - data_key: vessel + data_source: handle + data_type: resource + handler_key: vessel_out + label: Vessel Out + - data_key: vessel + data_source: executor + data_type: resource + handler_key: filtrate_vessel_out + label: Filtrate Vessel + result: {} + schema: + description: ROS Action WashSolid 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + progress: + type: number + status: + type: string + required: + - status + - progress + title: WashSolid_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + filtrate_vessel: + type: string + repeats: + maximum: 2147483647 + minimum: -2147483648 + type: integer + solvent: + type: string + stir: + type: boolean + stir_speed: + type: number + temp: + type: number + time: + type: number + vessel: + type: string + volume: + type: number + required: + - vessel + - solvent + - volume + - filtrate_vessel + - temp + - stir + - stir_speed + - time + - repeats + title: WashSolid_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: WashSolid_Result + type: object + required: + - goal + title: WashSolid + type: object + type: WashSolid + auto-create_ros_action_server: + feedback: {} + goal: {} + goal_default: + action_name: null + action_value_mapping: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand create_ros_action_server 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand create_ros_action_server 的参数schema + properties: + action_name: + description: '参数: action_name' + type: string + action_value_mapping: + description: '参数: action_value_mapping' + type: string + required: + - action_name + - action_value_mapping + type: object + result: {} + required: + - goal + title: create_ros_action_server 命令参数 + type: object + type: UniLabJsonCommand + auto-initialize_device: + feedback: {} + goal: {} + goal_default: + device_config: null + device_id: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand initialize_device 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand initialize_device 的参数schema + properties: + device_config: + description: '参数: device_config' + type: string + device_id: + description: '参数: device_id' + type: string + required: + - device_id + - device_config + type: object + result: {} + required: + - goal + title: initialize_device 命令参数 + type: object + type: UniLabJsonCommand + module: unilabos.ros.nodes.presets.protocol_node:ROS2ProtocolNode + status_types: {} + type: ros2 + description: Workstation + handles: [] + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + children: + description: '参数: children' + type: object + device_id: + description: '参数: device_id' + type: string + protocol_type: + description: '参数: protocol_type' + type: string + resource_tracker: + description: '参数: resource_tracker' + type: string + required: + - device_id + - children + - protocol_type + - resource_tracker + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object diff --git a/unilabos/registry/devices/zhida_hplc.yaml b/unilabos/registry/devices/zhida_hplc.yaml index 1aed8a2..0c8141a 100644 --- a/unilabos/registry/devices/zhida_hplc.yaml +++ b/unilabos/registry/devices/zhida_hplc.yaml @@ -1,27 +1,259 @@ zhida_hplc: - description: Zhida HPLC class: - module: unilabos.devices.zhida_hplc.zhida:ZhidaClient - type: python - status_types: - status: String action_value_mappings: + abort: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: ROS Action EmptyIn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: EmptyIn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: {} + required: [] + title: EmptyIn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + required: + - return_info + title: EmptyIn_Result + type: object + required: + - goal + title: EmptyIn + type: object + type: EmptyIn + auto-abort: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand abort 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand abort 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: abort 命令参数 + type: object + type: UniLabJsonCommand + auto-close: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand close 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand close 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: close 命令参数 + type: object + type: UniLabJsonCommand + auto-connect: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand connect 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand connect 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: connect 命令参数 + type: object + type: UniLabJsonCommand + auto-get_methods: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_methods 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_methods 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: get_methods 命令参数 + type: object + type: UniLabJsonCommand + auto-start: + feedback: {} + goal: {} + goal_default: + text: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand start 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand start 的参数schema + properties: + text: + description: '参数: text' + type: string + required: + - text + type: object + result: {} + required: + - goal + title: start 命令参数 + type: object + type: UniLabJsonCommand + get_methods: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: ROS Action EmptyIn 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: EmptyIn_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: {} + required: [] + title: EmptyIn_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + required: + - return_info + title: EmptyIn_Result + type: object + required: + - goal + title: EmptyIn + type: object + type: EmptyIn start: - type: StrSingleInput + feedback: {} goal: string: string - feedback: {} + goal_default: + string: '' + handles: [] result: {} - abort: - type: EmptyIn - goal: {} - feedback: {} - result: {} - get_methods: - type: EmptyIn - goal: {} - feedback: {} - result: {} - - schema: - properties: {} \ No newline at end of file + schema: + description: ROS Action StrSingleInput 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: StrSingleInput_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + string: + type: string + required: + - string + title: StrSingleInput_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: StrSingleInput_Result + type: object + required: + - goal + title: StrSingleInput + type: object + type: StrSingleInput + module: unilabos.devices.zhida_hplc.zhida:ZhidaClient + status_types: + status: dict + type: python + description: Zhida HPLC + handles: [] + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + host: + default: 192.168.1.47 + description: '参数: host' + type: string + port: + default: 5792 + description: '参数: port' + type: integer + timeout: + default: 10.0 + description: '参数: timeout' + type: number + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object diff --git a/unilabos/registry/registry.py b/unilabos/registry/registry.py index 03d4899..27e47e5 100644 --- a/unilabos/registry/registry.py +++ b/unilabos/registry/registry.py @@ -1,14 +1,17 @@ +import copy import io import os import sys from pathlib import Path -from typing import Any +from typing import Any, Dict, List import yaml from unilabos.ros.msgs.message_converter import msg_converter_manager, ros_action_to_json_schema from unilabos.utils import logger from unilabos.utils.decorator import singleton +from unilabos.utils.import_manager import get_enhanced_class_info +from unilabos.utils.type_check import NoAliasDumper DEFAULT_PATHS = [Path(__file__).absolute().parent] @@ -32,7 +35,7 @@ class Registry: # 其他状态变量 # self.is_host_mode = False # 移至BasicConfig中 - def setup(self): + def setup(self, complete_registry=False): # 检查是否已调用过setup if self._setup_called: logger.critical("[UniLab Registry] setup方法已被调用过,不允许多次调用") @@ -86,13 +89,15 @@ class Registry: 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" - }] + "output": [ + { + "handler_key": "labware", + "label": "Labware", + "data_type": "resource", + "data_source": "handle", + "data_key": "liquid", + } + ] }, }, "test_latency": { @@ -110,7 +115,6 @@ class Registry: "registry_type": "device", "handles": [], "init_param_schema": {}, - "schema": {"properties": {}, "additionalProperties": False, "type": "object"}, "file_path": "/", } } @@ -121,13 +125,13 @@ class Registry: sys_path = path.parent logger.debug(f"[UniLab Registry] Path {i+1}/{len(self.registry_paths)}: {sys_path}") sys.path.append(str(sys_path)) - self.load_device_types(path) - self.load_resource_types(path) + self.load_device_types(path, complete_registry) + self.load_resource_types(path, complete_registry) logger.info("[UniLab Registry] 注册表设置完成") # 标记setup已被调用 self._setup_called = True - def load_resource_types(self, path: os.PathLike): + def load_resource_types(self, path: os.PathLike, complete_registry: bool): abs_path = Path(path).absolute() resource_path = abs_path / "resources" files = list(resource_path.glob("*/*.yaml")) @@ -176,7 +180,7 @@ class Registry: if not type_name or type_name == "": logger.warning(f"[UniLab Registry] 设备 {device_id} 的 {field_name} 类型为空,跳过替换") return type_name - if "." in type_name: + if ":" in type_name: type_class = msg_converter_manager.get_class(type_name) else: type_class = msg_converter_manager.search_class(type_name) @@ -186,7 +190,72 @@ class Registry: logger.error(f"[UniLab Registry] 无法找到类型 '{type_name}' 用于设备 {device_id} 的 {field_name}") sys.exit(1) - def load_device_types(self, path: os.PathLike): + def _generate_unilab_json_command_schema(self, method_args: List[Dict[str, Any]], method_name: str) -> Dict[str, Any]: + """ + 根据UniLabJsonCommand方法信息生成JSON Schema,暂不支持嵌套类型 + + Args: + method_args: 方法信息字典,包含args等 + method_name: 方法名称 + + Returns: + JSON Schema格式的参数schema + """ + schema = { + "description": f"UniLabJsonCommand {method_name} 的参数schema", + "type": "object", + "properties": {}, + "required": [], + } + + for arg_info in method_args: + param_name = arg_info.get("name", "") + param_type = arg_info.get("type") + param_default = arg_info.get("default") + param_required = arg_info.get("required", True) + + prop_schema = {"description": f"参数: {param_name}"} + + # 根据类型设置schema FIXME 不完整 + if param_type: + param_type_lower = param_type.lower() + if param_type_lower in ["str", "string"]: + prop_schema["type"] = "string" + elif param_type_lower in ["int", "integer"]: + prop_schema["type"] = "integer" + elif param_type_lower in ["float", "number"]: + prop_schema["type"] = "number" + elif param_type_lower in ["bool", "boolean"]: + prop_schema["type"] = "boolean" + elif param_type_lower in ["list", "array"]: + prop_schema["type"] = "array" + elif param_type_lower in ["dict", "object"]: + prop_schema["type"] = "object" + else: + # 默认为字符串类型 + prop_schema["type"] = "string" + else: + # 如果没有类型信息,默认为字符串 + prop_schema["type"] = "string" + + # 设置默认值 + if param_default is not None: + prop_schema["default"] = param_default + + schema["properties"][param_name] = prop_schema + + # 如果是必需参数,添加到required列表 + if param_required: + schema["required"].append(param_name) + return { + "title": f"{method_name} 命令参数", + "description": f"UniLabJsonCommand {method_name} 的参数schema", + "type": "object", + "properties": {"goal": schema, "feedback": {}, "result": {}}, + "required": ["goal"], + } + + def load_device_types(self, path: os.PathLike, complete_registry: bool): abs_path = Path(path).absolute() devices_path = abs_path / "devices" device_comms_path = abs_path / "device_comms" @@ -199,12 +268,18 @@ class Registry: from unilabos.app.web.utils.action_utils import get_yaml_from_goal_type for i, file in enumerate(files): - data = yaml.safe_load(open(file, encoding="utf-8")) + with open(file, encoding="utf-8", mode="r") as f: + data = yaml.safe_load(io.StringIO(f.read())) + complete_data = {} + action_str_type_mapping = { + "UniLabJsonCommand": "UniLabJsonCommand", + "UniLabJsonCommandAsync": "UniLabJsonCommandAsync", + } + status_str_type_mapping = {} if data: # 在添加到注册表前处理类型替换 for device_id, device_config in data.items(): # 添加文件路径信息 - 使用规范化的完整文件路径 - device_config["file_path"] = str(file.absolute()).replace("\\", "/") if "description" not in device_config: device_config["description"] = "" if "icon" not in device_config: @@ -213,42 +288,108 @@ class Registry: 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: - # 处理状态类型 - if "status_types" in device_config["class"]: - for status_name, status_type in device_config["class"]["status_types"].items(): - device_config["class"]["status_types"][status_name] = self._replace_type_with_class( - status_type, device_id, f"状态 {status_name}" - ) - + if "status_types" not in device_config["class"]: + device_config["class"]["status_types"] = {} + if "action_value_mappings" not in device_config["class"]: + device_config["class"]["action_value_mappings"] = {} + enhanced_info = {} + if complete_registry: + enhanced_info = get_enhanced_class_info(device_config["class"]["module"], use_dynamic=True) + device_config["class"]["status_types"].update( + {k: v["return_type"] for k, v in enhanced_info["status_methods"].items()} + ) + for status_name, status_type in device_config["class"]["status_types"].items(): + if status_type in ["Any", "None"]: + status_type = "String" # 替换成ROS的String,便于显示 + target_type = self._replace_type_with_class(status_type, device_id, f"状态 {status_name}") + status_str_type_mapping[status_type] = target_type + device_config["class"]["status_types"] = dict( + sorted(device_config["class"]["status_types"].items()) + ) # 处理动作值映射 - 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}" + device_config["class"]["action_value_mappings"].update( + { + f"auto-{k}": { + "type": "UniLabJsonCommandAsync" if v["is_async"] else "UniLabJsonCommand", + "goal": {}, + "feedback": {}, + "result": {}, + "schema": self._generate_unilab_json_command_schema(v["args"], k), + "goal_default": {i["name"]: i["default"] for i in v["args"]}, + "handles": [], + } + for k, v in enhanced_info["action_methods"].items() + } + ) + device_config["init_param_schema"] = self._generate_unilab_json_command_schema(enhanced_info["init_params"], "__init__") + device_config.pop("schema", None) + device_config["class"]["action_value_mappings"] = dict( + sorted(device_config["class"]["action_value_mappings"].items()) + ) + 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_type_str: str = action_config["type"] + # 通过Json发放指令,而不是通过特殊的ros action进行处理 + if not action_type_str.startswith("UniLabJsonCommand"): + target_type = self._replace_type_with_class( + action_type_str, device_id, f"动作 {action_name}" ) - if action_config["type"] is not None: + action_str_type_mapping[action_type_str] = target_type + if target_type is not None: action_config["goal_default"] = yaml.safe_load( - io.StringIO(get_yaml_from_goal_type(action_config["type"].Goal)) + io.StringIO(get_yaml_from_goal_type(target_type.Goal)) ) - action_config["schema"] = ros_action_to_json_schema(action_config["type"]) + action_config["schema"] = ros_action_to_json_schema(target_type) else: logger.warning( f"[UniLab Registry] 设备 {device_id} 的动作 {action_name} 类型为空,跳过替换" ) - - self.device_type_registry.update(data) - - for device_id in data.keys(): + complete_data[device_id] = copy.deepcopy(dict(sorted(device_config.items()))) # 稍后dump到文件 + for status_name, status_type in device_config["class"]["status_types"].items(): + device_config["class"]["status_types"][status_name] = status_str_type_mapping[status_type] + for action_name, action_config in device_config["class"]["action_value_mappings"].items(): + action_config["type"] = action_str_type_mapping[action_config["type"]] + for additional_action in ["_execute_driver_command", "_execute_driver_command_async"]: + device_config["class"]["action_value_mappings"][additional_action] = { + "type": self._replace_type_with_class( + "StrSingleInput", device_id, f"动作 {additional_action}" + ), + "goal": {"string": "string"}, + "feedback": {}, + "result": {}, + "schema": ros_action_to_json_schema( + self._replace_type_with_class( + "StrSingleInput", device_id, f"动作 {additional_action}" + ) + ), + "goal_default": yaml.safe_load( + io.StringIO( + get_yaml_from_goal_type( + self._replace_type_with_class( + "StrSingleInput", device_id, f"动作 {additional_action}" + ).Goal + ) + ) + ), + "handles": [], + } + if "registry_type" not in device_config: + device_config["registry_type"] = "device" + device_config["file_path"] = str(file.absolute()).replace("\\", "/") + device_config["registry_type"] = "device" logger.debug( f"[UniLab Registry] Device-{current_device_number} File-{i+1}/{len(files)} Add {device_id} " + f"[{data[device_id].get('name', '未命名设备')}]" ) current_device_number += 1 + complete_data = dict(sorted(complete_data.items())) + complete_data = copy.deepcopy(complete_data) + with open(file, "w", encoding="utf-8") as f: + yaml.dump(complete_data, f, allow_unicode=True, default_flow_style=False, Dumper=NoAliasDumper) + self.device_type_registry.update(data) else: logger.debug( f"[UniLab Registry] Device File-{i+1}/{len(files)} Not Valid YAML File: {file.absolute()}" @@ -273,7 +414,7 @@ class Registry: lab_registry = Registry() -def build_registry(registry_paths=None): +def build_registry(registry_paths=None, complete_registry=False): """ 构建或获取Registry单例实例 @@ -297,6 +438,6 @@ def build_registry(registry_paths=None): lab_registry.registry_paths.append(path) # 初始化注册表 - lab_registry.setup() + lab_registry.setup(complete_registry) return lab_registry diff --git a/unilabos/ros/device_node_wrapper.py b/unilabos/ros/device_node_wrapper.py index f6d071f..51ff217 100644 --- a/unilabos/ros/device_node_wrapper.py +++ b/unilabos/ros/device_node_wrapper.py @@ -55,7 +55,7 @@ def ros2_device_node( "read": "read_data", "extra_info": [], } - + # FIXME 后面要删除 for k, v in cls.__dict__.items(): if not k.startswith("_") and isinstance(v, property): # noinspection PyUnresolvedReferences diff --git a/unilabos/ros/msgs/message_converter.py b/unilabos/ros/msgs/message_converter.py index 2bcaadb..940c481 100644 --- a/unilabos/ros/msgs/message_converter.py +++ b/unilabos/ros/msgs/message_converter.py @@ -727,7 +727,6 @@ def ros_action_to_json_schema(action_class: Any) -> Dict[str, Any]: # 创建基础 schema schema = { - '$schema': 'http://json-schema.org/draft-07/schema#', 'title': action_class.__name__, 'description': f"ROS Action {action_class.__name__} 的 JSON Schema", 'type': 'object', diff --git a/unilabos/ros/nodes/base_device_node.py b/unilabos/ros/nodes/base_device_node.py index e119e21..94b2edf 100644 --- a/unilabos/ros/nodes/base_device_node.py +++ b/unilabos/ros/nodes/base_device_node.py @@ -1,4 +1,5 @@ import copy +import io import json import threading import time @@ -10,6 +11,7 @@ from concurrent.futures import ThreadPoolExecutor import asyncio import rclpy +import yaml from rclpy.node import Node from rclpy.action import ActionServer, ActionClient from rclpy.action.server import ServerGoalHandle @@ -302,6 +304,8 @@ class BaseROS2DeviceNode(Node, Generic[T]): # 创建动作服务 if self.create_action_server: for action_name, action_value_mapping in self._action_value_mappings.items(): + if action_name.startswith("auto-"): + continue self.create_ros_action_server(action_name, action_value_mapping) # 创建线程池执行器 @@ -838,6 +842,8 @@ class BaseROS2DeviceNode(Node, Generic[T]): class DeviceInitError(Exception): pass +class JsonCommandInitError(Exception): + pass class ROS2DeviceNode: """ @@ -954,12 +960,51 @@ class ROS2DeviceNode: self._ros_node: BaseROS2DeviceNode self._ros_node.lab_logger().info(f"初始化完成 {self._ros_node.uuid} {self.driver_is_ros}") self.driver_instance._ros_node = self._ros_node # type: ignore + self.driver_instance._execute_driver_command = self._execute_driver_command # type: ignore + self.driver_instance._execute_driver_command_async = self._execute_driver_command_async # type: ignore if hasattr(self.driver_instance, "post_init"): try: self.driver_instance.post_init(self._ros_node) # type: ignore except Exception as e: self._ros_node.lab_logger().error(f"设备后初始化失败: {e}") + def _execute_driver_command(self, string: str): + try: + target = json.loads(string) + except Exception as ex: + try: + target = yaml.safe_load(io.StringIO(string)) + except Exception as ex2: + raise JsonCommandInitError(f"执行动作时JSON/YAML解析失败: \n{ex}\n{ex2}\n原内容: {string}\n{traceback.format_exc()}") + try: + function_name = target["function_name"] + function_args = target["function_args"] + assert isinstance(function_args, dict), "执行动作时JSON必须为dict类型\n原JSON: {string}" + function = getattr(self.driver_instance, function_name) + assert callable(function), f"执行动作时JSON中的function_name对应的函数不可调用: {function_name}\n原JSON: {string}" + return function(**function_args) + except KeyError as ex: + raise JsonCommandInitError(f"执行动作时JSON缺少function_name或function_args: {ex}\n原JSON: {string}\n{traceback.format_exc()}") + + async def _execute_driver_command_async(self, string: str): + try: + target = json.loads(string) + except Exception as ex: + try: + target = yaml.safe_load(io.StringIO(string)) + except Exception as ex2: + raise JsonCommandInitError(f"执行动作时JSON/YAML解析失败: \n{ex}\n{ex2}\n原内容: {string}\n{traceback.format_exc()}") + try: + function_name = target["function_name"] + function_args = target["function_args"] + assert isinstance(function_args, dict), "执行动作时JSON必须为dict类型\n原JSON: {string}" + function = getattr(self.driver_instance, function_name) + assert callable(function), f"执行动作时JSON中的function_name对应的函数不可调用: {function_name}\n原JSON: {string}" + assert asyncio.iscoroutinefunction(function), f"执行动作时JSON中的function并非异步: {function_name}\n原JSON: {string}" + return await function(**function_args) + except KeyError as ex: + raise JsonCommandInitError(f"执行动作时JSON缺少function_name或function_args: {ex}\n原JSON: {string}\n{traceback.format_exc()}") + def _start_loop(self): def run_event_loop(): loop = asyncio.new_event_loop() diff --git a/unilabos/ros/nodes/presets/host_node.py b/unilabos/ros/nodes/presets/host_node.py index 6665165..cae1a9f 100644 --- a/unilabos/ros/nodes/presets/host_node.py +++ b/unilabos/ros/nodes/presets/host_node.py @@ -567,6 +567,7 @@ class HostNode(BaseROS2DeviceNode): def send_goal( self, device_id: str, + action_type: str, action_name: str, action_kwargs: Dict[str, Any], goal_uuid: Optional[str] = None, @@ -577,11 +578,26 @@ class HostNode(BaseROS2DeviceNode): Args: device_id: 设备ID + action_type: 动作类型 action_name: 动作名称 action_kwargs: 动作参数 goal_uuid: 目标UUID,如果为None则自动生成 + server_info: 服务器发送信息,包含发送时间戳等 """ - action_id = f"/devices/{device_id}/{action_name}" + if action_type.startswith("UniLabJsonCommand"): + if action_name.startswith("auto-"): + action_name = action_name[5:] + action_id = f"/devices/{device_id}/_execute_driver_command" + action_kwargs = { + "string": json.dumps({ + "function_name": action_name, + "function_args": action_kwargs, + }) + } + if action_type.startswith("UniLabJsonCommandAsync"): + action_id = f"/devices/{device_id}/_execute_driver_command_async" + else: + action_id = f"/devices/{device_id}/{action_name}" if action_name == "test_latency" and server_info is not None: self.server_latest_timestamp = server_info.get("send_timestamp", 0.0) if action_id not in self._action_clients: diff --git a/unilabos/ros/nodes/presets/protocol_node.py b/unilabos/ros/nodes/presets/protocol_node.py index 4da8c62..09921db 100644 --- a/unilabos/ros/nodes/presets/protocol_node.py +++ b/unilabos/ros/nodes/presets/protocol_node.py @@ -1,7 +1,5 @@ import time -import asyncio import traceback -from types import MethodType from typing import Union import rclpy @@ -22,6 +20,8 @@ from unilabos.ros.msgs.message_converter import ( convert_from_ros_msg_with_mapping, ) from unilabos.ros.nodes.base_device_node import BaseROS2DeviceNode, DeviceNodeResourceTracker, ROS2DeviceNode +from unilabos.utils.log import error +from unilabos.utils.type_check import serialize_result_info class ROS2ProtocolNode(BaseROS2DeviceNode): @@ -33,7 +33,15 @@ class ROS2ProtocolNode(BaseROS2DeviceNode): # create_action_server = False # Action Server要自己创建 - def __init__(self, device_id: str, children: dict, protocol_type: Union[str, list[str]], resource_tracker: DeviceNodeResourceTracker, *args, **kwargs): + def __init__( + self, + device_id: str, + children: dict, + protocol_type: Union[str, list[str]], + resource_tracker: DeviceNodeResourceTracker, + *args, + **kwargs, + ): self._setup_protocol_names(protocol_type) # 初始化其它属性 @@ -60,7 +68,9 @@ class ROS2ProtocolNode(BaseROS2DeviceNode): for device_id, device_config in self.children.items(): if device_config.get("type", "device") != "device": - self.lab_logger().debug(f"[Protocol Node] Skipping type {device_config['type']} {device_id} already existed, skipping.") + self.lab_logger().debug( + f"[Protocol Node] Skipping type {device_config['type']} {device_id} already existed, skipping." + ) continue try: d = self.initialize_device(device_id, device_config) @@ -76,22 +86,27 @@ class ROS2ProtocolNode(BaseROS2DeviceNode): # 设置硬件接口代理 if d: + hardware_interface = d.ros_node_instance._hardware_interface if ( - hasattr(d.driver_instance, d.ros_node_instance._hardware_interface["name"]) - and hasattr(d.driver_instance, d.ros_node_instance._hardware_interface["write"]) - and (d.ros_node_instance._hardware_interface["read"] is None or hasattr(d.driver_instance, d.ros_node_instance._hardware_interface["read"])) + hasattr(d.driver_instance, hardware_interface["name"]) + and hasattr(d.driver_instance, hardware_interface["write"]) + and (hardware_interface["read"] is None or hasattr(d.driver_instance, hardware_interface["read"])) ): - name = getattr(d.driver_instance, d.ros_node_instance._hardware_interface["name"]) - read = d.ros_node_instance._hardware_interface.get("read", None) - write = d.ros_node_instance._hardware_interface.get("write", None) + name = getattr(d.driver_instance, hardware_interface["name"]) + read = hardware_interface.get("read", None) + write = hardware_interface.get("write", None) # 如果硬件接口是字符串,通过通信设备提供 if isinstance(name, str) and name in self.sub_devices: communicate_device = self.sub_devices[name] communicate_hardware_info = communicate_device.ros_node_instance._hardware_interface self._setup_hardware_proxy(d, self.sub_devices[name], read, write) - self.lab_logger().info(f"\n通信代理:为子设备{device_id}\n 添加了{read}方法(来源:{name} {communicate_hardware_info['write']}) \n 添加了{write}方法(来源:{name} {communicate_hardware_info['read']})") + self.lab_logger().info( + f"\n通信代理:为子设备{device_id}\n " + f"添加了{read}方法(来源:{name} {communicate_hardware_info['write']}) \n " + f"添加了{write}方法(来源:{name} {communicate_hardware_info['read']})" + ) def _setup_protocol_names(self, protocol_type): # 处理协议类型 @@ -149,63 +164,127 @@ class ROS2ProtocolNode(BaseROS2DeviceNode): def _create_protocol_execute_callback(self, protocol_name, protocol_steps_generator): async def execute_protocol(goal_handle: ServerGoalHandle): """执行完整的工作流""" - self.get_logger().info(f'Executing {protocol_name} action...') - action_value_mapping = self._action_value_mappings[protocol_name] - print('+'*30) - print(protocol_steps_generator) - # 从目标消息中提取参数, 并调用Protocol生成器(根据设备连接图)生成action步骤 - goal = goal_handle.request - protocol_kwargs = convert_from_ros_msg_with_mapping(goal, action_value_mapping["goal"]) + # 初始化结果信息变量 + execution_error = "" + execution_success = False + protocol_return_value = None - # 向Host查询物料当前状态 - for k, v in goal.get_fields_and_field_types().items(): - if v in ["unilabos_msgs/Resource", "sequence"]: - r = ResourceGet.Request() - r.id = protocol_kwargs[k]["id"] if v == "unilabos_msgs/Resource" else protocol_kwargs[k][0]["id"] - r.with_children = True - response = await self._resource_clients["resource_get"].call_async(r) - protocol_kwargs[k] = list_to_nested_dict([convert_from_ros_msg(rs) for rs in response.resources]) + try: + self.get_logger().info(f"Executing {protocol_name} action...") + action_value_mapping = self._action_value_mappings[protocol_name] + print("+" * 30) + print(protocol_steps_generator) + # 从目标消息中提取参数, 并调用Protocol生成器(根据设备连接图)生成action步骤 + goal = goal_handle.request + protocol_kwargs = convert_from_ros_msg_with_mapping(goal, action_value_mapping["goal"]) - from unilabos.resources.graphio import physical_setup_graph - self.get_logger().info(f'Working on physical setup: {physical_setup_graph}') - protocol_steps = protocol_steps_generator(G=physical_setup_graph, **protocol_kwargs) + # 向Host查询物料当前状态 + for k, v in goal.get_fields_and_field_types().items(): + if v in ["unilabos_msgs/Resource", "sequence"]: + r = ResourceGet.Request() + resource_id = ( + protocol_kwargs[k]["id"] if v == "unilabos_msgs/Resource" else protocol_kwargs[k][0]["id"] + ) + r.id = resource_id + r.with_children = True + response = await self._resource_clients["resource_get"].call_async(r) + protocol_kwargs[k] = list_to_nested_dict( + [convert_from_ros_msg(rs) for rs in response.resources] + ) - self.get_logger().info(f'Goal received: {protocol_kwargs}, running steps: \n{protocol_steps}') + from unilabos.resources.graphio import physical_setup_graph - time_start = time.time() - time_overall = 100 - self._busy = True + self.lab_logger().info(f"Working on physical setup: {physical_setup_graph}") + protocol_steps = protocol_steps_generator(G=physical_setup_graph, **protocol_kwargs) - # 逐步执行工作流 - for i, action in enumerate(protocol_steps): - self.get_logger().info(f'Running step {i+1}: {action}') - if type(action) == dict: - # 如果是单个动作,直接执行 - if action["action_name"] == "wait": - time.sleep(action["action_kwargs"]["time"]) - else: - result = await self.execute_single_action(**action) - elif type(action) == list: - # 如果是并行动作,同时执行 - actions = action - futures = [rclpy.get_global_executor().create_task(self.execute_single_action(**a)) for a in actions] - results = [await f for f in futures] + self.lab_logger().info(f"Goal received: {protocol_kwargs}, running steps: \n{protocol_steps}") - # 向Host更新物料当前状态 - for k, v in goal.get_fields_and_field_types().items(): - if v in ["unilabos_msgs/Resource", "sequence"]: - r = ResourceUpdate.Request() - r.resources = [ - convert_to_ros_msg(Resource, rs) for rs in nested_dict_to_list(protocol_kwargs[k]) - ] - response = await self._resource_clients["resource_update"].call_async(r) + time_start = time.time() + time_overall = 100 + self._busy = True - goal_handle.succeed() + # 逐步执行工作流 + step_results = [] + for i, action in enumerate(protocol_steps): + self.get_logger().info(f"Running step {i + 1}: {action}") + if isinstance(action, dict): + # 如果是单个动作,直接执行 + if action["action_name"] == "wait": + time.sleep(action["action_kwargs"]["time"]) + step_results.append({"step": i + 1, "action": "wait", "result": "completed"}) + else: + result = await self.execute_single_action(**action) + step_results.append({"step": i + 1, "action": action["action_name"], "result": result}) + elif isinstance(action, list): + # 如果是并行动作,同时执行 + actions = action + futures = [ + rclpy.get_global_executor().create_task(self.execute_single_action(**a)) for a in actions + ] + results = [await f for f in futures] + step_results.append( + { + "step": i + 1, + "parallel_actions": [a["action_name"] for a in actions], + "results": results, + } + ) + + # 向Host更新物料当前状态 + for k, v in goal.get_fields_and_field_types().items(): + if v in ["unilabos_msgs/Resource", "sequence"]: + r = ResourceUpdate.Request() + r.resources = [ + convert_to_ros_msg(Resource, rs) for rs in nested_dict_to_list(protocol_kwargs[k]) + ] + response = await self._resource_clients["resource_update"].call_async(r) + + # 设置成功状态和返回值 + execution_success = True + protocol_return_value = { + "protocol_name": protocol_name, + "steps_executed": len(protocol_steps), + "step_results": step_results, + "total_time": time.time() - time_start, + } + + goal_handle.succeed() + + except Exception as e: + # 捕获并记录错误信息 + execution_error = traceback.format_exc() + execution_success = False + error(f"协议 {protocol_name} 执行失败") + error(traceback.format_exc()) + self.lab_logger().error(f"协议执行出错: {str(e)}") + + # 设置动作失败 + goal_handle.abort() + + finally: + self._busy = False + + # 创建结果消息 result = action_value_mapping["type"].Result() - result.success = True + result.success = execution_success - self._busy = False + # 获取结果消息类型信息,检查是否有return_info字段 + result_msg_types = action_value_mapping["type"].Result.get_fields_and_field_types() + + # 设置return_info字段(如果存在) + for attr_name in result_msg_types.keys(): + if attr_name in ["success", "reached_goal"]: + setattr(result, attr_name, execution_success) + elif attr_name == "return_info": + setattr( + result, + attr_name, + serialize_result_info(execution_error, execution_success, protocol_return_value), + ) + + self.lab_logger().info(f"协议 {protocol_name} 完成并返回结果") return result + return execute_protocol async def execute_single_action(self, device_id, action_name, action_kwargs): @@ -241,14 +320,19 @@ class ROS2ProtocolNode(BaseROS2DeviceNode): return result_future.result - """还没有改过的部分""" - def _setup_hardware_proxy(self, device: ROS2DeviceNode, communication_device: ROS2DeviceNode, read_method, write_method): + def _setup_hardware_proxy( + self, device: ROS2DeviceNode, communication_device: ROS2DeviceNode, read_method, write_method + ): """为设备设置硬件接口代理""" # extra_info = [getattr(device.driver_instance, info) for info in communication_device.ros_node_instance._hardware_interface.get("extra_info", [])] - write_func = getattr(communication_device.driver_instance, communication_device.ros_node_instance._hardware_interface["write"]) - read_func = getattr(communication_device.driver_instance, communication_device.ros_node_instance._hardware_interface["read"]) + write_func = getattr( + communication_device.driver_instance, communication_device.ros_node_instance._hardware_interface["write"] + ) + read_func = getattr( + communication_device.driver_instance, communication_device.ros_node_instance._hardware_interface["read"] + ) def _read(*args, **kwargs): return read_func(*args, **kwargs) @@ -264,7 +348,6 @@ class ROS2ProtocolNode(BaseROS2DeviceNode): # bound_write = MethodType(_write, device.driver_instance) setattr(device.driver_instance, write_method, _write) - async def _update_resources(self, goal, protocol_kwargs): """更新资源状态""" for k, v in goal.get_fields_and_field_types().items(): diff --git a/unilabos/utils/import_manager.py b/unilabos/utils/import_manager.py index 17c69d2..4653977 100644 --- a/unilabos/utils/import_manager.py +++ b/unilabos/utils/import_manager.py @@ -7,7 +7,11 @@ import builtins import importlib import inspect +import sys import traceback +import ast +import os +from pathlib import Path from typing import Dict, List, Any, Optional, Callable, Type @@ -18,8 +22,12 @@ __all__ = [ "get_class", "get_module", "init_from_list", + "get_class_info_static", + "get_registry_class_info", ] +from ast import Constant + from unilabos.utils import logger @@ -114,15 +122,16 @@ class ImportManager: # 尝试动态导入 if ":" in class_name: module_path, cls_name = class_name.rsplit(":", 1) - # 如果cls_name是builtins中的关键字,则返回对应类 - if cls_name in builtins.__dict__: - return builtins.__dict__[cls_name] module = self.load_module(module_path) if hasattr(module, cls_name): cls = getattr(module, cls_name) self._classes[class_name] = cls self._classes[cls_name] = cls return cls + else: + # 如果cls_name是builtins中的关键字,则返回对应类 + if class_name in builtins.__dict__: + return builtins.__dict__[class_name] raise KeyError(f"找不到类: {class_name}") @@ -149,6 +158,9 @@ class ImportManager: Returns: 找到的类对象,如果未找到则返回None """ + # 如果cls_name是builtins中的关键字,则返回对应类 + if class_name in builtins.__dict__: + return builtins.__dict__[class_name] # 首先在已索引的类中查找 if class_name in self._classes: return self._classes[class_name] @@ -161,7 +173,9 @@ class ImportManager: # 遍历所有已加载的模块进行搜索 for module_path, module in self._modules.items(): for name, obj in inspect.getmembers(module): - if inspect.isclass(obj) and ((name.lower() == class_name.lower()) if search_lower else (name == class_name)): + if inspect.isclass(obj) and ( + (name.lower() == class_name.lower()) if search_lower else (name == class_name) + ): # 将找到的类添加到索引中 self._classes[name] = obj self._classes[f"{module_path}:{name}"] = obj @@ -169,6 +183,559 @@ class ImportManager: return None + def get_enhanced_class_info(self, module_path: str, use_dynamic: bool = True) -> Dict[str, Any]: + """ + 获取增强的类信息,支持动态导入和静态分析 + + Args: + module_path: 模块路径,格式为 "module.path" 或 "module.path:ClassName" + use_dynamic: 是否优先使用动态导入 + + Returns: + 包含详细类信息的字典 + """ + result = { + "module_path": module_path, + "dynamic_import_success": False, + "static_analysis_success": False, + "init_params": {}, + "status_methods": {}, # get_ 开头和 @property 方法 + "action_methods": {}, # set_ 开头和其他非_开头方法 + } + + # 尝试动态导入 + dynamic_info = None + if use_dynamic: + try: + raise ValueError("强制使用动态导入") # 强制使用动态导入以测试功能 + dynamic_info = self._get_dynamic_class_info(module_path) + result["dynamic_import_success"] = True + logger.debug(f"[ImportManager] 动态导入类 {module_path} 成功") + except Exception as e: + logger.warning( + f"[UniLab Registry] 在补充注册表时,动态导入类 " + f"{module_path} 失败(将使用静态分析," + f"建议修复导入错误,以实现更好的注册表识别效果!): {e}" + ) + + # 尝试静态分析 + static_info = None + try: + static_info = self._get_static_class_info(module_path) + result["static_analysis_success"] = True + logger.debug(f"[ImportManager] 静态分析类 {module_path} 成功") + except Exception as e: + logger.warning(f"[ImportManager] 静态分析类 {module_path} 失败: {e}") + + # 合并信息(优先使用动态导入的信息) + if dynamic_info: + result.update(dynamic_info) + elif static_info: + result.update(static_info) + + return result + + def _get_dynamic_class_info(self, class_path: str) -> Dict[str, Any]: + """使用inspect模块动态获取类信息""" + cls = get_class(class_path) + class_name = cls.__name__ + + result = { + "class_name": class_name, + "init_params": {}, + "status_methods": {}, + "action_methods": {}, + } + + init_signature = inspect.signature(cls.__init__) + for param_name, param in init_signature.parameters.items(): + if param_name == "self": + continue + + # 先获取注解类型 + param_type = self._get_type_string(param.annotation) + param_default = None if param.default == inspect.Parameter.empty else param.default + + # 如果type为Any或None,尝试用default的类型推断 + if param_type in ["Any", "None"]: + if param.default != inspect.Parameter.empty and param.default is not None: + default_type = type(param.default) + param_type = self._get_type_string(default_type) + + param_info = { + "name": param_name, + "type": param_type, + "required": param.default == inspect.Parameter.empty, + "default": param_default, + } + result["init_params"][param_name] = param_info + + # 分析类的所有成员 + for name, method in inspect.getmembers(cls): + if name.startswith("_"): + continue + + # 检查是否是property + if isinstance(method, property): + # @property 装饰的方法 + # noinspection PyTypeChecker + return_type = self._get_return_type_from_method(method.fget) if method.fget else "Any" + prop_info = { + "name": name, + "return_type": return_type, + } + result["status_methods"][name] = prop_info + + # 检查是否有对应的setter + if method.fset: + setter_info = self._analyze_method_signature(method.fset) + result["action_methods"][name] = setter_info + + elif inspect.ismethod(method) or inspect.isfunction(method): + if name.startswith("get_"): + # get_ 开头的方法归类为status + method_info = self._analyze_method_signature(method) + result["status_methods"][name] = method_info + elif not name.startswith("_"): + # 其他非_开头的方法归类为action + method_info = self._analyze_method_signature(method) + result["action_methods"][name] = method_info + + return result + + def _get_static_class_info(self, module_path: str) -> Dict[str, Any]: + """使用AST静态分析获取类信息""" + module_name, class_name = module_path.rsplit(":", 1) + # 将模块路径转换为文件路径 + file_path = self._module_path_to_file_path(module_name) + if not file_path or not os.path.exists(file_path): + raise FileNotFoundError(f"找不到模块文件: {module_name} -> {file_path}") + + with open(file_path, "r", encoding="utf-8") as f: + source_code = f.read() + + tree = ast.parse(source_code) + + # 查找目标类 + target_class = None + for node in ast.walk(tree): + if isinstance(node, ast.ClassDef): + if node.name == class_name: + target_class = node + break + + if target_class is None: + raise AttributeError(f"在文件 {file_path} 中找不到类 {class_name}") + + result = { + "class_name": class_name, + "init_params": {}, + "status_methods": {}, + "action_methods": {}, + } + + # 分析类的方法 + for node in target_class.body: + if isinstance(node, ast.FunctionDef): + method_info = self._analyze_method_node(node) + method_name = node.name + if method_name == "__init__": + result["init_params"] = method_info["args"] + elif method_name.startswith("_"): + continue + elif self._is_property_method(node): + # @property 装饰的方法 + result["status_methods"][method_name] = method_info + else: + # set_ 开头或其他非_开头的方法 + result["action_methods"][method_name] = method_info + return result + + def _analyze_method_signature(self, method) -> Dict[str, Any]: + """分析方法签名""" + signature = inspect.signature(method) + + args = [] + num_required = 0 + for param_name, param in signature.parameters.items(): + if param_name == "self": + continue + + is_required = param.default == inspect.Parameter.empty + if is_required: + num_required += 1 + + args.append( + { + "name": param_name, + "type": self._get_type_string(param.annotation), + "required": is_required, + "default": None if param.default == inspect.Parameter.empty else param.default, + } + ) + + return { + "name": method.__name__, + "args": args, + "return_type": self._get_type_string(signature.return_annotation), + "is_async": inspect.iscoroutinefunction(method), + } + + def _get_return_type_from_method(self, method) -> str: + """从方法中获取返回类型""" + if hasattr(method, "__annotations__") and "return" in method.__annotations__: + return self._get_type_string(method.__annotations__["return"]) + + signature = inspect.signature(method) + return self._get_type_string(signature.return_annotation) + + def _get_type_string(self, annotation) -> str: + """将类型注解转换为字符串""" + if annotation == inspect.Parameter.empty: + return "Any" # 如果没有注解,返回Any + + if annotation is None: + return "None" # 明确的None类型 + + # 如果是类型对象 + if hasattr(annotation, "__name__"): + # 如果是内置类型 + if annotation.__module__ == "builtins": + return annotation.__name__ + else: + # 如果是自定义类,返回完整路径 + return f"{annotation.__module__}:{annotation.__name__}" + + # 如果是typing模块的类型 + elif hasattr(annotation, "_name"): + return annotation._name + + # 如果是字符串形式的类型注解 + elif isinstance(annotation, str): + return annotation + + # 其他情况,尝试转换为字符串 + else: + annotation_str = str(annotation) + # 处理typing模块的复杂类型 + if "typing." in annotation_str: + # 简化typing类型显示 + return annotation_str.replace("typing.", "") + return annotation_str + + def _is_property_method(self, node: ast.FunctionDef) -> bool: + """检查是否是@property装饰的方法""" + for decorator in node.decorator_list: + if isinstance(decorator, ast.Name) and decorator.id == "property": + return True + return False + + def _is_setter_method(self, node: ast.FunctionDef) -> bool: + """检查是否是@xxx.setter装饰的方法""" + for decorator in node.decorator_list: + if isinstance(decorator, ast.Attribute) and decorator.attr == "setter": + return True + return False + + def _get_property_name_from_setter(self, node: ast.FunctionDef) -> str: + """从setter装饰器中获取属性名""" + for decorator in node.decorator_list: + if isinstance(decorator, ast.Attribute) and decorator.attr == "setter": + if isinstance(decorator.value, ast.Name): + return decorator.value.id + return node.name + + def get_class_info_static(self, module_class_path: str) -> Dict[str, Any]: + """ + 静态分析获取类的方法信息,不需要实际导入模块 + + Args: + module_class_path: 格式为 "module.path:ClassName" 的字符串 + + Returns: + 包含类方法信息的字典 + """ + try: + if ":" not in module_class_path: + raise ValueError("module_class_path必须是 'module.path:ClassName' 格式") + + module_path, class_name = module_class_path.rsplit(":", 1) + + # 将模块路径转换为文件路径 + file_path = self._module_path_to_file_path(module_path) + if not file_path or not os.path.exists(file_path): + logger.warning(f"找不到模块文件: {module_path} -> {file_path}") + return {} + + # 解析源码 + with open(file_path, "r", encoding="utf-8") as f: + source_code = f.read() + + tree = ast.parse(source_code) + + # 查找目标类 + class_node = None + for node in ast.walk(tree): + if isinstance(node, ast.ClassDef) and node.name == class_name: + class_node = node + break + + if not class_node: + logger.warning(f"在模块 {module_path} 中找不到类 {class_name}") + return {} + + # 分析类的方法 + methods_info = {} + for node in class_node.body: + if isinstance(node, ast.FunctionDef): + method_info = self._analyze_method_node(node) + methods_info[node.name] = method_info + + return { + "class_name": class_name, + "module_path": module_path, + "file_path": file_path, + "methods": methods_info, + } + + except Exception as e: + logger.error(f"静态分析类 {module_class_path} 时出错: {str(e)}") + return {} + + def _module_path_to_file_path(self, module_path: str) -> Optional[str]: + for path in sys.path: + potential_path = Path(path) / module_path.replace(".", "/") + + # 检查是否为包 + if (potential_path / "__init__.py").exists(): + return str(potential_path / "__init__.py") + + # 检查是否为模块文件 + if (potential_path.parent / f"{potential_path.name}.py").exists(): + return str(potential_path.parent / f"{potential_path.name}.py") + + return None + + def _analyze_method_node(self, node: ast.FunctionDef) -> Dict[str, Any]: + """分析方法节点,提取参数和返回类型信息""" + method_info = { + "name": node.name, + "args": [], + "return_type": None, + "is_async": isinstance(node, ast.AsyncFunctionDef), + } + # 获取默认值列表 + defaults = node.args.defaults + num_defaults = len(defaults) + + # 计算必需参数数量 + total_args = len(node.args.args) + num_required = total_args - num_defaults + + # 提取参数信息 + for i, arg in enumerate(node.args.args): + if arg.arg == "self": + continue + arg_info = { + "name": arg.arg, + "type": None, + "default": None, + "required": i < num_required, + } + + # 提取类型注解 + if arg.annotation: + arg_info["type"] = ast.unparse(arg.annotation) if hasattr(ast, "unparse") else str(arg.annotation) + + # 提取默认值并推断类型 + if i >= num_required: + default_index = i - num_required + if default_index < len(defaults): + default_value: Constant = defaults[default_index] + assert isinstance(default_value, Constant), "暂不支持对非常量类型进行推断,可反馈开源仓库" + arg_info["default"] = default_value.value + # 如果没有类型注解,尝试从默认值推断类型 + if not arg_info["type"]: + arg_info["type"] = self._get_type_string(type(arg_info["default"])) + method_info["args"].append(arg_info) + + # 提取返回类型 + if node.returns: + method_info["return_type"] = ast.unparse(node.returns) if hasattr(ast, "unparse") else str(node.returns) + + return method_info + + + def _infer_type_from_default(self, node: ast.AST) -> Optional[str]: + """从默认值推断参数类型""" + if isinstance(node, ast.Constant): + value = node.value + if isinstance(value, bool): + return "bool" + elif isinstance(value, int): + return "int" + elif isinstance(value, float): + return "float" + elif isinstance(value, str): + return "str" + elif value is None: + return "Optional[Any]" + elif isinstance(node, ast.List): + return "List" + elif isinstance(node, ast.Dict): + return "Dict" + elif isinstance(node, ast.Tuple): + return "Tuple" + elif isinstance(node, ast.Set): + return "Set" + elif isinstance(node, ast.Name): + # 常见的默认值模式 + if node.id in ["None"]: + return "Optional[Any]" + elif node.id in ["True", "False"]: + return "bool" + elif isinstance(node, ast.Attribute): + # 处理类似 os.path.join 的情况 + attr_str = self._extract_default_value(node) + if "path" in attr_str.lower(): + return "str" + + return None + + def _infer_types_from_docstring(self, method_info: Dict[str, Any]) -> None: + """从docstring中推断参数类型""" + docstring = method_info.get("docstring", "") + if not docstring: + return + + lines = docstring.split("\n") + in_args_section = False + + for line in lines: + line = line.strip() + + # 检测Args或Arguments段落 + if line.lower().startswith(("args:", "arguments:")): + in_args_section = True + continue + elif line.startswith(("returns:", "return:", "yields:", "raises:")): + in_args_section = False + continue + elif not line or not in_args_section: + continue + + # 解析参数行,格式通常是: param_name (type): description 或 param_name: description + if ":" in line: + parts = line.split(":", 1) + param_part = parts[0].strip() + + # 提取参数名和类型 + param_name = None + param_type = None + + if "(" in param_part and ")" in param_part: + # 格式: param_name (type) + param_name = param_part.split("(")[0].strip() + type_part = param_part.split("(")[1].split(")")[0].strip() + param_type = type_part + else: + # 格式: param_name + param_name = param_part + + # 更新对应参数的类型信息 + if param_name: + for arg_info in method_info["args"]: + if arg_info["name"] == param_name and not arg_info["type"]: + if param_type: + arg_info["inferred_type"] = param_type + elif not arg_info["inferred_type"]: + # 从描述中推断类型 + description = parts[1].strip().lower() + if any(word in description for word in ["path", "file", "directory", "filename"]): + arg_info["inferred_type"] = "str" + elif any( + word in description for word in ["port", "number", "count", "size", "length"] + ): + arg_info["inferred_type"] = "int" + elif any( + word in description for word in ["rate", "ratio", "percentage", "temperature"] + ): + arg_info["inferred_type"] = "float" + elif any(word in description for word in ["flag", "enable", "disable", "option"]): + arg_info["inferred_type"] = "bool" + + def get_registry_class_info(self, module_class_path: str) -> Dict[str, Any]: + """ + 获取适用于注册表的类信息,包含完整的类型推断 + + Args: + module_class_path: 格式为 "module.path:ClassName" 的字符串 + + Returns: + 适用于注册表的类信息字典 + """ + class_info = self.get_class_info_static(module_class_path) + if not class_info: + return {} + + registry_info = { + "class_name": class_info["class_name"], + "module_path": class_info["module_path"], + "file_path": class_info["file_path"], + "methods": {}, + "properties": [], + "init_params": {}, + "action_methods": {}, + } + + for method_name, method_info in class_info["methods"].items(): + # 分类处理不同类型的方法 + if method_info["is_property"]: + registry_info["properties"].append( + { + "name": method_name, + "return_type": method_info.get("return_type"), + "docstring": method_info.get("docstring"), + } + ) + elif method_name == "__init__": + # 处理初始化参数 + init_params = {} + for arg in method_info["args"]: + if arg["name"] != "self": + param_info = { + "name": arg["name"], + "type": arg.get("type") or arg.get("inferred_type"), + "required": arg.get("is_required", True), + "default": arg.get("default"), + } + init_params[arg["name"]] = param_info + registry_info["init_params"] = init_params + elif not method_name.startswith("_"): + # 处理公共方法(可能的action方法) + action_info = { + "name": method_name, + "params": {}, + "return_type": method_info.get("return_type"), + "docstring": method_info.get("docstring"), + "num_required": method_info.get("num_required", 0) - 1, # 减去self + "num_defaults": method_info.get("num_defaults", 0), + } + + for arg in method_info["args"]: + if arg["name"] != "self": + param_info = { + "name": arg["name"], + "type": arg.get("type") or arg.get("inferred_type"), + "required": arg.get("is_required", True), + "default": arg.get("default"), + } + action_info["params"][arg["name"]] = param_info + + registry_info["action_methods"][method_name] = action_info + + return registry_info + # 全局实例,便于直接使用 default_manager = ImportManager() @@ -193,3 +760,18 @@ def init_from_list(module_list: List[str]) -> None: """从模块列表初始化默认管理器""" global default_manager default_manager = ImportManager(module_list) + + +def get_class_info_static(module_class_path: str) -> Dict[str, Any]: + """静态分析获取类信息的便捷函数""" + return default_manager.get_class_info_static(module_class_path) + + +def get_registry_class_info(module_class_path: str) -> Dict[str, Any]: + """获取适用于注册表的类信息的便捷函数""" + return default_manager.get_registry_class_info(module_class_path) + + +def get_enhanced_class_info(module_path: str, use_dynamic: bool = True) -> Dict[str, Any]: + """获取增强的类信息的便捷函数""" + return default_manager.get_enhanced_class_info(module_path, use_dynamic) diff --git a/unilabos/utils/type_check.py b/unilabos/utils/type_check.py index 578eb93..52a6f0b 100644 --- a/unilabos/utils/type_check.py +++ b/unilabos/utils/type_check.py @@ -2,6 +2,8 @@ import collections.abc import json from typing import get_origin, get_args +import yaml + def get_type_class(type_hint): origin = get_origin(type_hint) @@ -22,6 +24,12 @@ class TypeEncoder(json.JSONEncoder): return super().default(obj) +class NoAliasDumper(yaml.SafeDumper): + def ignore_aliases(self, data): + return True + + + class ResultInfoEncoder(json.JSONEncoder): """专门用于处理任务执行结果信息的JSON编码器""" From 15f3f8518bbf359824c706a53aa3cf837594910f Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Sat, 28 Jun 2025 01:19:54 +0800 Subject: [PATCH 03/96] =?UTF-8?q?=E6=94=AF=E6=8C=81=E9=80=9A=E8=BF=87?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E6=96=B9=E5=BC=8F=E8=A1=A5=E5=85=A8=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=E8=A1=A8=EF=BC=8C=E6=96=B0=E5=A2=9E=E5=B7=A5=E4=BD=9C?= =?UTF-8?q?=E6=B5=81unilabos=5Fdevice=5Fid=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../devices/characterization_optic.yaml | 505 ++++++ unilabos/registry/devices/hotel.yaml | 3 +- unilabos/registry/devices/liquid_handler.yaml | 1006 ++++++++++- unilabos/registry/devices/mock_devices.yaml | 10 + unilabos/registry/devices/moveit_config.yaml | 612 ++++++- unilabos/registry/devices/pump_and_valve.yaml | 10 + unilabos/registry/devices/robot_gripper.yaml | 507 +++++- .../registry/devices/robot_linear_motion.yaml | 175 +- unilabos/registry/devices/sim_nodes.yaml | 6 +- unilabos/registry/devices/temperature.yaml | 2 + .../registry/devices/vacuum_and_purge.yaml | 2 + unilabos/registry/devices/virtual_device.yaml | 1574 ++++++++++++++++- unilabos/registry/devices/work_station.yaml | 44 + unilabos/registry/devices/zhida_hplc.yaml | 1 + unilabos/registry/registry.py | 32 +- unilabos/ros/nodes/presets/protocol_node.py | 5 +- unilabos/utils/import_manager.py | 15 +- 17 files changed, 4457 insertions(+), 52 deletions(-) diff --git a/unilabos/registry/devices/characterization_optic.yaml b/unilabos/registry/devices/characterization_optic.yaml index e69de29..ddca2dd 100644 --- a/unilabos/registry/devices/characterization_optic.yaml +++ b/unilabos/registry/devices/characterization_optic.yaml @@ -0,0 +1,505 @@ +hplc.agilent: + class: + action_value_mappings: + auto-check_status: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand check_status 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand check_status 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: check_status 命令参数 + type: object + type: UniLabJsonCommand + auto-execute_command_from_outer: + feedback: {} + goal: {} + goal_default: + command: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand execute_command_from_outer 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand execute_command_from_outer 的参数schema + properties: + command: + description: '参数: command' + type: string + required: + - command + type: object + result: {} + required: + - goal + title: execute_command_from_outer 命令参数 + type: object + type: UniLabJsonCommand + auto-extract_data_from_txt: + feedback: {} + goal: {} + goal_default: + file_path: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand extract_data_from_txt 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand extract_data_from_txt 的参数schema + properties: + file_path: + description: '参数: file_path' + type: string + required: + - file_path + type: object + result: {} + required: + - goal + title: extract_data_from_txt 命令参数 + type: object + type: UniLabJsonCommand + auto-get_data_file: + feedback: {} + goal: {} + goal_default: + after_time: null + mat_index: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand get_data_file 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand get_data_file 的参数schema + properties: + after_time: + description: '参数: after_time' + type: string + mat_index: + description: '参数: mat_index' + type: string + required: [] + type: object + result: {} + required: + - goal + title: get_data_file 命令参数 + type: object + type: UniLabJsonCommand + auto-start_sequence: + feedback: {} + goal: {} + goal_default: + params: null + resource: null + wf_name: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand start_sequence 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand start_sequence 的参数schema + properties: + params: + description: '参数: params' + type: string + resource: + description: '参数: resource' + type: object + wf_name: + description: '参数: wf_name' + type: string + required: + - wf_name + type: object + result: {} + required: + - goal + title: start_sequence 命令参数 + type: object + type: UniLabJsonCommand + auto-try_close_sub_device: + feedback: {} + goal: {} + goal_default: + device_name: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand try_close_sub_device 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand try_close_sub_device 的参数schema + properties: + device_name: + description: '参数: device_name' + type: string + required: [] + type: object + result: {} + required: + - goal + title: try_close_sub_device 命令参数 + type: object + type: UniLabJsonCommand + auto-try_open_sub_device: + feedback: {} + goal: {} + goal_default: + device_name: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand try_open_sub_device 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand try_open_sub_device 的参数schema + properties: + device_name: + description: '参数: device_name' + type: string + required: [] + type: object + result: {} + required: + - goal + title: try_open_sub_device 命令参数 + type: object + type: UniLabJsonCommand + execute_command_from_outer: + feedback: {} + goal: + command: command + goal_default: + command: '' + handles: [] + result: + success: success + schema: + description: ROS Action SendCmd 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: SendCmd_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + command: + type: string + required: + - command + title: SendCmd_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: SendCmd_Result + type: object + required: + - goal + title: SendCmd + type: object + type: SendCmd + module: unilabos.devices.hplc.AgilentHPLC:HPLCDriver + status_types: + could_run: bool + device_status: str + driver_init_ok: bool + finish_status: str + get_data_file: tuple + is_running: bool + status_text: str + success: bool + type: python + description: HPLC device + handles: [] + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + driver_debug: + default: false + description: '参数: driver_debug' + type: boolean + required: [] + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object +raman_home_made: + class: + action_value_mappings: + auto-ccd_time: + feedback: {} + goal: {} + goal_default: + int_time: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand ccd_time 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand ccd_time 的参数schema + properties: + int_time: + description: '参数: int_time' + type: string + required: + - int_time + type: object + result: {} + required: + - goal + title: ccd_time 命令参数 + type: object + type: UniLabJsonCommand + auto-laser_on_power: + feedback: {} + goal: {} + goal_default: + output_voltage_laser: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand laser_on_power 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand laser_on_power 的参数schema + properties: + output_voltage_laser: + description: '参数: output_voltage_laser' + type: string + required: + - output_voltage_laser + type: object + result: {} + required: + - goal + title: laser_on_power 命令参数 + type: object + type: UniLabJsonCommand + auto-raman_cmd: + feedback: {} + goal: {} + goal_default: + command: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand raman_cmd 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand raman_cmd 的参数schema + properties: + command: + description: '参数: command' + type: string + required: + - command + type: object + result: {} + required: + - goal + title: raman_cmd 命令参数 + type: object + type: UniLabJsonCommand + auto-raman_without_background: + feedback: {} + goal: {} + goal_default: + int_time: null + laser_power: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand raman_without_background 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand raman_without_background 的参数schema + properties: + int_time: + description: '参数: int_time' + type: string + laser_power: + description: '参数: laser_power' + type: string + required: + - int_time + - laser_power + type: object + result: {} + required: + - goal + title: raman_without_background 命令参数 + type: object + type: UniLabJsonCommand + auto-raman_without_background_average: + feedback: {} + goal: {} + goal_default: + average: null + int_time: null + laser_power: null + sample_name: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand raman_without_background_average 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand raman_without_background_average 的参数schema + properties: + average: + description: '参数: average' + type: string + int_time: + description: '参数: int_time' + type: string + laser_power: + description: '参数: laser_power' + type: string + sample_name: + description: '参数: sample_name' + type: string + required: + - sample_name + - int_time + - laser_power + - average + type: object + result: {} + required: + - goal + title: raman_without_background_average 命令参数 + type: object + type: UniLabJsonCommand + raman_cmd: + feedback: {} + goal: + command: command + goal_default: + command: '' + handles: [] + result: + success: success + schema: + description: ROS Action SendCmd 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + required: + - status + title: SendCmd_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + command: + type: string + required: + - command + title: SendCmd_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: SendCmd_Result + type: object + required: + - goal + title: SendCmd + type: object + type: SendCmd + module: unilabos.devices.raman_uv.home_made_raman:RamanObj + status_types: + status: String + type: python + description: Raman spectroscopy device + handles: [] + icon: '' + init_param_schema: + description: UniLabJsonCommand __init__ 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand __init__ 的参数schema + properties: + baudrate_ccd: + default: 921600 + description: '参数: baudrate_ccd' + type: integer + baudrate_laser: + default: 9600 + description: '参数: baudrate_laser' + type: integer + port_ccd: + description: '参数: port_ccd' + type: string + port_laser: + description: '参数: port_laser' + type: string + required: + - port_laser + - port_ccd + type: object + result: {} + required: + - goal + title: __init__ 命令参数 + type: object diff --git a/unilabos/registry/devices/hotel.yaml b/unilabos/registry/devices/hotel.yaml index 6429f01..abaf871 100644 --- a/unilabos/registry/devices/hotel.yaml +++ b/unilabos/registry/devices/hotel.yaml @@ -23,7 +23,8 @@ hotel.thermo_orbitor_rs2_hotel: type: object type: UniLabJsonCommand module: unilabos.devices.resource_container.container:HotelContainer - status_types: {} + status_types: + get_rotation: String type: python description: Thermo Orbitor RS2 Hotel handles: [] diff --git a/unilabos/registry/devices/liquid_handler.yaml b/unilabos/registry/devices/liquid_handler.yaml index 6fdb6e5..8fea092 100644 --- a/unilabos/registry/devices/liquid_handler.yaml +++ b/unilabos/registry/devices/liquid_handler.yaml @@ -554,6 +554,188 @@ liquid_handler: title: LiquidHandlerAspirate type: object type: LiquidHandlerAspirate + auto-add_liquid: + feedback: {} + goal: {} + goal_default: + asp_vols: null + blow_out_air_volume: null + delays: null + dis_vols: null + flow_rates: null + is_96_well: false + liquid_height: null + mix_liquid_height: null + mix_rate: null + mix_time: null + mix_vol: null + none_keys: [] + offsets: null + reagent_sources: null + spread: wide + targets: null + use_channels: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand add_liquid 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand add_liquid 的参数schema + properties: + asp_vols: + description: '参数: asp_vols' + type: string + blow_out_air_volume: + description: '参数: blow_out_air_volume' + type: string + delays: + description: '参数: delays' + type: string + dis_vols: + description: '参数: dis_vols' + type: string + flow_rates: + description: '参数: flow_rates' + type: string + is_96_well: + default: false + description: '参数: is_96_well' + type: boolean + liquid_height: + description: '参数: liquid_height' + type: string + mix_liquid_height: + description: '参数: mix_liquid_height' + type: string + mix_rate: + description: '参数: mix_rate' + type: string + mix_time: + description: '参数: mix_time' + type: string + mix_vol: + description: '参数: mix_vol' + type: string + none_keys: + default: [] + description: '参数: none_keys' + type: string + offsets: + description: '参数: offsets' + type: string + reagent_sources: + description: '参数: reagent_sources' + type: string + spread: + default: wide + description: '参数: spread' + type: string + targets: + description: '参数: targets' + type: string + use_channels: + description: '参数: use_channels' + type: string + required: + - asp_vols + - dis_vols + - reagent_sources + - targets + type: object + result: {} + required: + - goal + title: add_liquid 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-create_protocol: + feedback: {} + goal: {} + goal_default: + none_keys: [] + protocol_author: null + protocol_date: null + protocol_description: null + protocol_name: null + protocol_type: null + protocol_version: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand create_protocol 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand create_protocol 的参数schema + properties: + none_keys: + default: [] + description: '参数: none_keys' + type: string + protocol_author: + description: '参数: protocol_author' + type: string + protocol_date: + description: '参数: protocol_date' + type: string + protocol_description: + description: '参数: protocol_description' + type: string + protocol_name: + description: '参数: protocol_name' + type: string + protocol_type: + description: '参数: protocol_type' + type: string + protocol_version: + description: '参数: protocol_version' + type: string + required: + - protocol_name + - protocol_description + - protocol_version + - protocol_author + - protocol_date + - protocol_type + type: object + result: {} + required: + - goal + title: create_protocol 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-custom_delay: + feedback: {} + goal: {} + goal_default: + msg: null + seconds: 0 + handles: [] + result: {} + schema: + description: UniLabJsonCommand custom_delay 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand custom_delay 的参数schema + properties: + msg: + description: '参数: msg' + type: string + seconds: + default: 0 + description: '参数: seconds' + type: string + required: [] + type: object + result: {} + required: + - goal + title: custom_delay 命令参数 + type: object + type: UniLabJsonCommandAsync auto-iter_tips: feedback: {} goal: {} @@ -580,6 +762,171 @@ liquid_handler: title: iter_tips 命令参数 type: object type: UniLabJsonCommand + auto-mix: + feedback: {} + goal: {} + goal_default: + height_to_bottom: null + mix_rate: null + mix_time: null + mix_vol: null + none_keys: [] + offsets: null + targets: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand mix 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand mix 的参数schema + properties: + height_to_bottom: + description: '参数: height_to_bottom' + type: string + mix_rate: + description: '参数: mix_rate' + type: string + mix_time: + description: '参数: mix_time' + type: integer + mix_vol: + description: '参数: mix_vol' + type: string + none_keys: + default: [] + description: '参数: none_keys' + type: string + offsets: + description: '参数: offsets' + type: string + targets: + description: '参数: targets' + type: string + required: + - targets + type: object + result: {} + required: + - goal + title: mix 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-move_to: + feedback: {} + goal: {} + goal_default: + channel: 0 + dis_to_top: 0 + well: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand move_to 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand move_to 的参数schema + properties: + channel: + default: 0 + description: '参数: channel' + type: integer + dis_to_top: + default: 0 + description: '参数: dis_to_top' + type: number + well: + description: '参数: well' + type: string + required: + - well + type: object + result: {} + required: + - goal + title: move_to 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-remove_liquid: + feedback: {} + goal: {} + goal_default: + blow_out_air_volume: null + delays: null + flow_rates: null + is_96_well: false + liquid_height: null + none_keys: [] + offsets: null + sources: null + spread: wide + top: null + use_channels: null + vols: null + waste_liquid: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand remove_liquid 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand remove_liquid 的参数schema + properties: + blow_out_air_volume: + description: '参数: blow_out_air_volume' + type: string + delays: + description: '参数: delays' + type: string + flow_rates: + description: '参数: flow_rates' + type: string + is_96_well: + default: false + description: '参数: is_96_well' + type: string + liquid_height: + description: '参数: liquid_height' + type: string + none_keys: + default: [] + description: '参数: none_keys' + type: string + offsets: + description: '参数: offsets' + type: string + sources: + description: '参数: sources' + type: string + spread: + default: wide + description: '参数: spread' + type: string + top: + description: '参数: top' + type: string + use_channels: + description: '参数: use_channels' + type: string + vols: + description: '参数: vols' + type: string + waste_liquid: + description: '参数: waste_liquid' + type: string + required: + - vols + - sources + type: object + result: {} + required: + - goal + title: remove_liquid 命令参数 + type: object + type: UniLabJsonCommandAsync auto-set_tiprack: feedback: {} goal: {} @@ -606,6 +953,147 @@ liquid_handler: title: set_tiprack 命令参数 type: object type: UniLabJsonCommand + auto-touch_tip: + feedback: {} + goal: {} + goal_default: + targets: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand touch_tip 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand touch_tip 的参数schema + properties: + targets: + description: '参数: targets' + type: string + required: + - targets + type: object + result: {} + required: + - goal + title: touch_tip 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-transfer_liquid: + feedback: {} + goal: {} + goal_default: + asp_flow_rates: null + asp_vols: null + blow_out_air_volume: null + delays: null + dis_flow_rates: null + dis_vols: null + is_96_well: false + liquid_height: null + mix_liquid_height: null + mix_rate: null + mix_stage: none + mix_times: null + mix_vol: null + none_keys: [] + offsets: null + sources: null + spread: wide + targets: null + tip_racks: null + touch_tip: false + use_channels: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand transfer_liquid 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand transfer_liquid 的参数schema + properties: + asp_flow_rates: + description: '参数: asp_flow_rates' + type: string + asp_vols: + description: '参数: asp_vols' + type: string + blow_out_air_volume: + description: '参数: blow_out_air_volume' + type: string + delays: + description: '参数: delays' + type: string + dis_flow_rates: + description: '参数: dis_flow_rates' + type: string + dis_vols: + description: '参数: dis_vols' + type: string + is_96_well: + default: false + description: '参数: is_96_well' + type: boolean + liquid_height: + description: '参数: liquid_height' + type: string + mix_liquid_height: + description: '参数: mix_liquid_height' + type: string + mix_rate: + description: '参数: mix_rate' + type: string + mix_stage: + default: none + description: '参数: mix_stage' + type: string + mix_times: + description: '参数: mix_times' + type: string + mix_vol: + description: '参数: mix_vol' + type: string + none_keys: + default: [] + description: '参数: none_keys' + type: string + offsets: + description: '参数: offsets' + type: string + sources: + description: '参数: sources' + type: string + spread: + default: wide + description: '参数: spread' + type: string + targets: + description: '参数: targets' + type: string + tip_racks: + description: '参数: tip_racks' + type: string + touch_tip: + default: false + description: '参数: touch_tip' + type: boolean + use_channels: + description: '参数: use_channels' + type: string + required: + - sources + - targets + - tip_racks + - asp_vols + - dis_vols + type: object + result: {} + required: + - goal + title: transfer_liquid 命令参数 + type: object + type: UniLabJsonCommandAsync discard_tips: feedback: {} goal: @@ -4369,8 +4857,16 @@ liquid_handler: feedback: {} goal: description: UniLabJsonCommand __init__ 的参数schema - properties: {} - required: [] + properties: + backend: + description: '参数: backend' + type: string + deck: + description: '参数: deck' + type: string + required: + - backend + - deck type: object result: {} required: @@ -4380,6 +4876,454 @@ liquid_handler: liquid_handler.biomek: class: action_value_mappings: + auto-create_protocol: + feedback: {} + goal: {} + goal_default: + none_keys: [] + protocol_author: null + protocol_date: null + protocol_description: null + protocol_name: null + protocol_type: null + protocol_version: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand create_protocol 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand create_protocol 的参数schema + properties: + none_keys: + default: [] + description: '参数: none_keys' + type: string + protocol_author: + description: '参数: protocol_author' + type: string + protocol_date: + description: '参数: protocol_date' + type: string + protocol_description: + description: '参数: protocol_description' + type: string + protocol_name: + description: '参数: protocol_name' + type: string + protocol_type: + description: '参数: protocol_type' + type: string + protocol_version: + description: '参数: protocol_version' + type: string + required: + - protocol_name + - protocol_description + - protocol_version + - protocol_author + - protocol_date + - protocol_type + type: object + result: {} + required: + - goal + title: create_protocol 命令参数 + type: object + type: UniLabJsonCommand + auto-create_resource: + feedback: {} + goal: {} + goal_default: + bind_location: null + bind_parent_id: null + liquid_input_slot: null + liquid_type: null + liquid_volume: null + resource_tracker: null + resources: null + slot_on_deck: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand create_resource 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand create_resource 的参数schema + properties: + bind_location: + description: '参数: bind_location' + type: object + bind_parent_id: + description: '参数: bind_parent_id' + type: string + liquid_input_slot: + description: '参数: liquid_input_slot' + type: array + liquid_type: + description: '参数: liquid_type' + type: array + liquid_volume: + description: '参数: liquid_volume' + type: array + resource_tracker: + description: '参数: resource_tracker' + type: string + resources: + description: '参数: resources' + type: array + slot_on_deck: + description: '参数: slot_on_deck' + type: integer + required: + - resource_tracker + - resources + - bind_parent_id + - bind_location + - liquid_input_slot + - liquid_type + - liquid_volume + - slot_on_deck + type: object + result: {} + required: + - goal + title: create_resource 命令参数 + type: object + type: UniLabJsonCommand + auto-incubation_biomek: + feedback: {} + goal: {} + goal_default: + time: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand incubation_biomek 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand incubation_biomek 的参数schema + properties: + time: + description: '参数: time' + type: integer + required: + - time + type: object + result: {} + required: + - goal + title: incubation_biomek 命令参数 + type: object + type: UniLabJsonCommand + auto-instrument_setup_biomek: + feedback: {} + goal: {} + goal_default: + class_name: null + id: null + liquid_input_wells: null + liquid_type: null + liquid_volume: null + parent: null + slot_on_deck: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand instrument_setup_biomek 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand instrument_setup_biomek 的参数schema + properties: + class_name: + description: '参数: class_name' + type: string + id: + description: '参数: id' + type: string + liquid_input_wells: + description: '参数: liquid_input_wells' + type: array + liquid_type: + description: '参数: liquid_type' + type: array + liquid_volume: + description: '参数: liquid_volume' + type: array + parent: + description: '参数: parent' + type: string + slot_on_deck: + description: '参数: slot_on_deck' + type: string + required: + - id + - parent + - slot_on_deck + - class_name + - liquid_type + - liquid_volume + - liquid_input_wells + type: object + result: {} + required: + - goal + title: instrument_setup_biomek 命令参数 + type: object + type: UniLabJsonCommand + auto-move_biomek: + feedback: {} + goal: {} + goal_default: + source: null + target: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand move_biomek 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand move_biomek 的参数schema + properties: + source: + description: '参数: source' + type: string + target: + description: '参数: target' + type: string + required: + - source + - target + type: object + result: {} + required: + - goal + title: move_biomek 命令参数 + type: object + type: UniLabJsonCommand + auto-oscillation_biomek: + feedback: {} + goal: {} + goal_default: + rpm: null + time: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand oscillation_biomek 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand oscillation_biomek 的参数schema + properties: + rpm: + description: '参数: rpm' + type: integer + time: + description: '参数: time' + type: integer + required: + - rpm + - time + type: object + result: {} + required: + - goal + title: oscillation_biomek 命令参数 + type: object + type: UniLabJsonCommand + auto-run_protocol: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand run_protocol 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand run_protocol 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: run_protocol 命令参数 + type: object + type: UniLabJsonCommand + auto-transfer_biomek: + feedback: {} + goal: {} + goal_default: + aspirate_techniques: null + dispense_techniques: null + source: null + target: null + tip_rack: null + volume: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand transfer_biomek 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand transfer_biomek 的参数schema + properties: + aspirate_techniques: + description: '参数: aspirate_techniques' + type: string + dispense_techniques: + description: '参数: dispense_techniques' + type: string + source: + description: '参数: source' + type: string + target: + description: '参数: target' + type: string + tip_rack: + description: '参数: tip_rack' + type: string + volume: + description: '参数: volume' + type: number + required: + - source + - target + - tip_rack + - volume + - aspirate_techniques + - dispense_techniques + type: object + result: {} + required: + - goal + title: transfer_biomek 命令参数 + type: object + type: UniLabJsonCommand + auto-transfer_liquid: + feedback: {} + goal: {} + goal_default: + asp_flow_rates: null + asp_vols: null + blow_out_air_volume: null + delays: null + dis_flow_rates: null + dis_vols: null + is_96_well: false + liquid_height: null + mix_liquid_height: null + mix_rate: null + mix_stage: none + mix_times: null + mix_vol: null + none_keys: [] + offsets: null + sources: null + spread: wide + targets: null + tip_racks: null + touch_tip: false + use_channels: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand transfer_liquid 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand transfer_liquid 的参数schema + properties: + asp_flow_rates: + description: '参数: asp_flow_rates' + type: string + asp_vols: + description: '参数: asp_vols' + type: string + blow_out_air_volume: + description: '参数: blow_out_air_volume' + type: string + delays: + description: '参数: delays' + type: string + dis_flow_rates: + description: '参数: dis_flow_rates' + type: string + dis_vols: + description: '参数: dis_vols' + type: string + is_96_well: + default: false + description: '参数: is_96_well' + type: boolean + liquid_height: + description: '参数: liquid_height' + type: string + mix_liquid_height: + description: '参数: mix_liquid_height' + type: string + mix_rate: + description: '参数: mix_rate' + type: string + mix_stage: + default: none + description: '参数: mix_stage' + type: string + mix_times: + description: '参数: mix_times' + type: string + mix_vol: + description: '参数: mix_vol' + type: string + none_keys: + default: [] + description: '参数: none_keys' + type: string + offsets: + description: '参数: offsets' + type: string + sources: + description: '参数: sources' + type: string + spread: + default: wide + description: '参数: spread' + type: string + targets: + description: '参数: targets' + type: string + tip_racks: + description: '参数: tip_racks' + type: string + touch_tip: + default: false + description: '参数: touch_tip' + type: boolean + use_channels: + description: '参数: use_channels' + type: string + required: + - sources + - targets + - tip_racks + - asp_vols + - dis_vols + type: object + result: {} + required: + - goal + title: transfer_liquid 命令参数 + type: object + type: UniLabJsonCommand create_protocol: feedback: {} goal: @@ -5256,7 +6200,8 @@ liquid_handler.biomek: type: object type: LiquidHandlerTransfer module: unilabos.devices.liquid_handling.biomek:LiquidHandlerBiomek - status_types: {} + status_types: + success: String type: python description: Biomek液体处理器设备,基于pylabrobot控制 handles: [] @@ -5267,8 +6212,16 @@ liquid_handler.biomek: feedback: {} goal: description: UniLabJsonCommand __init__ 的参数schema - properties: {} - required: [] + properties: + args: + description: '参数: args' + type: string + kwargs: + description: '参数: kwargs' + type: string + required: + - args + - kwargs type: object result: {} required: @@ -5278,6 +6231,46 @@ liquid_handler.biomek: liquid_handler.revvity: class: action_value_mappings: + auto-run: + feedback: {} + goal: {} + goal_default: + file_path: null + params: null + resource: + AichemecoHiwo: + id: AichemecoHiwo + handles: [] + result: {} + schema: + description: UniLabJsonCommand run 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand run 的参数schema + properties: + file_path: + description: '参数: file_path' + type: string + params: + description: '参数: params' + type: string + resource: + default: + AichemecoHiwo: + id: AichemecoHiwo + description: '参数: resource' + type: object + required: + - file_path + - params + type: object + result: {} + required: + - goal + title: run 命令参数 + type: object + type: UniLabJsonCommand run: feedback: status: status @@ -5431,7 +6424,8 @@ liquid_handler.revvity: type: WorkStationRun module: unilabos.devices.liquid_handling.revvity:Revvity status_types: - status: String + status: str + success: bool type: python description: '' handles: [] diff --git a/unilabos/registry/devices/mock_devices.yaml b/unilabos/registry/devices/mock_devices.yaml index 7ec0b60..1cf844c 100644 --- a/unilabos/registry/devices/mock_devices.yaml +++ b/unilabos/registry/devices/mock_devices.yaml @@ -250,6 +250,7 @@ mock_chiller: module: unilabos.devices.mock.mock_chiller:MockChiller status_types: current_temperature: float + get_status_info: dict is_cooling: bool is_heating: bool purpose: str @@ -594,6 +595,7 @@ mock_filter: filtered_volume: float filtrate_vessel: str flow_rate: float + get_status_info: dict is_filtering: bool pressure_drop: float progress: float @@ -1053,6 +1055,7 @@ mock_heater: module: unilabos.devices.mock.mock_heater:MockHeater status_types: current_temperature: float + get_status_info: dict heating_power: float is_heating: bool max_temperature: float @@ -1510,6 +1513,7 @@ mock_pump: current_device: str flow_rate: float from_vessel: str + get_status_info: dict is_solid: bool is_viscous: bool max_flow_rate: float @@ -2081,6 +2085,7 @@ mock_rotavap: type: EmptyIn module: unilabos.devices.mock.mock_rotavap:MockRotavap status_types: + get_status_info: dict pump_state: str pump_time: float rotate_speed: float @@ -2573,6 +2578,7 @@ mock_separator: status_types: current_device: str from_vessel: str + get_status_info: dict product_phase: str purpose: str repeats: int @@ -2865,6 +2871,7 @@ mock_solenoid_valve: type: StrSingleInput module: unilabos.devices.mock.mock_solenoid_valve:MockSolenoidValve status_types: + get_valve_status: str status: str valve_status: str type: python @@ -3281,6 +3288,7 @@ mock_stirrer: type: EmptyIn module: unilabos.devices.mock.mock_stirrer:MockStirrer status_types: + get_status_info: dict heating_power: float heating_state: str max_stir_speed: float @@ -3621,6 +3629,7 @@ mock_stirrer_new: type: StopStir module: unilabos.devices.mock.mock_stirrer_new:MockStirrer_new status_types: + get_status_info: dict max_stir_speed: float progress: float purpose: str @@ -4125,6 +4134,7 @@ mock_vacuum: type: EmptyIn module: unilabos.devices.mock.mock_vacuum:MockVacuum status_types: + get_status_info: dict max_pump_speed: float power_state: str pump_efficiency: float diff --git a/unilabos/registry/devices/moveit_config.yaml b/unilabos/registry/devices/moveit_config.yaml index 2bc56a6..8865d50 100644 --- a/unilabos/registry/devices/moveit_config.yaml +++ b/unilabos/registry/devices/moveit_config.yaml @@ -1,6 +1,294 @@ moveit.arm_slider: class: action_value_mappings: + auto-check_tf_update_actions: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand check_tf_update_actions 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand check_tf_update_actions 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: check_tf_update_actions 命令参数 + type: object + type: UniLabJsonCommand + auto-moveit_joint_task: + feedback: {} + goal: {} + goal_default: + joint_names: null + joint_positions: null + move_group: null + retry: 10 + speed: 1 + handles: [] + result: {} + schema: + description: UniLabJsonCommand moveit_joint_task 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand moveit_joint_task 的参数schema + properties: + joint_names: + description: '参数: joint_names' + type: string + joint_positions: + description: '参数: joint_positions' + type: string + move_group: + description: '参数: move_group' + type: string + retry: + default: 10 + description: '参数: retry' + type: string + speed: + default: 1 + description: '参数: speed' + type: string + required: + - move_group + - joint_positions + type: object + result: {} + required: + - goal + title: moveit_joint_task 命令参数 + type: object + type: UniLabJsonCommand + auto-moveit_task: + feedback: {} + goal: {} + goal_default: + cartesian: false + move_group: null + offsets: + - 0 + - 0 + - 0 + position: null + quaternion: null + retry: 10 + speed: 1 + target_link: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand moveit_task 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand moveit_task 的参数schema + properties: + cartesian: + default: false + description: '参数: cartesian' + type: string + move_group: + description: '参数: move_group' + type: string + offsets: + default: + - 0 + - 0 + - 0 + description: '参数: offsets' + type: string + position: + description: '参数: position' + type: string + quaternion: + description: '参数: quaternion' + type: string + retry: + default: 10 + description: '参数: retry' + type: string + speed: + default: 1 + description: '参数: speed' + type: string + target_link: + description: '参数: target_link' + type: string + required: + - move_group + - position + - quaternion + type: object + result: {} + required: + - goal + title: moveit_task 命令参数 + type: object + type: UniLabJsonCommand + auto-pick_and_place: + feedback: {} + goal: {} + goal_default: + command: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand pick_and_place 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand pick_and_place 的参数schema + properties: + command: + description: '参数: command' + type: string + required: + - command + type: object + result: {} + required: + - goal + title: pick_and_place 命令参数 + type: object + type: UniLabJsonCommand + auto-post_init: + feedback: {} + goal: {} + goal_default: + ros_node: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand post_init 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand post_init 的参数schema + properties: + ros_node: + description: '参数: ros_node' + type: string + required: + - ros_node + type: object + result: {} + required: + - goal + title: post_init 命令参数 + type: object + type: UniLabJsonCommand + auto-resource_manager: + feedback: {} + goal: {} + goal_default: + parent_link: null + resource: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand resource_manager 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand resource_manager 的参数schema + properties: + parent_link: + description: '参数: parent_link' + type: string + resource: + description: '参数: resource' + type: string + required: + - resource + - parent_link + type: object + result: {} + required: + - goal + title: resource_manager 命令参数 + type: object + type: UniLabJsonCommand + auto-set_position: + feedback: {} + goal: {} + goal_default: + command: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_position 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_position 的参数schema + properties: + command: + description: '参数: command' + type: string + required: + - command + type: object + result: {} + required: + - goal + title: set_position 命令参数 + type: object + type: UniLabJsonCommand + auto-set_status: + feedback: {} + goal: {} + goal_default: + command: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_status 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_status 的参数schema + properties: + command: + description: '参数: command' + type: string + required: + - command + type: object + result: {} + required: + - goal + title: set_status 命令参数 + type: object + type: UniLabJsonCommand + auto-wait_for_resource_action: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand wait_for_resource_action 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand wait_for_resource_action 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: wait_for_resource_action 命令参数 + type: object + type: UniLabJsonCommand pick_and_place: feedback: {} goal: @@ -151,8 +439,22 @@ moveit.arm_slider: feedback: {} goal: description: UniLabJsonCommand __init__ 的参数schema - properties: {} - required: [] + properties: + device_config: + description: '参数: device_config' + type: string + joint_poses: + description: '参数: joint_poses' + type: string + moveit_type: + description: '参数: moveit_type' + type: string + rotation: + description: '参数: rotation' + type: string + required: + - moveit_type + - joint_poses type: object result: {} required: @@ -165,6 +467,294 @@ moveit.arm_slider: moveit.toyo_xyz: class: action_value_mappings: + auto-check_tf_update_actions: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand check_tf_update_actions 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand check_tf_update_actions 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: check_tf_update_actions 命令参数 + type: object + type: UniLabJsonCommand + auto-moveit_joint_task: + feedback: {} + goal: {} + goal_default: + joint_names: null + joint_positions: null + move_group: null + retry: 10 + speed: 1 + handles: [] + result: {} + schema: + description: UniLabJsonCommand moveit_joint_task 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand moveit_joint_task 的参数schema + properties: + joint_names: + description: '参数: joint_names' + type: string + joint_positions: + description: '参数: joint_positions' + type: string + move_group: + description: '参数: move_group' + type: string + retry: + default: 10 + description: '参数: retry' + type: string + speed: + default: 1 + description: '参数: speed' + type: string + required: + - move_group + - joint_positions + type: object + result: {} + required: + - goal + title: moveit_joint_task 命令参数 + type: object + type: UniLabJsonCommand + auto-moveit_task: + feedback: {} + goal: {} + goal_default: + cartesian: false + move_group: null + offsets: + - 0 + - 0 + - 0 + position: null + quaternion: null + retry: 10 + speed: 1 + target_link: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand moveit_task 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand moveit_task 的参数schema + properties: + cartesian: + default: false + description: '参数: cartesian' + type: string + move_group: + description: '参数: move_group' + type: string + offsets: + default: + - 0 + - 0 + - 0 + description: '参数: offsets' + type: string + position: + description: '参数: position' + type: string + quaternion: + description: '参数: quaternion' + type: string + retry: + default: 10 + description: '参数: retry' + type: string + speed: + default: 1 + description: '参数: speed' + type: string + target_link: + description: '参数: target_link' + type: string + required: + - move_group + - position + - quaternion + type: object + result: {} + required: + - goal + title: moveit_task 命令参数 + type: object + type: UniLabJsonCommand + auto-pick_and_place: + feedback: {} + goal: {} + goal_default: + command: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand pick_and_place 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand pick_and_place 的参数schema + properties: + command: + description: '参数: command' + type: string + required: + - command + type: object + result: {} + required: + - goal + title: pick_and_place 命令参数 + type: object + type: UniLabJsonCommand + auto-post_init: + feedback: {} + goal: {} + goal_default: + ros_node: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand post_init 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand post_init 的参数schema + properties: + ros_node: + description: '参数: ros_node' + type: string + required: + - ros_node + type: object + result: {} + required: + - goal + title: post_init 命令参数 + type: object + type: UniLabJsonCommand + auto-resource_manager: + feedback: {} + goal: {} + goal_default: + parent_link: null + resource: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand resource_manager 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand resource_manager 的参数schema + properties: + parent_link: + description: '参数: parent_link' + type: string + resource: + description: '参数: resource' + type: string + required: + - resource + - parent_link + type: object + result: {} + required: + - goal + title: resource_manager 命令参数 + type: object + type: UniLabJsonCommand + auto-set_position: + feedback: {} + goal: {} + goal_default: + command: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_position 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_position 的参数schema + properties: + command: + description: '参数: command' + type: string + required: + - command + type: object + result: {} + required: + - goal + title: set_position 命令参数 + type: object + type: UniLabJsonCommand + auto-set_status: + feedback: {} + goal: {} + goal_default: + command: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_status 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_status 的参数schema + properties: + command: + description: '参数: command' + type: string + required: + - command + type: object + result: {} + required: + - goal + title: set_status 命令参数 + type: object + type: UniLabJsonCommand + auto-wait_for_resource_action: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand wait_for_resource_action 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand wait_for_resource_action 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: wait_for_resource_action 命令参数 + type: object + type: UniLabJsonCommand pick_and_place: feedback: {} goal: @@ -315,8 +905,22 @@ moveit.toyo_xyz: feedback: {} goal: description: UniLabJsonCommand __init__ 的参数schema - properties: {} - required: [] + properties: + device_config: + description: '参数: device_config' + type: string + joint_poses: + description: '参数: joint_poses' + type: string + moveit_type: + description: '参数: moveit_type' + type: string + rotation: + description: '参数: rotation' + type: string + required: + - moveit_type + - joint_poses type: object result: {} required: diff --git a/unilabos/registry/devices/pump_and_valve.yaml b/unilabos/registry/devices/pump_and_valve.yaml index e524dac..fd0b08a 100644 --- a/unilabos/registry/devices/pump_and_valve.yaml +++ b/unilabos/registry/devices/pump_and_valve.yaml @@ -224,6 +224,7 @@ solenoid_valve: type: StrSingleInput module: unilabos.devices.pump_and_valve.solenoid_valve:SolenoidValve status_types: + get_valve_position: str status: str valve_position: str type: python @@ -454,6 +455,7 @@ solenoid_valve.mock: type: EmptyIn module: unilabos.devices.pump_and_valve.solenoid_valve_mock:SolenoidValveMock status_types: + get_valve_position: str status: str valve_position: str type: python @@ -1087,6 +1089,14 @@ syringe_pump_with_valve.runze: write: send_command module: unilabos.devices.pump_and_valve.runze_backbone:RunzeSyringePump status_types: + get_max_velocity: String + get_plunger_position: String + get_position: String + get_status: String + get_valve_position: str + get_velocity_end: String + get_velocity_grade: String + get_velocity_init: String max_velocity: float mode: int position: float diff --git a/unilabos/registry/devices/robot_gripper.yaml b/unilabos/registry/devices/robot_gripper.yaml index cd2b1aa..aa1795a 100644 --- a/unilabos/registry/devices/robot_gripper.yaml +++ b/unilabos/registry/devices/robot_gripper.yaml @@ -1,6 +1,410 @@ gripper.misumi_rz: class: action_value_mappings: + auto-data_loop: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand data_loop 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand data_loop 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: data_loop 命令参数 + type: object + type: UniLabJsonCommand + auto-data_reader: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand data_reader 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand data_reader 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: data_reader 命令参数 + type: object + type: UniLabJsonCommand + auto-gripper_move: + feedback: {} + goal: {} + goal_default: + force: null + pos: null + speed: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand gripper_move 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand gripper_move 的参数schema + properties: + force: + description: '参数: force' + type: string + pos: + description: '参数: pos' + type: string + speed: + description: '参数: speed' + type: string + required: + - pos + - speed + - force + type: object + result: {} + required: + - goal + title: gripper_move 命令参数 + type: object + type: UniLabJsonCommand + auto-init_gripper: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand init_gripper 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand init_gripper 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: init_gripper 命令参数 + type: object + type: UniLabJsonCommand + auto-modbus_crc: + feedback: {} + goal: {} + goal_default: + data: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand modbus_crc 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand modbus_crc 的参数schema + properties: + data: + description: '参数: data' + type: string + required: + - data + type: object + result: {} + required: + - goal + title: modbus_crc 命令参数 + type: object + type: UniLabJsonCommand + auto-move_and_rotate: + feedback: {} + goal: {} + goal_default: + grasp_F: null + grasp_pos: null + grasp_v: null + spin_F: null + spin_pos: null + spin_v: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand move_and_rotate 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand move_and_rotate 的参数schema + properties: + grasp_F: + description: '参数: grasp_F' + type: string + grasp_pos: + description: '参数: grasp_pos' + type: string + grasp_v: + description: '参数: grasp_v' + type: string + spin_F: + description: '参数: spin_F' + type: string + spin_pos: + description: '参数: spin_pos' + type: string + spin_v: + description: '参数: spin_v' + type: string + required: + - spin_pos + - grasp_pos + - spin_v + - grasp_v + - spin_F + - grasp_F + type: object + result: {} + required: + - goal + title: move_and_rotate 命令参数 + type: object + type: UniLabJsonCommand + auto-node_gripper_move: + feedback: {} + goal: {} + goal_default: + cmd: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand node_gripper_move 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand node_gripper_move 的参数schema + properties: + cmd: + description: '参数: cmd' + type: string + required: + - cmd + type: object + result: {} + required: + - goal + title: node_gripper_move 命令参数 + type: object + type: UniLabJsonCommand + auto-node_rotate_move: + feedback: {} + goal: {} + goal_default: + cmd: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand node_rotate_move 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand node_rotate_move 的参数schema + properties: + cmd: + description: '参数: cmd' + type: string + required: + - cmd + type: object + result: {} + required: + - goal + title: node_rotate_move 命令参数 + type: object + type: UniLabJsonCommand + auto-read_address: + feedback: {} + goal: {} + goal_default: + address: null + data_len: null + id: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand read_address 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand read_address 的参数schema + properties: + address: + description: '参数: address' + type: string + data_len: + description: '参数: data_len' + type: string + id: + description: '参数: id' + type: string + required: + - id + - address + - data_len + type: object + result: {} + required: + - goal + title: read_address 命令参数 + type: object + type: UniLabJsonCommand + auto-rotate_move_abs: + feedback: {} + goal: {} + goal_default: + force: null + pos: null + speed: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand rotate_move_abs 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand rotate_move_abs 的参数schema + properties: + force: + description: '参数: force' + type: string + pos: + description: '参数: pos' + type: string + speed: + description: '参数: speed' + type: string + required: + - pos + - speed + - force + type: object + result: {} + required: + - goal + title: rotate_move_abs 命令参数 + type: object + type: UniLabJsonCommand + auto-send_cmd: + feedback: {} + goal: {} + goal_default: + address: null + data: null + fun: null + id: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand send_cmd 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand send_cmd 的参数schema + properties: + address: + description: '参数: address' + type: string + data: + description: '参数: data' + type: string + fun: + description: '参数: fun' + type: string + id: + description: '参数: id' + type: string + required: + - id + - fun + - address + - data + type: object + result: {} + required: + - goal + title: send_cmd 命令参数 + type: object + type: UniLabJsonCommand + auto-wait_for_gripper: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand wait_for_gripper 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand wait_for_gripper 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: wait_for_gripper 命令参数 + type: object + type: UniLabJsonCommand + auto-wait_for_gripper_init: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand wait_for_gripper_init 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand wait_for_gripper_init 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: wait_for_gripper_init 命令参数 + type: object + type: UniLabJsonCommand + auto-wait_for_rotate: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand wait_for_rotate 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand wait_for_rotate 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: wait_for_rotate 命令参数 + type: object + type: UniLabJsonCommand execute_command_from_outer: feedback: {} goal: @@ -50,7 +454,7 @@ gripper.misumi_rz: type: SendCmd module: unilabos.devices.motor.Grasp:EleGripper status_types: - status: String + status: str type: python description: Misumi RZ gripper handles: [] @@ -61,8 +465,24 @@ gripper.misumi_rz: feedback: {} goal: description: UniLabJsonCommand __init__ 的参数schema - properties: {} - required: [] + properties: + baudrate: + default: 115200 + description: '参数: baudrate' + type: integer + id: + default: 9 + description: '参数: id' + type: integer + port: + description: '参数: port' + type: string + pos_error: + default: -11 + description: '参数: pos_error' + type: integer + required: + - port type: object result: {} required: @@ -72,6 +492,80 @@ gripper.misumi_rz: gripper.mock: class: action_value_mappings: + auto-edit_id: + feedback: {} + goal: {} + goal_default: + params: '{}' + resource: + Gripper1: {} + wf_name: gripper_run + handles: [] + result: {} + schema: + description: UniLabJsonCommand edit_id 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand edit_id 的参数schema + properties: + params: + default: '{}' + description: '参数: params' + type: string + resource: + default: + Gripper1: {} + description: '参数: resource' + type: object + wf_name: + default: gripper_run + description: '参数: wf_name' + type: string + required: [] + type: object + result: {} + required: + - goal + title: edit_id 命令参数 + type: object + type: UniLabJsonCommand + auto-push_to: + feedback: {} + goal: {} + goal_default: + position: null + torque: null + velocity: 0.0 + handles: [] + result: {} + schema: + description: UniLabJsonCommand push_to 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand push_to 的参数schema + properties: + position: + description: '参数: position' + type: number + torque: + description: '参数: torque' + type: number + velocity: + default: 0.0 + description: '参数: velocity' + type: number + required: + - position + - torque + type: object + result: {} + required: + - goal + title: push_to 命令参数 + type: object + type: UniLabJsonCommand push_to: feedback: effort: torque @@ -151,9 +645,10 @@ gripper.mock: type: GripperCommand module: unilabos.devices.gripper.mock:MockGripper status_types: - position: Float64 - status: String - torque: Float64 + position: float + status: str + torque: float + velocity: float type: python description: Mock gripper handles: [] diff --git a/unilabos/registry/devices/robot_linear_motion.yaml b/unilabos/registry/devices/robot_linear_motion.yaml index 4d2812d..a3abefb 100644 --- a/unilabos/registry/devices/robot_linear_motion.yaml +++ b/unilabos/registry/devices/robot_linear_motion.yaml @@ -1,6 +1,152 @@ linear_motion.grbl: class: action_value_mappings: + auto-initialize: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand initialize 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand initialize 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: initialize 命令参数 + type: object + type: UniLabJsonCommand + auto-move_through_points: + feedback: {} + goal: {} + goal_default: + positions: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand move_through_points 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand move_through_points 的参数schema + properties: + positions: + description: '参数: positions' + type: array + required: + - positions + type: object + result: {} + required: + - goal + title: move_through_points 命令参数 + type: object + type: UniLabJsonCommand + auto-set_position: + feedback: {} + goal: {} + goal_default: + position: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_position 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_position 的参数schema + properties: + position: + description: '参数: position' + type: string + required: + - position + type: object + result: {} + required: + - goal + title: set_position 命令参数 + type: object + type: UniLabJsonCommand + auto-set_spindle_speed: + feedback: {} + goal: {} + goal_default: + max_velocity: 500 + spindle_speed: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_spindle_speed 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_spindle_speed 的参数schema + properties: + max_velocity: + default: 500 + description: '参数: max_velocity' + type: number + spindle_speed: + description: '参数: spindle_speed' + type: number + required: + - spindle_speed + type: object + result: {} + required: + - goal + title: set_spindle_speed 命令参数 + type: object + type: UniLabJsonCommand + auto-stop_operation: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand stop_operation 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand stop_operation 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: stop_operation 命令参数 + type: object + type: UniLabJsonCommand + auto-wait_error: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand wait_error 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand wait_error 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: wait_error 命令参数 + type: object + type: UniLabJsonCommandAsync move_through_points: feedback: current_pose.pose.position: position @@ -347,7 +493,12 @@ linear_motion.grbl: type: object type: SingleJointPosition module: unilabos.devices.cnc.grbl_sync:GrblCNC - status_types: {} + status_types: + get_position: String + get_status: String + position: unilabos.messages:Point3D + spindle_speed: float + status: str type: python description: Grbl CNC handles: [] @@ -358,8 +509,26 @@ linear_motion.grbl: feedback: {} goal: description: UniLabJsonCommand __init__ 的参数schema - properties: {} - required: [] + properties: + address: + default: '1' + description: '参数: address' + type: string + limits: + default: + - -150 + - 150 + - -200 + - 0 + - -80 + - 0 + description: '参数: limits' + type: string + port: + description: '参数: port' + type: string + required: + - port type: object result: {} required: diff --git a/unilabos/registry/devices/sim_nodes.yaml b/unilabos/registry/devices/sim_nodes.yaml index f8794f2..bf33b8e 100644 --- a/unilabos/registry/devices/sim_nodes.yaml +++ b/unilabos/registry/devices/sim_nodes.yaml @@ -182,7 +182,7 @@ lh_joint_publisher: speed: default: 0.1 description: '参数: speed' - type: number + type: string x: description: '参数: x' type: string @@ -268,7 +268,7 @@ lh_joint_publisher: properties: channels: description: '参数: channels' - type: string + type: array link_name: description: '参数: link_name' type: string @@ -306,7 +306,7 @@ lh_joint_publisher: type: string resource_id_list: description: '参数: resource_id_list' - type: string + type: array required: - resource_id_list - link_name diff --git a/unilabos/registry/devices/temperature.yaml b/unilabos/registry/devices/temperature.yaml index b40810a..a6308a9 100644 --- a/unilabos/registry/devices/temperature.yaml +++ b/unilabos/registry/devices/temperature.yaml @@ -614,6 +614,8 @@ heaterstirrer.dalong: type: SendCmd module: unilabos.devices.heaterstirrer.dalong:HeaterStirrer_DaLong status_types: + get_status: str + get_temp: String status: str stir_speed: float temp: float diff --git a/unilabos/registry/devices/vacuum_and_purge.yaml b/unilabos/registry/devices/vacuum_and_purge.yaml index d17593b..4a15c4a 100644 --- a/unilabos/registry/devices/vacuum_and_purge.yaml +++ b/unilabos/registry/devices/vacuum_and_purge.yaml @@ -247,6 +247,7 @@ gas_source.mock: type: StrSingleInput module: unilabos.devices.pump_and_valve.vacuum_pump_mock:VacuumPumpMock status_types: + get_status: str status: str type: python description: Mock gas source @@ -525,6 +526,7 @@ vacuum_pump.mock: type: StrSingleInput module: unilabos.devices.pump_and_valve.vacuum_pump_mock:VacuumPumpMock status_types: + get_status: str status: str type: python description: Mock vacuum pump diff --git a/unilabos/registry/devices/virtual_device.yaml b/unilabos/registry/devices/virtual_device.yaml index af6af57..785b865 100644 --- a/unilabos/registry/devices/virtual_device.yaml +++ b/unilabos/registry/devices/virtual_device.yaml @@ -1,6 +1,89 @@ virtual_centrifuge: class: action_value_mappings: + auto-centrifuge: + feedback: {} + goal: {} + goal_default: + speed: null + temp: 25.0 + time: null + vessel: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand centrifuge 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand centrifuge 的参数schema + properties: + speed: + description: '参数: speed' + type: number + temp: + default: 25.0 + description: '参数: temp' + type: number + time: + description: '参数: time' + type: number + vessel: + description: '参数: vessel' + type: string + required: + - vessel + - speed + - time + type: object + result: {} + required: + - goal + title: centrifuge 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-cleanup: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand cleanup 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand cleanup 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: cleanup 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-initialize: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand initialize 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand initialize 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: initialize 命令参数 + type: object + type: UniLabJsonCommandAsync centrifuge: feedback: current_speed: current_speed @@ -119,7 +202,11 @@ virtual_centrifuge: device_id: description: '参数: device_id' type: string - required: [] + kwargs: + description: '参数: kwargs' + type: string + required: + - kwargs type: object result: {} required: @@ -129,6 +216,84 @@ virtual_centrifuge: virtual_column: class: action_value_mappings: + auto-cleanup: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand cleanup 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand cleanup 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: cleanup 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-initialize: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand initialize 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand initialize 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: initialize 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-run_column: + feedback: {} + goal: {} + goal_default: + column: null + from_vessel: null + to_vessel: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand run_column 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand run_column 的参数schema + properties: + column: + description: '参数: column' + type: string + from_vessel: + description: '参数: from_vessel' + type: string + to_vessel: + description: '参数: to_vessel' + type: string + required: + - from_vessel + - to_vessel + - column + type: object + result: {} + required: + - goal + title: run_column 命令参数 + type: object + type: UniLabJsonCommandAsync run_column: feedback: current_status: current_status @@ -241,7 +406,11 @@ virtual_column: device_id: description: '参数: device_id' type: string - required: [] + kwargs: + description: '参数: kwargs' + type: string + required: + - kwargs type: object result: {} required: @@ -251,6 +420,104 @@ virtual_column: virtual_filter: class: action_value_mappings: + auto-cleanup: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand cleanup 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand cleanup 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: cleanup 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-filter: + feedback: {} + goal: {} + goal_default: + continue_heatchill: false + filtrate_vessel: '' + stir: false + stir_speed: 300.0 + temp: 25.0 + vessel: null + volume: 0.0 + handles: [] + result: {} + schema: + description: UniLabJsonCommand filter 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand filter 的参数schema + properties: + continue_heatchill: + default: false + description: '参数: continue_heatchill' + type: boolean + filtrate_vessel: + default: '' + description: '参数: filtrate_vessel' + type: string + stir: + default: false + description: '参数: stir' + type: boolean + stir_speed: + default: 300.0 + description: '参数: stir_speed' + type: number + temp: + default: 25.0 + description: '参数: temp' + type: number + vessel: + description: '参数: vessel' + type: string + volume: + default: 0.0 + description: '参数: volume' + type: number + required: + - vessel + type: object + result: {} + required: + - goal + title: filter 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-initialize: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand initialize 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand initialize 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: initialize 命令参数 + type: object + type: UniLabJsonCommandAsync filter: feedback: current_status: current_status @@ -398,7 +665,11 @@ virtual_filter: device_id: description: '参数: device_id' type: string - required: [] + kwargs: + description: '参数: kwargs' + type: string + required: + - kwargs type: object result: {} required: @@ -408,6 +679,27 @@ virtual_filter: virtual_gas_source: class: action_value_mappings: + auto-cleanup: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand cleanup 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand cleanup 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: cleanup 命令参数 + type: object + type: UniLabJsonCommandAsync auto-close: feedback: {} goal: {} @@ -450,6 +742,27 @@ virtual_gas_source: title: get_status 命令参数 type: object type: UniLabJsonCommand + auto-initialize: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand initialize 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand initialize 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: initialize 命令参数 + type: object + type: UniLabJsonCommandAsync auto-is_closed: feedback: {} goal: {} @@ -654,6 +967,7 @@ virtual_gas_source: type: StrSingleInput module: unilabos.devices.virtual.virtual_gas_source:VirtualGasSource status_types: + get_status: str status: str type: python description: Virtual gas source @@ -680,7 +994,11 @@ virtual_gas_source: device_id: description: '参数: device_id' type: string - required: [] + kwargs: + description: '参数: kwargs' + type: string + required: + - kwargs type: object result: {} required: @@ -690,6 +1008,161 @@ virtual_gas_source: virtual_heatchill: class: action_value_mappings: + auto-cleanup: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand cleanup 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand cleanup 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: cleanup 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-heat_chill: + feedback: {} + goal: {} + goal_default: + purpose: null + stir: null + stir_speed: null + temp: null + time: null + vessel: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand heat_chill 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand heat_chill 的参数schema + properties: + purpose: + description: '参数: purpose' + type: string + stir: + description: '参数: stir' + type: boolean + stir_speed: + description: '参数: stir_speed' + type: number + temp: + description: '参数: temp' + type: number + time: + description: '参数: time' + type: number + vessel: + description: '参数: vessel' + type: string + required: + - vessel + - temp + - time + - stir + - stir_speed + - purpose + type: object + result: {} + required: + - goal + title: heat_chill 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-heat_chill_start: + feedback: {} + goal: {} + goal_default: + purpose: null + temp: null + vessel: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand heat_chill_start 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand heat_chill_start 的参数schema + properties: + purpose: + description: '参数: purpose' + type: string + temp: + description: '参数: temp' + type: number + vessel: + description: '参数: vessel' + type: string + required: + - vessel + - temp + - purpose + type: object + result: {} + required: + - goal + title: heat_chill_start 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-heat_chill_stop: + feedback: {} + goal: {} + goal_default: + vessel: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand heat_chill_stop 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand heat_chill_stop 的参数schema + properties: + vessel: + description: '参数: vessel' + type: string + required: + - vessel + type: object + result: {} + required: + - goal + title: heat_chill_stop 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-initialize: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand initialize 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand initialize 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: initialize 命令参数 + type: object + type: UniLabJsonCommandAsync heat_chill: feedback: status: status @@ -901,7 +1374,11 @@ virtual_heatchill: device_id: description: '参数: device_id' type: string - required: [] + kwargs: + description: '参数: kwargs' + type: string + required: + - kwargs type: object result: {} required: @@ -1416,6 +1893,13 @@ virtual_multiway_valve: module: unilabos.devices.virtual.virtual_multiway_valve:VirtualMultiwayValve status_types: current_position: int + get_available_ports: typing:Dict + get_available_positions: list + get_current_port: str + get_current_position: int + get_flow_path: str + get_info: dict + get_valve_position: int max_positions: Int32 status: str target_position: int @@ -1521,6 +2005,165 @@ virtual_multiway_valve: virtual_pump: class: action_value_mappings: + auto-clean_vessel: + feedback: {} + goal: {} + goal_default: + repeats: 1 + solvent: null + temp: null + vessel: null + volume: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand clean_vessel 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand clean_vessel 的参数schema + properties: + repeats: + default: 1 + description: '参数: repeats' + type: integer + solvent: + description: '参数: solvent' + type: string + temp: + description: '参数: temp' + type: number + vessel: + description: '参数: vessel' + type: string + volume: + description: '参数: volume' + type: number + required: + - vessel + - solvent + - volume + - temp + type: object + result: {} + required: + - goal + title: clean_vessel 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-cleanup: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand cleanup 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand cleanup 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: cleanup 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-initialize: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand initialize 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand initialize 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: initialize 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-transfer: + feedback: {} + goal: {} + goal_default: + amount: '' + from_vessel: null + rinsing_repeats: 0 + rinsing_solvent: '' + rinsing_volume: 0.0 + solid: false + time: 0.0 + to_vessel: null + viscous: false + volume: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand transfer 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand transfer 的参数schema + properties: + amount: + default: '' + description: '参数: amount' + type: string + from_vessel: + description: '参数: from_vessel' + type: string + rinsing_repeats: + default: 0 + description: '参数: rinsing_repeats' + type: integer + rinsing_solvent: + default: '' + description: '参数: rinsing_solvent' + type: string + rinsing_volume: + default: 0.0 + description: '参数: rinsing_volume' + type: number + solid: + default: false + description: '参数: solid' + type: boolean + time: + default: 0.0 + description: '参数: time' + type: number + to_vessel: + description: '参数: to_vessel' + type: string + viscous: + default: false + description: '参数: viscous' + type: boolean + volume: + description: '参数: volume' + type: number + required: + - from_vessel + - to_vessel + - volume + type: object + result: {} + required: + - goal + title: transfer 命令参数 + type: object + type: UniLabJsonCommandAsync set_valve_position: feedback: status: status @@ -1733,7 +2376,11 @@ virtual_pump: device_id: description: '参数: device_id' type: string - required: [] + kwargs: + description: '参数: kwargs' + type: string + required: + - kwargs type: object result: {} required: @@ -1743,6 +2390,94 @@ virtual_pump: virtual_rotavap: class: action_value_mappings: + auto-cleanup: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand cleanup 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand cleanup 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: cleanup 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-evaporate: + feedback: {} + goal: {} + goal_default: + pressure: 0.1 + stir_speed: 100.0 + temp: 60.0 + time: 1800.0 + vessel: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand evaporate 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand evaporate 的参数schema + properties: + pressure: + default: 0.1 + description: '参数: pressure' + type: number + stir_speed: + default: 100.0 + description: '参数: stir_speed' + type: number + temp: + default: 60.0 + description: '参数: temp' + type: number + time: + default: 1800.0 + description: '参数: time' + type: number + vessel: + description: '参数: vessel' + type: string + required: + - vessel + type: object + result: {} + required: + - goal + title: evaporate 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-initialize: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand initialize 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand initialize 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: initialize 命令参数 + type: object + type: UniLabJsonCommandAsync evaporate: feedback: current_temp: current_temp @@ -1904,7 +2639,11 @@ virtual_rotavap: device_id: description: '参数: device_id' type: string - required: [] + kwargs: + description: '参数: kwargs' + type: string + required: + - kwargs type: object result: {} required: @@ -1914,6 +2653,134 @@ virtual_rotavap: virtual_separator: class: action_value_mappings: + auto-cleanup: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand cleanup 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand cleanup 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: cleanup 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-initialize: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand initialize 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand initialize 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: initialize 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-separate: + feedback: {} + goal: {} + goal_default: + from_vessel: null + product_phase: null + purpose: null + repeats: 1 + separation_vessel: null + settling_time: 300.0 + solvent: '' + solvent_volume: 50.0 + stir_speed: 300.0 + stir_time: 30.0 + through: '' + to_vessel: null + waste_phase_to_vessel: '' + handles: [] + result: {} + schema: + description: UniLabJsonCommand separate 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand separate 的参数schema + properties: + from_vessel: + description: '参数: from_vessel' + type: string + product_phase: + description: '参数: product_phase' + type: string + purpose: + description: '参数: purpose' + type: string + repeats: + default: 1 + description: '参数: repeats' + type: integer + separation_vessel: + description: '参数: separation_vessel' + type: string + settling_time: + default: 300.0 + description: '参数: settling_time' + type: number + solvent: + default: '' + description: '参数: solvent' + type: string + solvent_volume: + default: 50.0 + description: '参数: solvent_volume' + type: number + stir_speed: + default: 300.0 + description: '参数: stir_speed' + type: number + stir_time: + default: 30.0 + description: '参数: stir_time' + type: number + through: + default: '' + description: '参数: through' + type: string + to_vessel: + description: '参数: to_vessel' + type: string + waste_phase_to_vessel: + default: '' + description: '参数: waste_phase_to_vessel' + type: string + required: + - purpose + - product_phase + - from_vessel + - separation_vessel + - to_vessel + type: object + result: {} + required: + - goal + title: separate 命令参数 + type: object + type: UniLabJsonCommandAsync separate: feedback: current_status: status @@ -2121,7 +2988,11 @@ virtual_separator: device_id: description: '参数: device_id' type: string - required: [] + kwargs: + description: '参数: kwargs' + type: string + required: + - kwargs type: object result: {} required: @@ -2131,6 +3002,53 @@ virtual_separator: virtual_solenoid_valve: class: action_value_mappings: + auto-cleanup: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand cleanup 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand cleanup 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: cleanup 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-close: + feedback: {} + goal: {} + goal_default: + kwargs: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand close 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand close 的参数schema + properties: + kwargs: + description: '参数: kwargs' + type: string + required: + - kwargs + type: object + result: {} + required: + - goal + title: close 命令参数 + type: object + type: UniLabJsonCommandAsync auto-get_state: feedback: {} goal: {} @@ -2173,6 +3091,27 @@ virtual_solenoid_valve: title: get_valve_position 命令参数 type: object type: UniLabJsonCommand + auto-initialize: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand initialize 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand initialize 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: initialize 命令参数 + type: object + type: UniLabJsonCommandAsync auto-is_closed: feedback: {} goal: {} @@ -2194,6 +3133,114 @@ virtual_solenoid_valve: title: is_closed 命令参数 type: object type: UniLabJsonCommand + auto-open: + feedback: {} + goal: {} + goal_default: + kwargs: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand open 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand open 的参数schema + properties: + kwargs: + description: '参数: kwargs' + type: string + required: + - kwargs + type: object + result: {} + required: + - goal + title: open 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-reset: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand reset 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand reset 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: reset 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-set_state: + feedback: {} + goal: {} + goal_default: + command: null + kwargs: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_state 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_state 的参数schema + properties: + command: + description: '参数: command' + type: string + kwargs: + description: '参数: kwargs' + type: string + required: + - command + - kwargs + type: object + result: {} + required: + - goal + title: set_state 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-set_valve_position: + feedback: {} + goal: {} + goal_default: + command: null + kwargs: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_valve_position 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_valve_position 的参数schema + properties: + command: + description: '参数: command' + type: string + kwargs: + description: '参数: kwargs' + type: string + required: + - kwargs + type: object + result: {} + required: + - goal + title: set_valve_position 命令参数 + type: object + type: UniLabJsonCommandAsync auto-toggle: feedback: {} goal: {} @@ -2405,6 +3452,8 @@ virtual_solenoid_valve: type: SendCmd module: unilabos.devices.virtual.virtual_solenoid_valve:VirtualSolenoidValve status_types: + get_state: dict + get_valve_position: str is_open: bool status: str valve_state: str @@ -2441,7 +3490,11 @@ virtual_solenoid_valve: device_id: description: '参数: device_id' type: string - required: [] + kwargs: + description: '参数: kwargs' + type: string + required: + - kwargs type: object result: {} required: @@ -2451,6 +3504,146 @@ virtual_solenoid_valve: virtual_stirrer: class: action_value_mappings: + auto-cleanup: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand cleanup 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand cleanup 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: cleanup 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-initialize: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand initialize 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand initialize 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: initialize 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-start_stir: + feedback: {} + goal: {} + goal_default: + purpose: null + stir_speed: null + vessel: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand start_stir 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand start_stir 的参数schema + properties: + purpose: + description: '参数: purpose' + type: string + stir_speed: + description: '参数: stir_speed' + type: number + vessel: + description: '参数: vessel' + type: string + required: + - vessel + - stir_speed + - purpose + type: object + result: {} + required: + - goal + title: start_stir 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-stir: + feedback: {} + goal: {} + goal_default: + settling_time: null + stir_speed: null + stir_time: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand stir 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand stir 的参数schema + properties: + settling_time: + description: '参数: settling_time' + type: number + stir_speed: + description: '参数: stir_speed' + type: number + stir_time: + description: '参数: stir_time' + type: number + required: + - stir_time + - stir_speed + - settling_time + type: object + result: {} + required: + - goal + title: stir 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-stop_stir: + feedback: {} + goal: {} + goal_default: + vessel: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand stop_stir 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand stop_stir 的参数schema + properties: + vessel: + description: '参数: vessel' + type: string + required: + - vessel + type: object + result: {} + required: + - goal + title: stop_stir 命令参数 + type: object + type: UniLabJsonCommandAsync start_stir: feedback: status: status @@ -2663,7 +3856,11 @@ virtual_stirrer: device_id: description: '参数: device_id' type: string - required: [] + kwargs: + description: '参数: kwargs' + type: string + required: + - kwargs type: object result: {} required: @@ -2673,6 +3870,137 @@ virtual_stirrer: virtual_transfer_pump: class: action_value_mappings: + auto-aspirate: + feedback: {} + goal: {} + goal_default: + velocity: null + volume: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand aspirate 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand aspirate 的参数schema + properties: + velocity: + description: '参数: velocity' + type: number + volume: + description: '参数: volume' + type: number + required: + - volume + type: object + result: {} + required: + - goal + title: aspirate 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-cleanup: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand cleanup 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand cleanup 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: cleanup 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-dispense: + feedback: {} + goal: {} + goal_default: + velocity: null + volume: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand dispense 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand dispense 的参数schema + properties: + velocity: + description: '参数: velocity' + type: number + volume: + description: '参数: volume' + type: number + required: + - volume + type: object + result: {} + required: + - goal + title: dispense 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-empty_syringe: + feedback: {} + goal: {} + goal_default: + velocity: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand empty_syringe 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand empty_syringe 的参数schema + properties: + velocity: + description: '参数: velocity' + type: number + required: [] + type: object + result: {} + required: + - goal + title: empty_syringe 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-fill_syringe: + feedback: {} + goal: {} + goal_default: + velocity: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand fill_syringe 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand fill_syringe 的参数schema + properties: + velocity: + description: '参数: velocity' + type: number + required: [] + type: object + result: {} + required: + - goal + title: fill_syringe 命令参数 + type: object + type: UniLabJsonCommandAsync auto-get_current_volume: feedback: {} goal: {} @@ -2778,6 +4106,27 @@ virtual_transfer_pump: title: get_status 命令参数 type: object type: UniLabJsonCommand + auto-initialize: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand initialize 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand initialize 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: initialize 命令参数 + type: object + type: UniLabJsonCommandAsync auto-is_empty: feedback: {} goal: {} @@ -2820,6 +4169,66 @@ virtual_transfer_pump: title: is_full 命令参数 type: object type: UniLabJsonCommand + auto-pull_plunger: + feedback: {} + goal: {} + goal_default: + velocity: null + volume: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand pull_plunger 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand pull_plunger 的参数schema + properties: + velocity: + description: '参数: velocity' + type: number + volume: + description: '参数: volume' + type: number + required: + - volume + type: object + result: {} + required: + - goal + title: pull_plunger 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-push_plunger: + feedback: {} + goal: {} + goal_default: + velocity: null + volume: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand push_plunger 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand push_plunger 的参数schema + properties: + velocity: + description: '参数: velocity' + type: number + volume: + description: '参数: volume' + type: number + required: + - volume + type: object + result: {} + required: + - goal + title: push_plunger 命令参数 + type: object + type: UniLabJsonCommandAsync auto-set_max_velocity: feedback: {} goal: {} @@ -2846,6 +4255,91 @@ virtual_transfer_pump: title: set_max_velocity 命令参数 type: object type: UniLabJsonCommand + auto-set_position: + feedback: {} + goal: {} + goal_default: + max_velocity: null + position: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand set_position 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand set_position 的参数schema + properties: + max_velocity: + description: '参数: max_velocity' + type: number + position: + description: '参数: position' + type: number + required: + - position + type: object + result: {} + required: + - goal + title: set_position 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-stop_operation: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand stop_operation 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand stop_operation 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: stop_operation 命令参数 + type: object + type: UniLabJsonCommandAsync + auto-transfer: + feedback: {} + goal: {} + goal_default: + aspirate_velocity: null + dispense_velocity: null + volume: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand transfer 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand transfer 的参数schema + properties: + aspirate_velocity: + description: '参数: aspirate_velocity' + type: number + dispense_velocity: + description: '参数: dispense_velocity' + type: number + volume: + description: '参数: volume' + type: number + required: + - volume + type: object + result: {} + required: + - goal + title: transfer 命令参数 + type: object + type: UniLabJsonCommandAsync set_position: feedback: current_position: current_position @@ -3021,6 +4515,11 @@ virtual_transfer_pump: module: unilabos.devices.virtual.virtual_transferpump:VirtualTransferPump status_types: current_volume: float + get_current_volume: float + get_position: float + get_pump_info: dict + get_remaining_capacity: float + get_status: str max_velocity: float max_volume: Float64 position: float @@ -3051,7 +4550,11 @@ virtual_transfer_pump: device_id: description: '参数: device_id' type: string - required: [] + kwargs: + description: '参数: kwargs' + type: string + required: + - kwargs type: object result: {} required: @@ -3061,6 +4564,27 @@ virtual_transfer_pump: virtual_vacuum_pump: class: action_value_mappings: + auto-cleanup: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand cleanup 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand cleanup 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: cleanup 命令参数 + type: object + type: UniLabJsonCommandAsync auto-close: feedback: {} goal: {} @@ -3103,6 +4627,27 @@ virtual_vacuum_pump: title: get_status 命令参数 type: object type: UniLabJsonCommand + auto-initialize: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: UniLabJsonCommand initialize 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand initialize 的参数schema + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: initialize 命令参数 + type: object + type: UniLabJsonCommandAsync auto-is_closed: feedback: {} goal: {} @@ -3307,6 +4852,7 @@ virtual_vacuum_pump: type: StrSingleInput module: unilabos.devices.virtual.virtual_vacuum_pump:VirtualVacuumPump status_types: + get_status: str status: str type: python description: Virtual vacuum pump @@ -3333,7 +4879,11 @@ virtual_vacuum_pump: device_id: description: '参数: device_id' type: string - required: [] + kwargs: + description: '参数: kwargs' + type: string + required: + - kwargs type: object result: {} required: diff --git a/unilabos/registry/devices/work_station.yaml b/unilabos/registry/devices/work_station.yaml index 293060a..3b2765b 100644 --- a/unilabos/registry/devices/work_station.yaml +++ b/unilabos/registry/devices/work_station.yaml @@ -2298,6 +2298,42 @@ workstation: title: create_ros_action_server 命令参数 type: object type: UniLabJsonCommand + auto-execute_single_action: + feedback: {} + goal: {} + goal_default: + action_kwargs: null + action_name: null + device_id: null + handles: [] + result: {} + schema: + description: UniLabJsonCommand execute_single_action 的参数schema + properties: + feedback: {} + goal: + description: UniLabJsonCommand execute_single_action 的参数schema + properties: + action_kwargs: + description: '参数: action_kwargs' + type: string + action_name: + description: '参数: action_name' + type: string + device_id: + description: '参数: device_id' + type: string + required: + - device_id + - action_name + - action_kwargs + type: object + result: {} + required: + - goal + title: execute_single_action 命令参数 + type: object + type: UniLabJsonCommandAsync auto-initialize_device: feedback: {} goal: {} @@ -2342,12 +2378,18 @@ workstation: goal: description: UniLabJsonCommand __init__ 的参数schema properties: + args: + description: '参数: args' + type: string children: description: '参数: children' type: object device_id: description: '参数: device_id' type: string + kwargs: + description: '参数: kwargs' + type: string protocol_type: description: '参数: protocol_type' type: string @@ -2359,6 +2401,8 @@ workstation: - children - protocol_type - resource_tracker + - args + - kwargs type: object result: {} required: diff --git a/unilabos/registry/devices/zhida_hplc.yaml b/unilabos/registry/devices/zhida_hplc.yaml index 0c8141a..fa95efe 100644 --- a/unilabos/registry/devices/zhida_hplc.yaml +++ b/unilabos/registry/devices/zhida_hplc.yaml @@ -226,6 +226,7 @@ zhida_hplc: type: StrSingleInput module: unilabos.devices.zhida_hplc.zhida:ZhidaClient status_types: + get_methods: dict status: dict type: python description: Zhida HPLC diff --git a/unilabos/registry/registry.py b/unilabos/registry/registry.py index 27e47e5..5895509 100644 --- a/unilabos/registry/registry.py +++ b/unilabos/registry/registry.py @@ -190,7 +190,9 @@ class Registry: logger.error(f"[UniLab Registry] 无法找到类型 '{type_name}' 用于设备 {device_id} 的 {field_name}") sys.exit(1) - def _generate_unilab_json_command_schema(self, method_args: List[Dict[str, Any]], method_name: str) -> Dict[str, Any]: + def _generate_unilab_json_command_schema( + self, method_args: List[Dict[str, Any]], method_name: str + ) -> Dict[str, Any]: """ 根据UniLabJsonCommand方法信息生成JSON Schema,暂不支持嵌套类型 @@ -302,6 +304,7 @@ class Registry: for status_name, status_type in device_config["class"]["status_types"].items(): if status_type in ["Any", "None"]: status_type = "String" # 替换成ROS的String,便于显示 + device_config["class"]["status_types"][status_name] = status_type target_type = self._replace_type_with_class(status_type, device_id, f"状态 {status_name}") status_str_type_mapping[status_type] = target_type device_config["class"]["status_types"] = dict( @@ -322,7 +325,9 @@ class Registry: for k, v in enhanced_info["action_methods"].items() } ) - device_config["init_param_schema"] = self._generate_unilab_json_command_schema(enhanced_info["init_params"], "__init__") + device_config["init_param_schema"] = self._generate_unilab_json_command_schema( + enhanced_info["init_params"], "__init__" + ) device_config.pop("schema", None) device_config["class"]["action_value_mappings"] = dict( sorted(device_config["class"]["action_value_mappings"].items()) @@ -398,7 +403,28 @@ class Registry: def obtain_registry_device_info(self): devices = [] for device_id, device_info in self.device_type_registry.items(): - msg = {"id": device_id, **device_info} + device_info_copy = copy.deepcopy(device_info) + if "class" in device_info_copy and "action_value_mappings" in device_info_copy["class"]: + action_mappings = device_info_copy["class"]["action_value_mappings"] + for action_name, action_config in action_mappings.items(): + if "schema" in action_config and action_config["schema"]: + schema = action_config["schema"] + # 确保schema结构存在 + if ( + "properties" in schema + and "goal" in schema["properties"] + and "properties" in schema["properties"]["goal"] + ): + schema["properties"]["goal"]["properties"] = { + "unilabos_device_id": { + "type": "string", + "default": "", + "description": "UniLabOS设备ID,用于指定执行动作的具体设备实例", + }, + **schema["properties"]["goal"]["properties"], + } + + msg = {"id": device_id, **device_info_copy} devices.append(msg) return devices diff --git a/unilabos/ros/nodes/presets/protocol_node.py b/unilabos/ros/nodes/presets/protocol_node.py index 09921db..380bfff 100644 --- a/unilabos/ros/nodes/presets/protocol_node.py +++ b/unilabos/ros/nodes/presets/protocol_node.py @@ -168,10 +168,9 @@ class ROS2ProtocolNode(BaseROS2DeviceNode): execution_error = "" execution_success = False protocol_return_value = None - + self.get_logger().info(f"Executing {protocol_name} action...") + action_value_mapping = self._action_value_mappings[protocol_name] try: - self.get_logger().info(f"Executing {protocol_name} action...") - action_value_mapping = self._action_value_mappings[protocol_name] print("+" * 30) print(protocol_steps_generator) # 从目标消息中提取参数, 并调用Protocol生成器(根据设备连接图)生成action步骤 diff --git a/unilabos/utils/import_manager.py b/unilabos/utils/import_manager.py index 4653977..b3968e1 100644 --- a/unilabos/utils/import_manager.py +++ b/unilabos/utils/import_manager.py @@ -207,7 +207,6 @@ class ImportManager: dynamic_info = None if use_dynamic: try: - raise ValueError("强制使用动态导入") # 强制使用动态导入以测试功能 dynamic_info = self._get_dynamic_class_info(module_path) result["dynamic_import_success"] = True logger.debug(f"[ImportManager] 动态导入类 {module_path} 成功") @@ -242,7 +241,7 @@ class ImportManager: result = { "class_name": class_name, - "init_params": {}, + "init_params": [], "status_methods": {}, "action_methods": {}, } @@ -268,10 +267,10 @@ class ImportManager: "required": param.default == inspect.Parameter.empty, "default": param_default, } - result["init_params"][param_name] = param_info + result["init_params"].append(param_info) # 分析类的所有成员 - for name, method in inspect.getmembers(cls): + for name, method in cls.__dict__.items(): if name.startswith("_"): continue @@ -551,7 +550,7 @@ class ImportManager: if i >= num_required: default_index = i - num_required if default_index < len(defaults): - default_value: Constant = defaults[default_index] + default_value: Constant = defaults[default_index] # type: ignore assert isinstance(default_value, Constant), "暂不支持对非常量类型进行推断,可反馈开源仓库" arg_info["default"] = default_value.value # 如果没有类型注解,尝试从默认值推断类型 @@ -565,7 +564,6 @@ class ImportManager: return method_info - def _infer_type_from_default(self, node: ast.AST) -> Optional[str]: """从默认值推断参数类型""" if isinstance(node, ast.Constant): @@ -594,11 +592,6 @@ class ImportManager: return "Optional[Any]" elif node.id in ["True", "False"]: return "bool" - elif isinstance(node, ast.Attribute): - # 处理类似 os.path.join 的情况 - attr_str = self._extract_default_value(node) - if "path" in attr_str.lower(): - return "str" return None From 817e88cfc48c474cb7b8172c6a676be22eb92d70 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Sat, 28 Jun 2025 01:32:10 +0800 Subject: [PATCH 04/96] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=8D=E5=90=AF?= =?UTF-8?q?=E7=94=A8=E6=B3=A8=E5=86=8C=E8=A1=A8=E8=A1=A5=E5=85=85=E5=B0=B1?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E5=90=AF=E5=8A=A8=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- unilabos/registry/registry.py | 41 ++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/unilabos/registry/registry.py b/unilabos/registry/registry.py index 5895509..deac881 100644 --- a/unilabos/registry/registry.py +++ b/unilabos/registry/registry.py @@ -298,9 +298,9 @@ class Registry: enhanced_info = {} if complete_registry: enhanced_info = get_enhanced_class_info(device_config["class"]["module"], use_dynamic=True) - device_config["class"]["status_types"].update( - {k: v["return_type"] for k, v in enhanced_info["status_methods"].items()} - ) + device_config["class"]["status_types"].update( + {k: v["return_type"] for k, v in enhanced_info["status_methods"].items()} + ) for status_name, status_type in device_config["class"]["status_types"].items(): if status_type in ["Any", "None"]: status_type = "String" # 替换成ROS的String,便于显示 @@ -310,24 +310,25 @@ class Registry: device_config["class"]["status_types"] = dict( sorted(device_config["class"]["status_types"].items()) ) - # 处理动作值映射 - device_config["class"]["action_value_mappings"].update( - { - f"auto-{k}": { - "type": "UniLabJsonCommandAsync" if v["is_async"] else "UniLabJsonCommand", - "goal": {}, - "feedback": {}, - "result": {}, - "schema": self._generate_unilab_json_command_schema(v["args"], k), - "goal_default": {i["name"]: i["default"] for i in v["args"]}, - "handles": [], + if complete_registry: + # 处理动作值映射 + device_config["class"]["action_value_mappings"].update( + { + f"auto-{k}": { + "type": "UniLabJsonCommandAsync" if v["is_async"] else "UniLabJsonCommand", + "goal": {}, + "feedback": {}, + "result": {}, + "schema": self._generate_unilab_json_command_schema(v["args"], k), + "goal_default": {i["name"]: i["default"] for i in v["args"]}, + "handles": [], + } + for k, v in enhanced_info["action_methods"].items() } - for k, v in enhanced_info["action_methods"].items() - } - ) - device_config["init_param_schema"] = self._generate_unilab_json_command_schema( - enhanced_info["init_params"], "__init__" - ) + ) + device_config["init_param_schema"] = self._generate_unilab_json_command_schema( + enhanced_info["init_params"], "__init__" + ) device_config.pop("schema", None) device_config["class"]["action_value_mappings"] = dict( sorted(device_config["class"]["action_value_mappings"].items()) From 9be6e1069ab2346133637f1cadcc143cf29cd7b9 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Sat, 28 Jun 2025 10:52:34 +0800 Subject: [PATCH 05/96] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=83=A8=E5=88=86?= =?UTF-8?q?=E8=AF=86=E5=88=ABerror?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- unilabos/app/register.py | 22 +++---- unilabos/app/web/client.py | 2 - unilabos/app/web/pages.py | 4 +- unilabos/registry/devices/liquid_handler.yaml | 4 +- unilabos/registry/devices/virtual_device.yaml | 44 ++++---------- unilabos/ros/nodes/presets/host_node.py | 2 + unilabos/utils/import_manager.py | 58 ++++++++++++------- 7 files changed, 66 insertions(+), 70 deletions(-) diff --git a/unilabos/app/register.py b/unilabos/app/register.py index 7d2f23c..40e4107 100644 --- a/unilabos/app/register.py +++ b/unilabos/app/register.py @@ -13,17 +13,17 @@ def register_devices_and_resources(mqtt_client, lab_registry): """ logger.info("[UniLab Register] 开始注册设备和资源...") - # # 注册设备信息 - # for device_info in lab_registry.obtain_registry_device_info(): - # mqtt_client.publish_registry(device_info["id"], device_info, False) - # logger.debug(f"[UniLab Register] 注册设备: {device_info['id']}") - # - # # 注册资源信息 - # for resource_info in lab_registry.obtain_registry_resource_info(): - # mqtt_client.publish_registry(resource_info["id"], resource_info, False) - # logger.debug(f"[UniLab Register] 注册资源: {resource_info['id']}") - # - # time.sleep(10) + # 注册设备信息 + for device_info in lab_registry.obtain_registry_device_info(): + mqtt_client.publish_registry(device_info["id"], device_info, False) + logger.debug(f"[UniLab Register] 注册设备: {device_info['id']}") + + # 注册资源信息 + for resource_info in lab_registry.obtain_registry_resource_info(): + mqtt_client.publish_registry(resource_info["id"], resource_info, False) + logger.debug(f"[UniLab Register] 注册资源: {resource_info['id']}") + + time.sleep(10) logger.info("[UniLab Register] 设备和资源注册完成.") diff --git a/unilabos/app/web/client.py b/unilabos/app/web/client.py index 9b9446a..09b6ede 100644 --- a/unilabos/app/web/client.py +++ b/unilabos/app/web/client.py @@ -40,7 +40,6 @@ class HTTPClient: Returns: Response: API响应对象 """ - return True response = requests.post( f"{self.remote_addr}/lab/resource/edge/batch_create/?database_process_later={1 if database_process_later else 0}", json=resources, @@ -61,7 +60,6 @@ class HTTPClient: Returns: Response: API响应对象 """ - return True response = requests.post( f"{self.remote_addr}/lab/resource/?database_process_later={1 if database_process_later else 0}", json=resources, diff --git a/unilabos/app/web/pages.py b/unilabos/app/web/pages.py index 51b109b..9f9a6c0 100644 --- a/unilabos/app/web/pages.py +++ b/unilabos/app/web/pages.py @@ -7,6 +7,7 @@ Web页面模块 import json import os import sys +import traceback from pathlib import Path from typing import Dict @@ -17,7 +18,7 @@ from jinja2 import Environment, FileSystemLoader from unilabos.config.config import BasicConfig from unilabos.registry.registry import lab_registry from unilabos.ros.msgs.message_converter import msg_converter_manager -from unilabos.utils.log import error +from unilabos.utils.log import error, debug from unilabos.utils.type_check import TypeEncoder from unilabos.app.web.utils.device_utils import get_registry_info from unilabos.app.web.utils.host_utils import get_host_node_info @@ -123,6 +124,7 @@ def setup_web_pages(router: APIRouter) -> None: return html except Exception as e: + debug(traceback.format_exc()) error(f"生成状态页面时出错: {str(e)}") raise HTTPException(status_code=500, detail=f"Error generating status page: {str(e)}") diff --git a/unilabos/registry/devices/liquid_handler.yaml b/unilabos/registry/devices/liquid_handler.yaml index 8fea092..eec9fc5 100644 --- a/unilabos/registry/devices/liquid_handler.yaml +++ b/unilabos/registry/devices/liquid_handler.yaml @@ -4899,7 +4899,7 @@ liquid_handler.biomek: none_keys: default: [] description: '参数: none_keys' - type: string + type: array protocol_author: description: '参数: protocol_author' type: string @@ -5287,7 +5287,7 @@ liquid_handler.biomek: none_keys: default: [] description: '参数: none_keys' - type: string + type: array offsets: description: '参数: offsets' type: string diff --git a/unilabos/registry/devices/virtual_device.yaml b/unilabos/registry/devices/virtual_device.yaml index 785b865..2538c57 100644 --- a/unilabos/registry/devices/virtual_device.yaml +++ b/unilabos/registry/devices/virtual_device.yaml @@ -402,7 +402,7 @@ virtual_column: properties: config: description: '参数: config' - type: string + type: object device_id: description: '参数: device_id' type: string @@ -1370,7 +1370,7 @@ virtual_heatchill: properties: config: description: '参数: config' - type: string + type: object device_id: description: '参数: device_id' type: string @@ -1893,7 +1893,7 @@ virtual_multiway_valve: module: unilabos.devices.virtual.virtual_multiway_valve:VirtualMultiwayValve status_types: current_position: int - get_available_ports: typing:Dict + get_available_ports: dict get_available_positions: list get_current_port: str get_current_position: int @@ -2372,7 +2372,7 @@ virtual_pump: properties: config: description: '参数: config' - type: string + type: object device_id: description: '参数: device_id' type: string @@ -3026,8 +3026,7 @@ virtual_solenoid_valve: auto-close: feedback: {} goal: {} - goal_default: - kwargs: null + goal_default: {} handles: [] result: {} schema: @@ -3036,12 +3035,8 @@ virtual_solenoid_valve: feedback: {} goal: description: UniLabJsonCommand close 的参数schema - properties: - kwargs: - description: '参数: kwargs' - type: string - required: - - kwargs + properties: {} + required: [] type: object result: {} required: @@ -3136,8 +3131,7 @@ virtual_solenoid_valve: auto-open: feedback: {} goal: {} - goal_default: - kwargs: null + goal_default: {} handles: [] result: {} schema: @@ -3146,12 +3140,8 @@ virtual_solenoid_valve: feedback: {} goal: description: UniLabJsonCommand open 的参数schema - properties: - kwargs: - description: '参数: kwargs' - type: string - required: - - kwargs + properties: {} + required: [] type: object result: {} required: @@ -3185,7 +3175,6 @@ virtual_solenoid_valve: goal: {} goal_default: command: null - kwargs: null handles: [] result: {} schema: @@ -3198,12 +3187,8 @@ virtual_solenoid_valve: command: description: '参数: command' type: string - kwargs: - description: '参数: kwargs' - type: string required: - command - - kwargs type: object result: {} required: @@ -3216,7 +3201,6 @@ virtual_solenoid_valve: goal: {} goal_default: command: null - kwargs: null handles: [] result: {} schema: @@ -3229,11 +3213,7 @@ virtual_solenoid_valve: command: description: '参数: command' type: string - kwargs: - description: '参数: kwargs' - type: string - required: - - kwargs + required: [] type: object result: {} required: @@ -3852,7 +3832,7 @@ virtual_stirrer: properties: config: description: '参数: config' - type: string + type: object device_id: description: '参数: device_id' type: string diff --git a/unilabos/ros/nodes/presets/host_node.py b/unilabos/ros/nodes/presets/host_node.py index cae1a9f..0cb3db7 100644 --- a/unilabos/ros/nodes/presets/host_node.py +++ b/unilabos/ros/nodes/presets/host_node.py @@ -459,6 +459,8 @@ class HostNode(BaseROS2DeviceNode): self.devices_instances[device_id] = d # noinspection PyProtectedMember for action_name, action_value_mapping in d._ros_node._action_value_mappings.items(): + if action_name.startswith("auto-"): + continue action_id = f"/devices/{device_id}/{action_name}" if action_id not in self._action_clients: action_type = action_value_mapping["type"] diff --git a/unilabos/utils/import_manager.py b/unilabos/utils/import_manager.py index b3968e1..ec1396b 100644 --- a/unilabos/utils/import_manager.py +++ b/unilabos/utils/import_manager.py @@ -216,15 +216,16 @@ class ImportManager: f"{module_path} 失败(将使用静态分析," f"建议修复导入错误,以实现更好的注册表识别效果!): {e}" ) - - # 尝试静态分析 - static_info = None - try: - static_info = self._get_static_class_info(module_path) - result["static_analysis_success"] = True - logger.debug(f"[ImportManager] 静态分析类 {module_path} 成功") - except Exception as e: - logger.warning(f"[ImportManager] 静态分析类 {module_path} 失败: {e}") + use_dynamic = False + if not use_dynamic: + # 尝试静态分析 + static_info = None + try: + static_info = self._get_static_class_info(module_path) + result["static_analysis_success"] = True + logger.debug(f"[ImportManager] 静态分析类 {module_path} 成功") + except Exception as e: + logger.warning(f"[ImportManager] 静态分析类 {module_path} 失败: {e}") # 合并信息(优先使用动态导入的信息) if dynamic_info: @@ -351,15 +352,32 @@ class ImportManager: return result def _analyze_method_signature(self, method) -> Dict[str, Any]: - """分析方法签名""" - signature = inspect.signature(method) + """ + 分析方法签名,提取具体的命名参数信息 + 注意:此方法会跳过*args和**kwargs,只提取具体的命名参数 + 这样可以确保通过**dict方式传参时的准确性 + + 示例用法: + method_info = self._analyze_method_signature(some_method) + params = {"param1": "value1", "param2": "value2"} + result = some_method(**params) # 安全的参数传递 + """ + signature = inspect.signature(method) args = [] num_required = 0 + for param_name, param in signature.parameters.items(): + # 跳过self参数 if param_name == "self": continue + # 跳过*args和**kwargs参数 + if param.kind == param.VAR_POSITIONAL: # *args + continue + if param.kind == param.VAR_KEYWORD: # **kwargs + continue + is_required = param.default == inspect.Parameter.empty if is_required: num_required += 1 @@ -392,10 +410,15 @@ class ImportManager: """将类型注解转换为字符串""" if annotation == inspect.Parameter.empty: return "Any" # 如果没有注解,返回Any - if annotation is None: return "None" # 明确的None类型 - + annotation_str = str(annotation) + # 处理typing模块的复杂类型 + if "typing." in annotation_str: + # 简化typing类型显示 + return ( + annotation_str.replace("typing.", "") if getattr(annotation, "_name", None) is None else annotation._name.lower() + ) # 如果是类型对象 if hasattr(annotation, "__name__"): # 如果是内置类型 @@ -404,22 +427,13 @@ class ImportManager: else: # 如果是自定义类,返回完整路径 return f"{annotation.__module__}:{annotation.__name__}" - # 如果是typing模块的类型 elif hasattr(annotation, "_name"): return annotation._name - # 如果是字符串形式的类型注解 elif isinstance(annotation, str): return annotation - - # 其他情况,尝试转换为字符串 else: - annotation_str = str(annotation) - # 处理typing模块的复杂类型 - if "typing." in annotation_str: - # 简化typing类型显示 - return annotation_str.replace("typing.", "") return annotation_str def _is_property_method(self, node: ast.FunctionDef) -> bool: From be0a73eb19aedec6d990938bcf0b1bd56ba474d4 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Sat, 28 Jun 2025 12:18:30 +0800 Subject: [PATCH 06/96] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=9D=99=E6=80=81?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E8=AF=86=E5=88=ABget=20status=EF=BC=8C?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E8=A1=A8=E6=94=AF=E6=8C=81python=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../devices/characterization_optic.yaml | 60 +-- unilabos/registry/devices/hotel.yaml | 25 +- unilabos/registry/devices/liquid_handler.yaml | 3 +- unilabos/registry/devices/mock_devices.yaml | 230 +---------- .../devices/organic_miscellaneous.yaml | 8 +- unilabos/registry/devices/pump_and_valve.yaml | 245 +----------- .../registry/devices/robot_linear_motion.yaml | 2 - unilabos/registry/devices/temperature.yaml | 45 --- .../registry/devices/vacuum_and_purge.yaml | 44 --- unilabos/registry/devices/virtual_device.yaml | 365 +----------------- unilabos/registry/devices/zhida_hplc.yaml | 23 +- unilabos/registry/registry.py | 13 +- unilabos/ros/nodes/base_device_node.py | 5 +- unilabos/utils/import_manager.py | 16 +- 14 files changed, 60 insertions(+), 1024 deletions(-) diff --git a/unilabos/registry/devices/characterization_optic.yaml b/unilabos/registry/devices/characterization_optic.yaml index ddca2dd..bfd1777 100644 --- a/unilabos/registry/devices/characterization_optic.yaml +++ b/unilabos/registry/devices/characterization_optic.yaml @@ -22,32 +22,6 @@ hplc.agilent: title: check_status 命令参数 type: object type: UniLabJsonCommand - auto-execute_command_from_outer: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: UniLabJsonCommand execute_command_from_outer 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand execute_command_from_outer 的参数schema - properties: - command: - description: '参数: command' - type: string - required: - - command - type: object - result: {} - required: - - goal - title: execute_command_from_outer 命令参数 - type: object - type: UniLabJsonCommand auto-extract_data_from_txt: feedback: {} goal: {} @@ -74,35 +48,6 @@ hplc.agilent: title: extract_data_from_txt 命令参数 type: object type: UniLabJsonCommand - auto-get_data_file: - feedback: {} - goal: {} - goal_default: - after_time: null - mat_index: null - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_data_file 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_data_file 的参数schema - properties: - after_time: - description: '参数: after_time' - type: string - mat_index: - description: '参数: mat_index' - type: string - required: [] - type: object - result: {} - required: - - goal - title: get_data_file 命令参数 - type: object - type: UniLabJsonCommand auto-start_sequence: feedback: {} goal: {} @@ -237,10 +182,10 @@ hplc.agilent: module: unilabos.devices.hplc.AgilentHPLC:HPLCDriver status_types: could_run: bool + data_file: tuple device_status: str driver_init_ok: bool finish_status: str - get_data_file: tuple is_running: bool status_text: str success: bool @@ -467,8 +412,7 @@ raman_home_made: type: object type: SendCmd module: unilabos.devices.raman_uv.home_made_raman:RamanObj - status_types: - status: String + status_types: {} type: python description: Raman spectroscopy device handles: [] diff --git a/unilabos/registry/devices/hotel.yaml b/unilabos/registry/devices/hotel.yaml index abaf871..bfd0090 100644 --- a/unilabos/registry/devices/hotel.yaml +++ b/unilabos/registry/devices/hotel.yaml @@ -1,30 +1,9 @@ hotel.thermo_orbitor_rs2_hotel: class: - action_value_mappings: - auto-get_rotation: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_rotation 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_rotation 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_rotation 命令参数 - type: object - type: UniLabJsonCommand + action_value_mappings: {} module: unilabos.devices.resource_container.container:HotelContainer status_types: - get_rotation: String + rotation: String type: python description: Thermo Orbitor RS2 Hotel handles: [] diff --git a/unilabos/registry/devices/liquid_handler.yaml b/unilabos/registry/devices/liquid_handler.yaml index eec9fc5..f431b49 100644 --- a/unilabos/registry/devices/liquid_handler.yaml +++ b/unilabos/registry/devices/liquid_handler.yaml @@ -4831,8 +4831,7 @@ liquid_handler: type: object type: LiquidHandlerTransfer module: unilabos.devices.liquid_handling.liquid_handler_abstract:LiquidHandlerAbstract - status_types: - name: String + status_types: {} type: python description: Liquid handler device controlled by pylabrobot handles: diff --git a/unilabos/registry/devices/mock_devices.yaml b/unilabos/registry/devices/mock_devices.yaml index 1cf844c..cc4db28 100644 --- a/unilabos/registry/devices/mock_devices.yaml +++ b/unilabos/registry/devices/mock_devices.yaml @@ -22,27 +22,6 @@ mock_chiller: title: emergency_stop 命令参数 type: object type: UniLabJsonCommand - auto-get_status_info: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_status_info 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_status_info 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_status_info 命令参数 - type: object - type: UniLabJsonCommand auto-heat_chill_start: feedback: {} goal: {} @@ -250,11 +229,11 @@ mock_chiller: module: unilabos.devices.mock.mock_chiller:MockChiller status_types: current_temperature: float - get_status_info: dict is_cooling: bool is_heating: bool purpose: str status: str + status_info: dict target_temperature: float vessel: str type: python @@ -359,27 +338,6 @@ mock_filter: title: filter 命令参数 type: object type: UniLabJsonCommand - auto-get_status_info: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_status_info 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_status_info 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_status_info 命令参数 - type: object - type: UniLabJsonCommand auto-replace_filter: feedback: {} goal: {} @@ -595,11 +553,11 @@ mock_filter: filtered_volume: float filtrate_vessel: str flow_rate: float - get_status_info: dict is_filtering: bool pressure_drop: float progress: float status: str + status_info: dict stir: bool stir_speed: float target_volume: float @@ -651,27 +609,6 @@ mock_heater: title: emergency_stop 命令参数 type: object type: UniLabJsonCommand - auto-get_status_info: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_status_info 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_status_info 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_status_info 命令参数 - type: object - type: UniLabJsonCommand auto-heat_chill: feedback: {} goal: {} @@ -1055,12 +992,12 @@ mock_heater: module: unilabos.devices.mock.mock_heater:MockHeater status_types: current_temperature: float - get_status_info: dict heating_power: float is_heating: bool max_temperature: float purpose: str status: str + status_info: dict stir: bool stir_speed: float target_temperature: float @@ -1111,27 +1048,6 @@ mock_pump: title: emergency_stop 命令参数 type: object type: UniLabJsonCommand - auto-get_status_info: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_status_info 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_status_info 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_status_info 命令参数 - type: object - type: UniLabJsonCommand auto-pause_pump: feedback: {} goal: {} @@ -1513,7 +1429,6 @@ mock_pump: current_device: str flow_rate: float from_vessel: str - get_status_info: dict is_solid: bool is_viscous: bool max_flow_rate: float @@ -1524,6 +1439,7 @@ mock_pump: rinsing_solvent: str rinsing_volume: float status: str + status_info: dict target_flow_rate: float time_remaining: float time_spent: float @@ -1577,27 +1493,6 @@ mock_rotavap: title: emergency_stop 命令参数 type: object type: UniLabJsonCommand - auto-get_status_info: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_status_info 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_status_info 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_status_info 命令参数 - type: object - type: UniLabJsonCommand auto-set_pump_time: feedback: {} goal: {} @@ -2085,14 +1980,13 @@ mock_rotavap: type: EmptyIn module: unilabos.devices.mock.mock_rotavap:MockRotavap status_types: - get_status_info: dict pump_state: str pump_time: float rotate_speed: float rotate_state: str rotate_time: float status: str - success: String + status_info: dict target_temperature: float temperature: float vacuum_level: float @@ -2121,27 +2015,6 @@ mock_rotavap: mock_separator: class: action_value_mappings: - auto-get_status_info: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_status_info 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_status_info 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_status_info 命令参数 - type: object - type: UniLabJsonCommand auto-separate: feedback: {} goal: {} @@ -2578,7 +2451,6 @@ mock_separator: status_types: current_device: str from_vessel: str - get_status_info: dict product_phase: str purpose: str repeats: int @@ -2589,6 +2461,7 @@ mock_separator: solvent: str solvent_volume: float status: str + status_info: dict stir_speed: float stir_time: float through: str @@ -2643,27 +2516,6 @@ mock_solenoid_valve: title: close_valve 命令参数 type: object type: UniLabJsonCommand - auto-get_valve_status: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_valve_status 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_valve_status 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_valve_status 命令参数 - type: object - type: UniLabJsonCommand auto-is_closed: feedback: {} goal: {} @@ -2871,7 +2723,6 @@ mock_solenoid_valve: type: StrSingleInput module: unilabos.devices.mock.mock_solenoid_valve:MockSolenoidValve status_types: - get_valve_status: str status: str valve_status: str type: python @@ -2920,27 +2771,6 @@ mock_stirrer: title: emergency_stop 命令参数 type: object type: UniLabJsonCommand - auto-get_status_info: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_status_info 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_status_info 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_status_info 命令参数 - type: object - type: UniLabJsonCommand auto-heating_control: feedback: {} goal: {} @@ -3288,12 +3118,12 @@ mock_stirrer: type: EmptyIn module: unilabos.devices.mock.mock_stirrer:MockStirrer status_types: - get_status_info: dict heating_power: float heating_state: str max_stir_speed: float max_temperature: float status: str + status_info: dict stir_speed: float stir_state: str target_stir_speed: float @@ -3324,27 +3154,6 @@ mock_stirrer: mock_stirrer_new: class: action_value_mappings: - auto-get_status_info: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_status_info 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_status_info 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_status_info 命令参数 - type: object - type: UniLabJsonCommand auto-start_stir: feedback: {} goal: {} @@ -3629,12 +3438,12 @@ mock_stirrer_new: type: StopStir module: unilabos.devices.mock.mock_stirrer_new:MockStirrer_new status_types: - get_status_info: dict max_stir_speed: float progress: float purpose: str settling_time: float status: str + status_info: dict stir_speed: float stir_state: str stir_time: float @@ -3686,27 +3495,6 @@ mock_vacuum: title: emergency_stop 命令参数 type: object type: UniLabJsonCommand - auto-get_status_info: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_status_info 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_status_info 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_status_info 命令参数 - type: object - type: UniLabJsonCommand auto-pause_vacuum: feedback: {} goal: {} @@ -4134,13 +3922,13 @@ mock_vacuum: type: EmptyIn module: unilabos.devices.mock.mock_vacuum:MockVacuum status_types: - get_status_info: dict max_pump_speed: float power_state: str pump_efficiency: float pump_speed: float pump_state: str status: str + status_info: dict target_vacuum: float vacuum_level: float type: python diff --git a/unilabos/registry/devices/organic_miscellaneous.yaml b/unilabos/registry/devices/organic_miscellaneous.yaml index 7f5a19d..7dcf87b 100644 --- a/unilabos/registry/devices/organic_miscellaneous.yaml +++ b/unilabos/registry/devices/organic_miscellaneous.yaml @@ -174,9 +174,7 @@ rotavap.one: type: object type: SendCmd module: unilabos.devices.rotavap.rotavap_one:RotavapOne - status_types: - pump_time: Float64 - rotate_time: Float64 + status_types: {} type: python description: Rotavap device handles: [] @@ -453,9 +451,7 @@ separator.homemade: type: object type: SendCmd module: unilabos.devices.separator.homemade_grbl_conductivity:SeparatorController - status_types: - sensordata: Float64 - status: String + status_types: {} type: python description: Separator device with homemade grbl controller handles: [] diff --git a/unilabos/registry/devices/pump_and_valve.yaml b/unilabos/registry/devices/pump_and_valve.yaml index fd0b08a..3abe9e2 100644 --- a/unilabos/registry/devices/pump_and_valve.yaml +++ b/unilabos/registry/devices/pump_and_valve.yaml @@ -22,27 +22,6 @@ solenoid_valve: title: close 命令参数 type: object type: UniLabJsonCommand - auto-get_valve_position: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_valve_position 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_valve_position 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_valve_position 命令参数 - type: object - type: UniLabJsonCommand auto-is_closed: feedback: {} goal: {} @@ -224,7 +203,6 @@ solenoid_valve: type: StrSingleInput module: unilabos.devices.pump_and_valve.solenoid_valve:SolenoidValve status_types: - get_valve_position: str status: str valve_position: str type: python @@ -273,27 +251,6 @@ solenoid_valve.mock: title: close 命令参数 type: object type: UniLabJsonCommand - auto-get_valve_position: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_valve_position 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_valve_position 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_valve_position 命令参数 - type: object - type: UniLabJsonCommand auto-is_closed: feedback: {} goal: {} @@ -455,7 +412,6 @@ solenoid_valve.mock: type: EmptyIn module: unilabos.devices.pump_and_valve.solenoid_valve_mock:SolenoidValveMock status_types: - get_valve_position: str status: str valve_position: str type: python @@ -514,174 +470,6 @@ syringe_pump_with_valve.runze: title: close 命令参数 type: object type: UniLabJsonCommand - auto-get_max_velocity: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_max_velocity 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_max_velocity 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_max_velocity 命令参数 - type: object - type: UniLabJsonCommand - auto-get_plunger_position: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_plunger_position 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_plunger_position 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_plunger_position 命令参数 - type: object - type: UniLabJsonCommand - auto-get_position: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_position 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_position 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_position 命令参数 - type: object - type: UniLabJsonCommand - auto-get_status: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_status 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_status 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_status 命令参数 - type: object - type: UniLabJsonCommand - auto-get_valve_position: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_valve_position 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_valve_position 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_valve_position 命令参数 - type: object - type: UniLabJsonCommand - auto-get_velocity_end: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_velocity_end 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_velocity_end 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_velocity_end 命令参数 - type: object - type: UniLabJsonCommand - auto-get_velocity_grade: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_velocity_grade 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_velocity_grade 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_velocity_grade 命令参数 - type: object - type: UniLabJsonCommand - auto-get_velocity_init: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_velocity_init 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_velocity_init 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_velocity_init 命令参数 - type: object - type: UniLabJsonCommand auto-initialize: feedback: {} goal: {} @@ -703,27 +491,6 @@ syringe_pump_with_valve.runze: title: initialize 命令参数 type: object type: UniLabJsonCommand - auto-list: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand list 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand list 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: list 命令参数 - type: object - type: UniLabJsonCommand auto-pull_plunger: feedback: {} goal: {} @@ -1089,19 +856,15 @@ syringe_pump_with_valve.runze: write: send_command module: unilabos.devices.pump_and_valve.runze_backbone:RunzeSyringePump status_types: - get_max_velocity: String - get_plunger_position: String - get_position: String - get_status: String - get_valve_position: str - get_velocity_end: String - get_velocity_grade: String - get_velocity_init: String max_velocity: float mode: int + plunger_position: String position: float status: str valve_position: str + velocity_end: String + velocity_grade: String + velocity_init: String type: python description: Runze Syringe pump with valve handles: [] diff --git a/unilabos/registry/devices/robot_linear_motion.yaml b/unilabos/registry/devices/robot_linear_motion.yaml index a3abefb..0411a59 100644 --- a/unilabos/registry/devices/robot_linear_motion.yaml +++ b/unilabos/registry/devices/robot_linear_motion.yaml @@ -494,8 +494,6 @@ linear_motion.grbl: type: SingleJointPosition module: unilabos.devices.cnc.grbl_sync:GrblCNC status_types: - get_position: String - get_status: String position: unilabos.messages:Point3D spindle_speed: float status: str diff --git a/unilabos/registry/devices/temperature.yaml b/unilabos/registry/devices/temperature.yaml index a6308a9..b94f939 100644 --- a/unilabos/registry/devices/temperature.yaml +++ b/unilabos/registry/devices/temperature.yaml @@ -245,48 +245,6 @@ heaterstirrer.dalong: title: close 命令参数 type: object type: UniLabJsonCommand - auto-get_status: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_status 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_status 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_status 命令参数 - type: object - type: UniLabJsonCommand - auto-get_temp: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_temp 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_temp 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_temp 命令参数 - type: object - type: UniLabJsonCommand auto-heatchill: feedback: {} goal: {} @@ -614,8 +572,6 @@ heaterstirrer.dalong: type: SendCmd module: unilabos.devices.heaterstirrer.dalong:HeaterStirrer_DaLong status_types: - get_status: str - get_temp: String status: str stir_speed: float temp: float @@ -849,7 +805,6 @@ tempsensor: module: unilabos.devices.temperature.sensor_node:TempSensorNode status_types: value: float - warning: Float64 type: python description: Temperature sensor handles: [] diff --git a/unilabos/registry/devices/vacuum_and_purge.yaml b/unilabos/registry/devices/vacuum_and_purge.yaml index 4a15c4a..0497ee7 100644 --- a/unilabos/registry/devices/vacuum_and_purge.yaml +++ b/unilabos/registry/devices/vacuum_and_purge.yaml @@ -22,27 +22,6 @@ gas_source.mock: title: close 命令参数 type: object type: UniLabJsonCommand - auto-get_status: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_status 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_status 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_status 命令参数 - type: object - type: UniLabJsonCommand auto-is_closed: feedback: {} goal: {} @@ -247,7 +226,6 @@ gas_source.mock: type: StrSingleInput module: unilabos.devices.pump_and_valve.vacuum_pump_mock:VacuumPumpMock status_types: - get_status: str status: str type: python description: Mock gas source @@ -301,27 +279,6 @@ vacuum_pump.mock: title: close 命令参数 type: object type: UniLabJsonCommand - auto-get_status: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_status 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_status 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_status 命令参数 - type: object - type: UniLabJsonCommand auto-is_closed: feedback: {} goal: {} @@ -526,7 +483,6 @@ vacuum_pump.mock: type: StrSingleInput module: unilabos.devices.pump_and_valve.vacuum_pump_mock:VacuumPumpMock status_types: - get_status: str status: str type: python description: Mock vacuum pump diff --git a/unilabos/registry/devices/virtual_device.yaml b/unilabos/registry/devices/virtual_device.yaml index 2538c57..5efc117 100644 --- a/unilabos/registry/devices/virtual_device.yaml +++ b/unilabos/registry/devices/virtual_device.yaml @@ -721,27 +721,6 @@ virtual_gas_source: title: close 命令参数 type: object type: UniLabJsonCommand - auto-get_status: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_status 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_status 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_status 命令参数 - type: object - type: UniLabJsonCommand auto-initialize: feedback: {} goal: {} @@ -967,7 +946,6 @@ virtual_gas_source: type: StrSingleInput module: unilabos.devices.virtual.virtual_gas_source:VirtualGasSource status_types: - get_status: str status: str type: python description: Virtual gas source @@ -1409,153 +1387,6 @@ virtual_multiway_valve: title: close 命令参数 type: object type: UniLabJsonCommand - auto-get_available_ports: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_available_ports 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_available_ports 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_available_ports 命令参数 - type: object - type: UniLabJsonCommand - auto-get_available_positions: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_available_positions 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_available_positions 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_available_positions 命令参数 - type: object - type: UniLabJsonCommand - auto-get_current_port: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_current_port 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_current_port 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_current_port 命令参数 - type: object - type: UniLabJsonCommand - auto-get_current_position: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_current_position 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_current_position 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_current_position 命令参数 - type: object - type: UniLabJsonCommand - auto-get_flow_path: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_flow_path 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_flow_path 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_flow_path 命令参数 - type: object - type: UniLabJsonCommand - auto-get_info: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_info 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_info 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_info 命令参数 - type: object - type: UniLabJsonCommand - auto-get_valve_position: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_valve_position 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_valve_position 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_valve_position 命令参数 - type: object - type: UniLabJsonCommand auto-is_at_port: feedback: {} goal: {} @@ -1892,17 +1723,15 @@ virtual_multiway_valve: type: SendCmd module: unilabos.devices.virtual.virtual_multiway_valve:VirtualMultiwayValve status_types: + available_ports: dict + available_positions: list + current_port: str current_position: int - get_available_ports: dict - get_available_positions: list - get_current_port: str - get_current_position: int - get_flow_path: str - get_info: dict - get_valve_position: int - max_positions: Int32 + flow_path: str + info: dict status: str target_position: int + valve_position: int valve_state: str type: python description: Virtual 8-Way Valve for flow direction control @@ -2345,7 +2174,6 @@ virtual_pump: current_volume: float from_vessel: str max_volume: float - position: Float64 progress: float status: str to_vessel: str @@ -3044,48 +2872,6 @@ virtual_solenoid_valve: title: close 命令参数 type: object type: UniLabJsonCommandAsync - auto-get_state: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_state 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_state 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_state 命令参数 - type: object - type: UniLabJsonCommand - auto-get_valve_position: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_valve_position 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_valve_position 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_valve_position 命令参数 - type: object - type: UniLabJsonCommand auto-initialize: feedback: {} goal: {} @@ -3432,10 +3218,10 @@ virtual_solenoid_valve: type: SendCmd module: unilabos.devices.virtual.virtual_solenoid_valve:VirtualSolenoidValve status_types: - get_state: dict - get_valve_position: str is_open: bool + state: dict status: str + valve_position: str valve_state: str type: python description: Virtual Solenoid Valve for simple on/off flow control @@ -3981,111 +3767,6 @@ virtual_transfer_pump: title: fill_syringe 命令参数 type: object type: UniLabJsonCommandAsync - auto-get_current_volume: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_current_volume 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_current_volume 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_current_volume 命令参数 - type: object - type: UniLabJsonCommand - auto-get_position: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_position 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_position 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_position 命令参数 - type: object - type: UniLabJsonCommand - auto-get_pump_info: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_pump_info 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_pump_info 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_pump_info 命令参数 - type: object - type: UniLabJsonCommand - auto-get_remaining_capacity: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_remaining_capacity 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_remaining_capacity 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_remaining_capacity 命令参数 - type: object - type: UniLabJsonCommand - auto-get_status: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_status 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_status 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_status 命令参数 - type: object - type: UniLabJsonCommand auto-initialize: feedback: {} goal: {} @@ -4495,14 +4176,10 @@ virtual_transfer_pump: module: unilabos.devices.virtual.virtual_transferpump:VirtualTransferPump status_types: current_volume: float - get_current_volume: float - get_position: float - get_pump_info: dict - get_remaining_capacity: float - get_status: str max_velocity: float - max_volume: Float64 position: float + pump_info: dict + remaining_capacity: float status: str transfer_rate: float type: python @@ -4586,27 +4263,6 @@ virtual_vacuum_pump: title: close 命令参数 type: object type: UniLabJsonCommand - auto-get_status: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_status 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_status 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_status 命令参数 - type: object - type: UniLabJsonCommand auto-initialize: feedback: {} goal: {} @@ -4832,7 +4488,6 @@ virtual_vacuum_pump: type: StrSingleInput module: unilabos.devices.virtual.virtual_vacuum_pump:VirtualVacuumPump status_types: - get_status: str status: str type: python description: Virtual vacuum pump diff --git a/unilabos/registry/devices/zhida_hplc.yaml b/unilabos/registry/devices/zhida_hplc.yaml index fa95efe..7918386 100644 --- a/unilabos/registry/devices/zhida_hplc.yaml +++ b/unilabos/registry/devices/zhida_hplc.yaml @@ -99,27 +99,6 @@ zhida_hplc: title: connect 命令参数 type: object type: UniLabJsonCommand - auto-get_methods: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: UniLabJsonCommand get_methods 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand get_methods 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: get_methods 命令参数 - type: object - type: UniLabJsonCommand auto-start: feedback: {} goal: {} @@ -226,7 +205,7 @@ zhida_hplc: type: StrSingleInput module: unilabos.devices.zhida_hplc.zhida:ZhidaClient status_types: - get_methods: dict + methods: dict status: dict type: python description: Zhida HPLC diff --git a/unilabos/registry/registry.py b/unilabos/registry/registry.py index deac881..4210c2a 100644 --- a/unilabos/registry/registry.py +++ b/unilabos/registry/registry.py @@ -7,7 +7,7 @@ from typing import Any, Dict, List import yaml -from unilabos.ros.msgs.message_converter import msg_converter_manager, ros_action_to_json_schema +from unilabos.ros.msgs.message_converter import msg_converter_manager, ros_action_to_json_schema, String from unilabos.utils import logger from unilabos.utils.decorator import singleton from unilabos.utils.import_manager import get_enhanced_class_info @@ -180,6 +180,13 @@ class Registry: if not type_name or type_name == "": logger.warning(f"[UniLab Registry] 设备 {device_id} 的 {field_name} 类型为空,跳过替换") return type_name + convert_manager = { # 将python基本对象转为ros2基本对象 + "str": "String", + "bool": "Bool", + "int": "Int64", + "float": "Float64", + } + type_name = convert_manager.get(type_name, type_name) # 替换为ROS2类型 if ":" in type_name: type_class = msg_converter_manager.get_class(type_name) else: @@ -297,6 +304,7 @@ class Registry: device_config["class"]["action_value_mappings"] = {} enhanced_info = {} if complete_registry: + device_config["class"]["status_types"].clear() enhanced_info = get_enhanced_class_info(device_config["class"]["module"], use_dynamic=True) device_config["class"]["status_types"].update( {k: v["return_type"] for k, v in enhanced_info["status_methods"].items()} @@ -306,11 +314,14 @@ class Registry: status_type = "String" # 替换成ROS的String,便于显示 device_config["class"]["status_types"][status_name] = status_type target_type = self._replace_type_with_class(status_type, device_id, f"状态 {status_name}") + if target_type in [dict]: # 对于字典和对象的返回类型,要处理成字符串,直接进行转换 + target_type = String status_str_type_mapping[status_type] = target_type device_config["class"]["status_types"] = dict( sorted(device_config["class"]["status_types"].items()) ) if complete_registry: + device_config["class"]["action_value_mappings"] = {k:v for k, v in device_config["class"]["action_value_mappings"].items() if not k.startswith("auto-")} # 处理动作值映射 device_config["class"]["action_value_mappings"].update( { diff --git a/unilabos/ros/nodes/base_device_node.py b/unilabos/ros/nodes/base_device_node.py index 94b2edf..4b7eb07 100644 --- a/unilabos/ros/nodes/base_device_node.py +++ b/unilabos/ros/nodes/base_device_node.py @@ -168,7 +168,10 @@ class PropertyPublisher: self.print_publish = print_publish self._value = None - self.publisher_ = node.create_publisher(msg_type, f"{name}", 10) + try: + self.publisher_ = node.create_publisher(msg_type, f"{name}", 10) + except AttributeError as ex: + logger.error(f"创建发布者失败,可能由于注册表有误,类型: {msg_type},错误: {ex}\n{traceback.format_exc()}") self.timer = node.create_timer(self.timer_period, self.publish_property) self.__loop = get_event_loop() str_msg_type = str(msg_type)[8:-2] diff --git a/unilabos/utils/import_manager.py b/unilabos/utils/import_manager.py index ec1396b..1ce8b62 100644 --- a/unilabos/utils/import_manager.py +++ b/unilabos/utils/import_manager.py @@ -293,9 +293,12 @@ class ImportManager: elif inspect.ismethod(method) or inspect.isfunction(method): if name.startswith("get_"): + actual_name = name[4:] # 去掉get_前缀 + if actual_name in result["status_methods"]: + continue # get_ 开头的方法归类为status method_info = self._analyze_method_signature(method) - result["status_methods"][name] = method_info + result["status_methods"][actual_name] = method_info elif not name.startswith("_"): # 其他非_开头的方法归类为action method_info = self._analyze_method_signature(method) @@ -346,8 +349,13 @@ class ImportManager: elif self._is_property_method(node): # @property 装饰的方法 result["status_methods"][method_name] = method_info + elif method_name.startswith("get_"): + # get_ 开头的方法归类为status + actual_name = method_name[4:] # 去掉get_前缀 + if actual_name not in result["status_methods"]: + result["status_methods"][actual_name] = method_info else: - # set_ 开头或其他非_开头的方法 + # 其他非_开头的方法归类为action result["action_methods"][method_name] = method_info return result @@ -417,7 +425,9 @@ class ImportManager: if "typing." in annotation_str: # 简化typing类型显示 return ( - annotation_str.replace("typing.", "") if getattr(annotation, "_name", None) is None else annotation._name.lower() + annotation_str.replace("typing.", "") + if getattr(annotation, "_name", None) is None + else annotation._name.lower() ) # 如果是类型对象 if hasattr(annotation, "__name__"): From 157da1759d9a3fc870f72f43fefef7da40ac828b Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Sun, 29 Jun 2025 11:26:35 +0800 Subject: [PATCH 07/96] =?UTF-8?q?status=20types=E5=AF=B9=E4=BA=8E=E5=B5=8C?= =?UTF-8?q?=E5=A5=97=E7=B1=BB=E5=9E=8B=E8=BF=94=E5=9B=9E=E7=9A=84=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1=EF=BC=8C=E6=9A=82=E6=97=B6=E5=A4=84=E7=90=86=E6=88=90?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=EF=BC=8C=E6=97=A0=E6=B3=95=E7=9B=B4?= =?UTF-8?q?=E6=8E=A5=E8=BF=9B=E8=A1=8C=E8=BD=AC=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- unilabos/registry/registry.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unilabos/registry/registry.py b/unilabos/registry/registry.py index 4210c2a..3f4fceb 100644 --- a/unilabos/registry/registry.py +++ b/unilabos/registry/registry.py @@ -314,7 +314,7 @@ class Registry: status_type = "String" # 替换成ROS的String,便于显示 device_config["class"]["status_types"][status_name] = status_type target_type = self._replace_type_with_class(status_type, device_id, f"状态 {status_name}") - if target_type in [dict]: # 对于字典和对象的返回类型,要处理成字符串,直接进行转换 + if target_type in [dict, list]: # 对于嵌套类型返回的对象,暂时处理成字符串,无法直接进行转换 target_type = String status_str_type_mapping[status_type] = target_type device_config["class"]["status_types"] = dict( From 498b3cad6ab5aecdf5e185b3c9a7e5fc3f0d8b93 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Sun, 29 Jun 2025 11:52:24 +0800 Subject: [PATCH 08/96] =?UTF-8?q?=E6=94=AF=E6=8C=81=E9=80=9A=E8=BF=87list[?= =?UTF-8?q?int]=EF=BC=8Clist[float]=E8=BF=9B=E8=A1=8CInt64MultiArray?= =?UTF-8?q?=EF=BC=8CFloat64MultiArray=E7=9A=84=E6=9B=BF=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- unilabos/registry/devices/characterization_optic.yaml | 2 +- unilabos/registry/devices/robot_linear_motion.yaml | 2 +- unilabos/registry/registry.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/unilabos/registry/devices/characterization_optic.yaml b/unilabos/registry/devices/characterization_optic.yaml index bfd1777..06f9bfa 100644 --- a/unilabos/registry/devices/characterization_optic.yaml +++ b/unilabos/registry/devices/characterization_optic.yaml @@ -182,7 +182,7 @@ hplc.agilent: module: unilabos.devices.hplc.AgilentHPLC:HPLCDriver status_types: could_run: bool - data_file: tuple + data_file: list device_status: str driver_init_ok: bool finish_status: str diff --git a/unilabos/registry/devices/robot_linear_motion.yaml b/unilabos/registry/devices/robot_linear_motion.yaml index 0411a59..9a99a61 100644 --- a/unilabos/registry/devices/robot_linear_motion.yaml +++ b/unilabos/registry/devices/robot_linear_motion.yaml @@ -521,7 +521,7 @@ linear_motion.grbl: - -80 - 0 description: '参数: limits' - type: string + type: array port: description: '参数: port' type: string diff --git a/unilabos/registry/registry.py b/unilabos/registry/registry.py index 3f4fceb..d47663e 100644 --- a/unilabos/registry/registry.py +++ b/unilabos/registry/registry.py @@ -310,7 +310,7 @@ class Registry: {k: v["return_type"] for k, v in enhanced_info["status_methods"].items()} ) for status_name, status_type in device_config["class"]["status_types"].items(): - if status_type in ["Any", "None"]: + if status_type in ["Any", "None", "Unknown"]: status_type = "String" # 替换成ROS的String,便于显示 device_config["class"]["status_types"][status_name] = status_type target_type = self._replace_type_with_class(status_type, device_id, f"状态 {status_name}") From 68871358c2148b111683e5ece93d6bd19b706fb1 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Sun, 29 Jun 2025 11:52:59 +0800 Subject: [PATCH 09/96] =?UTF-8?q?=E6=88=90=E5=8A=9F=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E7=9A=84=E4=B8=8D=E5=86=8D=E9=9C=80=E8=A6=81?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E9=9D=99=E6=80=81=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- unilabos/utils/import_manager.py | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/unilabos/utils/import_manager.py b/unilabos/utils/import_manager.py index 1ce8b62..d04aca6 100644 --- a/unilabos/utils/import_manager.py +++ b/unilabos/utils/import_manager.py @@ -205,6 +205,7 @@ class ImportManager: # 尝试动态导入 dynamic_info = None + static_info = None if use_dynamic: try: dynamic_info = self._get_dynamic_class_info(module_path) @@ -216,10 +217,9 @@ class ImportManager: f"{module_path} 失败(将使用静态分析," f"建议修复导入错误,以实现更好的注册表识别效果!): {e}" ) - use_dynamic = False + use_dynamic = False if not use_dynamic: # 尝试静态分析 - static_info = None try: static_info = self._get_static_class_info(module_path) result["static_analysis_success"] = True @@ -408,18 +408,32 @@ class ImportManager: def _get_return_type_from_method(self, method) -> str: """从方法中获取返回类型""" - if hasattr(method, "__annotations__") and "return" in method.__annotations__: - return self._get_type_string(method.__annotations__["return"]) - signature = inspect.signature(method) return self._get_type_string(signature.return_annotation) def _get_type_string(self, annotation) -> str: - """将类型注解转换为字符串""" + """将类型注解转换为Class Library中可搜索的类名""" if annotation == inspect.Parameter.empty: return "Any" # 如果没有注解,返回Any if annotation is None: return "None" # 明确的None类型 + if hasattr(annotation, "__origin__"): + # 处理typing模块的类型 + origin = annotation.__origin__ + if origin in (list, set, tuple): + if hasattr(annotation, "__args__") and annotation.__args__: + if len(annotation.__args__): + arg0 = annotation.__args__[0] + if isinstance(arg0, int): + return "Int64MultiArray" + elif isinstance(arg0, float): + return "Float64MultiArray" + return "list" + elif origin is dict: + return "dict" + elif origin is Optional: + return "Unknown" + return f"Unknown" annotation_str = str(annotation) # 处理typing模块的复杂类型 if "typing." in annotation_str: From 64832718beaed705a5dcdef5b0fb1f9026246f41 Mon Sep 17 00:00:00 2001 From: Junhan Chang Date: Sun, 29 Jun 2025 17:31:44 +0800 Subject: [PATCH 10/96] Fix handle names (#55) * fix handle names * improve evacuateAndRefill gas source finding --- .../comprehensive_station.json | 14 +- .../compile/evacuateandrefill_protocol.py | 128 ++++++++++++++++-- unilabos/registry/devices/virtual_device.yaml | 18 +-- unilabos/registry/devices/work_station.yaml | 100 +++++++------- 4 files changed, 180 insertions(+), 80 deletions(-) diff --git a/test/experiments/comprehensive_protocol/comprehensive_station.json b/test/experiments/comprehensive_protocol/comprehensive_station.json index 071d913..0d9f5c7 100644 --- a/test/experiments/comprehensive_protocol/comprehensive_station.json +++ b/test/experiments/comprehensive_protocol/comprehensive_station.json @@ -680,7 +680,7 @@ "type": "fluid", "port": { "multiway_valve_1": "5", - "rotavap_1": "sample_in" + "rotavap_1": "samplein" } }, { @@ -770,7 +770,7 @@ "type": "transport", "port": { "multiway_valve_2": "4", - "filter_1": "filter_in" + "filter_1": "filterin" } }, { @@ -800,7 +800,7 @@ "type": "fluid", "port": { "multiway_valve_2": "6", - "separator_1": "separator_in" + "separator_1": "separatorin" } }, { @@ -809,7 +809,7 @@ "target": "collection_bottle_3", "type": "fluid", "port": { - "separator_1": "bottom_phase_out", + "separator_1": "bottomphaseout", "collection_bottle_3": "top" } }, @@ -859,7 +859,7 @@ "target": "waste_bottle_2", "type": "fluid", "port": { - "separator_1": "top_phase_out", + "separator_1": "topphaseout", "waste_bottle_2": "top" } }, @@ -879,7 +879,7 @@ "target": "collection_bottle_1", "type": "transport", "port": { - "filter_1": "filtrate_out", + "filter_1": "filtrateout", "collection_bottle_1": "top" } }, @@ -889,7 +889,7 @@ "target": "waste_bottle_1", "type": "transport", "port": { - "filter_1": "retentate_out", + "filter_1": "retentateout", "waste_bottle_1": "top" } } diff --git a/unilabos/compile/evacuateandrefill_protocol.py b/unilabos/compile/evacuateandrefill_protocol.py index 96e057d..aa44df6 100644 --- a/unilabos/compile/evacuateandrefill_protocol.py +++ b/unilabos/compile/evacuateandrefill_protocol.py @@ -5,38 +5,138 @@ from .pump_protocol import generate_pump_protocol_with_rinsing, generate_pump_pr def find_gas_source(G: nx.DiGraph, gas: str) -> str: - """根据气体名称查找对应的气源""" - # 按照命名规则查找气源 + """ + 根据气体名称查找对应的气源,支持多种匹配模式: + 1. 容器名称匹配 + 2. 气体类型匹配(data.gas_type) + 3. 默认气源 + """ + print(f"EVACUATE_REFILL: 正在查找气体 '{gas}' 的气源...") + + # 第一步:通过容器名称匹配 gas_source_patterns = [ f"gas_source_{gas}", f"gas_{gas}", f"flask_{gas}", - f"{gas}_source" + f"{gas}_source", + f"source_{gas}", + f"reagent_bottle_{gas}", + f"bottle_{gas}" ] for pattern in gas_source_patterns: if pattern in G.nodes(): + print(f"EVACUATE_REFILL: 通过名称匹配找到气源: {pattern}") return pattern - # 模糊匹配 - for node in G.nodes(): - node_class = G.nodes[node].get('class', '') or '' - if 'gas_source' in node_class and gas.lower() in node.lower(): - return node - if node.startswith('flask_') and gas.lower() in node.lower(): - return node + # 第二步:通过气体类型匹配 (data.gas_type) + for node_id in G.nodes(): + node_data = G.nodes[node_id] + node_class = node_data.get('class', '') or '' + + # 检查是否是气源设备 + if ('gas_source' in node_class or + 'gas' in node_id.lower() or + node_id.startswith('flask_')): + + # 检查 data.gas_type + data = node_data.get('data', {}) + gas_type = data.get('gas_type', '') + + if gas_type.lower() == gas.lower(): + print(f"EVACUATE_REFILL: 通过气体类型匹配找到气源: {node_id} (gas_type: {gas_type})") + return node_id + + # 检查 config.gas_type + config = node_data.get('config', {}) + config_gas_type = config.get('gas_type', '') + + if config_gas_type.lower() == gas.lower(): + print(f"EVACUATE_REFILL: 通过配置气体类型匹配找到气源: {node_id} (config.gas_type: {config_gas_type})") + return node_id - # 查找所有可用的气源 - available_gas_sources = [ + # 第三步:查找所有可用的气源设备 + available_gas_sources = [] + for node_id in G.nodes(): + node_data = G.nodes[node_id] + node_class = node_data.get('class', '') or '' + + if ('gas_source' in node_class or + 'gas' in node_id.lower() or + (node_id.startswith('flask_') and any(g in node_id.lower() for g in ['air', 'nitrogen', 'argon']))): + + data = node_data.get('data', {}) + gas_type = data.get('gas_type', 'unknown') + available_gas_sources.append(f"{node_id} (gas_type: {gas_type})") + + print(f"EVACUATE_REFILL: 可用气源列表: {available_gas_sources}") + + # 第四步:如果找不到特定气体,使用默认的第一个气源 + default_gas_sources = [ node for node in G.nodes() if ((G.nodes[node].get('class') or '').startswith('virtual_gas_source') - or ('gas' in node and 'source' in node) - or (node.startswith('flask_') and any(g in node.lower() for g in ['air', 'nitrogen', 'argon', 'vacuum']))) + or 'gas_source' in node) ] + if default_gas_sources: + default_source = default_gas_sources[0] + print(f"EVACUATE_REFILL: ⚠️ 未找到特定气体 '{gas}',使用默认气源: {default_source}") + return default_source + raise ValueError(f"找不到气体 '{gas}' 对应的气源。可用气源: {available_gas_sources}") +def find_gas_source_by_any_match(G: nx.DiGraph, gas: str) -> str: + """ + 增强版气源查找,支持各种匹配方式的别名函数 + """ + return find_gas_source(G, gas) + + +def get_gas_source_type(G: nx.DiGraph, gas_source: str) -> str: + """获取气源的气体类型""" + if gas_source not in G.nodes(): + return "unknown" + + node_data = G.nodes[gas_source] + data = node_data.get('data', {}) + config = node_data.get('config', {}) + + # 检查多个可能的字段 + gas_type = (data.get('gas_type') or + config.get('gas_type') or + data.get('gas') or + config.get('gas') or + "air") # 默认为空气 + + return gas_type + + +def find_vessels_by_gas_type(G: nx.DiGraph, gas: str) -> List[str]: + """ + 根据气体类型查找所有匹配的容器/气源 + """ + matching_vessels = [] + + for node_id in G.nodes(): + node_data = G.nodes[node_id] + + # 检查容器名称匹配 + if gas.lower() in node_id.lower(): + matching_vessels.append(f"{node_id} (名称匹配)") + continue + + # 检查气体类型匹配 + data = node_data.get('data', {}) + config = node_data.get('config', {}) + + gas_type = data.get('gas_type', '') or config.get('gas_type', '') + if gas_type.lower() == gas.lower(): + matching_vessels.append(f"{node_id} (gas_type: {gas_type})") + + return matching_vessels + + def find_vacuum_pump(G: nx.DiGraph) -> str: """查找真空泵设备""" vacuum_pumps = [ diff --git a/unilabos/registry/devices/virtual_device.yaml b/unilabos/registry/devices/virtual_device.yaml index 5efc117..953be1a 100644 --- a/unilabos/registry/devices/virtual_device.yaml +++ b/unilabos/registry/devices/virtual_device.yaml @@ -631,7 +631,7 @@ virtual_filter: data_source: handle data_type: transport description: 需要过滤的样品容器 - handler_key: filter_in + handler_key: filterin io_type: target label: filter_in side: NORTH @@ -639,7 +639,7 @@ virtual_filter: data_source: handle data_type: transport description: 滤液出口 - handler_key: filtrate_out + handler_key: filtrateout io_type: source label: filtrate_out side: SOUTH @@ -647,7 +647,7 @@ virtual_filter: data_source: handle data_type: transport description: 滤渣/固体出口 - handler_key: retentate_out + handler_key: retentateout io_type: source label: retentate_out side: EAST @@ -2433,7 +2433,7 @@ virtual_rotavap: data_source: handle data_type: fluid description: 样品连接口 - handler_key: sample_in + handler_key: samplein io_type: target label: sample_in side: NORTH @@ -2441,7 +2441,7 @@ virtual_rotavap: data_source: handle data_type: fluid description: 浓缩产物出口 - handler_key: product_out + handler_key: productout io_type: source label: product_out side: SOUTH @@ -2449,7 +2449,7 @@ virtual_rotavap: data_source: handle data_type: fluid description: 冷凝溶剂出口 - handler_key: solvent_out + handler_key: solventout io_type: source label: solvent_out side: EAST @@ -2774,7 +2774,7 @@ virtual_separator: data_source: handle data_type: fluid description: 需要分离的混合液体输入口 - handler_key: separator_in + handler_key: separatorin io_type: target label: separator_in side: NORTH @@ -2782,7 +2782,7 @@ virtual_separator: data_source: executor data_type: fluid description: 下相(重相)液体输出口 - handler_key: bottom_phase_out + handler_key: bottomphaseout io_type: source label: bottom_phase_out side: SOUTH @@ -2790,7 +2790,7 @@ virtual_separator: data_source: executor data_type: fluid description: 上相(轻相)液体输出口 - handler_key: top_phase_out + handler_key: topphaseout io_type: source label: top_phase_out side: EAST diff --git a/unilabos/registry/devices/work_station.yaml b/unilabos/registry/devices/work_station.yaml index 3b2765b..2866160 100644 --- a/unilabos/registry/devices/work_station.yaml +++ b/unilabos/registry/devices/work_station.yaml @@ -271,7 +271,7 @@ workstation: - data_key: vessel data_source: handle data_type: resource - handler_key: vessel + handler_key: Vessel label: Vessel - data_key: reagent data_source: handle @@ -282,7 +282,7 @@ workstation: - data_key: vessel data_source: executor data_type: resource - handler_key: vessel_out + handler_key: VesselOut label: Vessel result: {} schema: @@ -373,13 +373,13 @@ workstation: - data_key: vessel data_source: handle data_type: resource - handler_key: vessel + handler_key: Vessel label: Vessel output: - data_key: vessel data_source: executor data_type: resource - handler_key: vessel_out + handler_key: VesselOut label: Vessel result: {} schema: @@ -460,7 +460,7 @@ workstation: - data_key: vessel data_source: handle data_type: resource - handler_key: vessel + handler_key: Vessel label: Vessel - data_key: solvent data_source: handle @@ -471,7 +471,7 @@ workstation: - data_key: vessel data_source: executor data_type: resource - handler_key: vessel_out + handler_key: VesselOut label: Vessel result: {} schema: @@ -580,7 +580,7 @@ workstation: - data_key: vessel data_source: handle data_type: resource - handler_key: vessel + handler_key: Vessel label: Vessel - data_key: solvent data_source: handle @@ -591,7 +591,7 @@ workstation: - data_key: vessel data_source: executor data_type: resource - handler_key: vessel_out + handler_key: VesselOut label: Vessel result: {} schema: @@ -675,7 +675,7 @@ workstation: - data_key: vessel data_source: handle data_type: resource - handler_key: vessel + handler_key: Vessel label: Vessel - data_key: solvent data_source: handle @@ -686,7 +686,7 @@ workstation: - data_key: vessel data_source: executor data_type: resource - handler_key: vessel_out + handler_key: VesselOut label: Vessel result: {} schema: @@ -766,13 +766,13 @@ workstation: - data_key: vessel data_source: handle data_type: resource - handler_key: vessel + handler_key: Vessel label: Vessel output: - data_key: vessel data_source: executor data_type: resource - handler_key: vessel_out + handler_key: VesselOut label: Vessel result: {} schema: @@ -875,13 +875,13 @@ workstation: - data_key: vessel data_source: handle data_type: resource - handler_key: vessel + handler_key: Vessel label: Vessel output: - data_key: vessel data_source: executor data_type: resource - handler_key: vessel_out + handler_key: VesselOut label: Vessel result: {} schema: @@ -992,7 +992,7 @@ workstation: - data_key: vessel data_source: handle data_type: resource - handler_key: vessel + handler_key: Vessel label: Vessel - data_key: vessel data_source: handle @@ -1003,7 +1003,7 @@ workstation: - data_key: vessel data_source: executor data_type: resource - handler_key: vessel_out + handler_key: VesselOut label: Vessel - data_key: vessel data_source: executor @@ -1102,12 +1102,12 @@ workstation: - data_key: vessel data_source: handle data_type: resource - handler_key: from_vessel + handler_key: FromVessel label: From Vessel - data_key: vessel data_source: executor data_type: resource - handler_key: to_vessel + handler_key: ToVessel label: To Vessel - data_key: solvent data_source: handle @@ -1118,12 +1118,12 @@ workstation: - data_key: vessel data_source: handle data_type: resource - handler_key: from_vessel_out + handler_key: FromVesselOut label: From Vessel - data_key: vessel data_source: executor data_type: resource - handler_key: to_vessel_out + handler_key: ToVesselOut label: To Vessel result: {} schema: @@ -1211,13 +1211,13 @@ workstation: - data_key: vessel data_source: handle data_type: resource - handler_key: vessel + handler_key: Vessel label: Vessel output: - data_key: vessel data_source: executor data_type: resource - handler_key: vessel_out + handler_key: VesselOut label: Vessel result: {} schema: @@ -1288,13 +1288,13 @@ workstation: - data_key: vessel data_source: handle data_type: resource - handler_key: vessel + handler_key: Vessel label: Vessel output: - data_key: vessel data_source: executor data_type: resource - handler_key: vessel_out + handler_key: VesselOut label: Vessel result: {} schema: @@ -1352,13 +1352,13 @@ workstation: - data_key: vessel data_source: handle data_type: resource - handler_key: vessel + handler_key: Vessel label: Vessel output: - data_key: vessel data_source: executor data_type: resource - handler_key: vessel_out + handler_key: VesselOut label: Vessel result: {} schema: @@ -1428,12 +1428,12 @@ workstation: - data_key: vessel data_source: handle data_type: resource - handler_key: from_vessel + handler_key: FromVessel label: From Vessel - data_key: vessel data_source: executor data_type: resource - handler_key: to_vessel + handler_key: ToVessel label: To Vessel - data_key: solvent data_source: handle @@ -1444,12 +1444,12 @@ workstation: - data_key: vessel data_source: handle data_type: resource - handler_key: from_vessel_out + handler_key: FromVesselOut label: From Vessel - data_key: vessel data_source: executor data_type: resource - handler_key: to_vessel_out + handler_key: ToVesselOut label: To Vessel result: {} schema: @@ -1569,23 +1569,23 @@ workstation: - data_key: vessel data_source: handle data_type: resource - handler_key: from_vessel + handler_key: FromVessel label: From Vessel - data_key: vessel data_source: executor data_type: resource - handler_key: to_vessel + handler_key: ToVessel label: To Vessel output: - data_key: vessel data_source: handle data_type: resource - handler_key: from_vessel_out + handler_key: FromVesselOut label: From Vessel - data_key: vessel data_source: executor data_type: resource - handler_key: to_vessel_out + handler_key: ToVesselOut label: To Vessel result: {} schema: @@ -1673,12 +1673,12 @@ workstation: - data_key: vessel data_source: handle data_type: resource - handler_key: from_vessel + handler_key: FromVessel label: From Vessel - data_key: vessel data_source: executor data_type: resource - handler_key: to_vessel + handler_key: ToVessel label: To Vessel - data_key: solvent data_source: handle @@ -1689,12 +1689,12 @@ workstation: - data_key: vessel data_source: handle data_type: resource - handler_key: from_vessel_out + handler_key: FromVesselOut label: From Vessel - data_key: vessel data_source: executor data_type: resource - handler_key: to_vessel_out + handler_key: ToVesselOut label: To Vessel result: {} schema: @@ -1823,13 +1823,13 @@ workstation: - data_key: vessel data_source: handle data_type: resource - handler_key: vessel + handler_key: Vessel label: Vessel output: - data_key: vessel data_source: executor data_type: resource - handler_key: vessel_out + handler_key: VesselOut label: Vessel result: {} schema: @@ -1900,13 +1900,13 @@ workstation: - data_key: vessel data_source: handle data_type: resource - handler_key: vessel + handler_key: Vessel label: Vessel output: - data_key: vessel data_source: executor data_type: resource - handler_key: vessel_out + handler_key: VesselOut label: Vessel result: {} schema: @@ -1964,13 +1964,13 @@ workstation: - data_key: vessel data_source: handle data_type: resource - handler_key: vessel + handler_key: Vessel label: Vessel output: - data_key: vessel data_source: executor data_type: resource - handler_key: vessel_out + handler_key: VesselOut label: Vessel result: {} schema: @@ -2046,12 +2046,12 @@ workstation: - data_key: vessel data_source: handle data_type: resource - handler_key: from_vessel + handler_key: FromVessel label: From Vessel - data_key: vessel data_source: executor data_type: resource - handler_key: to_vessel + handler_key: ToVessel label: To Vessel - data_key: solvent data_source: handle @@ -2062,12 +2062,12 @@ workstation: - data_key: vessel data_source: handle data_type: resource - handler_key: from_vessel_out + handler_key: FromVesselOut label: From Vessel - data_key: vessel data_source: executor data_type: resource - handler_key: to_vessel_out + handler_key: ToVesselOut label: To Vessel result: {} schema: @@ -2173,7 +2173,7 @@ workstation: - data_key: vessel data_source: handle data_type: resource - handler_key: vessel + handler_key: Vessel label: Vessel - data_key: solvent data_source: handle @@ -2189,7 +2189,7 @@ workstation: - data_key: vessel data_source: handle data_type: resource - handler_key: vessel_out + handler_key: VesselOut label: Vessel Out - data_key: vessel data_source: executor From 7714c71cd23ce3286d18ea397f15b9c756908b66 Mon Sep 17 00:00:00 2001 From: Junhan Chang Date: Sun, 29 Jun 2025 17:35:32 +0800 Subject: [PATCH 11/96] add camera and dependency (#56) --- test/experiments/camera.json | 45 ++++++++++++++++++++ unilabos-linux-64.yaml | 3 +- unilabos-osx-arm64.yaml | 3 +- unilabos-win64.yaml | 3 +- unilabos/registry/devices/camera.yaml | 10 +++++ unilabos/ros/nodes/presets/camera.py | 61 +++++++++++++++++++++++++++ 6 files changed, 122 insertions(+), 3 deletions(-) create mode 100644 test/experiments/camera.json create mode 100644 unilabos/registry/devices/camera.yaml create mode 100644 unilabos/ros/nodes/presets/camera.py diff --git a/test/experiments/camera.json b/test/experiments/camera.json new file mode 100644 index 0000000..2d20845 --- /dev/null +++ b/test/experiments/camera.json @@ -0,0 +1,45 @@ +{ + "nodes": [ + { + "id": "Camera", + "name": "摄像头", + "children": [ + ], + "parent": null, + "type": "device", + "class": "camera", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "camera_index": 0, + "period": 0.05 + }, + "data": { + } + }, + { + "id": "Gripper1", + "name": "假夹爪", + "children": [ + ], + "parent": null, + "type": "device", + "class": "gripper.mock", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + }, + "data": { + } + } + ], + "links": [ + + ] +} \ No newline at end of file diff --git a/unilabos-linux-64.yaml b/unilabos-linux-64.yaml index aeac636..d2f6df1 100644 --- a/unilabos-linux-64.yaml +++ b/unilabos-linux-64.yaml @@ -48,8 +48,9 @@ dependencies: - ros-humble-ros2-control - ros-humble-robot-state-publisher - ros-humble-joint-state-publisher - # web + # web and visualization - ros-humble-rosbridge-server + - ros-humble-cv-bridge # geometry & motion planning - ros-humble-tf2 - ros-humble-moveit diff --git a/unilabos-osx-arm64.yaml b/unilabos-osx-arm64.yaml index 83ffe1b..391e818 100644 --- a/unilabos-osx-arm64.yaml +++ b/unilabos-osx-arm64.yaml @@ -50,8 +50,9 @@ dependencies: - ros-humble-ros2-control - ros-humble-robot-state-publisher - ros-humble-joint-state-publisher - # web + # web and visualization - ros-humble-rosbridge-server + - ros-humble-cv-bridge # geometry & motion planning - ros-humble-tf2 - ros-humble-moveit diff --git a/unilabos-win64.yaml b/unilabos-win64.yaml index 9ae2243..93f6332 100644 --- a/unilabos-win64.yaml +++ b/unilabos-win64.yaml @@ -48,8 +48,9 @@ dependencies: - ros-humble-ros2-control - ros-humble-robot-state-publisher - ros-humble-joint-state-publisher - # web + # web and visualization - ros-humble-rosbridge-server + - ros-humble-cv-bridge # geometry & motion planning - ros-humble-tf2 - ros-humble-moveit diff --git a/unilabos/registry/devices/camera.yaml b/unilabos/registry/devices/camera.yaml new file mode 100644 index 0000000..241576e --- /dev/null +++ b/unilabos/registry/devices/camera.yaml @@ -0,0 +1,10 @@ +camera: + class: + action_value_mappings: {} + module: unilabos.ros.nodes.presets.camera:VideoPublisher + status_types: {} + type: ros2 + description: '' + handles: [] + icon: '' + init_param_schema: {} diff --git a/unilabos/ros/nodes/presets/camera.py b/unilabos/ros/nodes/presets/camera.py new file mode 100644 index 0000000..e161671 --- /dev/null +++ b/unilabos/ros/nodes/presets/camera.py @@ -0,0 +1,61 @@ +import rclpy +from rclpy.node import Node +import cv2 +from sensor_msgs.msg import Image +from cv_bridge import CvBridge +from unilabos.ros.nodes.base_device_node import BaseROS2DeviceNode, DeviceNodeResourceTracker + +class VideoPublisher(BaseROS2DeviceNode): + def __init__(self, device_id='video_publisher', camera_index=0, period: float = 0.1, resource_tracker: DeviceNodeResourceTracker = None): + # 初始化BaseROS2DeviceNode,使用自身作为driver_instance + BaseROS2DeviceNode.__init__( + self, + driver_instance=self, + device_id=device_id, + status_types={}, + action_value_mappings={}, + hardware_interface="camera", + print_publish=False, + resource_tracker=resource_tracker, + ) + # 创建一个发布者,发布到 /video 话题,消息类型为 sensor_msgs/Image,队列长度设为 10 + self.publisher_ = self.create_publisher(Image, f'/{device_id}/video', 10) + # 初始化摄像头(默认设备索引为 0) + self.cap = cv2.VideoCapture(camera_index) + if not self.cap.isOpened(): + self.get_logger().error("无法打开摄像头") + # 用于将 OpenCV 的图像转换为 ROS 图像消息 + self.bridge = CvBridge() + # 设置定时器,10 Hz 发布一次 + timer_period = period # 单位:秒 + self.timer = self.create_timer(timer_period, self.timer_callback) + + def timer_callback(self): + ret, frame = self.cap.read() + if not ret: + self.get_logger().error("读取视频帧失败") + return + # 将 OpenCV 图像转换为 ROS Image 消息,注意图像编码需与摄像头数据匹配,这里使用 bgr8 + img_msg = self.bridge.cv2_to_imgmsg(frame, encoding="bgr8") + self.publisher_.publish(img_msg) + # self.get_logger().info("已发布视频帧") + + def destroy_node(self): + # 释放摄像头资源 + if self.cap.isOpened(): + self.cap.release() + super().destroy_node() + +def main(args=None): + rclpy.init(args=args) + node = VideoPublisher() + try: + rclpy.spin(node) + except KeyboardInterrupt: + pass + finally: + node.destroy_node() + rclpy.shutdown() + +if __name__ == '__main__': + main() From 09ad9052807c7c9428f2e5a5df841528f60b4a1d Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Sun, 29 Jun 2025 19:12:32 +0800 Subject: [PATCH 12/96] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dauto-=E7=9A=84Action?= =?UTF-8?q?=E5=9C=A8protocol=20node=E4=B8=8B=E9=94=99=E8=AF=AF=E6=B3=A8?= =?UTF-8?q?=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- unilabos/ros/nodes/presets/protocol_node.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/unilabos/ros/nodes/presets/protocol_node.py b/unilabos/ros/nodes/presets/protocol_node.py index 380bfff..f8921da 100644 --- a/unilabos/ros/nodes/presets/protocol_node.py +++ b/unilabos/ros/nodes/presets/protocol_node.py @@ -17,7 +17,7 @@ from unilabos.ros.msgs.message_converter import ( get_action_type, convert_to_ros_msg, convert_from_ros_msg, - convert_from_ros_msg_with_mapping, + convert_from_ros_msg_with_mapping, String, ) from unilabos.ros.nodes.base_device_node import BaseROS2DeviceNode, DeviceNodeResourceTracker, ROS2DeviceNode from unilabos.utils.log import error @@ -75,7 +75,7 @@ class ROS2ProtocolNode(BaseROS2DeviceNode): try: d = self.initialize_device(device_id, device_config) except Exception as ex: - self.lab_logger().error(f"[Protocol Node] Failed to initialize device {device_id}: {ex}") + self.lab_logger().error(f"[Protocol Node] Failed to initialize device {device_id}: {ex}\n{traceback.format_exc()}") d = None if d is None: continue @@ -134,11 +134,17 @@ class ROS2ProtocolNode(BaseROS2DeviceNode): if d is not None and hasattr(d, "ros_node_instance"): node = d.ros_node_instance for action_name, action_mapping in node._action_value_mappings.items(): + if action_name.startswith("auto-"): + continue action_id = f"/devices/{device_id_abs}/{action_name}" if action_id not in self._action_clients: - self._action_clients[action_id] = ActionClient( - self, action_mapping["type"], action_id, callback_group=self.callback_group - ) + try: + self._action_clients[action_id] = ActionClient( + self, action_mapping["type"], action_id, callback_group=self.callback_group + ) + except Exception as ex: + self.lab_logger().error(f"创建动作客户端失败: {action_id}, 错误: {ex}") + continue self.lab_logger().debug(f"为子设备 {device_id} 创建动作客户端: {action_name}") return d From e7521972e47e5dc2f7309d0a38b514713a8f1b53 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Mon, 30 Jun 2025 12:29:30 +0800 Subject: [PATCH 13/96] =?UTF-8?q?=E5=8C=B9=E9=85=8Dinit=20param=20schema?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- unilabos/registry/device_comms/serial.yaml | 65 +- unilabos/registry/devices/camera.yaml | 63 +- .../devices/characterization_optic.yaml | 166 +-- unilabos/registry/devices/hotel.yaml | 38 +- .../registry/devices/laiyu_add_solid.yaml | 102 +- unilabos/registry/devices/liquid_handler.yaml | 324 ++--- unilabos/registry/devices/mock_devices.yaml | 976 +++++++------ unilabos/registry/devices/moveit_config.yaml | 218 +-- .../devices/organic_miscellaneous.yaml | 145 +- unilabos/registry/devices/pump_and_valve.yaml | 299 ++-- unilabos/registry/devices/robot_agv.yaml | 48 +- unilabos/registry/devices/robot_arm.yaml | 75 +- unilabos/registry/devices/robot_gripper.yaml | 193 +-- .../registry/devices/robot_linear_motion.yaml | 162 +-- unilabos/registry/devices/sim_nodes.yaml | 120 +- unilabos/registry/devices/temperature.yaml | 251 ++-- .../registry/devices/vacuum_and_purge.yaml | 114 +- unilabos/registry/devices/virtual_device.yaml | 1215 ++++++++--------- unilabos/registry/devices/work_station.yaml | 79 +- unilabos/registry/devices/zhida_hplc.yaml | 69 +- unilabos/registry/registry.py | 116 +- unilabos/utils/import_manager.py | 32 +- 22 files changed, 2261 insertions(+), 2609 deletions(-) diff --git a/unilabos/registry/device_comms/serial.yaml b/unilabos/registry/device_comms/serial.yaml index 3ed9b6b..97e6051 100644 --- a/unilabos/registry/device_comms/serial.yaml +++ b/unilabos/registry/device_comms/serial.yaml @@ -10,17 +10,14 @@ serial: handles: [] result: {} schema: - description: UniLabJsonCommand handle_serial_request 的参数schema + description: handle_serial_request的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand handle_serial_request 的参数schema properties: request: - description: '参数: request' type: string response: - description: '参数: response' type: string required: - request @@ -29,7 +26,7 @@ serial: result: {} required: - goal - title: handle_serial_request 命令参数 + title: handle_serial_request参数 type: object type: UniLabJsonCommand auto-read_data: @@ -39,18 +36,17 @@ serial: handles: [] result: {} schema: - description: UniLabJsonCommand read_data 的参数schema + description: read_data的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand read_data 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: read_data 命令参数 + title: read_data参数 type: object type: UniLabJsonCommand auto-send_command: @@ -61,14 +57,12 @@ serial: handles: [] result: {} schema: - description: UniLabJsonCommand send_command 的参数schema + description: send_command的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand send_command 的参数schema properties: command: - description: '参数: command' type: string required: - command @@ -76,7 +70,7 @@ serial: result: {} required: - goal - title: send_command 命令参数 + title: send_command参数 type: object type: UniLabJsonCommand module: unilabos.ros.nodes.presets.serial_node:ROS2SerialNode @@ -87,31 +81,22 @@ serial: handles: [] icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - baudrate: - default: 9600 - description: '参数: baudrate' - type: integer - device_id: - description: '参数: device_id' - type: string - port: - description: '参数: port' - type: string - resource_tracker: - description: '参数: resource_tracker' - type: string - required: - - device_id - - port - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + baudrate: + default: 9600 + type: integer + device_id: + type: string + port: + type: string + resource_tracker: + type: string + required: + - device_id + - port + type: object + data: + properties: {} + required: [] + type: object diff --git a/unilabos/registry/devices/camera.yaml b/unilabos/registry/devices/camera.yaml index 241576e..55f5246 100644 --- a/unilabos/registry/devices/camera.yaml +++ b/unilabos/registry/devices/camera.yaml @@ -1,10 +1,69 @@ camera: class: - action_value_mappings: {} + action_value_mappings: + auto-destroy_node: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: destroy_node的参数schema + properties: + feedback: {} + goal: + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: destroy_node参数 + type: object + type: UniLabJsonCommand + auto-timer_callback: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: timer_callback的参数schema + properties: + feedback: {} + goal: + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: timer_callback参数 + type: object + type: UniLabJsonCommand module: unilabos.ros.nodes.presets.camera:VideoPublisher status_types: {} type: ros2 description: '' handles: [] icon: '' - init_param_schema: {} + init_param_schema: + config: + properties: + camera_index: + default: 0 + type: string + device_id: + default: video_publisher + type: string + period: + default: 0.1 + type: number + resource_tracker: + type: string + required: [] + type: object + data: + properties: {} + required: [] + type: object diff --git a/unilabos/registry/devices/characterization_optic.yaml b/unilabos/registry/devices/characterization_optic.yaml index 06f9bfa..a7fd543 100644 --- a/unilabos/registry/devices/characterization_optic.yaml +++ b/unilabos/registry/devices/characterization_optic.yaml @@ -8,18 +8,17 @@ hplc.agilent: handles: [] result: {} schema: - description: UniLabJsonCommand check_status 的参数schema + description: check_status的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand check_status 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: check_status 命令参数 + title: check_status参数 type: object type: UniLabJsonCommand auto-extract_data_from_txt: @@ -30,14 +29,12 @@ hplc.agilent: handles: [] result: {} schema: - description: UniLabJsonCommand extract_data_from_txt 的参数schema + description: extract_data_from_txt的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand extract_data_from_txt 的参数schema properties: file_path: - description: '参数: file_path' type: string required: - file_path @@ -45,7 +42,7 @@ hplc.agilent: result: {} required: - goal - title: extract_data_from_txt 命令参数 + title: extract_data_from_txt参数 type: object type: UniLabJsonCommand auto-start_sequence: @@ -58,20 +55,16 @@ hplc.agilent: handles: [] result: {} schema: - description: UniLabJsonCommand start_sequence 的参数schema + description: start_sequence的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand start_sequence 的参数schema properties: params: - description: '参数: params' type: string resource: - description: '参数: resource' type: object wf_name: - description: '参数: wf_name' type: string required: - wf_name @@ -79,7 +72,7 @@ hplc.agilent: result: {} required: - goal - title: start_sequence 命令参数 + title: start_sequence参数 type: object type: UniLabJsonCommand auto-try_close_sub_device: @@ -90,21 +83,19 @@ hplc.agilent: handles: [] result: {} schema: - description: UniLabJsonCommand try_close_sub_device 的参数schema + description: try_close_sub_device的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand try_close_sub_device 的参数schema properties: device_name: - description: '参数: device_name' type: string required: [] type: object result: {} required: - goal - title: try_close_sub_device 命令参数 + title: try_close_sub_device参数 type: object type: UniLabJsonCommand auto-try_open_sub_device: @@ -115,21 +106,19 @@ hplc.agilent: handles: [] result: {} schema: - description: UniLabJsonCommand try_open_sub_device 的参数schema + description: try_open_sub_device的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand try_open_sub_device 的参数schema properties: device_name: - description: '参数: device_name' type: string required: [] type: object result: {} required: - goal - title: try_open_sub_device 命令参数 + title: try_open_sub_device参数 type: object type: UniLabJsonCommand execute_command_from_outer: @@ -194,23 +183,41 @@ hplc.agilent: handles: [] icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - driver_debug: - default: false - description: '参数: driver_debug' - type: boolean - required: [] - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + driver_debug: + default: false + type: string + required: [] + type: object + data: + properties: + could_run: + type: boolean + data_file: + type: array + device_status: + type: string + driver_init_ok: + type: boolean + finish_status: + type: string + is_running: + type: boolean + status_text: + type: string + success: + type: boolean + required: + - status_text + - device_status + - could_run + - driver_init_ok + - is_running + - success + - finish_status + - data_file + type: object raman_home_made: class: action_value_mappings: @@ -222,14 +229,12 @@ raman_home_made: handles: [] result: {} schema: - description: UniLabJsonCommand ccd_time 的参数schema + description: ccd_time的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand ccd_time 的参数schema properties: int_time: - description: '参数: int_time' type: string required: - int_time @@ -237,7 +242,7 @@ raman_home_made: result: {} required: - goal - title: ccd_time 命令参数 + title: ccd_time参数 type: object type: UniLabJsonCommand auto-laser_on_power: @@ -248,14 +253,12 @@ raman_home_made: handles: [] result: {} schema: - description: UniLabJsonCommand laser_on_power 的参数schema + description: laser_on_power的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand laser_on_power 的参数schema properties: output_voltage_laser: - description: '参数: output_voltage_laser' type: string required: - output_voltage_laser @@ -263,7 +266,7 @@ raman_home_made: result: {} required: - goal - title: laser_on_power 命令参数 + title: laser_on_power参数 type: object type: UniLabJsonCommand auto-raman_cmd: @@ -274,14 +277,12 @@ raman_home_made: handles: [] result: {} schema: - description: UniLabJsonCommand raman_cmd 的参数schema + description: raman_cmd的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand raman_cmd 的参数schema properties: command: - description: '参数: command' type: string required: - command @@ -289,7 +290,7 @@ raman_home_made: result: {} required: - goal - title: raman_cmd 命令参数 + title: raman_cmd参数 type: object type: UniLabJsonCommand auto-raman_without_background: @@ -301,17 +302,14 @@ raman_home_made: handles: [] result: {} schema: - description: UniLabJsonCommand raman_without_background 的参数schema + description: raman_without_background的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand raman_without_background 的参数schema properties: int_time: - description: '参数: int_time' type: string laser_power: - description: '参数: laser_power' type: string required: - int_time @@ -320,7 +318,7 @@ raman_home_made: result: {} required: - goal - title: raman_without_background 命令参数 + title: raman_without_background参数 type: object type: UniLabJsonCommand auto-raman_without_background_average: @@ -334,23 +332,18 @@ raman_home_made: handles: [] result: {} schema: - description: UniLabJsonCommand raman_without_background_average 的参数schema + description: raman_without_background_average的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand raman_without_background_average 的参数schema properties: average: - description: '参数: average' type: string int_time: - description: '参数: int_time' type: string laser_power: - description: '参数: laser_power' type: string sample_name: - description: '参数: sample_name' type: string required: - sample_name @@ -361,7 +354,7 @@ raman_home_made: result: {} required: - goal - title: raman_without_background_average 命令参数 + title: raman_without_background_average参数 type: object type: UniLabJsonCommand raman_cmd: @@ -418,32 +411,23 @@ raman_home_made: handles: [] icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - baudrate_ccd: - default: 921600 - description: '参数: baudrate_ccd' - type: integer - baudrate_laser: - default: 9600 - description: '参数: baudrate_laser' - type: integer - port_ccd: - description: '参数: port_ccd' - type: string - port_laser: - description: '参数: port_laser' - type: string - required: - - port_laser - - port_ccd - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + baudrate_ccd: + default: 921600 + type: string + baudrate_laser: + default: 9600 + type: string + port_ccd: + type: string + port_laser: + type: string + required: + - port_laser + - port_ccd + type: object + data: + properties: {} + required: [] + type: object diff --git a/unilabos/registry/devices/hotel.yaml b/unilabos/registry/devices/hotel.yaml index bfd0090..e5cfc06 100644 --- a/unilabos/registry/devices/hotel.yaml +++ b/unilabos/registry/devices/hotel.yaml @@ -9,27 +9,23 @@ hotel.thermo_orbitor_rs2_hotel: handles: [] icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - device_config: - description: '参数: device_config' - type: object - rotation: - description: '参数: rotation' - type: object - required: - - rotation - - device_config - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + device_config: + type: object + rotation: + type: object + required: + - rotation + - device_config + type: object + data: + properties: + rotation: + type: string + required: + - rotation + type: object model: mesh: thermo_orbitor_rs2_hotel type: device diff --git a/unilabos/registry/devices/laiyu_add_solid.yaml b/unilabos/registry/devices/laiyu_add_solid.yaml index 8e1e7be..02b8014 100644 --- a/unilabos/registry/devices/laiyu_add_solid.yaml +++ b/unilabos/registry/devices/laiyu_add_solid.yaml @@ -70,20 +70,16 @@ laiyu_add_solid: handles: [] result: {} schema: - description: UniLabJsonCommand add_powder_tube 的参数schema + description: add_powder_tube的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand add_powder_tube 的参数schema properties: compound_mass: - description: '参数: compound_mass' type: string powder_tube_number: - description: '参数: powder_tube_number' type: string target_tube_position: - description: '参数: target_tube_position' type: string required: - powder_tube_number @@ -93,7 +89,7 @@ laiyu_add_solid: result: {} required: - goal - title: add_powder_tube 命令参数 + title: add_powder_tube参数 type: object type: UniLabJsonCommand auto-calculate_crc: @@ -104,14 +100,12 @@ laiyu_add_solid: handles: [] result: {} schema: - description: UniLabJsonCommand calculate_crc 的参数schema + description: calculate_crc的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand calculate_crc 的参数schema properties: data: - description: '参数: data' type: string required: - data @@ -119,7 +113,7 @@ laiyu_add_solid: result: {} required: - goal - title: calculate_crc 命令参数 + title: calculate_crc参数 type: object type: UniLabJsonCommand auto-discharge: @@ -130,14 +124,12 @@ laiyu_add_solid: handles: [] result: {} schema: - description: UniLabJsonCommand discharge 的参数schema + description: discharge的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand discharge 的参数schema properties: float_in: - description: '参数: float_in' type: number required: - float_in @@ -145,7 +137,7 @@ laiyu_add_solid: result: {} required: - goal - title: discharge 命令参数 + title: discharge参数 type: object type: UniLabJsonCommand auto-move_to_plate: @@ -156,14 +148,12 @@ laiyu_add_solid: handles: [] result: {} schema: - description: UniLabJsonCommand move_to_plate 的参数schema + description: move_to_plate的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand move_to_plate 的参数schema properties: string: - description: '参数: string' type: string required: - string @@ -171,7 +161,7 @@ laiyu_add_solid: result: {} required: - goal - title: move_to_plate 命令参数 + title: move_to_plate参数 type: object type: UniLabJsonCommand auto-move_to_xyz: @@ -184,20 +174,16 @@ laiyu_add_solid: handles: [] result: {} schema: - description: UniLabJsonCommand move_to_xyz 的参数schema + description: move_to_xyz的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand move_to_xyz 的参数schema properties: x: - description: '参数: x' type: number y: - description: '参数: y' type: number z: - description: '参数: z' type: number required: - x @@ -207,7 +193,7 @@ laiyu_add_solid: result: {} required: - goal - title: move_to_xyz 命令参数 + title: move_to_xyz参数 type: object type: UniLabJsonCommand auto-pick_powder_tube: @@ -218,14 +204,12 @@ laiyu_add_solid: handles: [] result: {} schema: - description: UniLabJsonCommand pick_powder_tube 的参数schema + description: pick_powder_tube的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand pick_powder_tube 的参数schema properties: int_input: - description: '参数: int_input' type: integer required: - int_input @@ -233,7 +217,7 @@ laiyu_add_solid: result: {} required: - goal - title: pick_powder_tube 命令参数 + title: pick_powder_tube参数 type: object type: UniLabJsonCommand auto-put_powder_tube: @@ -244,14 +228,12 @@ laiyu_add_solid: handles: [] result: {} schema: - description: UniLabJsonCommand put_powder_tube 的参数schema + description: put_powder_tube的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand put_powder_tube 的参数schema properties: int_input: - description: '参数: int_input' type: integer required: - int_input @@ -259,7 +241,7 @@ laiyu_add_solid: result: {} required: - goal - title: put_powder_tube 命令参数 + title: put_powder_tube参数 type: object type: UniLabJsonCommand auto-reset: @@ -269,18 +251,17 @@ laiyu_add_solid: handles: [] result: {} schema: - description: UniLabJsonCommand reset 的参数schema + description: reset的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand reset 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: reset 命令参数 + title: reset参数 type: object type: UniLabJsonCommand auto-send_command: @@ -291,14 +272,12 @@ laiyu_add_solid: handles: [] result: {} schema: - description: UniLabJsonCommand send_command 的参数schema + description: send_command的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand send_command 的参数schema properties: command: - description: '参数: command' type: string required: - command @@ -306,7 +285,7 @@ laiyu_add_solid: result: {} required: - goal - title: send_command 命令参数 + title: send_command参数 type: object type: UniLabJsonCommand discharge: @@ -581,28 +560,23 @@ laiyu_add_solid: handles: [] icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - baudrate: - default: 115200 - description: '参数: baudrate' - type: integer - port: - description: '参数: port' - type: string - timeout: - default: 0.5 - description: '参数: timeout' - type: number - required: - - port - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + baudrate: + default: 115200 + type: string + port: + type: string + timeout: + default: 0.5 + type: string + required: + - port + type: object + data: + properties: + status: + type: string + required: + - status + type: object diff --git a/unilabos/registry/devices/liquid_handler.yaml b/unilabos/registry/devices/liquid_handler.yaml index f431b49..ea14223 100644 --- a/unilabos/registry/devices/liquid_handler.yaml +++ b/unilabos/registry/devices/liquid_handler.yaml @@ -578,65 +578,47 @@ liquid_handler: handles: [] result: {} schema: - description: UniLabJsonCommand add_liquid 的参数schema + description: add_liquid的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand add_liquid 的参数schema properties: asp_vols: - description: '参数: asp_vols' type: string blow_out_air_volume: - description: '参数: blow_out_air_volume' type: string delays: - description: '参数: delays' type: string dis_vols: - description: '参数: dis_vols' type: string flow_rates: - description: '参数: flow_rates' type: string is_96_well: default: false - description: '参数: is_96_well' type: boolean liquid_height: - description: '参数: liquid_height' type: string mix_liquid_height: - description: '参数: mix_liquid_height' type: string mix_rate: - description: '参数: mix_rate' type: string mix_time: - description: '参数: mix_time' type: string mix_vol: - description: '参数: mix_vol' type: string none_keys: default: [] - description: '参数: none_keys' type: string offsets: - description: '参数: offsets' type: string reagent_sources: - description: '参数: reagent_sources' type: string spread: default: wide - description: '参数: spread' type: string targets: - description: '参数: targets' type: string use_channels: - description: '参数: use_channels' type: string required: - asp_vols @@ -647,7 +629,7 @@ liquid_handler: result: {} required: - goal - title: add_liquid 命令参数 + title: add_liquid参数 type: object type: UniLabJsonCommandAsync auto-create_protocol: @@ -664,33 +646,25 @@ liquid_handler: handles: [] result: {} schema: - description: UniLabJsonCommand create_protocol 的参数schema + description: create_protocol的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand create_protocol 的参数schema properties: none_keys: default: [] - description: '参数: none_keys' type: string protocol_author: - description: '参数: protocol_author' type: string protocol_date: - description: '参数: protocol_date' type: string protocol_description: - description: '参数: protocol_description' type: string protocol_name: - description: '参数: protocol_name' type: string protocol_type: - description: '参数: protocol_type' type: string protocol_version: - description: '参数: protocol_version' type: string required: - protocol_name @@ -703,7 +677,7 @@ liquid_handler: result: {} required: - goal - title: create_protocol 命令参数 + title: create_protocol参数 type: object type: UniLabJsonCommandAsync auto-custom_delay: @@ -715,25 +689,22 @@ liquid_handler: handles: [] result: {} schema: - description: UniLabJsonCommand custom_delay 的参数schema + description: custom_delay的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand custom_delay 的参数schema properties: msg: - description: '参数: msg' type: string seconds: default: 0 - description: '参数: seconds' type: string required: [] type: object result: {} required: - goal - title: custom_delay 命令参数 + title: custom_delay参数 type: object type: UniLabJsonCommandAsync auto-iter_tips: @@ -744,14 +715,12 @@ liquid_handler: handles: [] result: {} schema: - description: UniLabJsonCommand iter_tips 的参数schema + description: iter_tips的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand iter_tips 的参数schema properties: tip_racks: - description: '参数: tip_racks' type: string required: - tip_racks @@ -759,7 +728,7 @@ liquid_handler: result: {} required: - goal - title: iter_tips 命令参数 + title: iter_tips参数 type: object type: UniLabJsonCommand auto-mix: @@ -776,33 +745,25 @@ liquid_handler: handles: [] result: {} schema: - description: UniLabJsonCommand mix 的参数schema + description: mix的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand mix 的参数schema properties: height_to_bottom: - description: '参数: height_to_bottom' type: string mix_rate: - description: '参数: mix_rate' type: string mix_time: - description: '参数: mix_time' type: integer mix_vol: - description: '参数: mix_vol' type: string none_keys: default: [] - description: '参数: none_keys' type: string offsets: - description: '参数: offsets' type: string targets: - description: '参数: targets' type: string required: - targets @@ -810,7 +771,7 @@ liquid_handler: result: {} required: - goal - title: mix 命令参数 + title: mix参数 type: object type: UniLabJsonCommandAsync auto-move_to: @@ -823,22 +784,18 @@ liquid_handler: handles: [] result: {} schema: - description: UniLabJsonCommand move_to 的参数schema + description: move_to的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand move_to 的参数schema properties: channel: default: 0 - description: '参数: channel' type: integer dis_to_top: default: 0 - description: '参数: dis_to_top' type: number well: - description: '参数: well' type: string required: - well @@ -846,7 +803,7 @@ liquid_handler: result: {} required: - goal - title: move_to 命令参数 + title: move_to参数 type: object type: UniLabJsonCommandAsync auto-remove_liquid: @@ -869,53 +826,39 @@ liquid_handler: handles: [] result: {} schema: - description: UniLabJsonCommand remove_liquid 的参数schema + description: remove_liquid的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand remove_liquid 的参数schema properties: blow_out_air_volume: - description: '参数: blow_out_air_volume' type: string delays: - description: '参数: delays' type: string flow_rates: - description: '参数: flow_rates' type: string is_96_well: default: false - description: '参数: is_96_well' type: string liquid_height: - description: '参数: liquid_height' type: string none_keys: default: [] - description: '参数: none_keys' type: string offsets: - description: '参数: offsets' type: string sources: - description: '参数: sources' type: string spread: default: wide - description: '参数: spread' type: string top: - description: '参数: top' type: string use_channels: - description: '参数: use_channels' type: string vols: - description: '参数: vols' type: string waste_liquid: - description: '参数: waste_liquid' type: string required: - vols @@ -924,7 +867,7 @@ liquid_handler: result: {} required: - goal - title: remove_liquid 命令参数 + title: remove_liquid参数 type: object type: UniLabJsonCommandAsync auto-set_tiprack: @@ -935,14 +878,12 @@ liquid_handler: handles: [] result: {} schema: - description: UniLabJsonCommand set_tiprack 的参数schema + description: set_tiprack的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_tiprack 的参数schema properties: tip_racks: - description: '参数: tip_racks' type: string required: - tip_racks @@ -950,7 +891,7 @@ liquid_handler: result: {} required: - goal - title: set_tiprack 命令参数 + title: set_tiprack参数 type: object type: UniLabJsonCommand auto-touch_tip: @@ -961,14 +902,12 @@ liquid_handler: handles: [] result: {} schema: - description: UniLabJsonCommand touch_tip 的参数schema + description: touch_tip的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand touch_tip 的参数schema properties: targets: - description: '参数: targets' type: string required: - targets @@ -976,7 +915,7 @@ liquid_handler: result: {} required: - goal - title: touch_tip 命令参数 + title: touch_tip参数 type: object type: UniLabJsonCommandAsync auto-transfer_liquid: @@ -1007,79 +946,57 @@ liquid_handler: handles: [] result: {} schema: - description: UniLabJsonCommand transfer_liquid 的参数schema + description: transfer_liquid的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand transfer_liquid 的参数schema properties: asp_flow_rates: - description: '参数: asp_flow_rates' type: string asp_vols: - description: '参数: asp_vols' type: string blow_out_air_volume: - description: '参数: blow_out_air_volume' type: string delays: - description: '参数: delays' type: string dis_flow_rates: - description: '参数: dis_flow_rates' type: string dis_vols: - description: '参数: dis_vols' type: string is_96_well: default: false - description: '参数: is_96_well' type: boolean liquid_height: - description: '参数: liquid_height' type: string mix_liquid_height: - description: '参数: mix_liquid_height' type: string mix_rate: - description: '参数: mix_rate' type: string mix_stage: default: none - description: '参数: mix_stage' type: string mix_times: - description: '参数: mix_times' type: string mix_vol: - description: '参数: mix_vol' type: string none_keys: default: [] - description: '参数: none_keys' type: string offsets: - description: '参数: offsets' type: string sources: - description: '参数: sources' type: string spread: default: wide - description: '参数: spread' type: string targets: - description: '参数: targets' type: string tip_racks: - description: '参数: tip_racks' type: string touch_tip: default: false - description: '参数: touch_tip' type: boolean use_channels: - description: '参数: use_channels' type: string required: - sources @@ -1091,7 +1008,7 @@ liquid_handler: result: {} required: - goal - title: transfer_liquid 命令参数 + title: transfer_liquid参数 type: object type: UniLabJsonCommandAsync discard_tips: @@ -4851,27 +4768,20 @@ liquid_handler: label: Liquid Output icon: icon_yiyezhan.webp init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - backend: - description: '参数: backend' - type: string - deck: - description: '参数: deck' - type: string - required: - - backend - - deck - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + backend: + type: string + deck: + type: string + required: + - backend + - deck + type: object + data: + properties: {} + required: [] + type: object liquid_handler.biomek: class: action_value_mappings: @@ -4889,33 +4799,25 @@ liquid_handler.biomek: handles: [] result: {} schema: - description: UniLabJsonCommand create_protocol 的参数schema + description: create_protocol的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand create_protocol 的参数schema properties: none_keys: default: [] - description: '参数: none_keys' type: array protocol_author: - description: '参数: protocol_author' type: string protocol_date: - description: '参数: protocol_date' type: string protocol_description: - description: '参数: protocol_description' type: string protocol_name: - description: '参数: protocol_name' type: string protocol_type: - description: '参数: protocol_type' type: string protocol_version: - description: '参数: protocol_version' type: string required: - protocol_name @@ -4928,7 +4830,7 @@ liquid_handler.biomek: result: {} required: - goal - title: create_protocol 命令参数 + title: create_protocol参数 type: object type: UniLabJsonCommand auto-create_resource: @@ -4946,35 +4848,26 @@ liquid_handler.biomek: handles: [] result: {} schema: - description: UniLabJsonCommand create_resource 的参数schema + description: create_resource的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand create_resource 的参数schema properties: bind_location: - description: '参数: bind_location' type: object bind_parent_id: - description: '参数: bind_parent_id' type: string liquid_input_slot: - description: '参数: liquid_input_slot' type: array liquid_type: - description: '参数: liquid_type' type: array liquid_volume: - description: '参数: liquid_volume' type: array resource_tracker: - description: '参数: resource_tracker' type: string resources: - description: '参数: resources' type: array slot_on_deck: - description: '参数: slot_on_deck' type: integer required: - resource_tracker @@ -4989,7 +4882,7 @@ liquid_handler.biomek: result: {} required: - goal - title: create_resource 命令参数 + title: create_resource参数 type: object type: UniLabJsonCommand auto-incubation_biomek: @@ -5000,14 +4893,12 @@ liquid_handler.biomek: handles: [] result: {} schema: - description: UniLabJsonCommand incubation_biomek 的参数schema + description: incubation_biomek的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand incubation_biomek 的参数schema properties: time: - description: '参数: time' type: integer required: - time @@ -5015,7 +4906,7 @@ liquid_handler.biomek: result: {} required: - goal - title: incubation_biomek 命令参数 + title: incubation_biomek参数 type: object type: UniLabJsonCommand auto-instrument_setup_biomek: @@ -5032,32 +4923,24 @@ liquid_handler.biomek: handles: [] result: {} schema: - description: UniLabJsonCommand instrument_setup_biomek 的参数schema + description: instrument_setup_biomek的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand instrument_setup_biomek 的参数schema properties: class_name: - description: '参数: class_name' type: string id: - description: '参数: id' type: string liquid_input_wells: - description: '参数: liquid_input_wells' type: array liquid_type: - description: '参数: liquid_type' type: array liquid_volume: - description: '参数: liquid_volume' type: array parent: - description: '参数: parent' type: string slot_on_deck: - description: '参数: slot_on_deck' type: string required: - id @@ -5071,7 +4954,7 @@ liquid_handler.biomek: result: {} required: - goal - title: instrument_setup_biomek 命令参数 + title: instrument_setup_biomek参数 type: object type: UniLabJsonCommand auto-move_biomek: @@ -5083,17 +4966,14 @@ liquid_handler.biomek: handles: [] result: {} schema: - description: UniLabJsonCommand move_biomek 的参数schema + description: move_biomek的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand move_biomek 的参数schema properties: source: - description: '参数: source' type: string target: - description: '参数: target' type: string required: - source @@ -5102,7 +4982,7 @@ liquid_handler.biomek: result: {} required: - goal - title: move_biomek 命令参数 + title: move_biomek参数 type: object type: UniLabJsonCommand auto-oscillation_biomek: @@ -5114,17 +4994,14 @@ liquid_handler.biomek: handles: [] result: {} schema: - description: UniLabJsonCommand oscillation_biomek 的参数schema + description: oscillation_biomek的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand oscillation_biomek 的参数schema properties: rpm: - description: '参数: rpm' type: integer time: - description: '参数: time' type: integer required: - rpm @@ -5133,7 +5010,7 @@ liquid_handler.biomek: result: {} required: - goal - title: oscillation_biomek 命令参数 + title: oscillation_biomek参数 type: object type: UniLabJsonCommand auto-run_protocol: @@ -5143,18 +5020,17 @@ liquid_handler.biomek: handles: [] result: {} schema: - description: UniLabJsonCommand run_protocol 的参数schema + description: run_protocol的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand run_protocol 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: run_protocol 命令参数 + title: run_protocol参数 type: object type: UniLabJsonCommand auto-transfer_biomek: @@ -5170,29 +5046,22 @@ liquid_handler.biomek: handles: [] result: {} schema: - description: UniLabJsonCommand transfer_biomek 的参数schema + description: transfer_biomek的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand transfer_biomek 的参数schema properties: aspirate_techniques: - description: '参数: aspirate_techniques' type: string dispense_techniques: - description: '参数: dispense_techniques' type: string source: - description: '参数: source' type: string target: - description: '参数: target' type: string tip_rack: - description: '参数: tip_rack' type: string volume: - description: '参数: volume' type: number required: - source @@ -5205,7 +5074,7 @@ liquid_handler.biomek: result: {} required: - goal - title: transfer_biomek 命令参数 + title: transfer_biomek参数 type: object type: UniLabJsonCommand auto-transfer_liquid: @@ -5236,79 +5105,57 @@ liquid_handler.biomek: handles: [] result: {} schema: - description: UniLabJsonCommand transfer_liquid 的参数schema + description: transfer_liquid的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand transfer_liquid 的参数schema properties: asp_flow_rates: - description: '参数: asp_flow_rates' type: string asp_vols: - description: '参数: asp_vols' type: string blow_out_air_volume: - description: '参数: blow_out_air_volume' type: string delays: - description: '参数: delays' type: string dis_flow_rates: - description: '参数: dis_flow_rates' type: string dis_vols: - description: '参数: dis_vols' type: string is_96_well: default: false - description: '参数: is_96_well' type: boolean liquid_height: - description: '参数: liquid_height' type: string mix_liquid_height: - description: '参数: mix_liquid_height' type: string mix_rate: - description: '参数: mix_rate' type: string mix_stage: default: none - description: '参数: mix_stage' type: string mix_times: - description: '参数: mix_times' type: string mix_vol: - description: '参数: mix_vol' type: string none_keys: default: [] - description: '参数: none_keys' type: array offsets: - description: '参数: offsets' type: string sources: - description: '参数: sources' type: string spread: default: wide - description: '参数: spread' type: string targets: - description: '参数: targets' type: string tip_racks: - description: '参数: tip_racks' type: string touch_tip: default: false - description: '参数: touch_tip' type: boolean use_channels: - description: '参数: use_channels' type: string required: - sources @@ -5320,7 +5167,7 @@ liquid_handler.biomek: result: {} required: - goal - title: transfer_liquid 命令参数 + title: transfer_liquid参数 type: object type: UniLabJsonCommand create_protocol: @@ -6206,27 +6053,17 @@ liquid_handler.biomek: handles: [] icon: icon_yiyezhan.webp init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - args: - description: '参数: args' - type: string - kwargs: - description: '参数: kwargs' - type: string - required: - - args - - kwargs - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: {} + required: [] + type: object + data: + properties: + success: + type: string + required: + - success + type: object liquid_handler.revvity: class: action_value_mappings: @@ -6242,23 +6079,19 @@ liquid_handler.revvity: handles: [] result: {} schema: - description: UniLabJsonCommand run 的参数schema + description: run的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand run 的参数schema properties: file_path: - description: '参数: file_path' type: string params: - description: '参数: params' type: string resource: default: AichemecoHiwo: id: AichemecoHiwo - description: '参数: resource' type: object required: - file_path @@ -6267,7 +6100,7 @@ liquid_handler.revvity: result: {} required: - goal - title: run 命令参数 + title: run参数 type: object type: UniLabJsonCommand run: @@ -6430,16 +6263,17 @@ liquid_handler.revvity: handles: [] icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: {} + required: [] + type: object + data: + properties: + status: + type: string + success: + type: boolean + required: + - success + - status + type: object diff --git a/unilabos/registry/devices/mock_devices.yaml b/unilabos/registry/devices/mock_devices.yaml index cc4db28..4341434 100644 --- a/unilabos/registry/devices/mock_devices.yaml +++ b/unilabos/registry/devices/mock_devices.yaml @@ -8,18 +8,17 @@ mock_chiller: handles: [] result: {} schema: - description: UniLabJsonCommand emergency_stop 的参数schema + description: emergency_stop的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand emergency_stop 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: emergency_stop 命令参数 + title: emergency_stop参数 type: object type: UniLabJsonCommand auto-heat_chill_start: @@ -32,20 +31,16 @@ mock_chiller: handles: [] result: {} schema: - description: UniLabJsonCommand heat_chill_start 的参数schema + description: heat_chill_start的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand heat_chill_start 的参数schema properties: purpose: - description: '参数: purpose' type: string temp: - description: '参数: temp' type: number vessel: - description: '参数: vessel' type: string required: - vessel @@ -55,7 +50,7 @@ mock_chiller: result: {} required: - goal - title: heat_chill_start 命令参数 + title: heat_chill_start参数 type: object type: UniLabJsonCommand auto-heat_chill_stop: @@ -66,14 +61,12 @@ mock_chiller: handles: [] result: {} schema: - description: UniLabJsonCommand heat_chill_stop 的参数schema + description: heat_chill_stop的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand heat_chill_stop 的参数schema properties: vessel: - description: '参数: vessel' type: string required: - vessel @@ -81,7 +74,7 @@ mock_chiller: result: {} required: - goal - title: heat_chill_stop 命令参数 + title: heat_chill_stop参数 type: object type: UniLabJsonCommand emergency_stop: @@ -241,23 +234,41 @@ mock_chiller: handles: [] icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - port: - default: MOCK - description: '参数: port' - type: string - required: [] - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + port: + default: MOCK + type: string + required: [] + type: object + data: + properties: + current_temperature: + type: number + is_cooling: + type: boolean + is_heating: + type: boolean + purpose: + type: string + status: + type: string + status_info: + type: object + target_temperature: + type: number + vessel: + type: string + required: + - current_temperature + - target_temperature + - status + - is_cooling + - is_heating + - vessel + - purpose + - status_info + type: object mock_filter: class: action_value_mappings: @@ -268,18 +279,17 @@ mock_filter: handles: [] result: {} schema: - description: UniLabJsonCommand emergency_stop 的参数schema + description: emergency_stop的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand emergency_stop 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: emergency_stop 命令参数 + title: emergency_stop参数 type: object type: UniLabJsonCommand auto-filter: @@ -296,37 +306,29 @@ mock_filter: handles: [] result: {} schema: - description: UniLabJsonCommand filter 的参数schema + description: filter的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand filter 的参数schema properties: continue_heatchill: default: false - description: '参数: continue_heatchill' type: boolean filtrate_vessel: - description: '参数: filtrate_vessel' type: string stir: default: false - description: '参数: stir' type: boolean stir_speed: default: 0.0 - description: '参数: stir_speed' type: number temp: default: 25.0 - description: '参数: temp' type: number vessel: - description: '参数: vessel' type: string volume: default: 0.0 - description: '参数: volume' type: number required: - vessel @@ -335,7 +337,7 @@ mock_filter: result: {} required: - goal - title: filter 命令参数 + title: filter参数 type: object type: UniLabJsonCommand auto-replace_filter: @@ -345,18 +347,17 @@ mock_filter: handles: [] result: {} schema: - description: UniLabJsonCommand replace_filter 的参数schema + description: replace_filter的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand replace_filter 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: replace_filter 命令参数 + title: replace_filter参数 type: object type: UniLabJsonCommand auto-stop_filtering: @@ -366,18 +367,17 @@ mock_filter: handles: [] result: {} schema: - description: UniLabJsonCommand stop_filtering 的参数schema + description: stop_filtering的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand stop_filtering 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: stop_filtering 命令参数 + title: stop_filtering参数 type: object type: UniLabJsonCommand filter: @@ -568,23 +568,62 @@ mock_filter: handles: [] icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - port: - default: MOCK - description: '参数: port' - type: string - required: [] - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + port: + default: MOCK + type: string + required: [] + type: object + data: + properties: + continue_heatchill: + type: boolean + filter_life: + type: number + filtered_volume: + type: number + filtrate_vessel: + type: string + flow_rate: + type: number + is_filtering: + type: boolean + pressure_drop: + type: number + progress: + type: number + status: + type: string + status_info: + type: object + stir: + type: boolean + stir_speed: + type: number + target_volume: + type: number + temperature: + type: number + vessel: + type: string + required: + - status + - is_filtering + - flow_rate + - pressure_drop + - filter_life + - vessel + - filtrate_vessel + - filtered_volume + - progress + - stir + - stir_speed + - temperature + - continue_heatchill + - target_volume + - status_info + type: object mock_heater: class: action_value_mappings: @@ -595,18 +634,17 @@ mock_heater: handles: [] result: {} schema: - description: UniLabJsonCommand emergency_stop 的参数schema + description: emergency_stop的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand emergency_stop 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: emergency_stop 命令参数 + title: emergency_stop参数 type: object type: UniLabJsonCommand auto-heat_chill: @@ -622,32 +660,25 @@ mock_heater: handles: [] result: {} schema: - description: UniLabJsonCommand heat_chill 的参数schema + description: heat_chill的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand heat_chill 的参数schema properties: purpose: default: Unknown - description: '参数: purpose' type: string stir: default: false - description: '参数: stir' type: boolean stir_speed: default: 0.0 - description: '参数: stir_speed' type: number temp: - description: '参数: temp' type: number time: - description: '参数: time' type: number vessel: - description: '参数: vessel' type: string required: - vessel @@ -657,7 +688,7 @@ mock_heater: result: {} required: - goal - title: heat_chill 命令参数 + title: heat_chill参数 type: object type: UniLabJsonCommand auto-heat_chill_start: @@ -670,20 +701,16 @@ mock_heater: handles: [] result: {} schema: - description: UniLabJsonCommand heat_chill_start 的参数schema + description: heat_chill_start的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand heat_chill_start 的参数schema properties: purpose: - description: '参数: purpose' type: string temp: - description: '参数: temp' type: number vessel: - description: '参数: vessel' type: string required: - vessel @@ -693,7 +720,7 @@ mock_heater: result: {} required: - goal - title: heat_chill_start 命令参数 + title: heat_chill_start参数 type: object type: UniLabJsonCommand auto-heat_chill_stop: @@ -704,14 +731,12 @@ mock_heater: handles: [] result: {} schema: - description: UniLabJsonCommand heat_chill_stop 的参数schema + description: heat_chill_stop的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand heat_chill_stop 的参数schema properties: vessel: - description: '参数: vessel' type: string required: - vessel @@ -719,7 +744,7 @@ mock_heater: result: {} required: - goal - title: heat_chill_stop 命令参数 + title: heat_chill_stop参数 type: object type: UniLabJsonCommand auto-set_heating_power: @@ -730,14 +755,12 @@ mock_heater: handles: [] result: {} schema: - description: UniLabJsonCommand set_heating_power 的参数schema + description: set_heating_power的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_heating_power 的参数schema properties: power: - description: '参数: power' type: number required: - power @@ -745,7 +768,7 @@ mock_heater: result: {} required: - goal - title: set_heating_power 命令参数 + title: set_heating_power参数 type: object type: UniLabJsonCommand auto-set_temperature: @@ -756,14 +779,12 @@ mock_heater: handles: [] result: {} schema: - description: UniLabJsonCommand set_temperature 的参数schema + description: set_temperature的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_temperature 的参数schema properties: temperature: - description: '参数: temperature' type: number required: - temperature @@ -771,7 +792,7 @@ mock_heater: result: {} required: - goal - title: set_temperature 命令参数 + title: set_temperature参数 type: object type: UniLabJsonCommand emergency_stop: @@ -1007,23 +1028,50 @@ mock_heater: handles: [] icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - port: - default: MOCK - description: '参数: port' - type: string - required: [] - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + port: + default: MOCK + type: string + required: [] + type: object + data: + properties: + current_temperature: + type: number + heating_power: + type: number + is_heating: + type: boolean + max_temperature: + type: number + purpose: + type: string + status: + type: string + status_info: + type: object + stir: + type: boolean + stir_speed: + type: number + target_temperature: + type: number + vessel: + type: string + required: + - current_temperature + - target_temperature + - status + - is_heating + - heating_power + - max_temperature + - vessel + - purpose + - stir + - stir_speed + - status_info + type: object mock_pump: class: action_value_mappings: @@ -1034,18 +1082,17 @@ mock_pump: handles: [] result: {} schema: - description: UniLabJsonCommand emergency_stop 的参数schema + description: emergency_stop的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand emergency_stop 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: emergency_stop 命令参数 + title: emergency_stop参数 type: object type: UniLabJsonCommand auto-pause_pump: @@ -1055,18 +1102,17 @@ mock_pump: handles: [] result: {} schema: - description: UniLabJsonCommand pause_pump 的参数schema + description: pause_pump的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand pause_pump 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: pause_pump 命令参数 + title: pause_pump参数 type: object type: UniLabJsonCommand auto-pump_transfer: @@ -1086,48 +1132,37 @@ mock_pump: handles: [] result: {} schema: - description: UniLabJsonCommand pump_transfer 的参数schema + description: pump_transfer的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand pump_transfer 的参数schema properties: amount: default: '' - description: '参数: amount' type: string from_vessel: - description: '参数: from_vessel' type: string rinsing_repeats: default: 0 - description: '参数: rinsing_repeats' type: integer rinsing_solvent: default: '' - description: '参数: rinsing_solvent' type: string rinsing_volume: default: 0.0 - description: '参数: rinsing_volume' type: number solid: default: false - description: '参数: solid' type: boolean time: default: 0.0 - description: '参数: time' type: number to_vessel: - description: '参数: to_vessel' type: string viscous: default: false - description: '参数: viscous' type: boolean volume: - description: '参数: volume' type: number required: - from_vessel @@ -1137,7 +1172,7 @@ mock_pump: result: {} required: - goal - title: pump_transfer 命令参数 + title: pump_transfer参数 type: object type: UniLabJsonCommand auto-reset_volume_counter: @@ -1147,18 +1182,17 @@ mock_pump: handles: [] result: {} schema: - description: UniLabJsonCommand reset_volume_counter 的参数schema + description: reset_volume_counter的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand reset_volume_counter 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: reset_volume_counter 命令参数 + title: reset_volume_counter参数 type: object type: UniLabJsonCommand auto-resume_pump: @@ -1168,18 +1202,17 @@ mock_pump: handles: [] result: {} schema: - description: UniLabJsonCommand resume_pump 的参数schema + description: resume_pump的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand resume_pump 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: resume_pump 命令参数 + title: resume_pump参数 type: object type: UniLabJsonCommand pause_pump: @@ -1452,23 +1485,83 @@ mock_pump: handles: [] icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - port: - default: MOCK - description: '参数: port' - type: string - required: [] - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + port: + default: MOCK + type: string + required: [] + type: object + data: + properties: + amount: + type: string + current_device: + type: string + flow_rate: + type: number + from_vessel: + type: string + is_solid: + type: boolean + is_viscous: + type: boolean + max_flow_rate: + type: number + max_pressure: + type: number + pressure: + type: number + pump_state: + type: string + rinsing_repeats: + type: integer + rinsing_solvent: + type: string + rinsing_volume: + type: number + status: + type: string + status_info: + type: object + target_flow_rate: + type: number + time_remaining: + type: number + time_spent: + type: number + to_vessel: + type: string + total_volume: + type: number + transfer_time: + type: number + transfer_volume: + type: number + required: + - status + - current_device + - pump_state + - flow_rate + - target_flow_rate + - pressure + - total_volume + - max_flow_rate + - max_pressure + - from_vessel + - to_vessel + - transfer_volume + - amount + - transfer_time + - is_viscous + - rinsing_solvent + - rinsing_volume + - rinsing_repeats + - is_solid + - time_spent + - time_remaining + - status_info + type: object mock_rotavap: class: action_value_mappings: @@ -1479,18 +1572,17 @@ mock_rotavap: handles: [] result: {} schema: - description: UniLabJsonCommand emergency_stop 的参数schema + description: emergency_stop的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand emergency_stop 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: emergency_stop 命令参数 + title: emergency_stop参数 type: object type: UniLabJsonCommand auto-set_pump_time: @@ -1501,14 +1593,12 @@ mock_rotavap: handles: [] result: {} schema: - description: UniLabJsonCommand set_pump_time 的参数schema + description: set_pump_time的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_pump_time 的参数schema properties: time_seconds: - description: '参数: time_seconds' type: number required: - time_seconds @@ -1516,7 +1606,7 @@ mock_rotavap: result: {} required: - goal - title: set_pump_time 命令参数 + title: set_pump_time参数 type: object type: UniLabJsonCommand auto-set_rotate_speed: @@ -1527,14 +1617,12 @@ mock_rotavap: handles: [] result: {} schema: - description: UniLabJsonCommand set_rotate_speed 的参数schema + description: set_rotate_speed的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_rotate_speed 的参数schema properties: speed: - description: '参数: speed' type: number required: - speed @@ -1542,7 +1630,7 @@ mock_rotavap: result: {} required: - goal - title: set_rotate_speed 命令参数 + title: set_rotate_speed参数 type: object type: UniLabJsonCommand auto-set_rotate_time: @@ -1553,14 +1641,12 @@ mock_rotavap: handles: [] result: {} schema: - description: UniLabJsonCommand set_rotate_time 的参数schema + description: set_rotate_time的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_rotate_time 的参数schema properties: time_seconds: - description: '参数: time_seconds' type: number required: - time_seconds @@ -1568,7 +1654,7 @@ mock_rotavap: result: {} required: - goal - title: set_rotate_time 命令参数 + title: set_rotate_time参数 type: object type: UniLabJsonCommand auto-set_temperature: @@ -1579,14 +1665,12 @@ mock_rotavap: handles: [] result: {} schema: - description: UniLabJsonCommand set_temperature 的参数schema + description: set_temperature的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_temperature 的参数schema properties: temperature: - description: '参数: temperature' type: number required: - temperature @@ -1594,7 +1678,7 @@ mock_rotavap: result: {} required: - goal - title: set_temperature 命令参数 + title: set_temperature参数 type: object type: UniLabJsonCommand auto-set_timer: @@ -1605,14 +1689,12 @@ mock_rotavap: handles: [] result: {} schema: - description: UniLabJsonCommand set_timer 的参数schema + description: set_timer的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_timer 的参数schema properties: command: - description: '参数: command' type: string required: - command @@ -1620,7 +1702,7 @@ mock_rotavap: result: {} required: - goal - title: set_timer 命令参数 + title: set_timer参数 type: object type: UniLabJsonCommand auto-start_pump: @@ -1630,18 +1712,17 @@ mock_rotavap: handles: [] result: {} schema: - description: UniLabJsonCommand start_pump 的参数schema + description: start_pump的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand start_pump 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: start_pump 命令参数 + title: start_pump参数 type: object type: UniLabJsonCommand auto-start_rotation: @@ -1651,18 +1732,17 @@ mock_rotavap: handles: [] result: {} schema: - description: UniLabJsonCommand start_rotation 的参数schema + description: start_rotation的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand start_rotation 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: start_rotation 命令参数 + title: start_rotation参数 type: object type: UniLabJsonCommand auto-stop_all_operations: @@ -1672,18 +1752,17 @@ mock_rotavap: handles: [] result: {} schema: - description: UniLabJsonCommand stop_all_operations 的参数schema + description: stop_all_operations的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand stop_all_operations 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: stop_all_operations 命令参数 + title: stop_all_operations参数 type: object type: UniLabJsonCommand set_pump_time: @@ -1995,23 +2074,47 @@ mock_rotavap: handles: [] icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - port: - default: MOCK - description: '参数: port' - type: string - required: [] - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + port: + default: MOCK + type: string + required: [] + type: object + data: + properties: + pump_state: + type: string + pump_time: + type: number + rotate_speed: + type: number + rotate_state: + type: string + rotate_time: + type: number + status: + type: string + status_info: + type: object + target_temperature: + type: number + temperature: + type: number + vacuum_level: + type: number + required: + - status + - rotate_state + - rotate_time + - rotate_speed + - pump_state + - pump_time + - vacuum_level + - temperature + - target_temperature + - status_info + type: object mock_separator: class: action_value_mappings: @@ -2035,58 +2138,44 @@ mock_separator: handles: [] result: {} schema: - description: UniLabJsonCommand separate 的参数schema + description: separate的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand separate 的参数schema properties: from_vessel: - description: '参数: from_vessel' type: string product_phase: - description: '参数: product_phase' type: string purpose: - description: '参数: purpose' type: string repeats: default: 1 - description: '参数: repeats' type: integer separation_vessel: - description: '参数: separation_vessel' type: string settling_time: default: 60.0 - description: '参数: settling_time' type: number solvent: default: '' - description: '参数: solvent' type: string solvent_volume: default: 0.0 - description: '参数: solvent_volume' type: number stir_speed: default: 0.0 - description: '参数: stir_speed' type: number stir_time: default: 0.0 - description: '参数: stir_time' type: number through: default: '' - description: '参数: through' type: string to_vessel: - description: '参数: to_vessel' type: string waste_phase_to_vessel: default: '' - description: '参数: waste_phase_to_vessel' type: string required: - purpose @@ -2098,7 +2187,7 @@ mock_separator: result: {} required: - goal - title: separate 命令参数 + title: separate参数 type: object type: UniLabJsonCommand auto-set_valve: @@ -2109,14 +2198,12 @@ mock_separator: handles: [] result: {} schema: - description: UniLabJsonCommand set_valve 的参数schema + description: set_valve的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_valve 的参数schema properties: command: - description: '参数: command' type: string required: - command @@ -2124,7 +2211,7 @@ mock_separator: result: {} required: - goal - title: set_valve 命令参数 + title: set_valve参数 type: object type: UniLabJsonCommand auto-shake: @@ -2135,14 +2222,12 @@ mock_separator: handles: [] result: {} schema: - description: UniLabJsonCommand shake 的参数schema + description: shake的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand shake 的参数schema properties: shake_time: - description: '参数: shake_time' type: number required: - shake_time @@ -2150,7 +2235,7 @@ mock_separator: result: {} required: - goal - title: shake 命令参数 + title: shake参数 type: object type: UniLabJsonCommand auto-stop_operations: @@ -2160,18 +2245,17 @@ mock_separator: handles: [] result: {} schema: - description: UniLabJsonCommand stop_operations 的参数schema + description: stop_operations的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand stop_operations 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: stop_operations 命令参数 + title: stop_operations参数 type: object type: UniLabJsonCommand separate: @@ -2475,23 +2559,80 @@ mock_separator: handles: [] icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - port: - default: MOCK - description: '参数: port' - type: string - required: [] - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + port: + default: MOCK + type: string + required: [] + type: object + data: + properties: + current_device: + type: string + from_vessel: + type: string + product_phase: + type: string + purpose: + type: string + repeats: + type: integer + separation_vessel: + type: string + settling_time: + type: number + shake_status: + type: string + shake_time: + type: number + solvent: + type: string + solvent_volume: + type: number + status: + type: string + status_info: + type: object + stir_speed: + type: number + stir_time: + type: number + through: + type: string + time_remaining: + type: number + time_spent: + type: number + to_vessel: + type: string + valve_state: + type: string + waste_phase_to_vessel: + type: string + required: + - current_device + - purpose + - valve_state + - settling_time + - status + - shake_time + - shake_status + - product_phase + - from_vessel + - separation_vessel + - to_vessel + - waste_phase_to_vessel + - solvent + - solvent_volume + - through + - repeats + - stir_time + - stir_speed + - time_spent + - time_remaining + - status_info + type: object mock_solenoid_valve: class: action_value_mappings: @@ -2502,18 +2643,17 @@ mock_solenoid_valve: handles: [] result: {} schema: - description: UniLabJsonCommand close_valve 的参数schema + description: close_valve的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand close_valve 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: close_valve 命令参数 + title: close_valve参数 type: object type: UniLabJsonCommand auto-is_closed: @@ -2523,18 +2663,17 @@ mock_solenoid_valve: handles: [] result: {} schema: - description: UniLabJsonCommand is_closed 的参数schema + description: is_closed的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand is_closed 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: is_closed 命令参数 + title: is_closed参数 type: object type: UniLabJsonCommand auto-is_open: @@ -2544,18 +2683,17 @@ mock_solenoid_valve: handles: [] result: {} schema: - description: UniLabJsonCommand is_open 的参数schema + description: is_open的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand is_open 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: is_open 命令参数 + title: is_open参数 type: object type: UniLabJsonCommand auto-open_valve: @@ -2565,18 +2703,17 @@ mock_solenoid_valve: handles: [] result: {} schema: - description: UniLabJsonCommand open_valve 的参数schema + description: open_valve的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand open_valve 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: open_valve 命令参数 + title: open_valve参数 type: object type: UniLabJsonCommand auto-set_valve_status: @@ -2587,14 +2724,12 @@ mock_solenoid_valve: handles: [] result: {} schema: - description: UniLabJsonCommand set_valve_status 的参数schema + description: set_valve_status的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_valve_status 的参数schema properties: status: - description: '参数: status' type: string required: - status @@ -2602,7 +2737,7 @@ mock_solenoid_valve: result: {} required: - goal - title: set_valve_status 命令参数 + title: set_valve_status参数 type: object type: UniLabJsonCommand close_valve: @@ -2730,23 +2865,23 @@ mock_solenoid_valve: handles: [] icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - port: - default: MOCK - description: '参数: port' - type: string - required: [] - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + port: + default: MOCK + type: string + required: [] + type: object + data: + properties: + status: + type: string + valve_status: + type: string + required: + - status + - valve_status + type: object mock_stirrer: class: action_value_mappings: @@ -2757,18 +2892,17 @@ mock_stirrer: handles: [] result: {} schema: - description: UniLabJsonCommand emergency_stop 的参数schema + description: emergency_stop的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand emergency_stop 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: emergency_stop 命令参数 + title: emergency_stop参数 type: object type: UniLabJsonCommand auto-heating_control: @@ -2779,22 +2913,20 @@ mock_stirrer: handles: [] result: {} schema: - description: UniLabJsonCommand heating_control 的参数schema + description: heating_control的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand heating_control 的参数schema properties: heating_state: default: 'On' - description: '参数: heating_state' type: string required: [] type: object result: {} required: - goal - title: heating_control 命令参数 + title: heating_control参数 type: object type: UniLabJsonCommand auto-set_stir_speed: @@ -2805,14 +2937,12 @@ mock_stirrer: handles: [] result: {} schema: - description: UniLabJsonCommand set_stir_speed 的参数schema + description: set_stir_speed的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_stir_speed 的参数schema properties: speed: - description: '参数: speed' type: number required: - speed @@ -2820,7 +2950,7 @@ mock_stirrer: result: {} required: - goal - title: set_stir_speed 命令参数 + title: set_stir_speed参数 type: object type: UniLabJsonCommand auto-set_temperature: @@ -2831,14 +2961,12 @@ mock_stirrer: handles: [] result: {} schema: - description: UniLabJsonCommand set_temperature 的参数schema + description: set_temperature的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_temperature 的参数schema properties: temperature: - description: '参数: temperature' type: number required: - temperature @@ -2846,7 +2974,7 @@ mock_stirrer: result: {} required: - goal - title: set_temperature 命令参数 + title: set_temperature参数 type: object type: UniLabJsonCommand auto-start_stirring: @@ -2856,18 +2984,17 @@ mock_stirrer: handles: [] result: {} schema: - description: UniLabJsonCommand start_stirring 的参数schema + description: start_stirring的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand start_stirring 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: start_stirring 命令参数 + title: start_stirring参数 type: object type: UniLabJsonCommand auto-stop_all_operations: @@ -2877,18 +3004,17 @@ mock_stirrer: handles: [] result: {} schema: - description: UniLabJsonCommand stop_all_operations 的参数schema + description: stop_all_operations的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand stop_all_operations 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: stop_all_operations 命令参数 + title: stop_all_operations参数 type: object type: UniLabJsonCommand auto-stop_stirring: @@ -2898,18 +3024,17 @@ mock_stirrer: handles: [] result: {} schema: - description: UniLabJsonCommand stop_stirring 的参数schema + description: stop_stirring的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand stop_stirring 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: stop_stirring 命令参数 + title: stop_stirring参数 type: object type: UniLabJsonCommand heating_control: @@ -3134,23 +3259,50 @@ mock_stirrer: handles: [] icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - port: - default: MOCK - description: '参数: port' - type: string - required: [] - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + port: + default: MOCK + type: string + required: [] + type: object + data: + properties: + heating_power: + type: number + heating_state: + type: string + max_stir_speed: + type: number + max_temperature: + type: number + status: + type: string + status_info: + type: object + stir_speed: + type: number + stir_state: + type: string + target_stir_speed: + type: number + target_temperature: + type: number + temperature: + type: number + required: + - status + - stir_speed + - target_stir_speed + - stir_state + - temperature + - target_temperature + - heating_state + - heating_power + - max_stir_speed + - max_temperature + - status_info + type: object mock_stirrer_new: class: action_value_mappings: @@ -3164,22 +3316,18 @@ mock_stirrer_new: handles: [] result: {} schema: - description: UniLabJsonCommand start_stir 的参数schema + description: start_stir的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand start_stir 的参数schema properties: purpose: default: '' - description: '参数: purpose' type: string stir_speed: default: 0.0 - description: '参数: stir_speed' type: number vessel: - description: '参数: vessel' type: string required: - vessel @@ -3187,7 +3335,7 @@ mock_stirrer_new: result: {} required: - goal - title: start_stir 命令参数 + title: start_stir参数 type: object type: UniLabJsonCommand auto-stir: @@ -3200,20 +3348,16 @@ mock_stirrer_new: handles: [] result: {} schema: - description: UniLabJsonCommand stir 的参数schema + description: stir的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand stir 的参数schema properties: settling_time: - description: '参数: settling_time' type: number stir_speed: - description: '参数: stir_speed' type: number stir_time: - description: '参数: stir_time' type: number required: - stir_time @@ -3223,7 +3367,7 @@ mock_stirrer_new: result: {} required: - goal - title: stir 命令参数 + title: stir参数 type: object type: UniLabJsonCommand auto-stop_stir: @@ -3234,14 +3378,12 @@ mock_stirrer_new: handles: [] result: {} schema: - description: UniLabJsonCommand stop_stir 的参数schema + description: stop_stir的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand stop_stir 的参数schema properties: vessel: - description: '参数: vessel' type: string required: - vessel @@ -3249,7 +3391,7 @@ mock_stirrer_new: result: {} required: - goal - title: stop_stir 命令参数 + title: stop_stir参数 type: object type: UniLabJsonCommand start_stir: @@ -3454,23 +3596,50 @@ mock_stirrer_new: handles: [] icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - port: - default: MOCK - description: '参数: port' - type: string - required: [] - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + port: + default: MOCK + type: string + required: [] + type: object + data: + properties: + max_stir_speed: + type: number + progress: + type: number + purpose: + type: string + settling_time: + type: number + status: + type: string + status_info: + type: object + stir_speed: + type: number + stir_state: + type: string + stir_time: + type: number + target_stir_speed: + type: number + vessel: + type: string + required: + - status + - stir_speed + - target_stir_speed + - stir_state + - vessel + - purpose + - stir_time + - settling_time + - max_stir_speed + - progress + - status_info + type: object mock_vacuum: class: action_value_mappings: @@ -3481,18 +3650,17 @@ mock_vacuum: handles: [] result: {} schema: - description: UniLabJsonCommand emergency_stop 的参数schema + description: emergency_stop的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand emergency_stop 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: emergency_stop 命令参数 + title: emergency_stop参数 type: object type: UniLabJsonCommand auto-pause_vacuum: @@ -3502,18 +3670,17 @@ mock_vacuum: handles: [] result: {} schema: - description: UniLabJsonCommand pause_vacuum 的参数schema + description: pause_vacuum的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand pause_vacuum 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: pause_vacuum 命令参数 + title: pause_vacuum参数 type: object type: UniLabJsonCommand auto-power_control: @@ -3524,22 +3691,20 @@ mock_vacuum: handles: [] result: {} schema: - description: UniLabJsonCommand power_control 的参数schema + description: power_control的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand power_control 的参数schema properties: power_state: default: 'On' - description: '参数: power_state' type: string required: [] type: object result: {} required: - goal - title: power_control 命令参数 + title: power_control参数 type: object type: UniLabJsonCommand auto-resume_vacuum: @@ -3549,18 +3714,17 @@ mock_vacuum: handles: [] result: {} schema: - description: UniLabJsonCommand resume_vacuum 的参数schema + description: resume_vacuum的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand resume_vacuum 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: resume_vacuum 命令参数 + title: resume_vacuum参数 type: object type: UniLabJsonCommand auto-set_vacuum_level: @@ -3571,14 +3735,12 @@ mock_vacuum: handles: [] result: {} schema: - description: UniLabJsonCommand set_vacuum_level 的参数schema + description: set_vacuum_level的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_vacuum_level 的参数schema properties: vacuum_level: - description: '参数: vacuum_level' type: number required: - vacuum_level @@ -3586,7 +3748,7 @@ mock_vacuum: result: {} required: - goal - title: set_vacuum_level 命令参数 + title: set_vacuum_level参数 type: object type: UniLabJsonCommand auto-start_vacuum: @@ -3596,18 +3758,17 @@ mock_vacuum: handles: [] result: {} schema: - description: UniLabJsonCommand start_vacuum 的参数schema + description: start_vacuum的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand start_vacuum 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: start_vacuum 命令参数 + title: start_vacuum参数 type: object type: UniLabJsonCommand auto-stop_vacuum: @@ -3617,18 +3778,17 @@ mock_vacuum: handles: [] result: {} schema: - description: UniLabJsonCommand stop_vacuum 的参数schema + description: stop_vacuum的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand stop_vacuum 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: stop_vacuum 命令参数 + title: stop_vacuum参数 type: object type: UniLabJsonCommand auto-vent_to_atmosphere: @@ -3638,18 +3798,17 @@ mock_vacuum: handles: [] result: {} schema: - description: UniLabJsonCommand vent_to_atmosphere 的参数schema + description: vent_to_atmosphere的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand vent_to_atmosphere 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: vent_to_atmosphere 命令参数 + title: vent_to_atmosphere参数 type: object type: UniLabJsonCommand pause_vacuum: @@ -3936,20 +4095,41 @@ mock_vacuum: handles: [] icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - port: - default: MOCK - description: '参数: port' - type: string - required: [] - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + port: + default: MOCK + type: string + required: [] + type: object + data: + properties: + max_pump_speed: + type: number + power_state: + type: string + pump_efficiency: + type: number + pump_speed: + type: number + pump_state: + type: string + status: + type: string + status_info: + type: object + target_vacuum: + type: number + vacuum_level: + type: number + required: + - status + - power_state + - pump_state + - vacuum_level + - target_vacuum + - pump_speed + - pump_efficiency + - max_pump_speed + - status_info + type: object diff --git a/unilabos/registry/devices/moveit_config.yaml b/unilabos/registry/devices/moveit_config.yaml index 8865d50..e556bc8 100644 --- a/unilabos/registry/devices/moveit_config.yaml +++ b/unilabos/registry/devices/moveit_config.yaml @@ -8,18 +8,17 @@ moveit.arm_slider: handles: [] result: {} schema: - description: UniLabJsonCommand check_tf_update_actions 的参数schema + description: check_tf_update_actions的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand check_tf_update_actions 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: check_tf_update_actions 命令参数 + title: check_tf_update_actions参数 type: object type: UniLabJsonCommand auto-moveit_joint_task: @@ -34,28 +33,22 @@ moveit.arm_slider: handles: [] result: {} schema: - description: UniLabJsonCommand moveit_joint_task 的参数schema + description: moveit_joint_task的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand moveit_joint_task 的参数schema properties: joint_names: - description: '参数: joint_names' type: string joint_positions: - description: '参数: joint_positions' type: string move_group: - description: '参数: move_group' type: string retry: default: 10 - description: '参数: retry' type: string speed: default: 1 - description: '参数: speed' type: string required: - move_group @@ -64,7 +57,7 @@ moveit.arm_slider: result: {} required: - goal - title: moveit_joint_task 命令参数 + title: moveit_joint_task参数 type: object type: UniLabJsonCommand auto-moveit_task: @@ -85,42 +78,33 @@ moveit.arm_slider: handles: [] result: {} schema: - description: UniLabJsonCommand moveit_task 的参数schema + description: moveit_task的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand moveit_task 的参数schema properties: cartesian: default: false - description: '参数: cartesian' type: string move_group: - description: '参数: move_group' type: string offsets: default: - 0 - 0 - 0 - description: '参数: offsets' type: string position: - description: '参数: position' type: string quaternion: - description: '参数: quaternion' type: string retry: default: 10 - description: '参数: retry' type: string speed: default: 1 - description: '参数: speed' type: string target_link: - description: '参数: target_link' type: string required: - move_group @@ -130,7 +114,7 @@ moveit.arm_slider: result: {} required: - goal - title: moveit_task 命令参数 + title: moveit_task参数 type: object type: UniLabJsonCommand auto-pick_and_place: @@ -141,14 +125,12 @@ moveit.arm_slider: handles: [] result: {} schema: - description: UniLabJsonCommand pick_and_place 的参数schema + description: pick_and_place的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand pick_and_place 的参数schema properties: command: - description: '参数: command' type: string required: - command @@ -156,7 +138,7 @@ moveit.arm_slider: result: {} required: - goal - title: pick_and_place 命令参数 + title: pick_and_place参数 type: object type: UniLabJsonCommand auto-post_init: @@ -167,14 +149,12 @@ moveit.arm_slider: handles: [] result: {} schema: - description: UniLabJsonCommand post_init 的参数schema + description: post_init的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand post_init 的参数schema properties: ros_node: - description: '参数: ros_node' type: string required: - ros_node @@ -182,7 +162,7 @@ moveit.arm_slider: result: {} required: - goal - title: post_init 命令参数 + title: post_init参数 type: object type: UniLabJsonCommand auto-resource_manager: @@ -194,17 +174,14 @@ moveit.arm_slider: handles: [] result: {} schema: - description: UniLabJsonCommand resource_manager 的参数schema + description: resource_manager的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand resource_manager 的参数schema properties: parent_link: - description: '参数: parent_link' type: string resource: - description: '参数: resource' type: string required: - resource @@ -213,7 +190,7 @@ moveit.arm_slider: result: {} required: - goal - title: resource_manager 命令参数 + title: resource_manager参数 type: object type: UniLabJsonCommand auto-set_position: @@ -224,14 +201,12 @@ moveit.arm_slider: handles: [] result: {} schema: - description: UniLabJsonCommand set_position 的参数schema + description: set_position的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_position 的参数schema properties: command: - description: '参数: command' type: string required: - command @@ -239,7 +214,7 @@ moveit.arm_slider: result: {} required: - goal - title: set_position 命令参数 + title: set_position参数 type: object type: UniLabJsonCommand auto-set_status: @@ -250,14 +225,12 @@ moveit.arm_slider: handles: [] result: {} schema: - description: UniLabJsonCommand set_status 的参数schema + description: set_status的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_status 的参数schema properties: command: - description: '参数: command' type: string required: - command @@ -265,7 +238,7 @@ moveit.arm_slider: result: {} required: - goal - title: set_status 命令参数 + title: set_status参数 type: object type: UniLabJsonCommand auto-wait_for_resource_action: @@ -275,18 +248,17 @@ moveit.arm_slider: handles: [] result: {} schema: - description: UniLabJsonCommand wait_for_resource_action 的参数schema + description: wait_for_resource_action的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand wait_for_resource_action 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: wait_for_resource_action 命令参数 + title: wait_for_resource_action参数 type: object type: UniLabJsonCommand pick_and_place: @@ -434,33 +406,24 @@ moveit.arm_slider: handles: [] icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - device_config: - description: '参数: device_config' - type: string - joint_poses: - description: '参数: joint_poses' - type: string - moveit_type: - description: '参数: moveit_type' - type: string - rotation: - description: '参数: rotation' - type: string - required: - - moveit_type - - joint_poses - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + device_config: + type: string + joint_poses: + type: string + moveit_type: + type: string + rotation: + type: string + required: + - moveit_type + - joint_poses + type: object + data: + properties: {} + required: [] + type: object model: mesh: arm_slider type: device @@ -474,18 +437,17 @@ moveit.toyo_xyz: handles: [] result: {} schema: - description: UniLabJsonCommand check_tf_update_actions 的参数schema + description: check_tf_update_actions的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand check_tf_update_actions 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: check_tf_update_actions 命令参数 + title: check_tf_update_actions参数 type: object type: UniLabJsonCommand auto-moveit_joint_task: @@ -500,28 +462,22 @@ moveit.toyo_xyz: handles: [] result: {} schema: - description: UniLabJsonCommand moveit_joint_task 的参数schema + description: moveit_joint_task的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand moveit_joint_task 的参数schema properties: joint_names: - description: '参数: joint_names' type: string joint_positions: - description: '参数: joint_positions' type: string move_group: - description: '参数: move_group' type: string retry: default: 10 - description: '参数: retry' type: string speed: default: 1 - description: '参数: speed' type: string required: - move_group @@ -530,7 +486,7 @@ moveit.toyo_xyz: result: {} required: - goal - title: moveit_joint_task 命令参数 + title: moveit_joint_task参数 type: object type: UniLabJsonCommand auto-moveit_task: @@ -551,42 +507,33 @@ moveit.toyo_xyz: handles: [] result: {} schema: - description: UniLabJsonCommand moveit_task 的参数schema + description: moveit_task的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand moveit_task 的参数schema properties: cartesian: default: false - description: '参数: cartesian' type: string move_group: - description: '参数: move_group' type: string offsets: default: - 0 - 0 - 0 - description: '参数: offsets' type: string position: - description: '参数: position' type: string quaternion: - description: '参数: quaternion' type: string retry: default: 10 - description: '参数: retry' type: string speed: default: 1 - description: '参数: speed' type: string target_link: - description: '参数: target_link' type: string required: - move_group @@ -596,7 +543,7 @@ moveit.toyo_xyz: result: {} required: - goal - title: moveit_task 命令参数 + title: moveit_task参数 type: object type: UniLabJsonCommand auto-pick_and_place: @@ -607,14 +554,12 @@ moveit.toyo_xyz: handles: [] result: {} schema: - description: UniLabJsonCommand pick_and_place 的参数schema + description: pick_and_place的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand pick_and_place 的参数schema properties: command: - description: '参数: command' type: string required: - command @@ -622,7 +567,7 @@ moveit.toyo_xyz: result: {} required: - goal - title: pick_and_place 命令参数 + title: pick_and_place参数 type: object type: UniLabJsonCommand auto-post_init: @@ -633,14 +578,12 @@ moveit.toyo_xyz: handles: [] result: {} schema: - description: UniLabJsonCommand post_init 的参数schema + description: post_init的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand post_init 的参数schema properties: ros_node: - description: '参数: ros_node' type: string required: - ros_node @@ -648,7 +591,7 @@ moveit.toyo_xyz: result: {} required: - goal - title: post_init 命令参数 + title: post_init参数 type: object type: UniLabJsonCommand auto-resource_manager: @@ -660,17 +603,14 @@ moveit.toyo_xyz: handles: [] result: {} schema: - description: UniLabJsonCommand resource_manager 的参数schema + description: resource_manager的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand resource_manager 的参数schema properties: parent_link: - description: '参数: parent_link' type: string resource: - description: '参数: resource' type: string required: - resource @@ -679,7 +619,7 @@ moveit.toyo_xyz: result: {} required: - goal - title: resource_manager 命令参数 + title: resource_manager参数 type: object type: UniLabJsonCommand auto-set_position: @@ -690,14 +630,12 @@ moveit.toyo_xyz: handles: [] result: {} schema: - description: UniLabJsonCommand set_position 的参数schema + description: set_position的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_position 的参数schema properties: command: - description: '参数: command' type: string required: - command @@ -705,7 +643,7 @@ moveit.toyo_xyz: result: {} required: - goal - title: set_position 命令参数 + title: set_position参数 type: object type: UniLabJsonCommand auto-set_status: @@ -716,14 +654,12 @@ moveit.toyo_xyz: handles: [] result: {} schema: - description: UniLabJsonCommand set_status 的参数schema + description: set_status的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_status 的参数schema properties: command: - description: '参数: command' type: string required: - command @@ -731,7 +667,7 @@ moveit.toyo_xyz: result: {} required: - goal - title: set_status 命令参数 + title: set_status参数 type: object type: UniLabJsonCommand auto-wait_for_resource_action: @@ -741,18 +677,17 @@ moveit.toyo_xyz: handles: [] result: {} schema: - description: UniLabJsonCommand wait_for_resource_action 的参数schema + description: wait_for_resource_action的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand wait_for_resource_action 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: wait_for_resource_action 命令参数 + title: wait_for_resource_action参数 type: object type: UniLabJsonCommand pick_and_place: @@ -900,33 +835,24 @@ moveit.toyo_xyz: handles: [] icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - device_config: - description: '参数: device_config' - type: string - joint_poses: - description: '参数: joint_poses' - type: string - moveit_type: - description: '参数: moveit_type' - type: string - rotation: - description: '参数: rotation' - type: string - required: - - moveit_type - - joint_poses - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + device_config: + type: string + joint_poses: + type: string + moveit_type: + type: string + rotation: + type: string + required: + - moveit_type + - joint_poses + type: object + data: + properties: {} + required: [] + type: object model: mesh: toyo_xyz type: device diff --git a/unilabos/registry/devices/organic_miscellaneous.yaml b/unilabos/registry/devices/organic_miscellaneous.yaml index 7dcf87b..00e7550 100644 --- a/unilabos/registry/devices/organic_miscellaneous.yaml +++ b/unilabos/registry/devices/organic_miscellaneous.yaml @@ -9,14 +9,12 @@ rotavap.one: handles: [] result: {} schema: - description: UniLabJsonCommand cmd_write 的参数schema + description: cmd_write的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand cmd_write 的参数schema properties: cmd: - description: '参数: cmd' type: string required: - cmd @@ -24,7 +22,7 @@ rotavap.one: result: {} required: - goal - title: cmd_write 命令参数 + title: cmd_write参数 type: object type: UniLabJsonCommand auto-main_loop: @@ -34,18 +32,17 @@ rotavap.one: handles: [] result: {} schema: - description: UniLabJsonCommand main_loop 的参数schema + description: main_loop的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand main_loop 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: main_loop 命令参数 + title: main_loop参数 type: object type: UniLabJsonCommand auto-set_pump_time: @@ -56,14 +53,12 @@ rotavap.one: handles: [] result: {} schema: - description: UniLabJsonCommand set_pump_time 的参数schema + description: set_pump_time的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_pump_time 的参数schema properties: time: - description: '参数: time' type: string required: - time @@ -71,7 +66,7 @@ rotavap.one: result: {} required: - goal - title: set_pump_time 命令参数 + title: set_pump_time参数 type: object type: UniLabJsonCommand auto-set_rotate_time: @@ -82,14 +77,12 @@ rotavap.one: handles: [] result: {} schema: - description: UniLabJsonCommand set_rotate_time 的参数schema + description: set_rotate_time的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_rotate_time 的参数schema properties: time: - description: '参数: time' type: string required: - time @@ -97,7 +90,7 @@ rotavap.one: result: {} required: - goal - title: set_rotate_time 命令参数 + title: set_rotate_time参数 type: object type: UniLabJsonCommand auto-set_timer: @@ -108,14 +101,12 @@ rotavap.one: handles: [] result: {} schema: - description: UniLabJsonCommand set_timer 的参数schema + description: set_timer的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_timer 的参数schema properties: command: - description: '参数: command' type: string required: - command @@ -123,7 +114,7 @@ rotavap.one: result: {} required: - goal - title: set_timer 命令参数 + title: set_timer参数 type: object type: UniLabJsonCommand set_timer: @@ -180,27 +171,20 @@ rotavap.one: handles: [] icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - port: - description: '参数: port' - type: string - rate: - default: 9600 - description: '参数: rate' - type: integer - required: - - port - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + port: + type: string + rate: + default: 9600 + type: string + required: + - port + type: object + data: + properties: {} + required: [] + type: object separator.homemade: class: action_value_mappings: @@ -211,18 +195,17 @@ separator.homemade: handles: [] result: {} schema: - description: UniLabJsonCommand read_sensor_loop 的参数schema + description: read_sensor_loop的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand read_sensor_loop 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: read_sensor_loop 命令参数 + title: read_sensor_loop参数 type: object type: UniLabJsonCommand auto-stir: @@ -235,30 +218,26 @@ separator.homemade: handles: [] result: {} schema: - description: UniLabJsonCommand stir 的参数schema + description: stir的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand stir 的参数schema properties: settling_time: default: 10 - description: '参数: settling_time' type: number stir_speed: default: 300 - description: '参数: stir_speed' type: number stir_time: default: 10 - description: '参数: stir_time' type: number required: [] type: object result: {} required: - goal - title: stir 命令参数 + title: stir参数 type: object type: UniLabJsonCommand auto-valve_open: @@ -270,17 +249,14 @@ separator.homemade: handles: [] result: {} schema: - description: UniLabJsonCommand valve_open 的参数schema + description: valve_open的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand valve_open 的参数schema properties: condition: - description: '参数: condition' type: string value: - description: '参数: value' type: string required: - condition @@ -289,7 +265,7 @@ separator.homemade: result: {} required: - goal - title: valve_open 命令参数 + title: valve_open参数 type: object type: UniLabJsonCommand auto-valve_open_cmd: @@ -300,14 +276,12 @@ separator.homemade: handles: [] result: {} schema: - description: UniLabJsonCommand valve_open_cmd 的参数schema + description: valve_open_cmd的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand valve_open_cmd 的参数schema properties: command: - description: '参数: command' type: string required: - command @@ -315,7 +289,7 @@ separator.homemade: result: {} required: - goal - title: valve_open_cmd 命令参数 + title: valve_open_cmd参数 type: object type: UniLabJsonCommand auto-write: @@ -326,14 +300,12 @@ separator.homemade: handles: [] result: {} schema: - description: UniLabJsonCommand write 的参数schema + description: write的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand write 的参数schema properties: data: - description: '参数: data' type: string required: - data @@ -341,7 +313,7 @@ separator.homemade: result: {} required: - goal - title: write 命令参数 + title: write参数 type: object type: UniLabJsonCommand stir: @@ -457,32 +429,23 @@ separator.homemade: handles: [] icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - baudrate_executor: - default: 115200 - description: '参数: baudrate_executor' - type: integer - baudrate_sensor: - default: 115200 - description: '参数: baudrate_sensor' - type: integer - port_executor: - description: '参数: port_executor' - type: string - port_sensor: - description: '参数: port_sensor' - type: string - required: - - port_executor - - port_sensor - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + baudrate_executor: + default: 115200 + type: integer + baudrate_sensor: + default: 115200 + type: integer + port_executor: + type: string + port_sensor: + type: string + required: + - port_executor + - port_sensor + type: object + data: + properties: {} + required: [] + type: object diff --git a/unilabos/registry/devices/pump_and_valve.yaml b/unilabos/registry/devices/pump_and_valve.yaml index 3abe9e2..dc50dde 100644 --- a/unilabos/registry/devices/pump_and_valve.yaml +++ b/unilabos/registry/devices/pump_and_valve.yaml @@ -8,18 +8,17 @@ solenoid_valve: handles: [] result: {} schema: - description: UniLabJsonCommand close 的参数schema + description: close的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand close 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: close 命令参数 + title: close参数 type: object type: UniLabJsonCommand auto-is_closed: @@ -29,18 +28,17 @@ solenoid_valve: handles: [] result: {} schema: - description: UniLabJsonCommand is_closed 的参数schema + description: is_closed的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand is_closed 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: is_closed 命令参数 + title: is_closed参数 type: object type: UniLabJsonCommand auto-is_open: @@ -50,18 +48,17 @@ solenoid_valve: handles: [] result: {} schema: - description: UniLabJsonCommand is_open 的参数schema + description: is_open的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand is_open 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: is_open 命令参数 + title: is_open参数 type: object type: UniLabJsonCommand auto-open: @@ -71,18 +68,17 @@ solenoid_valve: handles: [] result: {} schema: - description: UniLabJsonCommand open 的参数schema + description: open的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand open 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: open 命令参数 + title: open参数 type: object type: UniLabJsonCommand auto-read_data: @@ -92,18 +88,17 @@ solenoid_valve: handles: [] result: {} schema: - description: UniLabJsonCommand read_data 的参数schema + description: read_data的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand read_data 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: read_data 命令参数 + title: read_data参数 type: object type: UniLabJsonCommand auto-send_command: @@ -114,14 +109,12 @@ solenoid_valve: handles: [] result: {} schema: - description: UniLabJsonCommand send_command 的参数schema + description: send_command的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand send_command 的参数schema properties: command: - description: '参数: command' type: string required: - command @@ -129,7 +122,7 @@ solenoid_valve: result: {} required: - goal - title: send_command 命令参数 + title: send_command参数 type: object type: UniLabJsonCommand auto-set_valve_position: @@ -140,14 +133,12 @@ solenoid_valve: handles: [] result: {} schema: - description: UniLabJsonCommand set_valve_position 的参数schema + description: set_valve_position的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_valve_position 的参数schema properties: position: - description: '参数: position' type: string required: - position @@ -155,7 +146,7 @@ solenoid_valve: result: {} required: - goal - title: set_valve_position 命令参数 + title: set_valve_position参数 type: object type: UniLabJsonCommand set_valve_position: @@ -210,23 +201,23 @@ solenoid_valve: handles: [] icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - io_device_port: - description: '参数: io_device_port' - type: string - required: - - io_device_port - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + io_device_port: + type: string + required: + - io_device_port + type: object + data: + properties: + status: + type: string + valve_position: + type: string + required: + - status + - valve_position + type: object solenoid_valve.mock: class: action_value_mappings: @@ -237,18 +228,17 @@ solenoid_valve.mock: handles: [] result: {} schema: - description: UniLabJsonCommand close 的参数schema + description: close的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand close 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: close 命令参数 + title: close参数 type: object type: UniLabJsonCommand auto-is_closed: @@ -258,18 +248,17 @@ solenoid_valve.mock: handles: [] result: {} schema: - description: UniLabJsonCommand is_closed 的参数schema + description: is_closed的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand is_closed 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: is_closed 命令参数 + title: is_closed参数 type: object type: UniLabJsonCommand auto-is_open: @@ -279,18 +268,17 @@ solenoid_valve.mock: handles: [] result: {} schema: - description: UniLabJsonCommand is_open 的参数schema + description: is_open的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand is_open 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: is_open 命令参数 + title: is_open参数 type: object type: UniLabJsonCommand auto-open: @@ -300,18 +288,17 @@ solenoid_valve.mock: handles: [] result: {} schema: - description: UniLabJsonCommand open 的参数schema + description: open的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand open 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: open 命令参数 + title: open参数 type: object type: UniLabJsonCommand auto-set_valve_position: @@ -322,14 +309,12 @@ solenoid_valve.mock: handles: [] result: {} schema: - description: UniLabJsonCommand set_valve_position 的参数schema + description: set_valve_position的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_valve_position 的参数schema properties: position: - description: '参数: position' type: string required: - position @@ -337,7 +322,7 @@ solenoid_valve.mock: result: {} required: - goal - title: set_valve_position 命令参数 + title: set_valve_position参数 type: object type: UniLabJsonCommand close: @@ -429,23 +414,23 @@ solenoid_valve.mock: side: SOUTH icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - port: - default: COM6 - description: '参数: port' - type: string - required: [] - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + port: + default: COM6 + type: string + required: [] + type: object + data: + properties: + status: + type: string + valve_position: + type: string + required: + - status + - valve_position + type: object syringe_pump_with_valve.runze: class: action_value_mappings: @@ -456,18 +441,17 @@ syringe_pump_with_valve.runze: handles: [] result: {} schema: - description: UniLabJsonCommand close 的参数schema + description: close的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand close 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: close 命令参数 + title: close参数 type: object type: UniLabJsonCommand auto-initialize: @@ -477,18 +461,17 @@ syringe_pump_with_valve.runze: handles: [] result: {} schema: - description: UniLabJsonCommand initialize 的参数schema + description: initialize的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand initialize 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: initialize 命令参数 + title: initialize参数 type: object type: UniLabJsonCommand auto-pull_plunger: @@ -499,14 +482,12 @@ syringe_pump_with_valve.runze: handles: [] result: {} schema: - description: UniLabJsonCommand pull_plunger 的参数schema + description: pull_plunger的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand pull_plunger 的参数schema properties: volume: - description: '参数: volume' type: number required: - volume @@ -514,7 +495,7 @@ syringe_pump_with_valve.runze: result: {} required: - goal - title: pull_plunger 命令参数 + title: pull_plunger参数 type: object type: UniLabJsonCommand auto-push_plunger: @@ -525,14 +506,12 @@ syringe_pump_with_valve.runze: handles: [] result: {} schema: - description: UniLabJsonCommand push_plunger 的参数schema + description: push_plunger的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand push_plunger 的参数schema properties: volume: - description: '参数: volume' type: number required: - volume @@ -540,7 +519,7 @@ syringe_pump_with_valve.runze: result: {} required: - goal - title: push_plunger 命令参数 + title: push_plunger参数 type: object type: UniLabJsonCommand auto-query_aux_input_status_1: @@ -550,18 +529,17 @@ syringe_pump_with_valve.runze: handles: [] result: {} schema: - description: UniLabJsonCommand query_aux_input_status_1 的参数schema + description: query_aux_input_status_1的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand query_aux_input_status_1 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: query_aux_input_status_1 命令参数 + title: query_aux_input_status_1参数 type: object type: UniLabJsonCommand auto-query_aux_input_status_2: @@ -571,18 +549,17 @@ syringe_pump_with_valve.runze: handles: [] result: {} schema: - description: UniLabJsonCommand query_aux_input_status_2 的参数schema + description: query_aux_input_status_2的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand query_aux_input_status_2 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: query_aux_input_status_2 命令参数 + title: query_aux_input_status_2参数 type: object type: UniLabJsonCommand auto-query_backlash_position: @@ -592,18 +569,17 @@ syringe_pump_with_valve.runze: handles: [] result: {} schema: - description: UniLabJsonCommand query_backlash_position 的参数schema + description: query_backlash_position的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand query_backlash_position 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: query_backlash_position 命令参数 + title: query_backlash_position参数 type: object type: UniLabJsonCommand auto-query_command_buffer_status: @@ -613,18 +589,17 @@ syringe_pump_with_valve.runze: handles: [] result: {} schema: - description: UniLabJsonCommand query_command_buffer_status 的参数schema + description: query_command_buffer_status的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand query_command_buffer_status 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: query_command_buffer_status 命令参数 + title: query_command_buffer_status参数 type: object type: UniLabJsonCommand auto-query_software_version: @@ -634,18 +609,17 @@ syringe_pump_with_valve.runze: handles: [] result: {} schema: - description: UniLabJsonCommand query_software_version 的参数schema + description: query_software_version的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand query_software_version 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: query_software_version 命令参数 + title: query_software_version参数 type: object type: UniLabJsonCommand auto-send_command: @@ -656,14 +630,12 @@ syringe_pump_with_valve.runze: handles: [] result: {} schema: - description: UniLabJsonCommand send_command 的参数schema + description: send_command的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand send_command 的参数schema properties: full_command: - description: '参数: full_command' type: string required: - full_command @@ -671,7 +643,7 @@ syringe_pump_with_valve.runze: result: {} required: - goal - title: send_command 命令参数 + title: send_command参数 type: object type: UniLabJsonCommand auto-set_baudrate: @@ -682,14 +654,12 @@ syringe_pump_with_valve.runze: handles: [] result: {} schema: - description: UniLabJsonCommand set_baudrate 的参数schema + description: set_baudrate的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_baudrate 的参数schema properties: baudrate: - description: '参数: baudrate' type: string required: - baudrate @@ -697,7 +667,7 @@ syringe_pump_with_valve.runze: result: {} required: - goal - title: set_baudrate 命令参数 + title: set_baudrate参数 type: object type: UniLabJsonCommand auto-set_max_velocity: @@ -708,14 +678,12 @@ syringe_pump_with_valve.runze: handles: [] result: {} schema: - description: UniLabJsonCommand set_max_velocity 的参数schema + description: set_max_velocity的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_max_velocity 的参数schema properties: velocity: - description: '参数: velocity' type: number required: - velocity @@ -723,7 +691,7 @@ syringe_pump_with_valve.runze: result: {} required: - goal - title: set_max_velocity 命令参数 + title: set_max_velocity参数 type: object type: UniLabJsonCommand auto-set_position: @@ -735,17 +703,14 @@ syringe_pump_with_valve.runze: handles: [] result: {} schema: - description: UniLabJsonCommand set_position 的参数schema + description: set_position的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_position 的参数schema properties: max_velocity: - description: '参数: max_velocity' type: number position: - description: '参数: position' type: number required: - position @@ -753,7 +718,7 @@ syringe_pump_with_valve.runze: result: {} required: - goal - title: set_position 命令参数 + title: set_position参数 type: object type: UniLabJsonCommand auto-set_valve_position: @@ -764,14 +729,12 @@ syringe_pump_with_valve.runze: handles: [] result: {} schema: - description: UniLabJsonCommand set_valve_position 的参数schema + description: set_valve_position的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_valve_position 的参数schema properties: position: - description: '参数: position' type: string required: - position @@ -779,7 +742,7 @@ syringe_pump_with_valve.runze: result: {} required: - goal - title: set_valve_position 命令参数 + title: set_valve_position参数 type: object type: UniLabJsonCommand auto-set_velocity_grade: @@ -790,14 +753,12 @@ syringe_pump_with_valve.runze: handles: [] result: {} schema: - description: UniLabJsonCommand set_velocity_grade 的参数schema + description: set_velocity_grade的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_velocity_grade 的参数schema properties: velocity: - description: '参数: velocity' type: string required: - velocity @@ -805,7 +766,7 @@ syringe_pump_with_valve.runze: result: {} required: - goal - title: set_velocity_grade 命令参数 + title: set_velocity_grade参数 type: object type: UniLabJsonCommand auto-stop_operation: @@ -815,18 +776,17 @@ syringe_pump_with_valve.runze: handles: [] result: {} schema: - description: UniLabJsonCommand stop_operation 的参数schema + description: stop_operation的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand stop_operation 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: stop_operation 命令参数 + title: stop_operation参数 type: object type: UniLabJsonCommand auto-wait_error: @@ -836,18 +796,17 @@ syringe_pump_with_valve.runze: handles: [] result: {} schema: - description: UniLabJsonCommand wait_error 的参数schema + description: wait_error的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand wait_error 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: wait_error 命令参数 + title: wait_error参数 type: object type: UniLabJsonCommand hardware_interface: @@ -870,31 +829,49 @@ syringe_pump_with_valve.runze: handles: [] icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - address: - default: '1' - description: '参数: address' - type: string - max_volume: - default: 25.0 - description: '参数: max_volume' - type: number - mode: - description: '参数: mode' - type: string - port: - description: '参数: port' - type: string - required: - - port - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + address: + default: '1' + type: string + max_volume: + default: 25.0 + type: number + mode: + type: string + port: + type: string + required: + - port + type: object + data: + properties: + max_velocity: + type: number + mode: + type: integer + plunger_position: + type: string + position: + type: number + status: + type: string + valve_position: + type: string + velocity_end: + type: string + velocity_grade: + type: string + velocity_init: + type: string + required: + - status + - mode + - max_velocity + - velocity_grade + - velocity_init + - velocity_end + - valve_position + - position + - plunger_position + type: object diff --git a/unilabos/registry/devices/robot_agv.yaml b/unilabos/registry/devices/robot_agv.yaml index 30639a0..51b59c2 100644 --- a/unilabos/registry/devices/robot_agv.yaml +++ b/unilabos/registry/devices/robot_agv.yaml @@ -11,22 +11,18 @@ agv.SEER: handles: [] result: {} schema: - description: UniLabJsonCommand send 的参数schema + description: send的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand send 的参数schema properties: cmd: - description: '参数: cmd' type: string ex_data: default: '' - description: '参数: ex_data' type: string obj: default: receive_socket - description: '参数: obj' type: string required: - cmd @@ -34,7 +30,7 @@ agv.SEER: result: {} required: - goal - title: send 命令参数 + title: send参数 type: object type: UniLabJsonCommand auto-send_nav_task: @@ -45,14 +41,12 @@ agv.SEER: handles: [] result: {} schema: - description: UniLabJsonCommand send_nav_task 的参数schema + description: send_nav_task的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand send_nav_task 的参数schema properties: command: - description: '参数: command' type: string required: - command @@ -60,7 +54,7 @@ agv.SEER: result: {} required: - goal - title: send_nav_task 命令参数 + title: send_nav_task参数 type: object type: UniLabJsonCommand send_nav_task: @@ -119,20 +113,20 @@ agv.SEER: handles: [] icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - host: - description: '参数: host' - type: string - required: - - host - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + host: + type: string + required: + - host + type: object + data: + properties: + pose: + type: array + status: + type: string + required: + - pose + - status + type: object diff --git a/unilabos/registry/devices/robot_arm.yaml b/unilabos/registry/devices/robot_arm.yaml index 0e32da1..72f0155 100644 --- a/unilabos/registry/devices/robot_arm.yaml +++ b/unilabos/registry/devices/robot_arm.yaml @@ -8,18 +8,17 @@ robotic_arm.UR: handles: [] result: {} schema: - description: UniLabJsonCommand arm_init 的参数schema + description: arm_init的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand arm_init 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: arm_init 命令参数 + title: arm_init参数 type: object type: UniLabJsonCommand auto-load_pose_data: @@ -30,14 +29,12 @@ robotic_arm.UR: handles: [] result: {} schema: - description: UniLabJsonCommand load_pose_data 的参数schema + description: load_pose_data的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand load_pose_data 的参数schema properties: data: - description: '参数: data' type: string required: - data @@ -45,7 +42,7 @@ robotic_arm.UR: result: {} required: - goal - title: load_pose_data 命令参数 + title: load_pose_data参数 type: object type: UniLabJsonCommand auto-load_pose_file: @@ -56,14 +53,12 @@ robotic_arm.UR: handles: [] result: {} schema: - description: UniLabJsonCommand load_pose_file 的参数schema + description: load_pose_file的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand load_pose_file 的参数schema properties: file: - description: '参数: file' type: string required: - file @@ -71,7 +66,7 @@ robotic_arm.UR: result: {} required: - goal - title: load_pose_file 命令参数 + title: load_pose_file参数 type: object type: UniLabJsonCommand auto-move_pos_task: @@ -82,14 +77,12 @@ robotic_arm.UR: handles: [] result: {} schema: - description: UniLabJsonCommand move_pos_task 的参数schema + description: move_pos_task的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand move_pos_task 的参数schema properties: command: - description: '参数: command' type: string required: - command @@ -97,7 +90,7 @@ robotic_arm.UR: result: {} required: - goal - title: move_pos_task 命令参数 + title: move_pos_task参数 type: object type: UniLabJsonCommand auto-reload_pose: @@ -107,18 +100,17 @@ robotic_arm.UR: handles: [] result: {} schema: - description: UniLabJsonCommand reload_pose 的参数schema + description: reload_pose的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand reload_pose 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: reload_pose 命令参数 + title: reload_pose参数 type: object type: UniLabJsonCommand move_pos_task: @@ -179,24 +171,29 @@ robotic_arm.UR: handles: [] icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - host: - description: '参数: host' - type: string - retry: - default: 30 - description: '参数: retry' - type: integer - required: - - host - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + host: + type: string + retry: + default: 30 + type: string + required: + - host + type: object + data: + properties: + arm_pose: + type: array + arm_status: + type: string + gripper_pose: + type: number + gripper_status: + type: string + required: + - arm_pose + - gripper_pose + - arm_status + - gripper_status + type: object diff --git a/unilabos/registry/devices/robot_gripper.yaml b/unilabos/registry/devices/robot_gripper.yaml index aa1795a..8a3be30 100644 --- a/unilabos/registry/devices/robot_gripper.yaml +++ b/unilabos/registry/devices/robot_gripper.yaml @@ -8,18 +8,17 @@ gripper.misumi_rz: handles: [] result: {} schema: - description: UniLabJsonCommand data_loop 的参数schema + description: data_loop的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand data_loop 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: data_loop 命令参数 + title: data_loop参数 type: object type: UniLabJsonCommand auto-data_reader: @@ -29,18 +28,17 @@ gripper.misumi_rz: handles: [] result: {} schema: - description: UniLabJsonCommand data_reader 的参数schema + description: data_reader的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand data_reader 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: data_reader 命令参数 + title: data_reader参数 type: object type: UniLabJsonCommand auto-gripper_move: @@ -53,20 +51,16 @@ gripper.misumi_rz: handles: [] result: {} schema: - description: UniLabJsonCommand gripper_move 的参数schema + description: gripper_move的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand gripper_move 的参数schema properties: force: - description: '参数: force' type: string pos: - description: '参数: pos' type: string speed: - description: '参数: speed' type: string required: - pos @@ -76,7 +70,7 @@ gripper.misumi_rz: result: {} required: - goal - title: gripper_move 命令参数 + title: gripper_move参数 type: object type: UniLabJsonCommand auto-init_gripper: @@ -86,18 +80,17 @@ gripper.misumi_rz: handles: [] result: {} schema: - description: UniLabJsonCommand init_gripper 的参数schema + description: init_gripper的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand init_gripper 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: init_gripper 命令参数 + title: init_gripper参数 type: object type: UniLabJsonCommand auto-modbus_crc: @@ -108,14 +101,12 @@ gripper.misumi_rz: handles: [] result: {} schema: - description: UniLabJsonCommand modbus_crc 的参数schema + description: modbus_crc的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand modbus_crc 的参数schema properties: data: - description: '参数: data' type: string required: - data @@ -123,7 +114,7 @@ gripper.misumi_rz: result: {} required: - goal - title: modbus_crc 命令参数 + title: modbus_crc参数 type: object type: UniLabJsonCommand auto-move_and_rotate: @@ -139,29 +130,22 @@ gripper.misumi_rz: handles: [] result: {} schema: - description: UniLabJsonCommand move_and_rotate 的参数schema + description: move_and_rotate的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand move_and_rotate 的参数schema properties: grasp_F: - description: '参数: grasp_F' type: string grasp_pos: - description: '参数: grasp_pos' type: string grasp_v: - description: '参数: grasp_v' type: string spin_F: - description: '参数: spin_F' type: string spin_pos: - description: '参数: spin_pos' type: string spin_v: - description: '参数: spin_v' type: string required: - spin_pos @@ -174,7 +158,7 @@ gripper.misumi_rz: result: {} required: - goal - title: move_and_rotate 命令参数 + title: move_and_rotate参数 type: object type: UniLabJsonCommand auto-node_gripper_move: @@ -185,14 +169,12 @@ gripper.misumi_rz: handles: [] result: {} schema: - description: UniLabJsonCommand node_gripper_move 的参数schema + description: node_gripper_move的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand node_gripper_move 的参数schema properties: cmd: - description: '参数: cmd' type: string required: - cmd @@ -200,7 +182,7 @@ gripper.misumi_rz: result: {} required: - goal - title: node_gripper_move 命令参数 + title: node_gripper_move参数 type: object type: UniLabJsonCommand auto-node_rotate_move: @@ -211,14 +193,12 @@ gripper.misumi_rz: handles: [] result: {} schema: - description: UniLabJsonCommand node_rotate_move 的参数schema + description: node_rotate_move的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand node_rotate_move 的参数schema properties: cmd: - description: '参数: cmd' type: string required: - cmd @@ -226,7 +206,7 @@ gripper.misumi_rz: result: {} required: - goal - title: node_rotate_move 命令参数 + title: node_rotate_move参数 type: object type: UniLabJsonCommand auto-read_address: @@ -239,20 +219,16 @@ gripper.misumi_rz: handles: [] result: {} schema: - description: UniLabJsonCommand read_address 的参数schema + description: read_address的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand read_address 的参数schema properties: address: - description: '参数: address' type: string data_len: - description: '参数: data_len' type: string id: - description: '参数: id' type: string required: - id @@ -262,7 +238,7 @@ gripper.misumi_rz: result: {} required: - goal - title: read_address 命令参数 + title: read_address参数 type: object type: UniLabJsonCommand auto-rotate_move_abs: @@ -275,20 +251,16 @@ gripper.misumi_rz: handles: [] result: {} schema: - description: UniLabJsonCommand rotate_move_abs 的参数schema + description: rotate_move_abs的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand rotate_move_abs 的参数schema properties: force: - description: '参数: force' type: string pos: - description: '参数: pos' type: string speed: - description: '参数: speed' type: string required: - pos @@ -298,7 +270,7 @@ gripper.misumi_rz: result: {} required: - goal - title: rotate_move_abs 命令参数 + title: rotate_move_abs参数 type: object type: UniLabJsonCommand auto-send_cmd: @@ -312,23 +284,18 @@ gripper.misumi_rz: handles: [] result: {} schema: - description: UniLabJsonCommand send_cmd 的参数schema + description: send_cmd的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand send_cmd 的参数schema properties: address: - description: '参数: address' type: string data: - description: '参数: data' type: string fun: - description: '参数: fun' type: string id: - description: '参数: id' type: string required: - id @@ -339,7 +306,7 @@ gripper.misumi_rz: result: {} required: - goal - title: send_cmd 命令参数 + title: send_cmd参数 type: object type: UniLabJsonCommand auto-wait_for_gripper: @@ -349,18 +316,17 @@ gripper.misumi_rz: handles: [] result: {} schema: - description: UniLabJsonCommand wait_for_gripper 的参数schema + description: wait_for_gripper的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand wait_for_gripper 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: wait_for_gripper 命令参数 + title: wait_for_gripper参数 type: object type: UniLabJsonCommand auto-wait_for_gripper_init: @@ -370,18 +336,17 @@ gripper.misumi_rz: handles: [] result: {} schema: - description: UniLabJsonCommand wait_for_gripper_init 的参数schema + description: wait_for_gripper_init的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand wait_for_gripper_init 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: wait_for_gripper_init 命令参数 + title: wait_for_gripper_init参数 type: object type: UniLabJsonCommand auto-wait_for_rotate: @@ -391,18 +356,17 @@ gripper.misumi_rz: handles: [] result: {} schema: - description: UniLabJsonCommand wait_for_rotate 的参数schema + description: wait_for_rotate的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand wait_for_rotate 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: wait_for_rotate 命令参数 + title: wait_for_rotate参数 type: object type: UniLabJsonCommand execute_command_from_outer: @@ -460,35 +424,29 @@ gripper.misumi_rz: handles: [] icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - baudrate: - default: 115200 - description: '参数: baudrate' - type: integer - id: - default: 9 - description: '参数: id' - type: integer - port: - description: '参数: port' - type: string - pos_error: - default: -11 - description: '参数: pos_error' - type: integer - required: - - port - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + baudrate: + default: 115200 + type: string + id: + default: 9 + type: string + port: + type: string + pos_error: + default: -11 + type: string + required: + - port + type: object + data: + properties: + status: + type: string + required: + - status + type: object gripper.mock: class: action_value_mappings: @@ -503,31 +461,27 @@ gripper.mock: handles: [] result: {} schema: - description: UniLabJsonCommand edit_id 的参数schema + description: edit_id的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand edit_id 的参数schema properties: params: default: '{}' - description: '参数: params' type: string resource: default: Gripper1: {} - description: '参数: resource' type: object wf_name: default: gripper_run - description: '参数: wf_name' type: string required: [] type: object result: {} required: - goal - title: edit_id 命令参数 + title: edit_id参数 type: object type: UniLabJsonCommand auto-push_to: @@ -540,21 +494,17 @@ gripper.mock: handles: [] result: {} schema: - description: UniLabJsonCommand push_to 的参数schema + description: push_to的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand push_to 的参数schema properties: position: - description: '参数: position' type: number torque: - description: '参数: torque' type: number velocity: default: 0.0 - description: '参数: velocity' type: number required: - position @@ -563,7 +513,7 @@ gripper.mock: result: {} required: - goal - title: push_to 命令参数 + title: push_to参数 type: object type: UniLabJsonCommand push_to: @@ -654,16 +604,23 @@ gripper.mock: handles: [] icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: {} + required: [] + type: object + data: + properties: + position: + type: number + status: + type: string + torque: + type: number + velocity: + type: number + required: + - position + - velocity + - torque + - status + type: object diff --git a/unilabos/registry/devices/robot_linear_motion.yaml b/unilabos/registry/devices/robot_linear_motion.yaml index 9a99a61..fa98ca9 100644 --- a/unilabos/registry/devices/robot_linear_motion.yaml +++ b/unilabos/registry/devices/robot_linear_motion.yaml @@ -8,18 +8,17 @@ linear_motion.grbl: handles: [] result: {} schema: - description: UniLabJsonCommand initialize 的参数schema + description: initialize的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand initialize 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: initialize 命令参数 + title: initialize参数 type: object type: UniLabJsonCommand auto-move_through_points: @@ -30,14 +29,12 @@ linear_motion.grbl: handles: [] result: {} schema: - description: UniLabJsonCommand move_through_points 的参数schema + description: move_through_points的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand move_through_points 的参数schema properties: positions: - description: '参数: positions' type: array required: - positions @@ -45,7 +42,7 @@ linear_motion.grbl: result: {} required: - goal - title: move_through_points 命令参数 + title: move_through_points参数 type: object type: UniLabJsonCommand auto-set_position: @@ -56,14 +53,12 @@ linear_motion.grbl: handles: [] result: {} schema: - description: UniLabJsonCommand set_position 的参数schema + description: set_position的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_position 的参数schema properties: position: - description: '参数: position' type: string required: - position @@ -71,7 +66,7 @@ linear_motion.grbl: result: {} required: - goal - title: set_position 命令参数 + title: set_position参数 type: object type: UniLabJsonCommand auto-set_spindle_speed: @@ -83,18 +78,15 @@ linear_motion.grbl: handles: [] result: {} schema: - description: UniLabJsonCommand set_spindle_speed 的参数schema + description: set_spindle_speed的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_spindle_speed 的参数schema properties: max_velocity: default: 500 - description: '参数: max_velocity' type: number spindle_speed: - description: '参数: spindle_speed' type: number required: - spindle_speed @@ -102,7 +94,7 @@ linear_motion.grbl: result: {} required: - goal - title: set_spindle_speed 命令参数 + title: set_spindle_speed参数 type: object type: UniLabJsonCommand auto-stop_operation: @@ -112,18 +104,17 @@ linear_motion.grbl: handles: [] result: {} schema: - description: UniLabJsonCommand stop_operation 的参数schema + description: stop_operation的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand stop_operation 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: stop_operation 命令参数 + title: stop_operation参数 type: object type: UniLabJsonCommand auto-wait_error: @@ -133,18 +124,17 @@ linear_motion.grbl: handles: [] result: {} schema: - description: UniLabJsonCommand wait_error 的参数schema + description: wait_error的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand wait_error 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: wait_error 命令参数 + title: wait_error参数 type: object type: UniLabJsonCommandAsync move_through_points: @@ -502,37 +492,38 @@ linear_motion.grbl: handles: [] icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - address: - default: '1' - description: '参数: address' - type: string - limits: - default: - - -150 - - 150 - - -200 - - 0 - - -80 - - 0 - description: '参数: limits' - type: array - port: - description: '参数: port' - type: string - required: - - port - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + address: + default: '1' + type: string + limits: + default: + - -150 + - 150 + - -200 + - 0 + - -80 + - 0 + type: array + port: + type: string + required: + - port + type: object + data: + properties: + position: + type: string + spindle_speed: + type: number + status: + type: string + required: + - status + - position + - spindle_speed + type: object motor.iCL42: class: action_value_mappings: @@ -546,20 +537,16 @@ motor.iCL42: handles: [] result: {} schema: - description: UniLabJsonCommand execute_run_motor 的参数schema + description: execute_run_motor的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand execute_run_motor 的参数schema properties: mode: - description: '参数: mode' type: string position: - description: '参数: position' type: number velocity: - description: '参数: velocity' type: integer required: - mode @@ -569,7 +556,7 @@ motor.iCL42: result: {} required: - goal - title: execute_run_motor 命令参数 + title: execute_run_motor参数 type: object type: UniLabJsonCommand auto-init_device: @@ -579,18 +566,17 @@ motor.iCL42: handles: [] result: {} schema: - description: UniLabJsonCommand init_device 的参数schema + description: init_device的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand init_device 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: init_device 命令参数 + title: init_device参数 type: object type: UniLabJsonCommand auto-run_motor: @@ -603,20 +589,16 @@ motor.iCL42: handles: [] result: {} schema: - description: UniLabJsonCommand run_motor 的参数schema + description: run_motor的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand run_motor 的参数schema properties: mode: - description: '参数: mode' type: string position: - description: '参数: position' type: number velocity: - description: '参数: velocity' type: integer required: - mode @@ -626,7 +608,7 @@ motor.iCL42: result: {} required: - goal - title: run_motor 命令参数 + title: run_motor参数 type: object type: UniLabJsonCommand execute_command_from_outer: @@ -686,24 +668,26 @@ motor.iCL42: handles: [] icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - device_address: - default: 1 - description: '参数: device_address' - type: integer - device_com: - default: COM9 - description: '参数: device_com' - type: string - required: [] - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + device_address: + default: 1 + type: integer + device_com: + default: COM9 + type: string + required: [] + type: object + data: + properties: + is_executing_run: + type: boolean + motor_position: + type: integer + success: + type: boolean + required: + - motor_position + - is_executing_run + - success + type: object diff --git a/unilabos/registry/devices/sim_nodes.yaml b/unilabos/registry/devices/sim_nodes.yaml index bf33b8e..07d1d1d 100644 --- a/unilabos/registry/devices/sim_nodes.yaml +++ b/unilabos/registry/devices/sim_nodes.yaml @@ -8,18 +8,17 @@ lh_joint_publisher: handles: [] result: {} schema: - description: UniLabJsonCommand check_tf_update_actions 的参数schema + description: check_tf_update_actions的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand check_tf_update_actions 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: check_tf_update_actions 命令参数 + title: check_tf_update_actions参数 type: object type: UniLabJsonCommand auto-find_resource_parent: @@ -30,14 +29,12 @@ lh_joint_publisher: handles: [] result: {} schema: - description: UniLabJsonCommand find_resource_parent 的参数schema + description: find_resource_parent的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand find_resource_parent 的参数schema properties: resource_id: - description: '参数: resource_id' type: string required: - resource_id @@ -45,7 +42,7 @@ lh_joint_publisher: result: {} required: - goal - title: find_resource_parent 命令参数 + title: find_resource_parent参数 type: object type: UniLabJsonCommand auto-inverse_kinematics: @@ -62,32 +59,24 @@ lh_joint_publisher: handles: [] result: {} schema: - description: UniLabJsonCommand inverse_kinematics 的参数schema + description: inverse_kinematics的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand inverse_kinematics 的参数schema properties: parent_id: - description: '参数: parent_id' type: string x: - description: '参数: x' type: string x_joint: - description: '参数: x_joint' type: object y: - description: '参数: y' type: string y_joint: - description: '参数: y_joint' type: object z: - description: '参数: z' type: string z_joint: - description: '参数: z_joint' type: object required: - x @@ -101,7 +90,7 @@ lh_joint_publisher: result: {} required: - goal - title: inverse_kinematics 命令参数 + title: inverse_kinematics参数 type: object type: UniLabJsonCommand auto-lh_joint_action_callback: @@ -112,14 +101,12 @@ lh_joint_publisher: handles: [] result: {} schema: - description: UniLabJsonCommand lh_joint_action_callback 的参数schema + description: lh_joint_action_callback的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand lh_joint_action_callback 的参数schema properties: goal_handle: - description: '参数: goal_handle' type: string required: - goal_handle @@ -127,7 +114,7 @@ lh_joint_publisher: result: {} required: - goal - title: lh_joint_action_callback 命令参数 + title: lh_joint_action_callback参数 type: object type: UniLabJsonCommand auto-lh_joint_pub_callback: @@ -137,18 +124,17 @@ lh_joint_publisher: handles: [] result: {} schema: - description: UniLabJsonCommand lh_joint_pub_callback 的参数schema + description: lh_joint_pub_callback的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand lh_joint_pub_callback 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: lh_joint_pub_callback 命令参数 + title: lh_joint_pub_callback参数 type: object type: UniLabJsonCommand auto-move_joints: @@ -167,39 +153,29 @@ lh_joint_publisher: handles: [] result: {} schema: - description: UniLabJsonCommand move_joints 的参数schema + description: move_joints的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand move_joints 的参数schema properties: option: - description: '参数: option' type: string resource_names: - description: '参数: resource_names' type: string speed: default: 0.1 - description: '参数: speed' type: string x: - description: '参数: x' type: string x_joint: - description: '参数: x_joint' type: string y: - description: '参数: y' type: string y_joint: - description: '参数: y_joint' type: string z: - description: '参数: z' type: string z_joint: - description: '参数: z_joint' type: string required: - resource_names @@ -211,7 +187,7 @@ lh_joint_publisher: result: {} required: - goal - title: move_joints 命令参数 + title: move_joints参数 type: object type: UniLabJsonCommand auto-move_to: @@ -224,20 +200,16 @@ lh_joint_publisher: handles: [] result: {} schema: - description: UniLabJsonCommand move_to 的参数schema + description: move_to的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand move_to 的参数schema properties: joint_positions: - description: '参数: joint_positions' type: string parent_id: - description: '参数: parent_id' type: string speed: - description: '参数: speed' type: string required: - joint_positions @@ -247,7 +219,7 @@ lh_joint_publisher: result: {} required: - goal - title: move_to 命令参数 + title: move_to参数 type: object type: UniLabJsonCommand auto-resource_move: @@ -260,20 +232,16 @@ lh_joint_publisher: handles: [] result: {} schema: - description: UniLabJsonCommand resource_move 的参数schema + description: resource_move的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand resource_move 的参数schema properties: channels: - description: '参数: channels' type: array link_name: - description: '参数: link_name' type: string resource_id: - description: '参数: resource_id' type: string required: - resource_id @@ -283,7 +251,7 @@ lh_joint_publisher: result: {} required: - goal - title: resource_move 命令参数 + title: resource_move参数 type: object type: UniLabJsonCommand auto-send_resource_action: @@ -295,17 +263,14 @@ lh_joint_publisher: handles: [] result: {} schema: - description: UniLabJsonCommand send_resource_action 的参数schema + description: send_resource_action的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand send_resource_action 的参数schema properties: link_name: - description: '参数: link_name' type: string resource_id_list: - description: '参数: resource_id_list' type: array required: - resource_id_list @@ -314,7 +279,7 @@ lh_joint_publisher: result: {} required: - goal - title: send_resource_action 命令参数 + title: send_resource_action参数 type: object type: UniLabJsonCommand module: unilabos.devices.ros_dev.liquid_handler_joint_publisher:LiquidHandlerJointPublisher @@ -324,32 +289,23 @@ lh_joint_publisher: handles: [] icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - device_id: - default: lh_joint_publisher - description: '参数: device_id' - type: string - rate: - default: 50 - description: '参数: rate' - type: integer - resource_tracker: - description: '参数: resource_tracker' - type: string - resources_config: - description: '参数: resources_config' - type: array - required: - - resources_config - - resource_tracker - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + device_id: + default: lh_joint_publisher + type: string + rate: + default: 50 + type: string + resource_tracker: + type: string + resources_config: + type: array + required: + - resources_config + - resource_tracker + type: object + data: + properties: {} + required: [] + type: object diff --git a/unilabos/registry/devices/temperature.yaml b/unilabos/registry/devices/temperature.yaml index b94f939..68a4f5e 100644 --- a/unilabos/registry/devices/temperature.yaml +++ b/unilabos/registry/devices/temperature.yaml @@ -12,23 +12,18 @@ chiller: handles: [] result: {} schema: - description: UniLabJsonCommand build_modbus_frame 的参数schema + description: build_modbus_frame的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand build_modbus_frame 的参数schema properties: device_address: - description: '参数: device_address' type: integer function_code: - description: '参数: function_code' type: integer register_address: - description: '参数: register_address' type: integer value: - description: '参数: value' type: integer required: - device_address @@ -39,7 +34,7 @@ chiller: result: {} required: - goal - title: build_modbus_frame 命令参数 + title: build_modbus_frame参数 type: object type: UniLabJsonCommand auto-convert_temperature_to_modbus_value: @@ -51,18 +46,15 @@ chiller: handles: [] result: {} schema: - description: UniLabJsonCommand convert_temperature_to_modbus_value 的参数schema + description: convert_temperature_to_modbus_value的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand convert_temperature_to_modbus_value 的参数schema properties: decimal_points: default: 1 - description: '参数: decimal_points' type: integer temperature: - description: '参数: temperature' type: number required: - temperature @@ -70,7 +62,7 @@ chiller: result: {} required: - goal - title: convert_temperature_to_modbus_value 命令参数 + title: convert_temperature_to_modbus_value参数 type: object type: UniLabJsonCommand auto-modbus_crc: @@ -81,14 +73,12 @@ chiller: handles: [] result: {} schema: - description: UniLabJsonCommand modbus_crc 的参数schema + description: modbus_crc的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand modbus_crc 的参数schema properties: data: - description: '参数: data' type: string required: - data @@ -96,7 +86,7 @@ chiller: result: {} required: - goal - title: modbus_crc 命令参数 + title: modbus_crc参数 type: object type: UniLabJsonCommand auto-set_temperature: @@ -107,14 +97,12 @@ chiller: handles: [] result: {} schema: - description: UniLabJsonCommand set_temperature 的参数schema + description: set_temperature的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_temperature 的参数schema properties: command: - description: '参数: command' type: string required: - command @@ -122,7 +110,7 @@ chiller: result: {} required: - goal - title: set_temperature 命令参数 + title: set_temperature参数 type: object type: UniLabJsonCommand auto-stop: @@ -132,18 +120,17 @@ chiller: handles: [] result: {} schema: - description: UniLabJsonCommand stop 的参数schema + description: stop的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand stop 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: stop 命令参数 + title: stop参数 type: object type: UniLabJsonCommand set_temperature: @@ -200,27 +187,20 @@ chiller: handles: [] icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - port: - description: '参数: port' - type: string - rate: - default: 9600 - description: '参数: rate' - type: integer - required: - - port - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + port: + type: string + rate: + default: 9600 + type: string + required: + - port + type: object + data: + properties: {} + required: [] + type: object heaterstirrer.dalong: class: action_value_mappings: @@ -231,18 +211,17 @@ heaterstirrer.dalong: handles: [] result: {} schema: - description: UniLabJsonCommand close 的参数schema + description: close的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand close 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: close 命令参数 + title: close参数 type: object type: UniLabJsonCommand auto-heatchill: @@ -258,33 +237,26 @@ heaterstirrer.dalong: handles: [] result: {} schema: - description: UniLabJsonCommand heatchill 的参数schema + description: heatchill的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand heatchill 的参数schema properties: purpose: default: reaction - description: '参数: purpose' type: string stir: default: true - description: '参数: stir' type: boolean stir_speed: default: 300 - description: '参数: stir_speed' type: number temp: - description: '参数: temp' type: number time: default: 3600 - description: '参数: time' type: number vessel: - description: '参数: vessel' type: string required: - vessel @@ -293,7 +265,7 @@ heaterstirrer.dalong: result: {} required: - goal - title: heatchill 命令参数 + title: heatchill参数 type: object type: UniLabJsonCommand auto-set_stir_speed: @@ -304,14 +276,12 @@ heaterstirrer.dalong: handles: [] result: {} schema: - description: UniLabJsonCommand set_stir_speed 的参数schema + description: set_stir_speed的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_stir_speed 的参数schema properties: speed: - description: '参数: speed' type: number required: - speed @@ -319,7 +289,7 @@ heaterstirrer.dalong: result: {} required: - goal - title: set_stir_speed 命令参数 + title: set_stir_speed参数 type: object type: UniLabJsonCommand auto-set_temp_inner: @@ -331,18 +301,15 @@ heaterstirrer.dalong: handles: [] result: {} schema: - description: UniLabJsonCommand set_temp_inner 的参数schema + description: set_temp_inner的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_temp_inner 的参数schema properties: temp: - description: '参数: temp' type: number type: default: warning - description: '参数: type' type: string required: - temp @@ -350,7 +317,7 @@ heaterstirrer.dalong: result: {} required: - goal - title: set_temp_inner 命令参数 + title: set_temp_inner参数 type: object type: UniLabJsonCommand auto-set_temp_target: @@ -361,14 +328,12 @@ heaterstirrer.dalong: handles: [] result: {} schema: - description: UniLabJsonCommand set_temp_target 的参数schema + description: set_temp_target的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_temp_target 的参数schema properties: temp: - description: '参数: temp' type: string required: - temp @@ -376,7 +341,7 @@ heaterstirrer.dalong: result: {} required: - goal - title: set_temp_target 命令参数 + title: set_temp_target参数 type: object type: UniLabJsonCommand auto-set_temp_warning: @@ -387,14 +352,12 @@ heaterstirrer.dalong: handles: [] result: {} schema: - description: UniLabJsonCommand set_temp_warning 的参数schema + description: set_temp_warning的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_temp_warning 的参数schema properties: temp: - description: '参数: temp' type: string required: - temp @@ -402,7 +365,7 @@ heaterstirrer.dalong: result: {} required: - goal - title: set_temp_warning 命令参数 + title: set_temp_warning参数 type: object type: UniLabJsonCommand heatchill: @@ -582,31 +545,38 @@ heaterstirrer.dalong: handles: [] icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - baudrate: - default: 9600 - description: '参数: baudrate' - type: integer - port: - default: COM6 - description: '参数: port' - type: string - temp_warning: - default: 50.0 - description: '参数: temp_warning' - type: number - required: [] - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + baudrate: + default: 9600 + type: integer + port: + default: COM6 + type: string + temp_warning: + default: 50.0 + type: string + required: [] + type: object + data: + properties: + status: + type: string + stir_speed: + type: number + temp: + type: number + temp_target: + type: number + temp_warning: + type: number + required: + - status + - stir_speed + - temp + - temp_warning + - temp_target + type: object tempsensor: class: action_value_mappings: @@ -621,23 +591,18 @@ tempsensor: handles: [] result: {} schema: - description: UniLabJsonCommand build_modbus_request 的参数schema + description: build_modbus_request的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand build_modbus_request 的参数schema properties: device_id: - description: '参数: device_id' type: string function_code: - description: '参数: function_code' type: string register_address: - description: '参数: register_address' type: string register_count: - description: '参数: register_count' type: string required: - device_id @@ -648,7 +613,7 @@ tempsensor: result: {} required: - goal - title: build_modbus_request 命令参数 + title: build_modbus_request参数 type: object type: UniLabJsonCommand auto-calculate_crc: @@ -659,14 +624,12 @@ tempsensor: handles: [] result: {} schema: - description: UniLabJsonCommand calculate_crc 的参数schema + description: calculate_crc的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand calculate_crc 的参数schema properties: data: - description: '参数: data' type: string required: - data @@ -674,7 +637,7 @@ tempsensor: result: {} required: - goal - title: calculate_crc 命令参数 + title: calculate_crc参数 type: object type: UniLabJsonCommand auto-read_modbus_response: @@ -685,14 +648,12 @@ tempsensor: handles: [] result: {} schema: - description: UniLabJsonCommand read_modbus_response 的参数schema + description: read_modbus_response的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand read_modbus_response 的参数schema properties: response: - description: '参数: response' type: string required: - response @@ -700,7 +661,7 @@ tempsensor: result: {} required: - goal - title: read_modbus_response 命令参数 + title: read_modbus_response参数 type: object type: UniLabJsonCommand auto-send_prototype_command: @@ -711,14 +672,12 @@ tempsensor: handles: [] result: {} schema: - description: UniLabJsonCommand send_prototype_command 的参数schema + description: send_prototype_command的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand send_prototype_command 的参数schema properties: command: - description: '参数: command' type: string required: - command @@ -726,7 +685,7 @@ tempsensor: result: {} required: - goal - title: send_prototype_command 命令参数 + title: send_prototype_command参数 type: object type: UniLabJsonCommand auto-set_warning: @@ -737,14 +696,12 @@ tempsensor: handles: [] result: {} schema: - description: UniLabJsonCommand set_warning 的参数schema + description: set_warning的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_warning 的参数schema properties: command: - description: '参数: command' type: string required: - command @@ -752,7 +709,7 @@ tempsensor: result: {} required: - goal - title: set_warning 命令参数 + title: set_warning参数 type: object type: UniLabJsonCommand set_warning: @@ -810,32 +767,26 @@ tempsensor: handles: [] icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - address: - description: '参数: address' - type: string - baudrate: - default: 9600 - description: '参数: baudrate' - type: integer - port: - description: '参数: port' - type: string - warning: - description: '参数: warning' - type: string - required: - - port - - warning - - address - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + address: + type: string + baudrate: + default: 9600 + type: string + port: + type: string + warning: + type: string + required: + - port + - warning + - address + type: object + data: + properties: + value: + type: number + required: + - value + type: object diff --git a/unilabos/registry/devices/vacuum_and_purge.yaml b/unilabos/registry/devices/vacuum_and_purge.yaml index 0497ee7..7239432 100644 --- a/unilabos/registry/devices/vacuum_and_purge.yaml +++ b/unilabos/registry/devices/vacuum_and_purge.yaml @@ -8,18 +8,17 @@ gas_source.mock: handles: [] result: {} schema: - description: UniLabJsonCommand close 的参数schema + description: close的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand close 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: close 命令参数 + title: close参数 type: object type: UniLabJsonCommand auto-is_closed: @@ -29,18 +28,17 @@ gas_source.mock: handles: [] result: {} schema: - description: UniLabJsonCommand is_closed 的参数schema + description: is_closed的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand is_closed 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: is_closed 命令参数 + title: is_closed参数 type: object type: UniLabJsonCommand auto-is_open: @@ -50,18 +48,17 @@ gas_source.mock: handles: [] result: {} schema: - description: UniLabJsonCommand is_open 的参数schema + description: is_open的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand is_open 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: is_open 命令参数 + title: is_open参数 type: object type: UniLabJsonCommand auto-open: @@ -71,18 +68,17 @@ gas_source.mock: handles: [] result: {} schema: - description: UniLabJsonCommand open 的参数schema + description: open的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand open 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: open 命令参数 + title: open参数 type: object type: UniLabJsonCommand auto-set_status: @@ -93,14 +89,12 @@ gas_source.mock: handles: [] result: {} schema: - description: UniLabJsonCommand set_status 的参数schema + description: set_status的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_status 的参数schema properties: string: - description: '参数: string' type: string required: - string @@ -108,7 +102,7 @@ gas_source.mock: result: {} required: - goal - title: set_status 命令参数 + title: set_status参数 type: object type: UniLabJsonCommand close: @@ -238,23 +232,20 @@ gas_source.mock: label: out icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - port: - default: COM6 - description: '参数: port' - type: string - required: [] - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + port: + default: COM6 + type: string + required: [] + type: object + data: + properties: + status: + type: string + required: + - status + type: object vacuum_pump.mock: class: action_value_mappings: @@ -265,18 +256,17 @@ vacuum_pump.mock: handles: [] result: {} schema: - description: UniLabJsonCommand close 的参数schema + description: close的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand close 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: close 命令参数 + title: close参数 type: object type: UniLabJsonCommand auto-is_closed: @@ -286,18 +276,17 @@ vacuum_pump.mock: handles: [] result: {} schema: - description: UniLabJsonCommand is_closed 的参数schema + description: is_closed的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand is_closed 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: is_closed 命令参数 + title: is_closed参数 type: object type: UniLabJsonCommand auto-is_open: @@ -307,18 +296,17 @@ vacuum_pump.mock: handles: [] result: {} schema: - description: UniLabJsonCommand is_open 的参数schema + description: is_open的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand is_open 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: is_open 命令参数 + title: is_open参数 type: object type: UniLabJsonCommand auto-open: @@ -328,18 +316,17 @@ vacuum_pump.mock: handles: [] result: {} schema: - description: UniLabJsonCommand open 的参数schema + description: open的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand open 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: open 命令参数 + title: open参数 type: object type: UniLabJsonCommand auto-set_status: @@ -350,14 +337,12 @@ vacuum_pump.mock: handles: [] result: {} schema: - description: UniLabJsonCommand set_status 的参数schema + description: set_status的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_status 的参数schema properties: string: - description: '参数: string' type: string required: - string @@ -365,7 +350,7 @@ vacuum_pump.mock: result: {} required: - goal - title: set_status 命令参数 + title: set_status参数 type: object type: UniLabJsonCommand close: @@ -495,20 +480,17 @@ vacuum_pump.mock: label: out icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - port: - default: COM6 - description: '参数: port' - type: string - required: [] - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + port: + default: COM6 + type: string + required: [] + type: object + data: + properties: + status: + type: string + required: + - status + type: object diff --git a/unilabos/registry/devices/virtual_device.yaml b/unilabos/registry/devices/virtual_device.yaml index 953be1a..8894314 100644 --- a/unilabos/registry/devices/virtual_device.yaml +++ b/unilabos/registry/devices/virtual_device.yaml @@ -12,24 +12,19 @@ virtual_centrifuge: handles: [] result: {} schema: - description: UniLabJsonCommand centrifuge 的参数schema + description: centrifuge的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand centrifuge 的参数schema properties: speed: - description: '参数: speed' type: number temp: default: 25.0 - description: '参数: temp' type: number time: - description: '参数: time' type: number vessel: - description: '参数: vessel' type: string required: - vessel @@ -39,7 +34,7 @@ virtual_centrifuge: result: {} required: - goal - title: centrifuge 命令参数 + title: centrifuge参数 type: object type: UniLabJsonCommandAsync auto-cleanup: @@ -49,18 +44,17 @@ virtual_centrifuge: handles: [] result: {} schema: - description: UniLabJsonCommand cleanup 的参数schema + description: cleanup的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand cleanup 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: cleanup 命令参数 + title: cleanup参数 type: object type: UniLabJsonCommandAsync auto-initialize: @@ -70,18 +64,17 @@ virtual_centrifuge: handles: [] result: {} schema: - description: UniLabJsonCommand initialize 的参数schema + description: initialize的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand initialize 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: initialize 命令参数 + title: initialize参数 type: object type: UniLabJsonCommandAsync centrifuge: @@ -190,29 +183,54 @@ virtual_centrifuge: side: NORTH icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - config: - description: '参数: config' - type: string - device_id: - description: '参数: device_id' - type: string - kwargs: - description: '参数: kwargs' - type: string - required: - - kwargs - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + config: + type: string + device_id: + type: string + required: [] + type: object + data: + properties: + centrifuge_state: + type: string + current_speed: + type: number + current_temp: + type: number + max_speed: + type: number + max_temp: + type: number + message: + type: string + min_temp: + type: number + progress: + type: number + status: + type: string + target_speed: + type: number + target_temp: + type: number + time_remaining: + type: number + required: + - status + - centrifuge_state + - current_speed + - target_speed + - current_temp + - target_temp + - max_speed + - max_temp + - min_temp + - time_remaining + - progress + - message + type: object virtual_column: class: action_value_mappings: @@ -223,18 +241,17 @@ virtual_column: handles: [] result: {} schema: - description: UniLabJsonCommand cleanup 的参数schema + description: cleanup的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand cleanup 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: cleanup 命令参数 + title: cleanup参数 type: object type: UniLabJsonCommandAsync auto-initialize: @@ -244,18 +261,17 @@ virtual_column: handles: [] result: {} schema: - description: UniLabJsonCommand initialize 的参数schema + description: initialize的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand initialize 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: initialize 命令参数 + title: initialize参数 type: object type: UniLabJsonCommandAsync auto-run_column: @@ -268,20 +284,16 @@ virtual_column: handles: [] result: {} schema: - description: UniLabJsonCommand run_column 的参数schema + description: run_column的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand run_column 的参数schema properties: column: - description: '参数: column' type: string from_vessel: - description: '参数: from_vessel' type: string to_vessel: - description: '参数: to_vessel' type: string required: - from_vessel @@ -291,7 +303,7 @@ virtual_column: result: {} required: - goal - title: run_column 命令参数 + title: run_column参数 type: object type: UniLabJsonCommandAsync run_column: @@ -394,29 +406,45 @@ virtual_column: side: EAST icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - config: - description: '参数: config' - type: object - device_id: - description: '参数: device_id' - type: string - kwargs: - description: '参数: kwargs' - type: string - required: - - kwargs - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + config: + type: object + device_id: + type: string + required: [] + type: object + data: + properties: + column_diameter: + type: number + column_length: + type: number + column_state: + type: string + current_flow_rate: + type: number + current_status: + type: string + max_flow_rate: + type: number + processed_volume: + type: number + progress: + type: number + status: + type: string + required: + - status + - column_state + - current_flow_rate + - max_flow_rate + - column_length + - column_diameter + - processed_volume + - progress + - current_status + type: object virtual_filter: class: action_value_mappings: @@ -427,18 +455,17 @@ virtual_filter: handles: [] result: {} schema: - description: UniLabJsonCommand cleanup 的参数schema + description: cleanup的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand cleanup 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: cleanup 命令参数 + title: cleanup参数 type: object type: UniLabJsonCommandAsync auto-filter: @@ -455,38 +482,30 @@ virtual_filter: handles: [] result: {} schema: - description: UniLabJsonCommand filter 的参数schema + description: filter的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand filter 的参数schema properties: continue_heatchill: default: false - description: '参数: continue_heatchill' type: boolean filtrate_vessel: default: '' - description: '参数: filtrate_vessel' type: string stir: default: false - description: '参数: stir' type: boolean stir_speed: default: 300.0 - description: '参数: stir_speed' type: number temp: default: 25.0 - description: '参数: temp' type: number vessel: - description: '参数: vessel' type: string volume: default: 0.0 - description: '参数: volume' type: number required: - vessel @@ -494,7 +513,7 @@ virtual_filter: result: {} required: - goal - title: filter 命令参数 + title: filter参数 type: object type: UniLabJsonCommandAsync auto-initialize: @@ -504,18 +523,17 @@ virtual_filter: handles: [] result: {} schema: - description: UniLabJsonCommand initialize 的参数schema + description: initialize的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand initialize 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: initialize 命令参数 + title: initialize参数 type: object type: UniLabJsonCommandAsync filter: @@ -653,29 +671,45 @@ virtual_filter: side: EAST icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - config: - description: '参数: config' - type: string - device_id: - description: '参数: device_id' - type: string - kwargs: - description: '参数: kwargs' - type: string - required: - - kwargs - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + config: + type: string + device_id: + type: string + required: [] + type: object + data: + properties: + current_status: + type: string + current_temp: + type: number + filtered_volume: + type: number + max_stir_speed: + type: number + max_temp: + type: number + max_volume: + type: number + message: + type: string + progress: + type: number + status: + type: string + required: + - status + - progress + - current_temp + - filtered_volume + - current_status + - message + - max_temp + - max_stir_speed + - max_volume + type: object virtual_gas_source: class: action_value_mappings: @@ -686,18 +720,17 @@ virtual_gas_source: handles: [] result: {} schema: - description: UniLabJsonCommand cleanup 的参数schema + description: cleanup的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand cleanup 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: cleanup 命令参数 + title: cleanup参数 type: object type: UniLabJsonCommandAsync auto-close: @@ -707,18 +740,17 @@ virtual_gas_source: handles: [] result: {} schema: - description: UniLabJsonCommand close 的参数schema + description: close的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand close 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: close 命令参数 + title: close参数 type: object type: UniLabJsonCommand auto-initialize: @@ -728,18 +760,17 @@ virtual_gas_source: handles: [] result: {} schema: - description: UniLabJsonCommand initialize 的参数schema + description: initialize的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand initialize 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: initialize 命令参数 + title: initialize参数 type: object type: UniLabJsonCommandAsync auto-is_closed: @@ -749,18 +780,17 @@ virtual_gas_source: handles: [] result: {} schema: - description: UniLabJsonCommand is_closed 的参数schema + description: is_closed的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand is_closed 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: is_closed 命令参数 + title: is_closed参数 type: object type: UniLabJsonCommand auto-is_open: @@ -770,18 +800,17 @@ virtual_gas_source: handles: [] result: {} schema: - description: UniLabJsonCommand is_open 的参数schema + description: is_open的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand is_open 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: is_open 命令参数 + title: is_open参数 type: object type: UniLabJsonCommand auto-open: @@ -791,18 +820,17 @@ virtual_gas_source: handles: [] result: {} schema: - description: UniLabJsonCommand open 的参数schema + description: open的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand open 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: open 命令参数 + title: open参数 type: object type: UniLabJsonCommand auto-set_status: @@ -813,14 +841,12 @@ virtual_gas_source: handles: [] result: {} schema: - description: UniLabJsonCommand set_status 的参数schema + description: set_status的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_status 的参数schema properties: string: - description: '参数: string' type: string required: - string @@ -828,7 +854,7 @@ virtual_gas_source: result: {} required: - goal - title: set_status 命令参数 + title: set_status参数 type: object type: UniLabJsonCommand close: @@ -960,29 +986,21 @@ virtual_gas_source: side: SOUTH icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - config: - description: '参数: config' - type: string - device_id: - description: '参数: device_id' - type: string - kwargs: - description: '参数: kwargs' - type: string - required: - - kwargs - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + config: + type: string + device_id: + type: string + required: [] + type: object + data: + properties: + status: + type: string + required: + - status + type: object virtual_heatchill: class: action_value_mappings: @@ -993,18 +1011,17 @@ virtual_heatchill: handles: [] result: {} schema: - description: UniLabJsonCommand cleanup 的参数schema + description: cleanup的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand cleanup 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: cleanup 命令参数 + title: cleanup参数 type: object type: UniLabJsonCommandAsync auto-heat_chill: @@ -1020,29 +1037,22 @@ virtual_heatchill: handles: [] result: {} schema: - description: UniLabJsonCommand heat_chill 的参数schema + description: heat_chill的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand heat_chill 的参数schema properties: purpose: - description: '参数: purpose' type: string stir: - description: '参数: stir' type: boolean stir_speed: - description: '参数: stir_speed' type: number temp: - description: '参数: temp' type: number time: - description: '参数: time' type: number vessel: - description: '参数: vessel' type: string required: - vessel @@ -1055,7 +1065,7 @@ virtual_heatchill: result: {} required: - goal - title: heat_chill 命令参数 + title: heat_chill参数 type: object type: UniLabJsonCommandAsync auto-heat_chill_start: @@ -1068,20 +1078,16 @@ virtual_heatchill: handles: [] result: {} schema: - description: UniLabJsonCommand heat_chill_start 的参数schema + description: heat_chill_start的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand heat_chill_start 的参数schema properties: purpose: - description: '参数: purpose' type: string temp: - description: '参数: temp' type: number vessel: - description: '参数: vessel' type: string required: - vessel @@ -1091,7 +1097,7 @@ virtual_heatchill: result: {} required: - goal - title: heat_chill_start 命令参数 + title: heat_chill_start参数 type: object type: UniLabJsonCommandAsync auto-heat_chill_stop: @@ -1102,14 +1108,12 @@ virtual_heatchill: handles: [] result: {} schema: - description: UniLabJsonCommand heat_chill_stop 的参数schema + description: heat_chill_stop的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand heat_chill_stop 的参数schema properties: vessel: - description: '参数: vessel' type: string required: - vessel @@ -1117,7 +1121,7 @@ virtual_heatchill: result: {} required: - goal - title: heat_chill_stop 命令参数 + title: heat_chill_stop参数 type: object type: UniLabJsonCommandAsync auto-initialize: @@ -1127,18 +1131,17 @@ virtual_heatchill: handles: [] result: {} schema: - description: UniLabJsonCommand initialize 的参数schema + description: initialize的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand initialize 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: initialize 命令参数 + title: initialize参数 type: object type: UniLabJsonCommandAsync heat_chill: @@ -1340,29 +1343,33 @@ virtual_heatchill: side: NORTH icon: Heater.webp init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - config: - description: '参数: config' - type: object - device_id: - description: '参数: device_id' - type: string - kwargs: - description: '参数: kwargs' - type: string - required: - - kwargs - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + config: + type: object + device_id: + type: string + required: [] + type: object + data: + properties: + is_stirring: + type: boolean + operation_mode: + type: string + remaining_time: + type: number + status: + type: string + stir_speed: + type: number + required: + - status + - operation_mode + - is_stirring + - stir_speed + - remaining_time + type: object virtual_multiway_valve: class: action_value_mappings: @@ -1373,18 +1380,17 @@ virtual_multiway_valve: handles: [] result: {} schema: - description: UniLabJsonCommand close 的参数schema + description: close的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand close 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: close 命令参数 + title: close参数 type: object type: UniLabJsonCommand auto-is_at_port: @@ -1395,14 +1401,12 @@ virtual_multiway_valve: handles: [] result: {} schema: - description: UniLabJsonCommand is_at_port 的参数schema + description: is_at_port的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand is_at_port 的参数schema properties: port_number: - description: '参数: port_number' type: integer required: - port_number @@ -1410,7 +1414,7 @@ virtual_multiway_valve: result: {} required: - goal - title: is_at_port 命令参数 + title: is_at_port参数 type: object type: UniLabJsonCommand auto-is_at_position: @@ -1421,14 +1425,12 @@ virtual_multiway_valve: handles: [] result: {} schema: - description: UniLabJsonCommand is_at_position 的参数schema + description: is_at_position的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand is_at_position 的参数schema properties: position: - description: '参数: position' type: integer required: - position @@ -1436,7 +1438,7 @@ virtual_multiway_valve: result: {} required: - goal - title: is_at_position 命令参数 + title: is_at_position参数 type: object type: UniLabJsonCommand auto-is_at_pump_position: @@ -1446,18 +1448,17 @@ virtual_multiway_valve: handles: [] result: {} schema: - description: UniLabJsonCommand is_at_pump_position 的参数schema + description: is_at_pump_position的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand is_at_pump_position 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: is_at_pump_position 命令参数 + title: is_at_pump_position参数 type: object type: UniLabJsonCommand auto-open: @@ -1467,18 +1468,17 @@ virtual_multiway_valve: handles: [] result: {} schema: - description: UniLabJsonCommand open 的参数schema + description: open的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand open 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: open 命令参数 + title: open参数 type: object type: UniLabJsonCommand auto-reset: @@ -1488,18 +1488,17 @@ virtual_multiway_valve: handles: [] result: {} schema: - description: UniLabJsonCommand reset 的参数schema + description: reset的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand reset 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: reset 命令参数 + title: reset参数 type: object type: UniLabJsonCommand auto-set_position: @@ -1510,14 +1509,12 @@ virtual_multiway_valve: handles: [] result: {} schema: - description: UniLabJsonCommand set_position 的参数schema + description: set_position的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_position 的参数schema properties: command: - description: '参数: command' type: string required: - command @@ -1525,7 +1522,7 @@ virtual_multiway_valve: result: {} required: - goal - title: set_position 命令参数 + title: set_position参数 type: object type: UniLabJsonCommand auto-set_to_port: @@ -1536,14 +1533,12 @@ virtual_multiway_valve: handles: [] result: {} schema: - description: UniLabJsonCommand set_to_port 的参数schema + description: set_to_port的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_to_port 的参数schema properties: port_number: - description: '参数: port_number' type: integer required: - port_number @@ -1551,7 +1546,7 @@ virtual_multiway_valve: result: {} required: - goal - title: set_to_port 命令参数 + title: set_to_port参数 type: object type: UniLabJsonCommand auto-set_to_pump_position: @@ -1561,18 +1556,17 @@ virtual_multiway_valve: handles: [] result: {} schema: - description: UniLabJsonCommand set_to_pump_position 的参数schema + description: set_to_pump_position的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_to_pump_position 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: set_to_pump_position 命令参数 + title: set_to_pump_position参数 type: object type: UniLabJsonCommand auto-set_valve_position: @@ -1583,14 +1577,12 @@ virtual_multiway_valve: handles: [] result: {} schema: - description: UniLabJsonCommand set_valve_position 的参数schema + description: set_valve_position的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_valve_position 的参数schema properties: command: - description: '参数: command' type: string required: - command @@ -1598,7 +1590,7 @@ virtual_multiway_valve: result: {} required: - goal - title: set_valve_position 命令参数 + title: set_valve_position参数 type: object type: UniLabJsonCommand auto-switch_between_pump_and_port: @@ -1609,14 +1601,12 @@ virtual_multiway_valve: handles: [] result: {} schema: - description: UniLabJsonCommand switch_between_pump_and_port 的参数schema + description: switch_between_pump_and_port的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand switch_between_pump_and_port 的参数schema properties: port_number: - description: '参数: port_number' type: integer required: - port_number @@ -1624,7 +1614,7 @@ virtual_multiway_valve: result: {} required: - goal - title: switch_between_pump_and_port 命令参数 + title: switch_between_pump_and_port参数 type: object type: UniLabJsonCommand set_position: @@ -1810,27 +1800,50 @@ virtual_multiway_valve: side: NORTH icon: EightPipeline.webp init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - port: - default: VIRTUAL - description: '参数: port' - type: string - positions: - default: 8 - description: '参数: positions' - type: integer - required: [] - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + port: + default: VIRTUAL + type: string + positions: + default: 8 + type: integer + required: [] + type: object + data: + properties: + available_ports: + type: object + available_positions: + type: array + current_port: + type: string + current_position: + type: integer + flow_path: + type: string + info: + type: object + status: + type: string + target_position: + type: integer + valve_position: + type: integer + valve_state: + type: string + required: + - status + - valve_state + - current_position + - target_position + - current_port + - valve_position + - available_positions + - available_ports + - flow_path + - info + type: object virtual_pump: class: action_value_mappings: @@ -1846,27 +1859,21 @@ virtual_pump: handles: [] result: {} schema: - description: UniLabJsonCommand clean_vessel 的参数schema + description: clean_vessel的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand clean_vessel 的参数schema properties: repeats: default: 1 - description: '参数: repeats' type: integer solvent: - description: '参数: solvent' type: string temp: - description: '参数: temp' type: number vessel: - description: '参数: vessel' type: string volume: - description: '参数: volume' type: number required: - vessel @@ -1877,7 +1884,7 @@ virtual_pump: result: {} required: - goal - title: clean_vessel 命令参数 + title: clean_vessel参数 type: object type: UniLabJsonCommandAsync auto-cleanup: @@ -1887,18 +1894,17 @@ virtual_pump: handles: [] result: {} schema: - description: UniLabJsonCommand cleanup 的参数schema + description: cleanup的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand cleanup 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: cleanup 命令参数 + title: cleanup参数 type: object type: UniLabJsonCommandAsync auto-initialize: @@ -1908,18 +1914,17 @@ virtual_pump: handles: [] result: {} schema: - description: UniLabJsonCommand initialize 的参数schema + description: initialize的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand initialize 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: initialize 命令参数 + title: initialize参数 type: object type: UniLabJsonCommandAsync auto-transfer: @@ -1939,48 +1944,37 @@ virtual_pump: handles: [] result: {} schema: - description: UniLabJsonCommand transfer 的参数schema + description: transfer的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand transfer 的参数schema properties: amount: default: '' - description: '参数: amount' type: string from_vessel: - description: '参数: from_vessel' type: string rinsing_repeats: default: 0 - description: '参数: rinsing_repeats' type: integer rinsing_solvent: default: '' - description: '参数: rinsing_solvent' type: string rinsing_volume: default: 0.0 - description: '参数: rinsing_volume' type: number solid: default: false - description: '参数: solid' type: boolean time: default: 0.0 - description: '参数: time' type: number to_vessel: - description: '参数: to_vessel' type: string viscous: default: false - description: '参数: viscous' type: boolean volume: - description: '参数: volume' type: number required: - from_vessel @@ -1990,7 +1984,7 @@ virtual_pump: result: {} required: - goal - title: transfer 命令参数 + title: transfer参数 type: object type: UniLabJsonCommandAsync set_valve_position: @@ -2192,29 +2186,48 @@ virtual_pump: label: pumpio icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - config: - description: '参数: config' - type: object - device_id: - description: '参数: device_id' - type: string - kwargs: - description: '参数: kwargs' - type: string - required: - - kwargs - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + config: + type: object + device_id: + type: string + required: [] + type: object + data: + properties: + current_status: + type: string + current_volume: + type: number + from_vessel: + type: string + max_volume: + type: number + progress: + type: number + status: + type: string + to_vessel: + type: string + transfer_rate: + type: number + transferred_volume: + type: number + valve_position: + type: integer + required: + - status + - valve_position + - current_volume + - max_volume + - transfer_rate + - from_vessel + - to_vessel + - progress + - transferred_volume + - current_status + type: object virtual_rotavap: class: action_value_mappings: @@ -2225,18 +2238,17 @@ virtual_rotavap: handles: [] result: {} schema: - description: UniLabJsonCommand cleanup 的参数schema + description: cleanup的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand cleanup 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: cleanup 命令参数 + title: cleanup参数 type: object type: UniLabJsonCommandAsync auto-evaporate: @@ -2251,30 +2263,24 @@ virtual_rotavap: handles: [] result: {} schema: - description: UniLabJsonCommand evaporate 的参数schema + description: evaporate的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand evaporate 的参数schema properties: pressure: default: 0.1 - description: '参数: pressure' type: number stir_speed: default: 100.0 - description: '参数: stir_speed' type: number temp: default: 60.0 - description: '参数: temp' type: number time: default: 1800.0 - description: '参数: time' type: number vessel: - description: '参数: vessel' type: string required: - vessel @@ -2282,7 +2288,7 @@ virtual_rotavap: result: {} required: - goal - title: evaporate 命令参数 + title: evaporate参数 type: object type: UniLabJsonCommandAsync auto-initialize: @@ -2292,18 +2298,17 @@ virtual_rotavap: handles: [] result: {} schema: - description: UniLabJsonCommand initialize 的参数schema + description: initialize的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand initialize 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: initialize 命令参数 + title: initialize参数 type: object type: UniLabJsonCommandAsync evaporate: @@ -2455,29 +2460,51 @@ virtual_rotavap: side: EAST icon: Rotaryevaporator.webp init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - config: - description: '参数: config' - type: string - device_id: - description: '参数: device_id' - type: string - kwargs: - description: '参数: kwargs' - type: string - required: - - kwargs - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + config: + type: string + device_id: + type: string + required: [] + type: object + data: + properties: + current_temp: + type: number + evaporated_volume: + type: number + max_rotation_speed: + type: number + max_temp: + type: number + message: + type: string + progress: + type: number + remaining_time: + type: number + rotation_speed: + type: number + rotavap_state: + type: string + status: + type: string + vacuum_pressure: + type: number + required: + - status + - rotavap_state + - current_temp + - rotation_speed + - vacuum_pressure + - evaporated_volume + - progress + - message + - max_temp + - max_rotation_speed + - remaining_time + type: object virtual_separator: class: action_value_mappings: @@ -2488,18 +2515,17 @@ virtual_separator: handles: [] result: {} schema: - description: UniLabJsonCommand cleanup 的参数schema + description: cleanup的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand cleanup 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: cleanup 命令参数 + title: cleanup参数 type: object type: UniLabJsonCommandAsync auto-initialize: @@ -2509,18 +2535,17 @@ virtual_separator: handles: [] result: {} schema: - description: UniLabJsonCommand initialize 的参数schema + description: initialize的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand initialize 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: initialize 命令参数 + title: initialize参数 type: object type: UniLabJsonCommandAsync auto-separate: @@ -2543,58 +2568,44 @@ virtual_separator: handles: [] result: {} schema: - description: UniLabJsonCommand separate 的参数schema + description: separate的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand separate 的参数schema properties: from_vessel: - description: '参数: from_vessel' type: string product_phase: - description: '参数: product_phase' type: string purpose: - description: '参数: purpose' type: string repeats: default: 1 - description: '参数: repeats' type: integer separation_vessel: - description: '参数: separation_vessel' type: string settling_time: default: 300.0 - description: '参数: settling_time' type: number solvent: default: '' - description: '参数: solvent' type: string solvent_volume: default: 50.0 - description: '参数: solvent_volume' type: number stir_speed: default: 300.0 - description: '参数: stir_speed' type: number stir_time: default: 30.0 - description: '参数: stir_time' type: number through: default: '' - description: '参数: through' type: string to_vessel: - description: '参数: to_vessel' type: string waste_phase_to_vessel: default: '' - description: '参数: waste_phase_to_vessel' type: string required: - purpose @@ -2606,7 +2617,7 @@ virtual_separator: result: {} required: - goal - title: separate 命令参数 + title: separate参数 type: object type: UniLabJsonCommandAsync separate: @@ -2804,29 +2815,45 @@ virtual_separator: side: WEST icon: Separator.webp init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - config: - description: '参数: config' - type: string - device_id: - description: '参数: device_id' - type: string - kwargs: - description: '参数: kwargs' - type: string - required: - - kwargs - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + config: + type: string + device_id: + type: string + required: [] + type: object + data: + properties: + has_phases: + type: boolean + message: + type: string + phase_separation: + type: boolean + progress: + type: number + separator_state: + type: string + settling_time: + type: number + status: + type: string + stir_speed: + type: number + volume: + type: number + required: + - status + - separator_state + - volume + - has_phases + - phase_separation + - stir_speed + - settling_time + - progress + - message + type: object virtual_solenoid_valve: class: action_value_mappings: @@ -2837,18 +2864,17 @@ virtual_solenoid_valve: handles: [] result: {} schema: - description: UniLabJsonCommand cleanup 的参数schema + description: cleanup的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand cleanup 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: cleanup 命令参数 + title: cleanup参数 type: object type: UniLabJsonCommandAsync auto-close: @@ -2858,18 +2884,17 @@ virtual_solenoid_valve: handles: [] result: {} schema: - description: UniLabJsonCommand close 的参数schema + description: close的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand close 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: close 命令参数 + title: close参数 type: object type: UniLabJsonCommandAsync auto-initialize: @@ -2879,18 +2904,17 @@ virtual_solenoid_valve: handles: [] result: {} schema: - description: UniLabJsonCommand initialize 的参数schema + description: initialize的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand initialize 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: initialize 命令参数 + title: initialize参数 type: object type: UniLabJsonCommandAsync auto-is_closed: @@ -2900,18 +2924,17 @@ virtual_solenoid_valve: handles: [] result: {} schema: - description: UniLabJsonCommand is_closed 的参数schema + description: is_closed的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand is_closed 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: is_closed 命令参数 + title: is_closed参数 type: object type: UniLabJsonCommand auto-open: @@ -2921,18 +2944,17 @@ virtual_solenoid_valve: handles: [] result: {} schema: - description: UniLabJsonCommand open 的参数schema + description: open的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand open 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: open 命令参数 + title: open参数 type: object type: UniLabJsonCommandAsync auto-reset: @@ -2942,18 +2964,17 @@ virtual_solenoid_valve: handles: [] result: {} schema: - description: UniLabJsonCommand reset 的参数schema + description: reset的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand reset 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: reset 命令参数 + title: reset参数 type: object type: UniLabJsonCommandAsync auto-set_state: @@ -2964,14 +2985,12 @@ virtual_solenoid_valve: handles: [] result: {} schema: - description: UniLabJsonCommand set_state 的参数schema + description: set_state的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_state 的参数schema properties: command: - description: '参数: command' type: string required: - command @@ -2979,7 +2998,7 @@ virtual_solenoid_valve: result: {} required: - goal - title: set_state 命令参数 + title: set_state参数 type: object type: UniLabJsonCommandAsync auto-set_valve_position: @@ -2990,21 +3009,19 @@ virtual_solenoid_valve: handles: [] result: {} schema: - description: UniLabJsonCommand set_valve_position 的参数schema + description: set_valve_position的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_valve_position 的参数schema properties: command: - description: '参数: command' type: string required: [] type: object result: {} required: - goal - title: set_valve_position 命令参数 + title: set_valve_position参数 type: object type: UniLabJsonCommandAsync auto-toggle: @@ -3014,18 +3031,17 @@ virtual_solenoid_valve: handles: [] result: {} schema: - description: UniLabJsonCommand toggle 的参数schema + description: toggle的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand toggle 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: toggle 命令参数 + title: toggle参数 type: object type: UniLabJsonCommand close: @@ -3244,29 +3260,33 @@ virtual_solenoid_valve: side: SOUTH icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - config: - description: '参数: config' - type: object - device_id: - description: '参数: device_id' - type: string - kwargs: - description: '参数: kwargs' - type: string - required: - - kwargs - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + config: + type: object + device_id: + type: string + required: [] + type: object + data: + properties: + is_open: + type: boolean + state: + type: object + status: + type: string + valve_position: + type: string + valve_state: + type: string + required: + - status + - valve_state + - is_open + - valve_position + - state + type: object virtual_stirrer: class: action_value_mappings: @@ -3277,18 +3297,17 @@ virtual_stirrer: handles: [] result: {} schema: - description: UniLabJsonCommand cleanup 的参数schema + description: cleanup的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand cleanup 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: cleanup 命令参数 + title: cleanup参数 type: object type: UniLabJsonCommandAsync auto-initialize: @@ -3298,18 +3317,17 @@ virtual_stirrer: handles: [] result: {} schema: - description: UniLabJsonCommand initialize 的参数schema + description: initialize的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand initialize 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: initialize 命令参数 + title: initialize参数 type: object type: UniLabJsonCommandAsync auto-start_stir: @@ -3322,20 +3340,16 @@ virtual_stirrer: handles: [] result: {} schema: - description: UniLabJsonCommand start_stir 的参数schema + description: start_stir的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand start_stir 的参数schema properties: purpose: - description: '参数: purpose' type: string stir_speed: - description: '参数: stir_speed' type: number vessel: - description: '参数: vessel' type: string required: - vessel @@ -3345,7 +3359,7 @@ virtual_stirrer: result: {} required: - goal - title: start_stir 命令参数 + title: start_stir参数 type: object type: UniLabJsonCommandAsync auto-stir: @@ -3358,20 +3372,16 @@ virtual_stirrer: handles: [] result: {} schema: - description: UniLabJsonCommand stir 的参数schema + description: stir的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand stir 的参数schema properties: settling_time: - description: '参数: settling_time' type: number stir_speed: - description: '参数: stir_speed' type: number stir_time: - description: '参数: stir_time' type: number required: - stir_time @@ -3381,7 +3391,7 @@ virtual_stirrer: result: {} required: - goal - title: stir 命令参数 + title: stir参数 type: object type: UniLabJsonCommandAsync auto-stop_stir: @@ -3392,14 +3402,12 @@ virtual_stirrer: handles: [] result: {} schema: - description: UniLabJsonCommand stop_stir 的参数schema + description: stop_stir的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand stop_stir 的参数schema properties: vessel: - description: '参数: vessel' type: string required: - vessel @@ -3407,7 +3415,7 @@ virtual_stirrer: result: {} required: - goal - title: stop_stir 命令参数 + title: stop_stir参数 type: object type: UniLabJsonCommandAsync start_stir: @@ -3610,29 +3618,36 @@ virtual_stirrer: side: NORTH icon: Stirrer.webp init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - config: - description: '参数: config' - type: object - device_id: - description: '参数: device_id' - type: string - kwargs: - description: '参数: kwargs' - type: string - required: - - kwargs - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + config: + type: object + device_id: + type: string + required: [] + type: object + data: + properties: + current_speed: + type: number + current_vessel: + type: string + is_stirring: + type: boolean + operation_mode: + type: string + remaining_time: + type: number + status: + type: string + required: + - status + - operation_mode + - current_vessel + - current_speed + - is_stirring + - remaining_time + type: object virtual_transfer_pump: class: action_value_mappings: @@ -3645,17 +3660,14 @@ virtual_transfer_pump: handles: [] result: {} schema: - description: UniLabJsonCommand aspirate 的参数schema + description: aspirate的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand aspirate 的参数schema properties: velocity: - description: '参数: velocity' type: number volume: - description: '参数: volume' type: number required: - volume @@ -3663,7 +3675,7 @@ virtual_transfer_pump: result: {} required: - goal - title: aspirate 命令参数 + title: aspirate参数 type: object type: UniLabJsonCommandAsync auto-cleanup: @@ -3673,18 +3685,17 @@ virtual_transfer_pump: handles: [] result: {} schema: - description: UniLabJsonCommand cleanup 的参数schema + description: cleanup的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand cleanup 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: cleanup 命令参数 + title: cleanup参数 type: object type: UniLabJsonCommandAsync auto-dispense: @@ -3696,17 +3707,14 @@ virtual_transfer_pump: handles: [] result: {} schema: - description: UniLabJsonCommand dispense 的参数schema + description: dispense的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand dispense 的参数schema properties: velocity: - description: '参数: velocity' type: number volume: - description: '参数: volume' type: number required: - volume @@ -3714,7 +3722,7 @@ virtual_transfer_pump: result: {} required: - goal - title: dispense 命令参数 + title: dispense参数 type: object type: UniLabJsonCommandAsync auto-empty_syringe: @@ -3725,21 +3733,19 @@ virtual_transfer_pump: handles: [] result: {} schema: - description: UniLabJsonCommand empty_syringe 的参数schema + description: empty_syringe的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand empty_syringe 的参数schema properties: velocity: - description: '参数: velocity' type: number required: [] type: object result: {} required: - goal - title: empty_syringe 命令参数 + title: empty_syringe参数 type: object type: UniLabJsonCommandAsync auto-fill_syringe: @@ -3750,21 +3756,19 @@ virtual_transfer_pump: handles: [] result: {} schema: - description: UniLabJsonCommand fill_syringe 的参数schema + description: fill_syringe的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand fill_syringe 的参数schema properties: velocity: - description: '参数: velocity' type: number required: [] type: object result: {} required: - goal - title: fill_syringe 命令参数 + title: fill_syringe参数 type: object type: UniLabJsonCommandAsync auto-initialize: @@ -3774,18 +3778,17 @@ virtual_transfer_pump: handles: [] result: {} schema: - description: UniLabJsonCommand initialize 的参数schema + description: initialize的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand initialize 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: initialize 命令参数 + title: initialize参数 type: object type: UniLabJsonCommandAsync auto-is_empty: @@ -3795,18 +3798,17 @@ virtual_transfer_pump: handles: [] result: {} schema: - description: UniLabJsonCommand is_empty 的参数schema + description: is_empty的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand is_empty 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: is_empty 命令参数 + title: is_empty参数 type: object type: UniLabJsonCommand auto-is_full: @@ -3816,18 +3818,17 @@ virtual_transfer_pump: handles: [] result: {} schema: - description: UniLabJsonCommand is_full 的参数schema + description: is_full的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand is_full 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: is_full 命令参数 + title: is_full参数 type: object type: UniLabJsonCommand auto-pull_plunger: @@ -3839,17 +3840,14 @@ virtual_transfer_pump: handles: [] result: {} schema: - description: UniLabJsonCommand pull_plunger 的参数schema + description: pull_plunger的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand pull_plunger 的参数schema properties: velocity: - description: '参数: velocity' type: number volume: - description: '参数: volume' type: number required: - volume @@ -3857,7 +3855,7 @@ virtual_transfer_pump: result: {} required: - goal - title: pull_plunger 命令参数 + title: pull_plunger参数 type: object type: UniLabJsonCommandAsync auto-push_plunger: @@ -3869,17 +3867,14 @@ virtual_transfer_pump: handles: [] result: {} schema: - description: UniLabJsonCommand push_plunger 的参数schema + description: push_plunger的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand push_plunger 的参数schema properties: velocity: - description: '参数: velocity' type: number volume: - description: '参数: volume' type: number required: - volume @@ -3887,7 +3882,7 @@ virtual_transfer_pump: result: {} required: - goal - title: push_plunger 命令参数 + title: push_plunger参数 type: object type: UniLabJsonCommandAsync auto-set_max_velocity: @@ -3898,14 +3893,12 @@ virtual_transfer_pump: handles: [] result: {} schema: - description: UniLabJsonCommand set_max_velocity 的参数schema + description: set_max_velocity的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_max_velocity 的参数schema properties: velocity: - description: '参数: velocity' type: number required: - velocity @@ -3913,7 +3906,7 @@ virtual_transfer_pump: result: {} required: - goal - title: set_max_velocity 命令参数 + title: set_max_velocity参数 type: object type: UniLabJsonCommand auto-set_position: @@ -3925,17 +3918,14 @@ virtual_transfer_pump: handles: [] result: {} schema: - description: UniLabJsonCommand set_position 的参数schema + description: set_position的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_position 的参数schema properties: max_velocity: - description: '参数: max_velocity' type: number position: - description: '参数: position' type: number required: - position @@ -3943,7 +3933,7 @@ virtual_transfer_pump: result: {} required: - goal - title: set_position 命令参数 + title: set_position参数 type: object type: UniLabJsonCommandAsync auto-stop_operation: @@ -3953,18 +3943,17 @@ virtual_transfer_pump: handles: [] result: {} schema: - description: UniLabJsonCommand stop_operation 的参数schema + description: stop_operation的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand stop_operation 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: stop_operation 命令参数 + title: stop_operation参数 type: object type: UniLabJsonCommandAsync auto-transfer: @@ -3977,20 +3966,16 @@ virtual_transfer_pump: handles: [] result: {} schema: - description: UniLabJsonCommand transfer 的参数schema + description: transfer的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand transfer 的参数schema properties: aspirate_velocity: - description: '参数: aspirate_velocity' type: number dispense_velocity: - description: '参数: dispense_velocity' type: number volume: - description: '参数: volume' type: number required: - volume @@ -3998,7 +3983,7 @@ virtual_transfer_pump: result: {} required: - goal - title: transfer 命令参数 + title: transfer参数 type: object type: UniLabJsonCommandAsync set_position: @@ -4195,29 +4180,39 @@ virtual_transfer_pump: side: SOUTH icon: Pump.webp init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - config: - description: '参数: config' - type: object - device_id: - description: '参数: device_id' - type: string - kwargs: - description: '参数: kwargs' - type: string - required: - - kwargs - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + config: + type: object + device_id: + type: string + required: [] + type: object + data: + properties: + current_volume: + type: number + max_velocity: + type: number + position: + type: number + pump_info: + type: object + remaining_capacity: + type: number + status: + type: string + transfer_rate: + type: number + required: + - status + - position + - current_volume + - max_velocity + - transfer_rate + - remaining_capacity + - pump_info + type: object virtual_vacuum_pump: class: action_value_mappings: @@ -4228,18 +4223,17 @@ virtual_vacuum_pump: handles: [] result: {} schema: - description: UniLabJsonCommand cleanup 的参数schema + description: cleanup的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand cleanup 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: cleanup 命令参数 + title: cleanup参数 type: object type: UniLabJsonCommandAsync auto-close: @@ -4249,18 +4243,17 @@ virtual_vacuum_pump: handles: [] result: {} schema: - description: UniLabJsonCommand close 的参数schema + description: close的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand close 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: close 命令参数 + title: close参数 type: object type: UniLabJsonCommand auto-initialize: @@ -4270,18 +4263,17 @@ virtual_vacuum_pump: handles: [] result: {} schema: - description: UniLabJsonCommand initialize 的参数schema + description: initialize的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand initialize 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: initialize 命令参数 + title: initialize参数 type: object type: UniLabJsonCommandAsync auto-is_closed: @@ -4291,18 +4283,17 @@ virtual_vacuum_pump: handles: [] result: {} schema: - description: UniLabJsonCommand is_closed 的参数schema + description: is_closed的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand is_closed 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: is_closed 命令参数 + title: is_closed参数 type: object type: UniLabJsonCommand auto-is_open: @@ -4312,18 +4303,17 @@ virtual_vacuum_pump: handles: [] result: {} schema: - description: UniLabJsonCommand is_open 的参数schema + description: is_open的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand is_open 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: is_open 命令参数 + title: is_open参数 type: object type: UniLabJsonCommand auto-open: @@ -4333,18 +4323,17 @@ virtual_vacuum_pump: handles: [] result: {} schema: - description: UniLabJsonCommand open 的参数schema + description: open的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand open 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: open 命令参数 + title: open参数 type: object type: UniLabJsonCommand auto-set_status: @@ -4355,14 +4344,12 @@ virtual_vacuum_pump: handles: [] result: {} schema: - description: UniLabJsonCommand set_status 的参数schema + description: set_status的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand set_status 的参数schema properties: string: - description: '参数: string' type: string required: - string @@ -4370,7 +4357,7 @@ virtual_vacuum_pump: result: {} required: - goal - title: set_status 命令参数 + title: set_status参数 type: object type: UniLabJsonCommand close: @@ -4502,26 +4489,18 @@ virtual_vacuum_pump: side: SOUTH icon: Vacuum.webp init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - config: - description: '参数: config' - type: string - device_id: - description: '参数: device_id' - type: string - kwargs: - description: '参数: kwargs' - type: string - required: - - kwargs - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + config: + type: string + device_id: + type: string + required: [] + type: object + data: + properties: + status: + type: string + required: + - status + type: object diff --git a/unilabos/registry/devices/work_station.yaml b/unilabos/registry/devices/work_station.yaml index 2866160..1df4382 100644 --- a/unilabos/registry/devices/work_station.yaml +++ b/unilabos/registry/devices/work_station.yaml @@ -2276,17 +2276,14 @@ workstation: handles: [] result: {} schema: - description: UniLabJsonCommand create_ros_action_server 的参数schema + description: create_ros_action_server的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand create_ros_action_server 的参数schema properties: action_name: - description: '参数: action_name' type: string action_value_mapping: - description: '参数: action_value_mapping' type: string required: - action_name @@ -2295,7 +2292,7 @@ workstation: result: {} required: - goal - title: create_ros_action_server 命令参数 + title: create_ros_action_server参数 type: object type: UniLabJsonCommand auto-execute_single_action: @@ -2308,20 +2305,16 @@ workstation: handles: [] result: {} schema: - description: UniLabJsonCommand execute_single_action 的参数schema + description: execute_single_action的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand execute_single_action 的参数schema properties: action_kwargs: - description: '参数: action_kwargs' type: string action_name: - description: '参数: action_name' type: string device_id: - description: '参数: device_id' type: string required: - device_id @@ -2331,7 +2324,7 @@ workstation: result: {} required: - goal - title: execute_single_action 命令参数 + title: execute_single_action参数 type: object type: UniLabJsonCommandAsync auto-initialize_device: @@ -2343,17 +2336,14 @@ workstation: handles: [] result: {} schema: - description: UniLabJsonCommand initialize_device 的参数schema + description: initialize_device的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand initialize_device 的参数schema properties: device_config: - description: '参数: device_config' type: string device_id: - description: '参数: device_id' type: string required: - device_id @@ -2362,7 +2352,7 @@ workstation: result: {} required: - goal - title: initialize_device 命令参数 + title: initialize_device参数 type: object type: UniLabJsonCommand module: unilabos.ros.nodes.presets.protocol_node:ROS2ProtocolNode @@ -2372,40 +2362,23 @@ workstation: handles: [] icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - args: - description: '参数: args' - type: string - children: - description: '参数: children' - type: object - device_id: - description: '参数: device_id' - type: string - kwargs: - description: '参数: kwargs' - type: string - protocol_type: - description: '参数: protocol_type' - type: string - resource_tracker: - description: '参数: resource_tracker' - type: string - required: - - device_id - - children - - protocol_type - - resource_tracker - - args - - kwargs - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + children: + type: object + device_id: + type: string + protocol_type: + type: string + resource_tracker: + type: string + required: + - device_id + - children + - protocol_type + - resource_tracker + type: object + data: + properties: {} + required: [] + type: object diff --git a/unilabos/registry/devices/zhida_hplc.yaml b/unilabos/registry/devices/zhida_hplc.yaml index 7918386..644ab7f 100644 --- a/unilabos/registry/devices/zhida_hplc.yaml +++ b/unilabos/registry/devices/zhida_hplc.yaml @@ -43,18 +43,17 @@ zhida_hplc: handles: [] result: {} schema: - description: UniLabJsonCommand abort 的参数schema + description: abort的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand abort 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: abort 命令参数 + title: abort参数 type: object type: UniLabJsonCommand auto-close: @@ -64,18 +63,17 @@ zhida_hplc: handles: [] result: {} schema: - description: UniLabJsonCommand close 的参数schema + description: close的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand close 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: close 命令参数 + title: close参数 type: object type: UniLabJsonCommand auto-connect: @@ -85,18 +83,17 @@ zhida_hplc: handles: [] result: {} schema: - description: UniLabJsonCommand connect 的参数schema + description: connect的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand connect 的参数schema properties: {} required: [] type: object result: {} required: - goal - title: connect 命令参数 + title: connect参数 type: object type: UniLabJsonCommand auto-start: @@ -107,14 +104,12 @@ zhida_hplc: handles: [] result: {} schema: - description: UniLabJsonCommand start 的参数schema + description: start的参数schema properties: feedback: {} goal: - description: UniLabJsonCommand start 的参数schema properties: text: - description: '参数: text' type: string required: - text @@ -122,7 +117,7 @@ zhida_hplc: result: {} required: - goal - title: start 命令参数 + title: start参数 type: object type: UniLabJsonCommand get_methods: @@ -212,28 +207,26 @@ zhida_hplc: handles: [] icon: '' init_param_schema: - description: UniLabJsonCommand __init__ 的参数schema - properties: - feedback: {} - goal: - description: UniLabJsonCommand __init__ 的参数schema - properties: - host: - default: 192.168.1.47 - description: '参数: host' - type: string - port: - default: 5792 - description: '参数: port' - type: integer - timeout: - default: 10.0 - description: '参数: timeout' - type: number - required: [] - type: object - result: {} - required: - - goal - title: __init__ 命令参数 - type: object + config: + properties: + host: + default: 192.168.1.47 + type: string + port: + default: 5792 + type: string + timeout: + default: 10.0 + type: string + required: [] + type: object + data: + properties: + methods: + type: object + status: + type: object + required: + - status + - methods + type: object diff --git a/unilabos/registry/registry.py b/unilabos/registry/registry.py index d47663e..c5a6981 100644 --- a/unilabos/registry/registry.py +++ b/unilabos/registry/registry.py @@ -197,6 +197,60 @@ class Registry: logger.error(f"[UniLab Registry] 无法找到类型 '{type_name}' 用于设备 {device_id} 的 {field_name}") sys.exit(1) + def _generate_schema_from_info( + self, + param_name: str, + param_type: str, + param_default: Any, + ) -> Dict[str, Any]: + """ + 根据参数信息生成JSON Schema + """ + prop_schema = {} + # 根据类型设置schema FIXME 不完整 + if param_type: + param_type_lower = param_type.lower() + if param_type_lower in ["str", "string"]: + prop_schema["type"] = "string" + elif param_type_lower in ["int", "integer"]: + prop_schema["type"] = "integer" + elif param_type_lower in ["float", "number"]: + prop_schema["type"] = "number" + elif param_type_lower in ["bool", "boolean"]: + prop_schema["type"] = "boolean" + elif param_type_lower in ["list", "array"]: + prop_schema["type"] = "array" + elif param_type_lower in ["dict", "object"]: + prop_schema["type"] = "object" + else: + # 默认为字符串类型 + prop_schema["type"] = "string" + else: + # 如果没有类型信息,默认为字符串 + prop_schema["type"] = "string" + + # 设置默认值 + if param_default is not None: + prop_schema["default"] = param_default + + return prop_schema + + def _generate_status_types_schema(self, status_types: Dict[str, Any]) -> Dict[str, Any]: + """ + 根据状态类型生成JSON Schema + """ + status_schema = { + "type": "object", + "properties": {}, + "required": [], + } + for status_name, status_type in status_types.items(): + status_schema["properties"][status_name] = self._generate_schema_from_info( + status_name, status_type["return_type"], None + ) + status_schema["required"].append(status_name) + return status_schema + def _generate_unilab_json_command_schema( self, method_args: List[Dict[str, Any]], method_name: str ) -> Dict[str, Any]: @@ -211,54 +265,24 @@ class Registry: JSON Schema格式的参数schema """ schema = { - "description": f"UniLabJsonCommand {method_name} 的参数schema", "type": "object", "properties": {}, "required": [], } - for arg_info in method_args: param_name = arg_info.get("name", "") - param_type = arg_info.get("type") + param_type = arg_info.get("type", "") param_default = arg_info.get("default") param_required = arg_info.get("required", True) - - prop_schema = {"description": f"参数: {param_name}"} - - # 根据类型设置schema FIXME 不完整 - if param_type: - param_type_lower = param_type.lower() - if param_type_lower in ["str", "string"]: - prop_schema["type"] = "string" - elif param_type_lower in ["int", "integer"]: - prop_schema["type"] = "integer" - elif param_type_lower in ["float", "number"]: - prop_schema["type"] = "number" - elif param_type_lower in ["bool", "boolean"]: - prop_schema["type"] = "boolean" - elif param_type_lower in ["list", "array"]: - prop_schema["type"] = "array" - elif param_type_lower in ["dict", "object"]: - prop_schema["type"] = "object" - else: - # 默认为字符串类型 - prop_schema["type"] = "string" - else: - # 如果没有类型信息,默认为字符串 - prop_schema["type"] = "string" - - # 设置默认值 - if param_default is not None: - prop_schema["default"] = param_default - - schema["properties"][param_name] = prop_schema - - # 如果是必需参数,添加到required列表 + schema["properties"][param_name] = self._generate_schema_from_info( + param_name, param_type, param_default + ) if param_required: schema["required"].append(param_name) + return { - "title": f"{method_name} 命令参数", - "description": f"UniLabJsonCommand {method_name} 的参数schema", + "title": f"{method_name}参数", + "description": f"{method_name}的参数schema", "type": "object", "properties": {"goal": schema, "feedback": {}, "result": {}}, "required": ["goal"], @@ -314,14 +338,21 @@ class Registry: status_type = "String" # 替换成ROS的String,便于显示 device_config["class"]["status_types"][status_name] = status_type target_type = self._replace_type_with_class(status_type, device_id, f"状态 {status_name}") - if target_type in [dict, list]: # 对于嵌套类型返回的对象,暂时处理成字符串,无法直接进行转换 + if target_type in [ + dict, + list, + ]: # 对于嵌套类型返回的对象,暂时处理成字符串,无法直接进行转换 target_type = String status_str_type_mapping[status_type] = target_type device_config["class"]["status_types"] = dict( sorted(device_config["class"]["status_types"].items()) ) if complete_registry: - device_config["class"]["action_value_mappings"] = {k:v for k, v in device_config["class"]["action_value_mappings"].items() if not k.startswith("auto-")} + device_config["class"]["action_value_mappings"] = { + k: v + for k, v in device_config["class"]["action_value_mappings"].items() + if not k.startswith("auto-") + } # 处理动作值映射 device_config["class"]["action_value_mappings"].update( { @@ -337,9 +368,14 @@ class Registry: for k, v in enhanced_info["action_methods"].items() } ) - device_config["init_param_schema"] = self._generate_unilab_json_command_schema( + device_config["init_param_schema"] = {} + device_config["init_param_schema"]["config"] = self._generate_unilab_json_command_schema( enhanced_info["init_params"], "__init__" + )["properties"]["goal"] + device_config["init_param_schema"]["data"] = self._generate_status_types_schema( + enhanced_info["status_methods"] ) + device_config.pop("schema", None) device_config["class"]["action_value_mappings"] = dict( sorted(device_config["class"]["action_value_mappings"].items()) diff --git a/unilabos/utils/import_manager.py b/unilabos/utils/import_manager.py index d04aca6..7a3066f 100644 --- a/unilabos/utils/import_manager.py +++ b/unilabos/utils/import_manager.py @@ -240,36 +240,8 @@ class ImportManager: cls = get_class(class_path) class_name = cls.__name__ - result = { - "class_name": class_name, - "init_params": [], - "status_methods": {}, - "action_methods": {}, - } - - init_signature = inspect.signature(cls.__init__) - for param_name, param in init_signature.parameters.items(): - if param_name == "self": - continue - - # 先获取注解类型 - param_type = self._get_type_string(param.annotation) - param_default = None if param.default == inspect.Parameter.empty else param.default - - # 如果type为Any或None,尝试用default的类型推断 - if param_type in ["Any", "None"]: - if param.default != inspect.Parameter.empty and param.default is not None: - default_type = type(param.default) - param_type = self._get_type_string(default_type) - - param_info = { - "name": param_name, - "type": param_type, - "required": param.default == inspect.Parameter.empty, - "default": param_default, - } - result["init_params"].append(param_info) - + result = {"class_name": class_name, "init_params": self._analyze_method_signature(cls.__init__)["args"], + "status_methods": {}, "action_methods": {}} # 分析类的所有成员 for name, method in cls.__dict__.items(): if name.startswith("_"): From 132955617d83e507555443a38af52ebd020cd6e3 Mon Sep 17 00:00:00 2001 From: ZiWei <131428629+ZiWei09@users.noreply.github.com> Date: Thu, 3 Jul 2025 23:59:08 +0800 Subject: [PATCH 14/96] Add channel_sources config in conda_build_config.yaml (#58) --- recipes/conda_build_config.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/recipes/conda_build_config.yaml b/recipes/conda_build_config.yaml index fd870d0..8e95491 100644 --- a/recipes/conda_build_config.yaml +++ b/recipes/conda_build_config.yaml @@ -1,3 +1,6 @@ +channel_sources: + - robostack,robostack-staging,conda-forge,defaults + gazebo: - '11' libpqxx: From d7d43af40a08f603d7d1e4976310673ccd79a319 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Fri, 4 Jul 2025 13:52:23 +0800 Subject: [PATCH 15/96] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E4=BC=A0=E5=8F=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- unilabos/app/mq.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/unilabos/app/mq.py b/unilabos/app/mq.py index ac744c9..061add2 100644 --- a/unilabos/app/mq.py +++ b/unilabos/app/mq.py @@ -56,6 +56,10 @@ class MQTTClient: payload_json["data"] = {} if "action" in payload_json: payload_json["data"]["action"] = payload_json.pop("action") + if "action_type" in payload_json: + payload_json["data"]["action_type"] = payload_json.pop("action_type") + if "action_args" in payload_json: + payload_json["data"]["action_args"] = payload_json.pop("action_args") if "action_kwargs" in payload_json: payload_json["data"]["action_kwargs"] = payload_json.pop("action_kwargs") job_req = JobAddReq.model_validate(payload_json) From 21afdb62bc3db92ac13bdd1ee992d32ef03b6f3a Mon Sep 17 00:00:00 2001 From: Kongchang Feng <2100011801@stu.pku.edu.cn> Date: Fri, 4 Jul 2025 13:58:27 +0800 Subject: [PATCH 16/96] Create 5 new protocols & bump version 0.9.8 (#59) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 添加了5个缺失的protocol,验证了可以运行 * bump version to 0.9.8 * 修复新增的Action的字段缺失 --------- Co-authored-by: Xuwznln <18435084+Xuwznln@users.noreply.github.com> --- README.md | 2 +- README_zh.md | 2 +- recipes/ros-humble-unilabos-msgs/recipe.yaml | 2 +- recipes/unilabos/recipe.yaml | 2 +- setup.py | 2 +- .../comprehensive_protocol/checklist.md | 13 +- .../comprehensive_station.json | 90 +++- unilabos/compile/__init__.py | 10 + unilabos/compile/adjustph_protocol.py | 411 ++++++++++++++++++ unilabos/compile/dry_protocol.py | 165 +++++++ unilabos/compile/hydrogenate_protocol.py | 366 ++++++++++++++++ unilabos/compile/recrystallize_protocol.py | 281 ++++++++++++ unilabos/compile/reset_handling_protocol.py | 180 ++++++++ unilabos/messages/__init__.py | 29 +- unilabos_msgs/CMakeLists.txt | 9 +- unilabos_msgs/action/AdjustPH.action | 13 + unilabos_msgs/action/Dry.action | 19 +- unilabos_msgs/action/Hydrogenate.action | 13 + unilabos_msgs/action/Recrystallize.action | 15 + unilabos_msgs/action/ResetHandling.action | 11 + 20 files changed, 1602 insertions(+), 33 deletions(-) create mode 100644 unilabos/compile/adjustph_protocol.py create mode 100644 unilabos/compile/dry_protocol.py create mode 100644 unilabos/compile/hydrogenate_protocol.py create mode 100644 unilabos/compile/recrystallize_protocol.py create mode 100644 unilabos/compile/reset_handling_protocol.py create mode 100644 unilabos_msgs/action/AdjustPH.action create mode 100644 unilabos_msgs/action/Hydrogenate.action create mode 100644 unilabos_msgs/action/Recrystallize.action create mode 100644 unilabos_msgs/action/ResetHandling.action diff --git a/README.md b/README.md index 94010e9..0d02849 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.7-xxxxx.tar.bz2 +conda install ros-humble-unilabos-msgs-0.9.8-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 d4f77f4..a80f06c 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.7-xxxxx.tar.bz2 +conda install ros-humble-unilabos-msgs-0.9.8-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 e476d1b..dde6acc 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.7 + version: 0.9.8 source: path: ../../unilabos_msgs folder: ros-humble-unilabos-msgs/src/work diff --git a/recipes/unilabos/recipe.yaml b/recipes/unilabos/recipe.yaml index 2a48b04..c54e141 100644 --- a/recipes/unilabos/recipe.yaml +++ b/recipes/unilabos/recipe.yaml @@ -1,6 +1,6 @@ package: name: unilabos - version: "0.9.7" + version: "0.9.8" source: path: ../.. diff --git a/setup.py b/setup.py index 8fd9bbc..4dde107 100644 --- a/setup.py +++ b/setup.py @@ -4,7 +4,7 @@ package_name = 'unilabos' setup( name=package_name, - version='0.9.7', + version='0.9.8', packages=find_packages(), include_package_data=True, install_requires=['setuptools'], diff --git a/test/experiments/comprehensive_protocol/checklist.md b/test/experiments/comprehensive_protocol/checklist.md index ed73ec5..ce6de37 100644 --- a/test/experiments/comprehensive_protocol/checklist.md +++ b/test/experiments/comprehensive_protocol/checklist.md @@ -23,6 +23,7 @@ HeatChillProtocol: generate_heat_chill_protocol, (√) HeatChillStartProtocol: generate_heat_chill_start_protocol, (√) HeatChillStopProtocol: generate_heat_chill_stop_protocol, (√) + HeatChillToTempProtocol: StirProtocol: generate_stir_protocol, (√) StartStirProtocol: generate_start_stir_protocol, (√) StopStirProtocol: generate_stop_stir_protocol, (√) @@ -30,7 +31,13 @@ CleanVesselProtocol: generate_clean_vessel_protocol, (√) DissolveProtocol: generate_dissolve_protocol, (√) FilterThroughProtocol: generate_filter_through_protocol, (√) - RunColumnProtocol: generate_run_column_protocol, (×) - WashSolidProtocol: generate_wash_solid_protocol, (×) + RunColumnProtocol: generate_run_column_protocol, (√) -上下文体积搜索 \ No newline at end of file +上下文体积搜索 +3. 还没创建的protocol + ResetHandling 写完了 + Dry 写完了 + AdjustPH 写完了 + Recrystallize 写完了 + TakeSample + Hydrogenate \ No newline at end of file diff --git a/test/experiments/comprehensive_protocol/comprehensive_station.json b/test/experiments/comprehensive_protocol/comprehensive_station.json index 0d9f5c7..d0f5c6a 100644 --- a/test/experiments/comprehensive_protocol/comprehensive_station.json +++ b/test/experiments/comprehensive_protocol/comprehensive_station.json @@ -23,8 +23,10 @@ "waste_bottle_2", "solenoid_valve_1", "solenoid_valve_2", + "solenoid_valve_3", "vacuum_pump_1", "gas_source_1", + "h2_gas_source", "filter_1", "column_1", "separator_1", @@ -60,7 +62,12 @@ "HeatChillStartProtocol", "HeatChillStopProtocol", "EvacuateAndRefillProtocol", - "PumpTransferProtocol" + "PumpTransferProtocol", + "AdjustPHProtocol", + "ResetHandlingProtocol", + "DryProtocol", + "HydrogenateProtocol", + "RecrystallizeProtocol" ] }, "data": {} @@ -461,6 +468,28 @@ "is_open": false } }, + { + "id": "solenoid_valve_3", + "name": "氢气电磁阀", + "children": [], + "parent": "OrganicSynthesisStation", + "type": "device", + "class": "virtual_solenoid_valve", + "position": { + "x": 450, + "y": 400, + "z": 0 + }, + "config": { + "voltage": 12.0, + "response_time": 0.1, + "gas_compatible": true + }, + "data": { + "valve_state": "Closed", + "is_open": false + } + }, { "id": "vacuum_pump_1", "name": "真空泵", @@ -500,6 +529,29 @@ "max_pressure": 5.0 } }, + { + "id": "h2_gas_source", + "name": "氢气气源", + "children": [], + "parent": "OrganicSynthesisStation", + "type": "device", + "class": "virtual_gas_source", + "position": { + "x": 500, + "y": 350, + "z": 0 + }, + "config": { + "max_pressure": 10.0, + "gas_type": "hydrogen" + }, + "data": { + "gas_type": "hydrogen", + "max_pressure": 10.0, + "current_pressure": 0.0, + "status": "OFF" + } + }, { "id": "filter_1", "name": "过滤器", @@ -874,14 +926,14 @@ } }, { - "id": "link_filter_filtrate_to_collection1", - "source": "filter_1", - "target": "collection_bottle_1", - "type": "transport", - "port": { - "filter_1": "filtrateout", - "collection_bottle_1": "top" - } + "id": "link_filter_filtrate_to_collection1", + "source": "filter_1", + "target": "collection_bottle_1", + "type": "transport", + "port": { + "filter_1": "filtrateout", + "collection_bottle_1": "top" + } }, { "id": "link_filter_retentate_to_waste1", @@ -892,6 +944,26 @@ "filter_1": "retentateout", "waste_bottle_1": "top" } + }, + { + "id": "link_h2_gas_to_valve3", + "source": "h2_gas_source", + "target": "solenoid_valve_3", + "type": "fluid", + "port": { + "h2_gas_source": "gassource", + "solenoid_valve_3": "in" + } + }, + { + "id": "link_valve3_to_reactor", + "source": "solenoid_valve_3", + "target": "main_reactor", + "type": "fluid", + "port": { + "solenoid_valve_3": "out", + "main_reactor": "top" + } } ] } \ No newline at end of file diff --git a/unilabos/compile/__init__.py b/unilabos/compile/__init__.py index 98ea8a2..ef6f8c6 100644 --- a/unilabos/compile/__init__.py +++ b/unilabos/compile/__init__.py @@ -21,16 +21,23 @@ from .dissolve_protocol import generate_dissolve_protocol from .filter_through_protocol import generate_filter_through_protocol from .run_column_protocol import generate_run_column_protocol from .wash_solid_protocol import generate_wash_solid_protocol +from .adjustph_protocol import generate_adjust_ph_protocol +from .reset_handling_protocol import generate_reset_handling_protocol +from .dry_protocol import generate_dry_protocol +from .recrystallize_protocol import generate_recrystallize_protocol +from .hydrogenate_protocol import generate_hydrogenate_protocol # Define a dictionary of protocol generators. action_protocol_generators = { AddProtocol: generate_add_protocol, AGVTransferProtocol: generate_agv_transfer_protocol, + AdjustPHProtocol: generate_adjust_ph_protocol, CentrifugeProtocol: generate_centrifuge_protocol, CleanProtocol: generate_clean_protocol, CleanVesselProtocol: generate_clean_vessel_protocol, DissolveProtocol: generate_dissolve_protocol, + DryProtocol: generate_dry_protocol, EvacuateAndRefillProtocol: generate_evacuateandrefill_protocol, EvaporateProtocol: generate_evaporate_protocol, FilterProtocol: generate_filter_protocol, @@ -38,7 +45,10 @@ action_protocol_generators = { HeatChillProtocol: generate_heat_chill_protocol, HeatChillStartProtocol: generate_heat_chill_start_protocol, HeatChillStopProtocol: generate_heat_chill_stop_protocol, + HydrogenateProtocol: generate_hydrogenate_protocol, PumpTransferProtocol: generate_pump_protocol_with_rinsing, + RecrystallizeProtocol: generate_recrystallize_protocol, + ResetHandlingProtocol: generate_reset_handling_protocol, RunColumnProtocol: generate_run_column_protocol, SeparateProtocol: generate_separate_protocol, StartStirProtocol: generate_start_stir_protocol, diff --git a/unilabos/compile/adjustph_protocol.py b/unilabos/compile/adjustph_protocol.py new file mode 100644 index 0000000..ce7c1c3 --- /dev/null +++ b/unilabos/compile/adjustph_protocol.py @@ -0,0 +1,411 @@ +import networkx as nx +from typing import List, Dict, Any +from .pump_protocol import generate_pump_protocol_with_rinsing + + +def find_acid_base_vessel(G: nx.DiGraph, reagent: str) -> str: + """ + 查找酸碱试剂容器,支持多种匹配模式 + + Args: + G: 网络图 + reagent: 试剂名称(如 "hydrochloric acid", "sodium hydroxide") + + Returns: + str: 试剂容器ID + """ + print(f"ADJUST_PH: 正在查找试剂 '{reagent}' 的容器...") + + # 常见酸碱试剂的别名映射 + reagent_aliases = { + "hydrochloric acid": ["HCl", "hydrochloric_acid", "hcl", "muriatic_acid"], + "sodium hydroxide": ["NaOH", "sodium_hydroxide", "naoh", "caustic_soda"], + "sulfuric acid": ["H2SO4", "sulfuric_acid", "h2so4"], + "nitric acid": ["HNO3", "nitric_acid", "hno3"], + "acetic acid": ["CH3COOH", "acetic_acid", "glacial_acetic_acid"], + "ammonia": ["NH3", "ammonium_hydroxide", "nh3"], + "potassium hydroxide": ["KOH", "potassium_hydroxide", "koh"] + } + + # 构建搜索名称列表 + search_names = [reagent.lower()] + + # 添加别名 + for base_name, aliases in reagent_aliases.items(): + if reagent.lower() in base_name.lower() or base_name.lower() in reagent.lower(): + search_names.extend([alias.lower() for alias in aliases]) + + # 构建可能的容器名称 + possible_names = [] + for name in search_names: + name_clean = name.replace(" ", "_").replace("-", "_") + possible_names.extend([ + f"flask_{name_clean}", + f"bottle_{name_clean}", + f"reagent_{name_clean}", + f"acid_{name_clean}" if "acid" in name else f"base_{name_clean}", + f"{name_clean}_bottle", + f"{name_clean}_flask", + name_clean + ]) + + # 第一步:通过容器名称匹配 + for vessel_name in possible_names: + if vessel_name in G.nodes(): + print(f"ADJUST_PH: 通过名称匹配找到容器: {vessel_name}") + return vessel_name + + # 第二步:通过模糊匹配 + for node_id in G.nodes(): + if G.nodes[node_id].get('type') == 'container': + node_name = G.nodes[node_id].get('name', '').lower() + + # 检查是否包含任何搜索名称 + for search_name in search_names: + if search_name in node_id.lower() or search_name in node_name: + print(f"ADJUST_PH: 通过模糊匹配找到容器: {node_id}") + return node_id + + # 第三步:通过液体类型匹配 + for node_id in G.nodes(): + if G.nodes[node_id].get('type') == 'container': + vessel_data = G.nodes[node_id].get('data', {}) + liquids = vessel_data.get('liquid', []) + + for liquid in liquids: + if isinstance(liquid, dict): + liquid_type = (liquid.get('liquid_type') or liquid.get('name', '')).lower() + reagent_name = vessel_data.get('reagent_name', '').lower() + + for search_name in search_names: + if search_name in liquid_type or search_name in reagent_name: + print(f"ADJUST_PH: 通过液体类型匹配找到容器: {node_id}") + return node_id + + # 列出可用容器帮助调试 + available_containers = [] + for node_id in G.nodes(): + if G.nodes[node_id].get('type') == 'container': + vessel_data = G.nodes[node_id].get('data', {}) + liquids = vessel_data.get('liquid', []) + liquid_types = [liquid.get('liquid_type', '') or liquid.get('name', '') + for liquid in liquids if isinstance(liquid, dict)] + + available_containers.append({ + 'id': node_id, + 'name': G.nodes[node_id].get('name', ''), + 'liquids': liquid_types, + 'reagent_name': vessel_data.get('reagent_name', '') + }) + + print(f"ADJUST_PH: 可用容器列表:") + for container in available_containers: + print(f" - {container['id']}: {container['name']}") + print(f" 液体: {container['liquids']}") + print(f" 试剂: {container['reagent_name']}") + + raise ValueError(f"找不到试剂 '{reagent}' 对应的容器。尝试了: {possible_names}") + + +def find_connected_stirrer(G: nx.DiGraph, vessel: str) -> str: + """查找与容器相连的搅拌器""" + stirrer_nodes = [node for node in G.nodes() + if (G.nodes[node].get('class') or '') == 'virtual_stirrer'] + + for stirrer in stirrer_nodes: + if G.has_edge(stirrer, vessel) or G.has_edge(vessel, stirrer): + return stirrer + + return stirrer_nodes[0] if stirrer_nodes else None + + +def calculate_reagent_volume(target_ph_value: float, reagent: str, vessel_volume: float = 100.0) -> float: # 改为 target_ph_value + """ + 估算需要的试剂体积来调节pH + + Args: + target_ph_value: 目标pH值 # 改为 target_ph_value + reagent: 试剂名称 + vessel_volume: 容器体积 (mL) + + Returns: + float: 估算的试剂体积 (mL) + """ + # 简化的pH调节体积估算(实际应用中需要更精确的计算) + if "acid" in reagent.lower() or "hcl" in reagent.lower(): + # 酸性试剂:pH越低需要的体积越大 + if target_ph_value < 3: # 改为 target_ph_value + return vessel_volume * 0.05 # 5% + elif target_ph_value < 5: # 改为 target_ph_value + return vessel_volume * 0.02 # 2% + else: + return vessel_volume * 0.01 # 1% + + elif "hydroxide" in reagent.lower() or "naoh" in reagent.lower(): + # 碱性试剂:pH越高需要的体积越大 + if target_ph_value > 11: # 改为 target_ph_value + return vessel_volume * 0.05 # 5% + elif target_ph_value > 9: # 改为 target_ph_value + return vessel_volume * 0.02 # 2% + else: + return vessel_volume * 0.01 # 1% + + else: + # 未知试剂,使用默认值 + return vessel_volume * 0.01 + + +def generate_adjust_ph_protocol( + G: nx.DiGraph, + vessel: str, + ph_value: float, # 改为 ph_value + reagent: str, + **kwargs +) -> List[Dict[str, Any]]: + """ + 生成调节pH的协议序列 + + Args: + G: 有向图,节点为容器和设备 + vessel: 目标容器(需要调节pH的容器) + ph_value: 目标pH值(从XDL传入) # 改为 ph_value + reagent: 酸碱试剂名称(从XDL传入) + **kwargs: 其他可选参数,使用默认值 + + Returns: + List[Dict[str, Any]]: 动作序列 + """ + action_sequence = [] + + # 从kwargs中获取可选参数,如果没有则使用默认值 + volume = kwargs.get('volume', 0.0) # 自动估算体积 + stir = kwargs.get('stir', True) # 默认搅拌 + stir_speed = kwargs.get('stir_speed', 300.0) # 默认搅拌速度 + stir_time = kwargs.get('stir_time', 60.0) # 默认搅拌时间 + settling_time = kwargs.get('settling_time', 30.0) # 默认平衡时间 + + print(f"ADJUST_PH: 开始生成pH调节协议") + print(f" - 目标容器: {vessel}") + print(f" - 目标pH: {ph_value}") # 改为 ph_value + print(f" - 试剂: {reagent}") + print(f" - 使用默认参数: 体积=自动估算, 搅拌=True, 搅拌速度=300RPM") + + # 1. 验证目标容器存在 + if vessel not in G.nodes(): + raise ValueError(f"目标容器 '{vessel}' 不存在于系统中") + + # 2. 查找酸碱试剂容器 + try: + reagent_vessel = find_acid_base_vessel(G, reagent) + print(f"ADJUST_PH: 找到试剂容器: {reagent_vessel}") + except ValueError as e: + raise ValueError(f"无法找到试剂 '{reagent}': {str(e)}") + + # 3. 如果未指定体积,自动估算 + if volume <= 0: + # 获取目标容器的体积信息 + vessel_data = G.nodes[vessel].get('data', {}) + vessel_volume = vessel_data.get('max_volume', 100.0) # 默认100mL + + estimated_volume = calculate_reagent_volume(ph_value, reagent, vessel_volume) # 改为 ph_value + volume = estimated_volume + print(f"ADJUST_PH: 自动估算试剂体积: {volume:.2f} mL") + + # 4. 验证路径存在 + try: + path = nx.shortest_path(G, source=reagent_vessel, target=vessel) + print(f"ADJUST_PH: 找到路径: {' → '.join(path)}") + except nx.NetworkXNoPath: + raise ValueError(f"从试剂容器 '{reagent_vessel}' 到目标容器 '{vessel}' 没有可用路径") + + # 5. 先启动搅拌(如果需要) + stirrer_id = None + if stir: + try: + stirrer_id = find_connected_stirrer(G, vessel) + + if stirrer_id: + print(f"ADJUST_PH: 找到搅拌器 {stirrer_id},启动搅拌") + action_sequence.append({ + "device_id": stirrer_id, + "action_name": "start_stir", + "action_kwargs": { + "vessel": vessel, + "stir_speed": stir_speed, + "purpose": f"pH调节: 启动搅拌,准备添加 {reagent}" + } + }) + + # 等待搅拌稳定 + action_sequence.append({ + "action_name": "wait", + "action_kwargs": {"time": 5} + }) + else: + print(f"ADJUST_PH: 警告 - 未找到搅拌器,继续执行") + + except Exception as e: + print(f"ADJUST_PH: 搅拌器配置出错: {str(e)}") + + # 6. 缓慢添加试剂 - 使用pump_protocol + print(f"ADJUST_PH: 开始添加试剂 {volume:.2f} mL") + + # 计算添加时间(pH调节需要缓慢添加) + addition_time = max(30.0, volume * 2.0) # 至少30秒,每mL需要2秒 + + try: + pump_actions = generate_pump_protocol_with_rinsing( + G=G, + from_vessel=reagent_vessel, + to_vessel=vessel, + volume=volume, + amount="", + time=addition_time, + viscous=False, + rinsing_solvent="", # pH调节不需要清洗 + rinsing_volume=0.0, + rinsing_repeats=0, + solid=False, + flowrate=0.5 # 缓慢注入 + ) + + action_sequence.extend(pump_actions) + + except Exception as e: + raise ValueError(f"生成泵协议时出错: {str(e)}") + + # 7. 持续搅拌以混合和平衡 + if stir and stirrer_id: + print(f"ADJUST_PH: 持续搅拌 {stir_time} 秒以混合试剂") + action_sequence.append({ + "device_id": stirrer_id, + "action_name": "stir", + "action_kwargs": { + "stir_time": stir_time, + "stir_speed": stir_speed, + "settling_time": settling_time, + "purpose": f"pH调节: 混合试剂,目标pH={ph_value}" # 改为 ph_value + } + }) + + # 8. 等待反应平衡 + action_sequence.append({ + "action_name": "wait", + "action_kwargs": { + "time": settling_time, + "description": f"等待pH平衡到目标值 {ph_value}" # 改为 ph_value + } + }) + + print(f"ADJUST_PH: 协议生成完成,共 {len(action_sequence)} 个动作") + print(f"ADJUST_PH: 预计总时间: {addition_time + stir_time + settling_time:.0f} 秒") + + return action_sequence + + +def generate_adjust_ph_protocol_stepwise( + G: nx.DiGraph, + vessel: str, + ph_value: float, + reagent: str, + max_volume: float = 10.0, + steps: int = 3 +) -> List[Dict[str, Any]]: + """ + 分步调节pH的协议(更安全,避免过度调节) + + Args: + G: 网络图 + vessel: 目标容器 + pH: 目标pH值 + reagent: 酸碱试剂 + max_volume: 最大试剂体积 + steps: 分步数量 + + Returns: + List[Dict[str, Any]]: 动作序列 + """ + action_sequence = [] + + print(f"ADJUST_PH: 开始分步pH调节({steps}步)") + + # 每步添加的体积 + step_volume = max_volume / steps + + for i in range(steps): + print(f"ADJUST_PH: 第 {i+1}/{steps} 步,添加 {step_volume} mL") + + # 生成单步协议 + step_actions = generate_adjust_ph_protocol( + G=G, + vessel=vessel, + ph_value=ph_value, + reagent=reagent, + volume=step_volume, + stir=True, + stir_speed=300.0, + stir_time=30.0, + settling_time=20.0 + ) + + action_sequence.extend(step_actions) + + # 步骤间等待 + if i < steps - 1: + action_sequence.append({ + "action_name": "wait", + "action_kwargs": { + "time": 30, + "description": f"pH调节第{i+1}步完成,等待下一步" + } + }) + + print(f"ADJUST_PH: 分步pH调节完成") + return action_sequence + + +# 便捷函数:常用pH调节 +def generate_acidify_protocol( + G: nx.DiGraph, + vessel: str, + target_ph: float = 2.0, + acid: str = "hydrochloric acid" +) -> List[Dict[str, Any]]: + """酸化协议""" + return generate_adjust_ph_protocol( + G, vessel, target_ph, acid, 0.0, True, 300.0, 120.0, 60.0 + ) + + +def generate_basify_protocol( + G: nx.DiGraph, + vessel: str, + target_ph: float = 12.0, + base: str = "sodium hydroxide" +) -> List[Dict[str, Any]]: + """碱化协议""" + return generate_adjust_ph_protocol( + G, vessel, target_ph, base, 0.0, True, 300.0, 120.0, 60.0 + ) + + +def generate_neutralize_protocol( + G: nx.DiGraph, + vessel: str, + reagent: str = "sodium hydroxide" +) -> List[Dict[str, Any]]: + """中和协议(pH=7)""" + return generate_adjust_ph_protocol( + G, vessel, 7.0, reagent, 0.0, True, 350.0, 180.0, 90.0 + ) + + +# 测试函数 +def test_adjust_ph_protocol(): + """测试pH调节协议""" + print("=== ADJUST PH PROTOCOL 测试 ===") + print("测试完成") + + +if __name__ == "__main__": + test_adjust_ph_protocol() \ No newline at end of file diff --git a/unilabos/compile/dry_protocol.py b/unilabos/compile/dry_protocol.py new file mode 100644 index 0000000..34044eb --- /dev/null +++ b/unilabos/compile/dry_protocol.py @@ -0,0 +1,165 @@ +import networkx as nx +from typing import List, Dict, Any + + +def find_connected_heater(G: nx.DiGraph, vessel: str) -> str: + """ + 查找与容器相连的加热器 + + Args: + G: 网络图 + vessel: 容器名称 + + Returns: + str: 加热器ID,如果没有则返回None + """ + print(f"DRY: 正在查找与容器 '{vessel}' 相连的加热器...") + + # 查找所有加热器节点 + heater_nodes = [node for node in G.nodes() + if ('heater' in node.lower() or + 'heat' in node.lower() or + G.nodes[node].get('class') == 'virtual_heatchill' or + G.nodes[node].get('type') == 'heater')] + + print(f"DRY: 找到的加热器节点: {heater_nodes}") + + # 检查是否有加热器与目标容器相连 + for heater in heater_nodes: + if G.has_edge(heater, vessel) or G.has_edge(vessel, heater): + print(f"DRY: 找到与容器 '{vessel}' 相连的加热器: {heater}") + return heater + + # 如果没有直接连接,查找距离最近的加热器 + for heater in heater_nodes: + try: + path = nx.shortest_path(G, source=heater, target=vessel) + if len(path) <= 3: # 最多2个中间节点 + print(f"DRY: 找到距离较近的加热器: {heater}, 路径: {' → '.join(path)}") + return heater + except nx.NetworkXNoPath: + continue + + print(f"DRY: 未找到与容器 '{vessel}' 相连的加热器") + return None + + +def generate_dry_protocol( + G: nx.DiGraph, + compound: str, + vessel: str, + **kwargs # 接收其他可能的参数但不使用 +) -> List[Dict[str, Any]]: + """ + 生成干燥协议序列 + + Args: + G: 有向图,节点为容器和设备 + compound: 化合物名称(从XDL传入) + vessel: 目标容器(从XDL传入) + **kwargs: 其他可选参数,但不使用 + + Returns: + List[Dict[str, Any]]: 动作序列 + """ + action_sequence = [] + + # 默认参数 + dry_temp = 60.0 # 默认干燥温度 60°C + dry_time = 3600.0 # 默认干燥时间 1小时(3600秒) + + print(f"DRY: 开始生成干燥协议") + print(f" - 化合物: {compound}") + print(f" - 容器: {vessel}") + print(f" - 干燥温度: {dry_temp}°C") + print(f" - 干燥时间: {dry_time/60:.0f} 分钟") + + # 1. 验证目标容器存在 + if vessel not in G.nodes(): + print(f"DRY: 警告 - 容器 '{vessel}' 不存在于系统中,跳过干燥") + return action_sequence + + # 2. 查找相连的加热器 + heater_id = find_connected_heater(G, vessel) + + if heater_id is None: + print(f"DRY: 警告 - 未找到与容器 '{vessel}' 相连的加热器,跳过干燥") + # 添加一个等待动作,表示干燥过程(模拟) + action_sequence.append({ + "action_name": "wait", + "action_kwargs": { + "time": 60.0, # 等待1分钟 + "description": f"模拟干燥 {compound} (无加热器可用)" + } + }) + return action_sequence + + # 3. 启动加热器进行干燥 + print(f"DRY: 启动加热器 {heater_id} 进行干燥") + + # 3.1 启动加热 + action_sequence.append({ + "device_id": heater_id, + "action_name": "heat_chill_start", + "action_kwargs": { + "vessel": vessel, + "temp": dry_temp, + "purpose": f"干燥 {compound}" + } + }) + + # 3.2 等待温度稳定 + action_sequence.append({ + "action_name": "wait", + "action_kwargs": { + "time": 60.0, + "description": f"等待温度稳定到 {dry_temp}°C" + } + }) + + # 3.3 保持干燥温度 + action_sequence.append({ + "device_id": heater_id, + "action_name": "heat_chill", + "action_kwargs": { + "vessel": vessel, + "temp": dry_temp, + "time": dry_time, + "purpose": f"干燥 {compound},保持温度 {dry_temp}°C" + } + }) + + # 3.4 停止加热 + action_sequence.append({ + "device_id": heater_id, + "action_name": "heat_chill_stop", + "action_kwargs": { + "vessel": vessel, + "purpose": f"干燥完成,停止加热" + } + }) + + # 3.5 等待冷却 + action_sequence.append({ + "action_name": "wait", + "action_kwargs": { + "time": 300.0, # 等待5分钟冷却 + "description": f"等待 {compound} 冷却" + } + }) + + print(f"DRY: 协议生成完成,共 {len(action_sequence)} 个动作") + print(f"DRY: 预计总时间: {(dry_time + 360)/60:.0f} 分钟") + + return action_sequence + + +# 测试函数 +def test_dry_protocol(): + """测试干燥协议""" + print("=== DRY PROTOCOL 测试 ===") + print("测试完成") + + +if __name__ == "__main__": + test_dry_protocol() \ No newline at end of file diff --git a/unilabos/compile/hydrogenate_protocol.py b/unilabos/compile/hydrogenate_protocol.py new file mode 100644 index 0000000..8070705 --- /dev/null +++ b/unilabos/compile/hydrogenate_protocol.py @@ -0,0 +1,366 @@ +import networkx as nx +from typing import List, Dict, Any, Optional + + +def parse_temperature(temp_str: str) -> float: + """ + 解析温度字符串,支持多种格式 + + Args: + temp_str: 温度字符串(如 "45 °C", "45°C", "45") + + Returns: + float: 温度值(摄氏度) + """ + try: + # 移除常见的温度单位和符号 + temp_clean = temp_str.replace("°C", "").replace("°", "").replace("C", "").strip() + return float(temp_clean) + except ValueError: + print(f"HYDROGENATE: 无法解析温度 '{temp_str}',使用默认温度 25°C") + return 25.0 + + +def parse_time(time_str: str) -> float: + """ + 解析时间字符串,支持多种格式 + + Args: + time_str: 时间字符串(如 "2 h", "120 min", "7200 s") + + Returns: + float: 时间值(秒) + """ + try: + time_clean = time_str.lower().strip() + + # 处理小时 + if "h" in time_clean: + hours = float(time_clean.replace("h", "").strip()) + return hours * 3600.0 + + # 处理分钟 + if "min" in time_clean: + minutes = float(time_clean.replace("min", "").strip()) + return minutes * 60.0 + + # 处理秒 + if "s" in time_clean: + seconds = float(time_clean.replace("s", "").strip()) + return seconds + + # 默认按小时处理 + return float(time_clean) * 3600.0 + + except ValueError: + print(f"HYDROGENATE: 无法解析时间 '{time_str}',使用默认时间 2小时") + return 7200.0 # 2小时 + + +def find_associated_solenoid_valve(G: nx.DiGraph, device_id: str) -> Optional[str]: + """查找与指定设备相关联的电磁阀""" + solenoid_valves = [ + node for node in G.nodes() + if ('solenoid' in (G.nodes[node].get('class') or '').lower() + or 'solenoid_valve' in node) + ] + + # 通过网络连接查找直接相连的电磁阀 + for solenoid in solenoid_valves: + if G.has_edge(device_id, solenoid) or G.has_edge(solenoid, device_id): + return solenoid + + # 通过命名规则查找关联的电磁阀 + device_type = "" + if 'gas' in device_id.lower(): + device_type = "gas" + elif 'h2' in device_id.lower() or 'hydrogen' in device_id.lower(): + device_type = "gas" + + if device_type: + for solenoid in solenoid_valves: + if device_type in solenoid.lower(): + return solenoid + + return None + + +def find_connected_device(G: nx.DiGraph, vessel: str, device_type: str) -> str: + """ + 查找与容器相连的指定类型设备 + + Args: + G: 网络图 + vessel: 容器名称 + device_type: 设备类型 ('heater', 'stirrer', 'gas_source') + + Returns: + str: 设备ID,如果没有则返回None + """ + print(f"HYDROGENATE: 正在查找与容器 '{vessel}' 相连的 {device_type}...") + + # 根据设备类型定义搜索关键词 + if device_type == 'heater': + keywords = ['heater', 'heat', 'heatchill'] + device_class = 'virtual_heatchill' + elif device_type == 'stirrer': + keywords = ['stirrer', 'stir'] + device_class = 'virtual_stirrer' + elif device_type == 'gas_source': + keywords = ['gas', 'h2', 'hydrogen'] + device_class = 'virtual_gas_source' + else: + return None + + # 查找设备节点 + device_nodes = [] + for node in G.nodes(): + node_data = G.nodes[node] + node_name = node.lower() + node_class = node_data.get('class', '').lower() + + # 通过名称匹配 + if any(keyword in node_name for keyword in keywords): + device_nodes.append(node) + # 通过类型匹配 + elif device_class in node_class: + device_nodes.append(node) + + print(f"HYDROGENATE: 找到的{device_type}节点: {device_nodes}") + + # 检查是否有设备与目标容器相连 + for device in device_nodes: + if G.has_edge(device, vessel) or G.has_edge(vessel, device): + print(f"HYDROGENATE: 找到与容器 '{vessel}' 相连的{device_type}: {device}") + return device + + # 如果没有直接连接,查找距离最近的设备 + for device in device_nodes: + try: + path = nx.shortest_path(G, source=device, target=vessel) + if len(path) <= 3: # 最多2个中间节点 + print(f"HYDROGENATE: 找到距离较近的{device_type}: {device}") + return device + except nx.NetworkXNoPath: + continue + + print(f"HYDROGENATE: 未找到与容器 '{vessel}' 相连的{device_type}") + return None + + +def generate_hydrogenate_protocol( + G: nx.DiGraph, + temp: str, + time: str, + vessel: str, + **kwargs # 接收其他可能的参数但不使用 +) -> List[Dict[str, Any]]: + """ + 生成氢化反应协议序列 + + Args: + G: 有向图,节点为容器和设备 + temp: 反应温度(如 "45 °C") + time: 反应时间(如 "2 h") + vessel: 反应容器 + **kwargs: 其他可选参数,但不使用 + + Returns: + List[Dict[str, Any]]: 动作序列 + """ + action_sequence = [] + + # 解析参数 + temperature = parse_temperature(temp) + reaction_time = parse_time(time) + + print(f"HYDROGENATE: 开始生成氢化反应协议") + print(f" - 反应温度: {temperature}°C") + print(f" - 反应时间: {reaction_time/3600:.1f} 小时") + print(f" - 反应容器: {vessel}") + + # 1. 验证目标容器存在 + if vessel not in G.nodes(): + print(f"HYDROGENATE: 警告 - 容器 '{vessel}' 不存在于系统中,跳过氢化反应") + return action_sequence + + # 2. 查找相连的设备 + heater_id = find_connected_device(G, vessel, 'heater') + stirrer_id = find_connected_device(G, vessel, 'stirrer') + gas_source_id = find_connected_device(G, vessel, 'gas_source') + + # 3. 启动搅拌器 + if stirrer_id: + print(f"HYDROGENATE: 启动搅拌器 {stirrer_id}") + action_sequence.append({ + "device_id": stirrer_id, + "action_name": "start_stir", + "action_kwargs": { + "vessel": vessel, + "stir_speed": 300.0, + "purpose": "氢化反应: 开始搅拌" + } + }) + else: + print(f"HYDROGENATE: 警告 - 未找到搅拌器,继续执行") + + # 4. 启动气源(氢气)- 修复版本 + if gas_source_id: + print(f"HYDROGENATE: 启动气源 {gas_source_id} (氢气)") + action_sequence.append({ + "device_id": gas_source_id, + "action_name": "set_status", # 修改为 set_status + "action_kwargs": { + "string": "ON" # 修改参数格式 + } + }) + + # 查找相关的电磁阀 + gas_solenoid = find_associated_solenoid_valve(G, gas_source_id) + if gas_solenoid: + print(f"HYDROGENATE: 开启气源电磁阀 {gas_solenoid}") + action_sequence.append({ + "device_id": gas_solenoid, + "action_name": "set_valve_position", + "action_kwargs": { + "command": "OPEN" + } + }) + else: + print(f"HYDROGENATE: 警告 - 未找到气源,继续执行") + + # 5. 等待气体稳定 + action_sequence.append({ + "action_name": "wait", + "action_kwargs": { + "time": 30.0, + "description": "等待氢气环境稳定" + } + }) + + # 6. 启动加热器 + if heater_id: + print(f"HYDROGENATE: 启动加热器 {heater_id} 到 {temperature}°C") + action_sequence.append({ + "device_id": heater_id, + "action_name": "heat_chill_start", + "action_kwargs": { + "vessel": vessel, + "temp": temperature, + "purpose": f"氢化反应: 加热到 {temperature}°C" + } + }) + + # 等待温度稳定 + action_sequence.append({ + "action_name": "wait", + "action_kwargs": { + "time": 120.0, + "description": f"等待温度稳定到 {temperature}°C" + } + }) + + # 保持反应温度 + action_sequence.append({ + "device_id": heater_id, + "action_name": "heat_chill", + "action_kwargs": { + "vessel": vessel, + "temp": temperature, + "time": reaction_time, + "purpose": f"氢化反应: 保持 {temperature}°C,反应 {reaction_time/3600:.1f} 小时" + } + }) + else: + print(f"HYDROGENATE: 警告 - 未找到加热器,使用室温反应") + # 室温反应,只等待时间 + action_sequence.append({ + "action_name": "wait", + "action_kwargs": { + "time": reaction_time, + "description": f"室温氢化反应 {reaction_time/3600:.1f} 小时" + } + }) + + # 7. 停止加热 + if heater_id: + action_sequence.append({ + "device_id": heater_id, + "action_name": "heat_chill_stop", + "action_kwargs": { + "vessel": vessel, + "purpose": "氢化反应完成,停止加热" + } + }) + + # 8. 等待冷却 + action_sequence.append({ + "action_name": "wait", + "action_kwargs": { + "time": 300.0, + "description": "等待反应混合物冷却" + } + }) + + # 9. 停止气源 - 修复版本 + if gas_source_id: + # 先关闭电磁阀 + gas_solenoid = find_associated_solenoid_valve(G, gas_source_id) + if gas_solenoid: + print(f"HYDROGENATE: 关闭气源电磁阀 {gas_solenoid}") + action_sequence.append({ + "device_id": gas_solenoid, + "action_name": "set_valve_position", + "action_kwargs": { + "command": "CLOSED" + } + }) + + # 再关闭气源 + action_sequence.append({ + "device_id": gas_source_id, + "action_name": "set_status", # 修改为 set_status + "action_kwargs": { + "string": "OFF" # 修改参数格式 + } + }) + + # 10. 停止搅拌 + if stirrer_id: + action_sequence.append({ + "device_id": stirrer_id, + "action_name": "stop_stir", + "action_kwargs": { + "vessel": vessel, + "purpose": "氢化反应完成,停止搅拌" + } + }) + + print(f"HYDROGENATE: 协议生成完成,共 {len(action_sequence)} 个动作") + print(f"HYDROGENATE: 预计总时间: {(reaction_time + 450)/3600:.1f} 小时") + + return action_sequence + + +# 测试函数 +def test_hydrogenate_protocol(): + """测试氢化反应协议""" + print("=== HYDROGENATE PROTOCOL 测试 ===") + + # 测试温度解析 + test_temps = ["45 °C", "45°C", "45", "25 C", "invalid"] + for temp in test_temps: + parsed = parse_temperature(temp) + print(f"温度 '{temp}' -> {parsed}°C") + + # 测试时间解析 + test_times = ["2 h", "120 min", "7200 s", "2", "invalid"] + for time in test_times: + parsed = parse_time(time) + print(f"时间 '{time}' -> {parsed/3600:.1f} 小时") + + print("测试完成") + + +if __name__ == "__main__": + test_hydrogenate_protocol() \ No newline at end of file diff --git a/unilabos/compile/recrystallize_protocol.py b/unilabos/compile/recrystallize_protocol.py new file mode 100644 index 0000000..b69d88b --- /dev/null +++ b/unilabos/compile/recrystallize_protocol.py @@ -0,0 +1,281 @@ +import networkx as nx +from typing import List, Dict, Any, Tuple +from .pump_protocol import generate_pump_protocol_with_rinsing + + +def parse_ratio(ratio_str: str) -> Tuple[float, float]: + """ + 解析比例字符串,支持多种格式 + + Args: + ratio_str: 比例字符串(如 "1:1", "3:7", "50:50") + + Returns: + Tuple[float, float]: 比例元组 (ratio1, ratio2) + """ + try: + # 处理 "1:1", "3:7", "50:50" 等格式 + if ":" in ratio_str: + parts = ratio_str.split(":") + if len(parts) == 2: + ratio1 = float(parts[0]) + ratio2 = float(parts[1]) + return ratio1, ratio2 + + # 处理 "1-1", "3-7" 等格式 + if "-" in ratio_str: + parts = ratio_str.split("-") + if len(parts) == 2: + ratio1 = float(parts[0]) + ratio2 = float(parts[1]) + return ratio1, ratio2 + + # 处理 "1,1", "3,7" 等格式 + if "," in ratio_str: + parts = ratio_str.split(",") + if len(parts) == 2: + ratio1 = float(parts[0]) + ratio2 = float(parts[1]) + return ratio1, ratio2 + + # 默认 1:1 + print(f"RECRYSTALLIZE: 无法解析比例 '{ratio_str}',使用默认比例 1:1") + return 1.0, 1.0 + + except ValueError: + print(f"RECRYSTALLIZE: 比例解析错误 '{ratio_str}',使用默认比例 1:1") + return 1.0, 1.0 + + +def find_solvent_vessel(G: nx.DiGraph, solvent: str) -> str: + """ + 查找溶剂容器 + + Args: + G: 网络图 + solvent: 溶剂名称 + + Returns: + str: 溶剂容器ID + """ + print(f"RECRYSTALLIZE: 正在查找溶剂 '{solvent}' 的容器...") + + # 构建可能的容器名称 + possible_names = [ + f"flask_{solvent}", + f"bottle_{solvent}", + f"reagent_{solvent}", + f"reagent_bottle_{solvent}", + f"{solvent}_flask", + f"{solvent}_bottle", + f"{solvent}", + f"vessel_{solvent}", + ] + + # 第一步:通过容器名称匹配 + for vessel_name in possible_names: + if vessel_name in G.nodes(): + print(f"RECRYSTALLIZE: 通过名称匹配找到容器: {vessel_name}") + return vessel_name + + # 第二步:通过模糊匹配 + for node_id in G.nodes(): + if G.nodes[node_id].get('type') == 'container': + node_name = G.nodes[node_id].get('name', '').lower() + + if solvent.lower() in node_id.lower() or solvent.lower() in node_name: + print(f"RECRYSTALLIZE: 通过模糊匹配找到容器: {node_id}") + return node_id + + # 第三步:通过液体类型匹配 + for node_id in G.nodes(): + if G.nodes[node_id].get('type') == 'container': + vessel_data = G.nodes[node_id].get('data', {}) + liquids = vessel_data.get('liquid', []) + + for liquid in liquids: + if isinstance(liquid, dict): + liquid_type = (liquid.get('liquid_type') or liquid.get('name', '')).lower() + reagent_name = vessel_data.get('reagent_name', '').lower() + + if solvent.lower() in liquid_type or solvent.lower() in reagent_name: + print(f"RECRYSTALLIZE: 通过液体类型匹配找到容器: {node_id}") + return node_id + + raise ValueError(f"找不到溶剂 '{solvent}' 对应的容器") + + +def generate_recrystallize_protocol( + G: nx.DiGraph, + ratio: str, + solvent1: str, + solvent2: str, + vessel: str, + volume: float, + **kwargs # 接收其他可能的参数但不使用 +) -> List[Dict[str, Any]]: + """ + 生成重结晶协议序列 + + Args: + G: 有向图,节点为容器和设备 + ratio: 溶剂比例(如 "1:1", "3:7") + solvent1: 第一种溶剂名称 + solvent2: 第二种溶剂名称 + vessel: 目标容器 + volume: 总体积 (mL) + **kwargs: 其他可选参数,但不使用 + + Returns: + List[Dict[str, Any]]: 动作序列 + """ + action_sequence = [] + + print(f"RECRYSTALLIZE: 开始生成重结晶协议") + print(f" - 比例: {ratio}") + print(f" - 溶剂1: {solvent1}") + print(f" - 溶剂2: {solvent2}") + print(f" - 容器: {vessel}") + print(f" - 总体积: {volume} mL") + + # 1. 验证目标容器存在 + if vessel not in G.nodes(): + raise ValueError(f"目标容器 '{vessel}' 不存在于系统中") + + # 2. 解析比例 + ratio1, ratio2 = parse_ratio(ratio) + total_ratio = ratio1 + ratio2 + + # 3. 计算各溶剂体积 + volume1 = volume * (ratio1 / total_ratio) + volume2 = volume * (ratio2 / total_ratio) + + print(f"RECRYSTALLIZE: 解析比例: {ratio1}:{ratio2}") + print(f"RECRYSTALLIZE: {solvent1} 体积: {volume1:.2f} mL") + print(f"RECRYSTALLIZE: {solvent2} 体积: {volume2:.2f} mL") + + # 4. 查找溶剂容器 + try: + solvent1_vessel = find_solvent_vessel(G, solvent1) + print(f"RECRYSTALLIZE: 找到溶剂1容器: {solvent1_vessel}") + except ValueError as e: + raise ValueError(f"无法找到溶剂1 '{solvent1}': {str(e)}") + + try: + solvent2_vessel = find_solvent_vessel(G, solvent2) + print(f"RECRYSTALLIZE: 找到溶剂2容器: {solvent2_vessel}") + except ValueError as e: + raise ValueError(f"无法找到溶剂2 '{solvent2}': {str(e)}") + + # 5. 验证路径存在 + try: + path1 = nx.shortest_path(G, source=solvent1_vessel, target=vessel) + print(f"RECRYSTALLIZE: 溶剂1路径: {' → '.join(path1)}") + except nx.NetworkXNoPath: + raise ValueError(f"从溶剂1容器 '{solvent1_vessel}' 到目标容器 '{vessel}' 没有可用路径") + + try: + path2 = nx.shortest_path(G, source=solvent2_vessel, target=vessel) + print(f"RECRYSTALLIZE: 溶剂2路径: {' → '.join(path2)}") + except nx.NetworkXNoPath: + raise ValueError(f"从溶剂2容器 '{solvent2_vessel}' 到目标容器 '{vessel}' 没有可用路径") + + # 6. 添加第一种溶剂 + print(f"RECRYSTALLIZE: 开始添加溶剂1 {volume1:.2f} mL") + + try: + pump_actions1 = generate_pump_protocol_with_rinsing( + G=G, + from_vessel=solvent1_vessel, + to_vessel=vessel, + volume=volume1, + amount="", + time=0.0, + viscous=False, + rinsing_solvent="", # 重结晶不需要清洗 + rinsing_volume=0.0, + rinsing_repeats=0, + solid=False, + flowrate=2.0, # 正常流速 + transfer_flowrate=0.5 + ) + + action_sequence.extend(pump_actions1) + + except Exception as e: + raise ValueError(f"生成溶剂1泵协议时出错: {str(e)}") + + # 7. 等待溶剂1稳定 + action_sequence.append({ + "action_name": "wait", + "action_kwargs": { + "time": 10.0, + "description": f"等待溶剂1 {solvent1} 稳定" + } + }) + + # 8. 添加第二种溶剂 + print(f"RECRYSTALLIZE: 开始添加溶剂2 {volume2:.2f} mL") + + try: + pump_actions2 = generate_pump_protocol_with_rinsing( + G=G, + from_vessel=solvent2_vessel, + to_vessel=vessel, + volume=volume2, + amount="", + time=0.0, + viscous=False, + rinsing_solvent="", # 重结晶不需要清洗 + rinsing_volume=0.0, + rinsing_repeats=0, + solid=False, + flowrate=2.0, # 正常流速 + transfer_flowrate=0.5 + ) + + action_sequence.extend(pump_actions2) + + except Exception as e: + raise ValueError(f"生成溶剂2泵协议时出错: {str(e)}") + + # 9. 等待溶剂2稳定 + action_sequence.append({ + "action_name": "wait", + "action_kwargs": { + "time": 10.0, + "description": f"等待溶剂2 {solvent2} 稳定" + } + }) + + # 10. 等待重结晶完成 + action_sequence.append({ + "action_name": "wait", + "action_kwargs": { + "time": 600.0, # 等待10分钟进行重结晶 + "description": f"等待重结晶完成({solvent1}:{solvent2} = {ratio})" + } + }) + + print(f"RECRYSTALLIZE: 协议生成完成,共 {len(action_sequence)} 个动作") + print(f"RECRYSTALLIZE: 预计总时间: {620/60:.1f} 分钟") + + return action_sequence + + +# 测试函数 +def test_recrystallize_protocol(): + """测试重结晶协议""" + print("=== RECRYSTALLIZE PROTOCOL 测试 ===") + + # 测试比例解析 + test_ratios = ["1:1", "3:7", "50:50", "1-1", "2,8", "invalid"] + for ratio in test_ratios: + r1, r2 = parse_ratio(ratio) + print(f"比例 '{ratio}' -> {r1}:{r2}") + + print("测试完成") + + +if __name__ == "__main__": + test_recrystallize_protocol() \ No newline at end of file diff --git a/unilabos/compile/reset_handling_protocol.py b/unilabos/compile/reset_handling_protocol.py new file mode 100644 index 0000000..0fa55c2 --- /dev/null +++ b/unilabos/compile/reset_handling_protocol.py @@ -0,0 +1,180 @@ +import networkx as nx +from typing import List, Dict, Any +from .pump_protocol import generate_pump_protocol_with_rinsing + + +def find_solvent_vessel(G: nx.DiGraph, solvent: str) -> str: + """ + 查找溶剂容器,支持多种匹配模式 + + Args: + G: 网络图 + solvent: 溶剂名称(如 "methanol", "ethanol", "water") + + Returns: + str: 溶剂容器ID + """ + print(f"RESET_HANDLING: 正在查找溶剂 '{solvent}' 的容器...") + + # 构建可能的容器名称 + possible_names = [ + f"flask_{solvent}", # flask_methanol + f"bottle_{solvent}", # bottle_methanol + f"reagent_{solvent}", # reagent_methanol + f"reagent_bottle_{solvent}", # reagent_bottle_methanol + f"{solvent}_flask", # methanol_flask + f"{solvent}_bottle", # methanol_bottle + f"{solvent}", # methanol + f"vessel_{solvent}", # vessel_methanol + ] + + # 第一步:通过容器名称匹配 + for vessel_name in possible_names: + if vessel_name in G.nodes(): + print(f"RESET_HANDLING: 通过名称匹配找到容器: {vessel_name}") + return vessel_name + + # 第二步:通过模糊匹配 + for node_id in G.nodes(): + if G.nodes[node_id].get('type') == 'container': + node_name = G.nodes[node_id].get('name', '').lower() + + # 检查是否包含溶剂名称 + if solvent.lower() in node_id.lower() or solvent.lower() in node_name: + print(f"RESET_HANDLING: 通过模糊匹配找到容器: {node_id}") + return node_id + + # 第三步:通过液体类型匹配 + for node_id in G.nodes(): + if G.nodes[node_id].get('type') == 'container': + vessel_data = G.nodes[node_id].get('data', {}) + liquids = vessel_data.get('liquid', []) + + for liquid in liquids: + if isinstance(liquid, dict): + liquid_type = (liquid.get('liquid_type') or liquid.get('name', '')).lower() + reagent_name = vessel_data.get('reagent_name', '').lower() + + if solvent.lower() in liquid_type or solvent.lower() in reagent_name: + print(f"RESET_HANDLING: 通过液体类型匹配找到容器: {node_id}") + return node_id + + # 列出可用容器帮助调试 + available_containers = [] + for node_id in G.nodes(): + if G.nodes[node_id].get('type') == 'container': + vessel_data = G.nodes[node_id].get('data', {}) + liquids = vessel_data.get('liquid', []) + liquid_types = [liquid.get('liquid_type', '') or liquid.get('name', '') + for liquid in liquids if isinstance(liquid, dict)] + + available_containers.append({ + 'id': node_id, + 'name': G.nodes[node_id].get('name', ''), + 'liquids': liquid_types, + 'reagent_name': vessel_data.get('reagent_name', '') + }) + + print(f"RESET_HANDLING: 可用容器列表:") + for container in available_containers: + print(f" - {container['id']}: {container['name']}") + print(f" 液体: {container['liquids']}") + print(f" 试剂: {container['reagent_name']}") + + raise ValueError(f"找不到溶剂 '{solvent}' 对应的容器。尝试了: {possible_names}") + + +def generate_reset_handling_protocol( + G: nx.DiGraph, + solvent: str, + **kwargs # 接收其他可能的参数但不使用 +) -> List[Dict[str, Any]]: + """ + 生成重置处理协议序列 + + Args: + G: 有向图,节点为容器和设备 + solvent: 溶剂名称(从XDL传入) + **kwargs: 其他可选参数,但不使用 + + Returns: + List[Dict[str, Any]]: 动作序列 + """ + action_sequence = [] + + # 固定参数 + target_vessel = "main_reactor" # 默认目标容器 + volume = 100.0 # 默认体积 100 mL + + print(f"RESET_HANDLING: 开始生成重置处理协议") + print(f" - 溶剂: {solvent}") + print(f" - 目标容器: {target_vessel}") + print(f" - 体积: {volume} mL") + + # 1. 验证目标容器存在 + if target_vessel not in G.nodes(): + raise ValueError(f"目标容器 '{target_vessel}' 不存在于系统中") + + # 2. 查找溶剂容器 + try: + solvent_vessel = find_solvent_vessel(G, solvent) + print(f"RESET_HANDLING: 找到溶剂容器: {solvent_vessel}") + except ValueError as e: + raise ValueError(f"无法找到溶剂 '{solvent}': {str(e)}") + + # 3. 验证路径存在 + try: + path = nx.shortest_path(G, source=solvent_vessel, target=target_vessel) + print(f"RESET_HANDLING: 找到路径: {' → '.join(path)}") + except nx.NetworkXNoPath: + raise ValueError(f"从溶剂容器 '{solvent_vessel}' 到目标容器 '{target_vessel}' 没有可用路径") + + # 4. 使用pump_protocol转移溶剂 + print(f"RESET_HANDLING: 开始转移溶剂 {volume} mL") + + try: + pump_actions = generate_pump_protocol_with_rinsing( + G=G, + from_vessel=solvent_vessel, + to_vessel=target_vessel, + volume=volume, + amount="", + time=0.0, + viscous=False, + rinsing_solvent="", # 重置处理不需要清洗 + rinsing_volume=0.0, + rinsing_repeats=0, + solid=False, + flowrate=2.5, # 正常流速 + transfer_flowrate=0.5 # 正常转移流速 + ) + + action_sequence.extend(pump_actions) + + except Exception as e: + raise ValueError(f"生成泵协议时出错: {str(e)}") + + # 5. 等待溶剂稳定 + action_sequence.append({ + "action_name": "wait", + "action_kwargs": { + "time": 10.0, + "description": f"等待溶剂 {solvent} 稳定" + } + }) + + print(f"RESET_HANDLING: 协议生成完成,共 {len(action_sequence)} 个动作") + print(f"RESET_HANDLING: 已添加 {volume} mL {solvent} 到 {target_vessel}") + + return action_sequence + + +# 测试函数 +def test_reset_handling_protocol(): + """测试重置处理协议""" + print("=== RESET HANDLING PROTOCOL 测试 ===") + print("测试完成") + + +if __name__ == "__main__": + test_reset_handling_protocol() \ No newline at end of file diff --git a/unilabos/messages/__init__.py b/unilabos/messages/__init__.py index 16947e6..47f21f1 100644 --- a/unilabos/messages/__init__.py +++ b/unilabos/messages/__init__.py @@ -178,6 +178,31 @@ class WashSolidProtocol(BaseModel): time: float = 0.0 repeats: int = 1 +class AdjustPHProtocol(BaseModel): + vessel: str = Field(..., description="目标容器") + ph_value: float = Field(..., description="目标pH值") # 改为 ph_value + reagent: str = Field(..., description="酸碱试剂名称") + # 移除其他可选参数,使用默认值 + +class ResetHandlingProtocol(BaseModel): + solvent: str = Field(..., description="溶剂名称") + +class DryProtocol(BaseModel): + compound: str = Field(..., description="化合物名称") + vessel: str = Field(..., description="目标容器") + +class RecrystallizeProtocol(BaseModel): + ratio: str = Field(..., description="溶剂比例(如 '1:1', '3:7')") + solvent1: str = Field(..., description="第一种溶剂名称") + solvent2: str = Field(..., description="第二种溶剂名称") + vessel: str = Field(..., description="目标容器") + volume: float = Field(..., description="总体积 (mL)") + +class HydrogenateProtocol(BaseModel): + temp: str = Field(..., description="反应温度(如 '45 °C')") + time: str = Field(..., description="反应时间(如 '2 h')") + vessel: str = Field(..., description="反应容器") + __all__ = [ "Point3D", "PumpTransferProtocol", "CleanProtocol", "SeparateProtocol", "EvaporateProtocol", "EvacuateAndRefillProtocol", "AGVTransferProtocol", @@ -185,6 +210,8 @@ __all__ = [ "HeatChillProtocol", "HeatChillStartProtocol", "HeatChillStopProtocol", "StirProtocol", "StartStirProtocol", "StopStirProtocol", "TransferProtocol", "CleanVesselProtocol", "DissolveProtocol", - "FilterThroughProtocol", "RunColumnProtocol", "WashSolidProtocol" + "FilterThroughProtocol", "RunColumnProtocol", "WashSolidProtocol", + "AdjustPHProtocol", "ResetHandlingProtocol", "DryProtocol", + "RecrystallizeProtocol", "HydrogenateProtocol" ] # End Protocols diff --git a/unilabos_msgs/CMakeLists.txt b/unilabos_msgs/CMakeLists.txt index db64116..7e8a146 100644 --- a/unilabos_msgs/CMakeLists.txt +++ b/unilabos_msgs/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.5) +cmake_minimum_required(VERSION 3.16) project(unilabos_msgs) # Default to C99 @@ -28,7 +28,11 @@ set(action_files "action/HeatChill.action" "action/HeatChillStart.action" "action/HeatChillStop.action" - + "action/AdjustPH.action" + "action/ResetHandling.action" + "action/Dry.action" + "action/Hydrogenate.action" + "action/Recrystallize.action" "action/CleanVessel.action" "action/Dissolve.action" "action/FilterThrough.action" @@ -39,7 +43,6 @@ set(action_files "action/Add.action" "action/Centrifuge.action" "action/Crystallize.action" - "action/Dry.action" "action/Purge.action" "action/StartPurge.action" "action/StartStir.action" diff --git a/unilabos_msgs/action/AdjustPH.action b/unilabos_msgs/action/AdjustPH.action new file mode 100644 index 0000000..815ccf7 --- /dev/null +++ b/unilabos_msgs/action/AdjustPH.action @@ -0,0 +1,13 @@ +# Request - 与您的 AdjustPHProtocol 类匹配 +string vessel +float64 ph_value +string reagent +--- +# Result - 标准结果格式 +bool success +string message +string return_info +--- +# Feedback - 标准反馈格式 +string status +float64 progress \ No newline at end of file diff --git a/unilabos_msgs/action/Dry.action b/unilabos_msgs/action/Dry.action index 5692ef2..ec10c9a 100644 --- a/unilabos_msgs/action/Dry.action +++ b/unilabos_msgs/action/Dry.action @@ -1,17 +1,12 @@ -# Goal - 干燥操作的目标参数 -string vessel # 干燥容器 -float64 time # 干燥时间 (可选,秒) -float64 pressure # 压力 (可选,Pa) -float64 temp # 温度 (可选,摄氏度) -bool continue_heatchill # 是否继续加热冷却 +# Request +string compound # 化合物 +string vessel # 干燥容器 --- -# Result - 操作结果 +# Result bool success # 操作是否成功 string message # 结果消息 string return_info --- -# Feedback - 实时反馈 -float64 progress # 进度百分比 (0-100) -float64 current_temp # 当前温度 -float64 current_pressure # 当前压力 -string current_status # 当前状态描述 \ No newline at end of file +# Feedback +string status # 当前状态描述 +float64 progress # 进度百分比 (0-100) \ No newline at end of file diff --git a/unilabos_msgs/action/Hydrogenate.action b/unilabos_msgs/action/Hydrogenate.action new file mode 100644 index 0000000..72f9459 --- /dev/null +++ b/unilabos_msgs/action/Hydrogenate.action @@ -0,0 +1,13 @@ +# Request +string temp +string time +string vessel +--- +# Result +bool success +string message +string return_info +--- +# Feedback +string status +float64 progress \ No newline at end of file diff --git a/unilabos_msgs/action/Recrystallize.action b/unilabos_msgs/action/Recrystallize.action new file mode 100644 index 0000000..fe727e8 --- /dev/null +++ b/unilabos_msgs/action/Recrystallize.action @@ -0,0 +1,15 @@ +# Request +string ratio +string solvent1 +string solvent2 +string vessel +float64 volume +--- +# Result +bool success +string message +string return_info +--- +# Feedback +string status +float64 progress \ No newline at end of file diff --git a/unilabos_msgs/action/ResetHandling.action b/unilabos_msgs/action/ResetHandling.action new file mode 100644 index 0000000..d07f240 --- /dev/null +++ b/unilabos_msgs/action/ResetHandling.action @@ -0,0 +1,11 @@ +# Request +string solvent +--- +# Result +bool success +string message +string return_info +--- +# Feedback +string status +float64 progress \ No newline at end of file From a6ec20e279720c8928b5ae64e3c2d99a6ad24ebe Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Sat, 5 Jul 2025 12:43:27 +0800 Subject: [PATCH 17/96] =?UTF-8?q?=E8=BD=AC=E6=8D=A2=E5=88=B0ros=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E6=97=B6=EF=BC=8C=E8=A6=81=E8=BF=9B=E8=A1=8C=E5=9F=BA?= =?UTF-8?q?=E7=A1=80=E7=B1=BB=E5=9E=8B=E8=BD=AC=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- unilabos/ros/msgs/message_converter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unilabos/ros/msgs/message_converter.py b/unilabos/ros/msgs/message_converter.py index 940c481..f0e9468 100644 --- a/unilabos/ros/msgs/message_converter.py +++ b/unilabos/ros/msgs/message_converter.py @@ -343,7 +343,7 @@ def convert_to_ros_msg(ros_msg_type: Union[Type, Any], obj: Any) -> Any: if hasattr(ros_msg, key): attr = getattr(ros_msg, key) if isinstance(attr, (float, int, str, bool)): - setattr(ros_msg, key, value) + setattr(ros_msg, key, type(attr)(value)) elif isinstance(attr, (list, tuple)) and isinstance(value, Iterable): td = ros_msg.SLOT_TYPES[ind].value_type if isinstance(td, NamespacedType): From c8c755057cc31106dffa8eaa3114cac212cb8f09 Mon Sep 17 00:00:00 2001 From: Kongchang Feng <2100011801@stu.pku.edu.cn> Date: Sat, 5 Jul 2025 15:13:14 +0800 Subject: [PATCH 18/96] Update work_station.yaml (#60) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update work_station.yaml * Checklist里面有XDL跟protocol之间没对齐的问题,工作量有点大找时间写完 --- .../comprehensive_protocol/checklist.md | 181 ++++++++- unilabos/registry/devices/work_station.yaml | 375 ++++++++++++++++++ 2 files changed, 555 insertions(+), 1 deletion(-) diff --git a/test/experiments/comprehensive_protocol/checklist.md b/test/experiments/comprehensive_protocol/checklist.md index ce6de37..5bb14ae 100644 --- a/test/experiments/comprehensive_protocol/checklist.md +++ b/test/experiments/comprehensive_protocol/checklist.md @@ -40,4 +40,183 @@ AdjustPH 写完了 Recrystallize 写完了 TakeSample - Hydrogenate \ No newline at end of file + Hydrogenate +4. 参数对齐 + +class PumpTransferProtocol(BaseModel): + from_vessel: str + to_vessel: str + volume: float + amount: str = "" + time: float = 0 + viscous: bool = False + rinsing_solvent: str = "air" + rinsing_volume: float = 5000 + rinsing_repeats: int = 2 + solid: bool = False + flowrate: float = 500 + transfer_flowrate: float = 2500 + +class SeparateProtocol(BaseModel): + purpose: str + product_phase: str + from_vessel: str + separation_vessel: str + to_vessel: str + waste_phase_to_vessel: str + solvent: str + solvent_volume: float + through: str + repeats: int + stir_time: float + stir_speed: float + settling_time: float + + +class EvaporateProtocol(BaseModel): + vessel: str + pressure: float + temp: float + time: float + stir_speed: float + + +class EvacuateAndRefillProtocol(BaseModel): + vessel: str + gas: str + repeats: int + +class AddProtocol(BaseModel): + vessel: str + reagent: str + volume: float + mass: float + amount: str + time: float + stir: bool + stir_speed: float + viscous: bool + purpose: str + +class CentrifugeProtocol(BaseModel): + vessel: str + speed: float + time: float 自创的 + temp: float + +class FilterProtocol(BaseModel): + vessel: str + filtrate_vessel: str + stir: bool + stir_speed: float + temp: float + continue_heatchill: bool + volume: float + +class HeatChillProtocol(BaseModel): + vessel: str + temp: float + time: float + + stir: bool + stir_speed: float + purpose: str + +class HeatChillStartProtocol(BaseModel): + vessel: str + temp: float 疑似没有 + purpose: str + +class HeatChillStopProtocol(BaseModel): + vessel: str 疑似没有 + +class StirProtocol(BaseModel): + stir_time: float + stir_speed: float + settling_time: float + +class StartStirProtocol(BaseModel): + vessel: str + stir_speed: float 疑似没有 + purpose: str + +class StopStirProtocol(BaseModel): + vessel: str 疑似没有 + +class TransferProtocol(BaseModel): + from_vessel: str + to_vessel: str + volume: float + amount: str = "" + time: float = 0 + viscous: bool = False + rinsing_solvent: str = "" + rinsing_volume: float = 0.0 + rinsing_repeats: int = 0 + solid: bool = False + +class CleanVesselProtocol(BaseModel): + vessel: str + solvent: str + volume: float + temp: float + repeats: int = 1 + +class DissolveProtocol(BaseModel): + vessel: str + solvent: str + volume: float + amount: str = "" + temp: float = 25.0 + time: float = 0.0 + stir_speed: float = 0.0 + +class FilterThroughProtocol(BaseModel): + from_vessel: str + to_vessel: str + filter_through: str + eluting_solvent: str = "" + eluting_volume: float = 0.0 疑似没有 + eluting_repeats: int = 0 + residence_time: float = 0.0 + +class RunColumnProtocol(BaseModel): + from_vessel: str + to_vessel: str + column: str + +class WashSolidProtocol(BaseModel): + vessel: str + solvent: str + volume: float + filtrate_vessel: str = "" + temp: float = 25.0 + stir: bool = False + stir_speed: float = 0.0 + time: float = 0.0 + repeats: int = 1 + +class AdjustPHProtocol(BaseModel): + vessel: str = Field(..., description="目标容器") + ph_value: float = Field(..., description="目标pH值") # 改为 ph_value + reagent: str = Field(..., description="酸碱试剂名称") + # 移除其他可选参数,使用默认值 <新写的,没问题> + +class ResetHandlingProtocol(BaseModel): + solvent: str = Field(..., description="溶剂名称") <新写的,没问题> + +class DryProtocol(BaseModel): + compound: str = Field(..., description="化合物名称") <新写的,没问题> + vessel: str = Field(..., description="目标容器") + +class RecrystallizeProtocol(BaseModel): + ratio: str = Field(..., description="溶剂比例(如 '1:1', '3:7')") + solvent1: str = Field(..., description="第一种溶剂名称") <新写的,没问题> + solvent2: str = Field(..., description="第二种溶剂名称") + vessel: str = Field(..., description="目标容器") + volume: float = Field(..., description="总体积 (mL)") + +class HydrogenateProtocol(BaseModel): + temp: str = Field(..., description="反应温度(如 '45 °C')") + time: str = Field(..., description="反应时间(如 '2 h')") <新写的,没问题> + vessel: str = Field(..., description="反应容器") \ No newline at end of file diff --git a/unilabos/registry/devices/work_station.yaml b/unilabos/registry/devices/work_station.yaml index 1df4382..5941645 100644 --- a/unilabos/registry/devices/work_station.yaml +++ b/unilabos/registry/devices/work_station.yaml @@ -2355,6 +2355,381 @@ workstation: title: initialize_device参数 type: object type: UniLabJsonCommand + AdjustPHProtocol: + feedback: {} + goal: + vessel: vessel + ph_value: ph_value + reagent: reagent + goal_default: + vessel: '' + ph_value: 7.0 + reagent: '' + handles: + input: + - data_key: vessel + data_source: handle + data_type: resource + handler_key: Vessel + label: Vessel + - data_key: reagent + data_source: handle + data_type: resource + handler_key: reagent + label: Reagent + output: + - data_key: vessel + data_source: executor + data_type: resource + handler_key: VesselOut + label: Vessel + result: {} + schema: + description: ROS Action AdjustPH 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + progress: + type: number + required: + - status + - progress + title: AdjustPH_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + vessel: + type: string + ph_value: + type: number + reagent: + type: string + required: + - vessel + - ph_value + - reagent + title: AdjustPH_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: AdjustPH_Result + type: object + required: + - goal + title: AdjustPH + type: object + type: AdjustPH + ResetHandlingProtocol: + feedback: {} + goal: + solvent: solvent + goal_default: + solvent: '' + handles: + input: + - data_key: solvent + data_source: handle + data_type: resource + handler_key: solvent + label: Solvent + output: [] + result: {} + schema: + description: ROS Action ResetHandling 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + progress: + type: number + required: + - status + - progress + title: ResetHandling_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + solvent: + type: string + required: + - solvent + title: ResetHandling_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: ResetHandling_Result + type: object + required: + - goal + title: ResetHandling + type: object + type: ResetHandling + DryProtocol: + feedback: {} + goal: + compound: compound + vessel: vessel + goal_default: + compound: '' + vessel: '' + handles: + input: + - data_key: vessel + data_source: handle + data_type: resource + handler_key: Vessel + label: Vessel + output: + - data_key: vessel + data_source: executor + data_type: resource + handler_key: VesselOut + label: Vessel + result: {} + schema: + description: ROS Action Dry 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + progress: + type: number + required: + - status + - progress + title: Dry_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + compound: + type: string + vessel: + type: string + required: + - compound + - vessel + title: Dry_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: Dry_Result + type: object + required: + - goal + title: Dry + type: object + type: Dry + HydrogenateProtocol: + feedback: {} + goal: + temp: temp + time: time + vessel: vessel + goal_default: + temp: '' + time: '' + vessel: '' + handles: + input: + - data_key: vessel + data_source: handle + data_type: resource + handler_key: Vessel + label: Vessel + output: + - data_key: vessel + data_source: executor + data_type: resource + handler_key: VesselOut + label: Vessel + result: {} + schema: + description: ROS Action Hydrogenate 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + progress: + type: number + required: + - status + - progress + title: Hydrogenate_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + temp: + type: string + time: + type: string + vessel: + type: string + required: + - temp + - time + - vessel + title: Hydrogenate_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: Hydrogenate_Result + type: object + required: + - goal + title: Hydrogenate + type: object + type: Hydrogenate + RecrystallizeProtocol: + feedback: {} + goal: + ratio: ratio + solvent1: solvent1 + solvent2: solvent2 + vessel: vessel + volume: volume + goal_default: + ratio: '' + solvent1: '' + solvent2: '' + vessel: '' + volume: 0.0 + handles: + input: + - data_key: vessel + data_source: handle + data_type: resource + handler_key: Vessel + label: Vessel + - data_key: solvent + data_source: handle + data_type: resource + handler_key: solvent1 + label: Solvent 1 + - data_key: solvent + data_source: handle + data_type: resource + handler_key: solvent2 + label: Solvent 2 + output: + - data_key: vessel + data_source: executor + data_type: resource + handler_key: VesselOut + label: Vessel + result: {} + schema: + description: ROS Action Recrystallize 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + status: + type: string + progress: + type: number + required: + - status + - progress + title: Recrystallize_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + ratio: + type: string + solvent1: + type: string + solvent2: + type: string + vessel: + type: string + volume: + type: number + required: + - ratio + - solvent1 + - solvent2 + - vessel + - volume + title: Recrystallize_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: Recrystallize_Result + type: object + required: + - goal + title: Recrystallize + type: object + type: Recrystallize module: unilabos.ros.nodes.presets.protocol_node:ROS2ProtocolNode status_types: {} type: ros2 From 0d512c9e3866f5d8ce77009084d9948996148b6f Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Sat, 5 Jul 2025 17:16:59 +0800 Subject: [PATCH 19/96] Create prcxi.py --- .../devices/liquid_handling/prcxi/prcxi.py | 169 ++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 unilabos/devices/liquid_handling/prcxi/prcxi.py diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py new file mode 100644 index 0000000..9df0b78 --- /dev/null +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -0,0 +1,169 @@ +import socket, json, contextlib +from typing import Any, List, Dict, Optional + + +class PRCXIError(RuntimeError): + """Lilith 返回 Success=false 时抛出的业务异常""" + + +class PRCXI9300: + + def __init__(self, host: str = "127.0.0.1", port: int = 9999, + timeout: float = 10.0) -> None: + self.host, self.port, self.timeout = host, port, timeout + + + @staticmethod + def _len_prefix(n: int) -> bytes: + return bytes.fromhex(format(n, "016x")) + + def _raw_request(self, payload: str) -> str: + with contextlib.closing(socket.socket()) as sock: + sock.settimeout(self.timeout) + sock.connect((self.host, self.port)) + data = payload.encode() + sock.sendall(self._len_prefix(len(data)) + data) + + chunks, first = [], True + while True: + chunk = sock.recv(4096) + if not chunk: + break + if first: + chunk, first = chunk[8:], False + chunks.append(chunk) + return b"".join(chunks).decode() + + def _call(self, service: str, method: str, + params: Optional[list] = None) -> Any: + payload = json.dumps( + {"ServiceName": service, + "MethodName": method, + "Paramters": params or []}, + separators=(",", ":") + ) + resp = json.loads(self._raw_request(payload)) + if not resp.get("Success", False): + raise PRCXIError(resp.get("Msg", "Unknown error")) + data = resp.get("Data") + try: + return json.loads(data) + except (TypeError, json.JSONDecodeError): + return data + + # ---------------------------------------------------- 方案相关(ISolution) + def list_solutions(self) -> List[Dict[str, Any]]: + """GetSolutionList""" + return self._call("ISolution", "GetSolutionList") + + def load_solution(self, solution_id: str) -> bool: + """LoadSolution""" + return self._call("ISolution", "LoadSolution", [solution_id]) + + def add_solution(self, name: str, matrix_id: str, + steps: List[Dict[str, Any]]) -> str: + """AddSolution → 返回新方案 GUID""" + return self._call("ISolution", "AddSolution", + [name, matrix_id, steps]) + + # ---------------------------------------------------- 自动化控制(IAutomation) + def start(self) -> bool: + return self._call("IAutomation", "Start") + + def stop(self) -> bool: + """Stop""" + return self._call("IAutomation", "Stop") + + def reset(self) -> bool: + """Reset""" + return self._call("IAutomation", "Reset") + + def pause(self) -> bool: + """Pause""" + return self._call("IAutomation", "Pause") + + def resume(self) -> bool: + """Resume""" + return self._call("IAutomation", "Resume") + + def get_error_code(self) -> Optional[str]: + """GetErrorCode""" + return self._call("IAutomation", "GetErrorCode") + + def clear_error_code(self) -> bool: + """RemoveErrorCodet""" + return self._call("IAutomation", "RemoveErrorCodet") + + # ---------------------------------------------------- 运行状态(IMachineState) + def step_state_list(self) -> List[Dict[str, Any]]: + """GetStepStateList""" + return self._call("IMachineState", "GetStepStateList") + + def step_status(self, seq_num: int) -> Dict[str, Any]: + """GetStepStatus""" + return self._call("IMachineState", "GetStepStatus", [seq_num]) + + def step_state(self, seq_num: int) -> Dict[str, Any]: + """GetStepState""" + return self._call("IMachineState", "GetStepState", [seq_num]) + + def axis_location(self, axis_num: int = 1) -> Dict[str, Any]: + """GetLocation""" + return self._call("IMachineState", "GetLocation", [axis_num]) + + # ---------------------------------------------------- 版位矩阵(IMatrix) + def list_matrices(self) -> List[Dict[str, Any]]: + """GetWorkTabletMatrices""" + return self._call("IMatrix", "GetWorkTabletMatrices") + + def matrix_by_id(self, matrix_id: str) -> Dict[str, Any]: + """GetWorkTabletMatrixById""" + return self._call("IMatrix", "GetWorkTabletMatrixById", [matrix_id]) + + def add_WorkTablet_Matrix(self,matrix): + return self._call("IMatrix", "AddWorkTabletMatrix", [matrix]) + + # ---------------------------------------------------- 一键运行 + def run_solution(self, solution_id: str, channel_idx: int = 1) -> None: + self.load_solution(solution_id) + self.start(channel_idx) + +# ---------------------------------------------------- 辅助类 StepData 工具 +def build_step( + axis: str, + function: str, + dosage: int, + plate_no: int, + is_whole_plate: bool, + hole_row: int, + hole_col: int, + blending_times: int, + balance_height: int, + plate_or_hole: str, + hole_numbers: str, + assist_fun1: str = "", + assist_fun2: str = "", + assist_fun3: str = "", + assist_fun4: str = "", + assist_fun5: str = "", + liquid_method: str = "NormalDispense" +) -> Dict[str, Any]: + return { + "StepAxis": axis, + "Function": function, + "DosageNum": dosage, + "PlateNo": plate_no, + "IsWholePlate": is_whole_plate, + "HoleRow": hole_row, + "HoleCol": hole_col, + "BlendingTimes": blending_times, + "BalanceHeight": balance_height, + "PlateOrHoleNum": plate_or_hole, + "AssistFun1": assist_fun1, + "AssistFun2": assist_fun2, + "AssistFun3": assist_fun3, + "AssistFun4": assist_fun4, + "AssistFun5": assist_fun5, + "HoleNumbers": hole_numbers, + "LiquidDispensingMethod": liquid_method + } From b78c6c6ba97fbb057f0aa6b19cadf1aef8408baf Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Sat, 5 Jul 2025 18:02:58 +0800 Subject: [PATCH 20/96] Update prcxi.py --- .../devices/liquid_handling/prcxi/prcxi.py | 165 +++++++++++++++++- 1 file changed, 161 insertions(+), 4 deletions(-) diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index 9df0b78..8196bde 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -128,10 +128,10 @@ class PRCXI9300: self.load_solution(solution_id) self.start(channel_idx) -# ---------------------------------------------------- 辅助类 StepData 工具 -def build_step( +# ---------------------------------------------------- 单点动作 + +def Load( axis: str, - function: str, dosage: int, plate_no: int, is_whole_plate: bool, @@ -150,7 +150,164 @@ def build_step( ) -> Dict[str, Any]: return { "StepAxis": axis, - "Function": function, + "Function": "Load", + "DosageNum": dosage, + "PlateNo": plate_no, + "IsWholePlate": is_whole_plate, + "HoleRow": hole_row, + "HoleCol": hole_col, + "BlendingTimes": blending_times, + "BalanceHeight": balance_height, + "PlateOrHoleNum": plate_or_hole, + "AssistFun1": assist_fun1, + "AssistFun2": assist_fun2, + "AssistFun3": assist_fun3, + "AssistFun4": assist_fun4, + "AssistFun5": assist_fun5, + "HoleNumbers": hole_numbers, + "LiquidDispensingMethod": liquid_method + } + + + + +def Imbibing( + axis: str, + dosage: int, + plate_no: int, + is_whole_plate: bool, + hole_row: int, + hole_col: int, + blending_times: int, + balance_height: int, + plate_or_hole: str, + hole_numbers: str, + assist_fun1: str = "", + assist_fun2: str = "", + assist_fun3: str = "", + assist_fun4: str = "", + assist_fun5: str = "", + liquid_method: str = "NormalDispense" +) -> Dict[str, Any]: + return { + "StepAxis": axis, + "Function": "Imbibing", + "DosageNum": dosage, + "PlateNo": plate_no, + "IsWholePlate": is_whole_plate, + "HoleRow": hole_row, + "HoleCol": hole_col, + "BlendingTimes": blending_times, + "BalanceHeight": balance_height, + "PlateOrHoleNum": plate_or_hole, + "AssistFun1": assist_fun1, + "AssistFun2": assist_fun2, + "AssistFun3": assist_fun3, + "AssistFun4": assist_fun4, + "AssistFun5": assist_fun5, + "HoleNumbers": hole_numbers, + "LiquidDispensingMethod": liquid_method + } + + +def Tapping( + axis: str, + dosage: int, + plate_no: int, + is_whole_plate: bool, + hole_row: int, + hole_col: int, + blending_times: int, + balance_height: int, + plate_or_hole: str, + hole_numbers: str, + assist_fun1: str = "", + assist_fun2: str = "", + assist_fun3: str = "", + assist_fun4: str = "", + assist_fun5: str = "", + liquid_method: str = "NormalDispense" +) -> Dict[str, Any]: + return { + "StepAxis": axis, + "Function": "Tapping", + "DosageNum": dosage, + "PlateNo": plate_no, + "IsWholePlate": is_whole_plate, + "HoleRow": hole_row, + "HoleCol": hole_col, + "BlendingTimes": blending_times, + "BalanceHeight": balance_height, + "PlateOrHoleNum": plate_or_hole, + "AssistFun1": assist_fun1, + "AssistFun2": assist_fun2, + "AssistFun3": assist_fun3, + "AssistFun4": assist_fun4, + "AssistFun5": assist_fun5, + "HoleNumbers": hole_numbers, + "LiquidDispensingMethod": liquid_method + } + + +def Blending( + axis: str, + dosage: int, + plate_no: int, + is_whole_plate: bool, + hole_row: int, + hole_col: int, + blending_times: int, + balance_height: int, + plate_or_hole: str, + hole_numbers: str, + assist_fun1: str = "", + assist_fun2: str = "", + assist_fun3: str = "", + assist_fun4: str = "", + assist_fun5: str = "", + liquid_method: str = "NormalDispense" +) -> Dict[str, Any]: + return { + "StepAxis": axis, + "Function": "Blending", + "DosageNum": dosage, + "PlateNo": plate_no, + "IsWholePlate": is_whole_plate, + "HoleRow": hole_row, + "HoleCol": hole_col, + "BlendingTimes": blending_times, + "BalanceHeight": balance_height, + "PlateOrHoleNum": plate_or_hole, + "AssistFun1": assist_fun1, + "AssistFun2": assist_fun2, + "AssistFun3": assist_fun3, + "AssistFun4": assist_fun4, + "AssistFun5": assist_fun5, + "HoleNumbers": hole_numbers, + "LiquidDispensingMethod": liquid_method + } + +def UnLoad( + axis: str, + dosage: int, + plate_no: int, + is_whole_plate: bool, + hole_row: int, + hole_col: int, + blending_times: int, + balance_height: int, + plate_or_hole: str, + hole_numbers: str, + assist_fun1: str = "", + assist_fun2: str = "", + assist_fun3: str = "", + assist_fun4: str = "", + assist_fun5: str = "", + liquid_method: str = "NormalDispense" +) -> Dict[str, Any]: + return { + "StepAxis": axis, + "Function": "UnLoad", "DosageNum": dosage, "PlateNo": plate_no, "IsWholePlate": is_whole_plate, From bef44b2293280cbde5721335fcddd7329fa9effb Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Sat, 5 Jul 2025 22:03:49 +0800 Subject: [PATCH 21/96] Update Prcxi --- .../devices/liquid_handling/prcxi/prcxi.py | 380 +++++++++--------- 1 file changed, 191 insertions(+), 189 deletions(-) diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index 8196bde..0093c0f 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -130,197 +130,199 @@ class PRCXI9300: # ---------------------------------------------------- 单点动作 -def Load( - axis: str, - dosage: int, - plate_no: int, - is_whole_plate: bool, - hole_row: int, - hole_col: int, - blending_times: int, - balance_height: int, - plate_or_hole: str, - hole_numbers: str, - assist_fun1: str = "", - assist_fun2: str = "", - assist_fun3: str = "", - assist_fun4: str = "", - assist_fun5: str = "", - liquid_method: str = "NormalDispense" -) -> Dict[str, Any]: - return { - "StepAxis": axis, - "Function": "Load", - "DosageNum": dosage, - "PlateNo": plate_no, - "IsWholePlate": is_whole_plate, - "HoleRow": hole_row, - "HoleCol": hole_col, - "BlendingTimes": blending_times, - "BalanceHeight": balance_height, - "PlateOrHoleNum": plate_or_hole, - "AssistFun1": assist_fun1, - "AssistFun2": assist_fun2, - "AssistFun3": assist_fun3, - "AssistFun4": assist_fun4, - "AssistFun5": assist_fun5, - "HoleNumbers": hole_numbers, - "LiquidDispensingMethod": liquid_method - } + def Load( + self, + axis: str, + dosage: int, + plate_no: int, + is_whole_plate: bool, + hole_row: int, + hole_col: int, + blending_times: int, + balance_height: int, + plate_or_hole: str, + hole_numbers: str, + assist_fun1: str = "", + assist_fun2: str = "", + assist_fun3: str = "", + assist_fun4: str = "", + assist_fun5: str = "", + liquid_method: str = "NormalDispense" + ) -> Dict[str, Any]: + return { + "StepAxis": axis, + "Function": "Load", + "DosageNum": dosage, + "PlateNo": plate_no, + "IsWholePlate": is_whole_plate, + "HoleRow": hole_row, + "HoleCol": hole_col, + "BlendingTimes": blending_times, + "BalanceHeight": balance_height, + "PlateOrHoleNum": plate_or_hole, + "AssistFun1": assist_fun1, + "AssistFun2": assist_fun2, + "AssistFun3": assist_fun3, + "AssistFun4": assist_fun4, + "AssistFun5": assist_fun5, + "HoleNumbers": hole_numbers, + "LiquidDispensingMethod": liquid_method + } + + def Imbibing( + self, + axis: str, + dosage: int, + plate_no: int, + is_whole_plate: bool, + hole_row: int, + hole_col: int, + blending_times: int, + balance_height: int, + plate_or_hole: str, + hole_numbers: str, + assist_fun1: str = "", + assist_fun2: str = "", + assist_fun3: str = "", + assist_fun4: str = "", + assist_fun5: str = "", + liquid_method: str = "NormalDispense" + ) -> Dict[str, Any]: + return { + "StepAxis": axis, + "Function": "Imbibing", + "DosageNum": dosage, + "PlateNo": plate_no, + "IsWholePlate": is_whole_plate, + "HoleRow": hole_row, + "HoleCol": hole_col, + "BlendingTimes": blending_times, + "BalanceHeight": balance_height, + "PlateOrHoleNum": plate_or_hole, + "AssistFun1": assist_fun1, + "AssistFun2": assist_fun2, + "AssistFun3": assist_fun3, + "AssistFun4": assist_fun4, + "AssistFun5": assist_fun5, + "HoleNumbers": hole_numbers, + "LiquidDispensingMethod": liquid_method + } + def Tapping( + self, + axis: str, + dosage: int, + plate_no: int, + is_whole_plate: bool, + hole_row: int, + hole_col: int, + blending_times: int, + balance_height: int, + plate_or_hole: str, + hole_numbers: str, + assist_fun1: str = "", + assist_fun2: str = "", + assist_fun3: str = "", + assist_fun4: str = "", + assist_fun5: str = "", + liquid_method: str = "NormalDispense" + ) -> Dict[str, Any]: + return { + "StepAxis": axis, + "Function": "Tapping", + "DosageNum": dosage, + "PlateNo": plate_no, + "IsWholePlate": is_whole_plate, + "HoleRow": hole_row, + "HoleCol": hole_col, + "BlendingTimes": blending_times, + "BalanceHeight": balance_height, + "PlateOrHoleNum": plate_or_hole, + "AssistFun1": assist_fun1, + "AssistFun2": assist_fun2, + "AssistFun3": assist_fun3, + "AssistFun4": assist_fun4, + "AssistFun5": assist_fun5, + "HoleNumbers": hole_numbers, + "LiquidDispensingMethod": liquid_method + } -def Imbibing( - axis: str, - dosage: int, - plate_no: int, - is_whole_plate: bool, - hole_row: int, - hole_col: int, - blending_times: int, - balance_height: int, - plate_or_hole: str, - hole_numbers: str, - assist_fun1: str = "", - assist_fun2: str = "", - assist_fun3: str = "", - assist_fun4: str = "", - assist_fun5: str = "", - liquid_method: str = "NormalDispense" -) -> Dict[str, Any]: - return { - "StepAxis": axis, - "Function": "Imbibing", - "DosageNum": dosage, - "PlateNo": plate_no, - "IsWholePlate": is_whole_plate, - "HoleRow": hole_row, - "HoleCol": hole_col, - "BlendingTimes": blending_times, - "BalanceHeight": balance_height, - "PlateOrHoleNum": plate_or_hole, - "AssistFun1": assist_fun1, - "AssistFun2": assist_fun2, - "AssistFun3": assist_fun3, - "AssistFun4": assist_fun4, - "AssistFun5": assist_fun5, - "HoleNumbers": hole_numbers, - "LiquidDispensingMethod": liquid_method - } + def Blending( + self, + axis: str, + dosage: int, + plate_no: int, + is_whole_plate: bool, + hole_row: int, + hole_col: int, + blending_times: int, + balance_height: int, + plate_or_hole: str, + hole_numbers: str, + assist_fun1: str = "", + assist_fun2: str = "", + assist_fun3: str = "", + assist_fun4: str = "", + assist_fun5: str = "", + liquid_method: str = "NormalDispense" + ) -> Dict[str, Any]: + return { + "StepAxis": axis, + "Function": "Blending", + "DosageNum": dosage, + "PlateNo": plate_no, + "IsWholePlate": is_whole_plate, + "HoleRow": hole_row, + "HoleCol": hole_col, + "BlendingTimes": blending_times, + "BalanceHeight": balance_height, + "PlateOrHoleNum": plate_or_hole, + "AssistFun1": assist_fun1, + "AssistFun2": assist_fun2, + "AssistFun3": assist_fun3, + "AssistFun4": assist_fun4, + "AssistFun5": assist_fun5, + "HoleNumbers": hole_numbers, + "LiquidDispensingMethod": liquid_method + } - -def Tapping( - axis: str, - dosage: int, - plate_no: int, - is_whole_plate: bool, - hole_row: int, - hole_col: int, - blending_times: int, - balance_height: int, - plate_or_hole: str, - hole_numbers: str, - assist_fun1: str = "", - assist_fun2: str = "", - assist_fun3: str = "", - assist_fun4: str = "", - assist_fun5: str = "", - liquid_method: str = "NormalDispense" -) -> Dict[str, Any]: - return { - "StepAxis": axis, - "Function": "Tapping", - "DosageNum": dosage, - "PlateNo": plate_no, - "IsWholePlate": is_whole_plate, - "HoleRow": hole_row, - "HoleCol": hole_col, - "BlendingTimes": blending_times, - "BalanceHeight": balance_height, - "PlateOrHoleNum": plate_or_hole, - "AssistFun1": assist_fun1, - "AssistFun2": assist_fun2, - "AssistFun3": assist_fun3, - "AssistFun4": assist_fun4, - "AssistFun5": assist_fun5, - "HoleNumbers": hole_numbers, - "LiquidDispensingMethod": liquid_method - } - - -def Blending( - axis: str, - dosage: int, - plate_no: int, - is_whole_plate: bool, - hole_row: int, - hole_col: int, - blending_times: int, - balance_height: int, - plate_or_hole: str, - hole_numbers: str, - assist_fun1: str = "", - assist_fun2: str = "", - assist_fun3: str = "", - assist_fun4: str = "", - assist_fun5: str = "", - liquid_method: str = "NormalDispense" -) -> Dict[str, Any]: - return { - "StepAxis": axis, - "Function": "Blending", - "DosageNum": dosage, - "PlateNo": plate_no, - "IsWholePlate": is_whole_plate, - "HoleRow": hole_row, - "HoleCol": hole_col, - "BlendingTimes": blending_times, - "BalanceHeight": balance_height, - "PlateOrHoleNum": plate_or_hole, - "AssistFun1": assist_fun1, - "AssistFun2": assist_fun2, - "AssistFun3": assist_fun3, - "AssistFun4": assist_fun4, - "AssistFun5": assist_fun5, - "HoleNumbers": hole_numbers, - "LiquidDispensingMethod": liquid_method - } - -def UnLoad( - axis: str, - dosage: int, - plate_no: int, - is_whole_plate: bool, - hole_row: int, - hole_col: int, - blending_times: int, - balance_height: int, - plate_or_hole: str, - hole_numbers: str, - assist_fun1: str = "", - assist_fun2: str = "", - assist_fun3: str = "", - assist_fun4: str = "", - assist_fun5: str = "", - liquid_method: str = "NormalDispense" -) -> Dict[str, Any]: - return { - "StepAxis": axis, - "Function": "UnLoad", - "DosageNum": dosage, - "PlateNo": plate_no, - "IsWholePlate": is_whole_plate, - "HoleRow": hole_row, - "HoleCol": hole_col, - "BlendingTimes": blending_times, - "BalanceHeight": balance_height, - "PlateOrHoleNum": plate_or_hole, - "AssistFun1": assist_fun1, - "AssistFun2": assist_fun2, - "AssistFun3": assist_fun3, - "AssistFun4": assist_fun4, - "AssistFun5": assist_fun5, - "HoleNumbers": hole_numbers, - "LiquidDispensingMethod": liquid_method - } + def UnLoad( + self, + axis: str, + dosage: int, + plate_no: int, + is_whole_plate: bool, + hole_row: int, + hole_col: int, + blending_times: int, + balance_height: int, + plate_or_hole: str, + hole_numbers: str, + assist_fun1: str = "", + assist_fun2: str = "", + assist_fun3: str = "", + assist_fun4: str = "", + assist_fun5: str = "", + liquid_method: str = "NormalDispense" + ) -> Dict[str, Any]: + return { + "StepAxis": axis, + "Function": "UnLoad", + "DosageNum": dosage, + "PlateNo": plate_no, + "IsWholePlate": is_whole_plate, + "HoleRow": hole_row, + "HoleCol": hole_col, + "BlendingTimes": blending_times, + "BalanceHeight": balance_height, + "PlateOrHoleNum": plate_or_hole, + "AssistFun1": assist_fun1, + "AssistFun2": assist_fun2, + "AssistFun3": assist_fun3, + "AssistFun4": assist_fun4, + "AssistFun5": assist_fun5, + "HoleNumbers": hole_numbers, + "LiquidDispensingMethod": liquid_method + } From ce8667f937f1aa275902ae1e5a9e6cd5c8d2c91f Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Sun, 6 Jul 2025 18:39:40 +0800 Subject: [PATCH 22/96] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=B8=AD=E6=9E=90?= =?UTF-8?q?=E4=BB=AA=E5=99=A8=EF=BC=8C=E4=BB=A5=E5=8F=8A=E5=90=AF=E5=8A=A8?= =?UTF-8?q?=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/experiments/prcxi.json | 190 +++++ .../liquid_handler_abstract.py | 2 +- .../devices/liquid_handling/prcxi/prcxi.py | 566 +++++++++++-- unilabos/registry/devices/liquid_handler.yaml | 510 ++++++++++++ unilabos/registry/devices/work_station.yaml | 750 +++++++++--------- unilabos/ros/nodes/base_device_node.py | 7 + unilabos/ros/utils/driver_creator.py | 6 +- 7 files changed, 1577 insertions(+), 454 deletions(-) create mode 100644 test/experiments/prcxi.json diff --git a/test/experiments/prcxi.json b/test/experiments/prcxi.json new file mode 100644 index 0000000..72ea23b --- /dev/null +++ b/test/experiments/prcxi.json @@ -0,0 +1,190 @@ +{ + "nodes": [ + { + "id": "PLR_STATION_PRCXI", + "name": "PLR_LH_TEST", + "parent": null, + "type": "device", + "class": "liquid_handler.prcxi", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "deck": { + "_resource_child_name": "deck", + "_resource_type": "unilabos.devices.liquid_handling.prcxi.prcxi:PRCXI9300Deck" + }, + "host": "127.0.0.1", + "port": 9999, + "timeout": 10.0, + "setup": false + }, + "data": {}, + "children": [ + "deck" + ] + }, + { + "id": "deck", + "name": "deck", + "sample_id": null, + "children": [ + "rackT1", + "plateT2", + "plateT3", + "rackT4", + "plateT5" + ], + "parent": "PLR_STATION_PRCXI", + "type": "device", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Deck" + }, + "data": {} + }, + { + "id": "rackT1", + "name": "rackT1", + "sample_id": null, + "children": [], + "parent": "deck", + "type": "device", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 120.98, + "size_y": 82.12, + "size_z": 50.3 + }, + "data": { + "Material": { + "uuid": "80652665f6a54402b2408d50b40398df", + "Code": "ZX-001-1000", + "Name": "1000μL Tip头", + "SummaryName": "1000μL Tip头", + "PipetteHeight": 100, + "materialEnum": 1 + } + } + }, + { + "id": "plateT2", + "name": "plateT2", + "sample_id": null, + "children": [], + "parent": "deck", + "type": "device", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 120.98, + "size_y": 82.12, + "size_z": 50.3 + }, + "data": { + "Material": { + "uuid": "57b1e4711e9e4a32b529f3132fc5931f" + } + } + }, + { + "id": "plateT3", + "name": "plateT3", + "sample_id": null, + "children": [], + "parent": "deck", + "type": "device", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 120.98, + "size_y": 82.12, + "size_z": 50.3 + }, + "data": { + "Material": { + "uuid": "57b1e4711e9e4a32b529f3132fc5931f" + } + } + }, + { + "id": "rackT4", + "name": "rackT4", + "sample_id": null, + "children": [], + "parent": "deck", + "type": "device", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 120.98, + "size_y": 82.12, + "size_z": 50.3 + }, + "data": { + "Material": { + "uuid": "80652665f6a54402b2408d50b40398df", + "Code": "ZX-001-1000", + "Name": "1000μL Tip头", + "SummaryName": "1000μL Tip头", + "PipetteHeight": 100, + "materialEnum": 1 + } + } + }, + { + "id": "plateT5", + "name": "plateT5", + "sample_id": null, + "children": [], + "parent": "deck", + "type": "device", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 120.98, + "size_y": 82.12, + "size_z": 50.3 + }, + "data": { + "Material": { + "uuid": "57b1e4711e9e4a32b529f3132fc5931f" + } + } + } + ], + "links": [] +} \ 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 4faa042..54257ac 100644 --- a/unilabos/devices/liquid_handling/liquid_handler_abstract.py +++ b/unilabos/devices/liquid_handling/liquid_handler_abstract.py @@ -183,7 +183,7 @@ class LiquidHandlerAbstract(LiquidHandler): spread: Literal["wide", "tight", "custom"] = "wide", is_96_well: bool = False, mix_stage: Optional[Literal["none", "before", "after", "both"]] = "none", - mix_times: Optional[List(int)] = None, + mix_times: Optional[List[int]] = None, mix_vol: Optional[int] = None, mix_rate: Optional[int] = None, mix_liquid_height: Optional[float] = None, diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index 0093c0f..25180cf 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -1,17 +1,456 @@ -import socket, json, contextlib -from typing import Any, List, Dict, Optional +import collections +import contextlib +import json +import socket +import time +from typing import Any, List, Dict, Optional, TypedDict, Union, Sequence, Iterator, Literal + +from pylabrobot.liquid_handling import ( + LiquidHandlerBackend, + Pickup, + SingleChannelAspiration, + Drop, + SingleChannelDispense, + PickupTipRack, + DropTipRack, + MultiHeadAspirationPlate, +) +from pylabrobot.liquid_handling.standard import ( + MultiHeadAspirationContainer, + MultiHeadDispenseContainer, + MultiHeadDispensePlate, + ResourcePickup, + ResourceMove, + ResourceDrop, +) +from pylabrobot.resources import Tip, Deck, Plate, Well, TipRack, Resource, Container, Coordinate + +from unilabos.devices.liquid_handling.liquid_handler_abstract import LiquidHandlerAbstract class PRCXIError(RuntimeError): """Lilith 返回 Success=false 时抛出的业务异常""" -class PRCXI9300: +class Material(TypedDict): # 和Plate同关系 + uuid: str + Code: Optional[str] + Name: Optional[str] + SummaryName: Optional[str] + PipetteHeight: Optional[int] + materialEnum: Optional[int] - def __init__(self, host: str = "127.0.0.1", port: int = 9999, - timeout: float = 10.0) -> None: + +class WorkTablets(TypedDict): + Number: int + Code: str + Material: Dict[str, Any] + + +class MatrixInfo(TypedDict): + MatrixId: str + MatrixName: str + MatrixCount: int + WorkTablets: list[WorkTablets] + + +class PRCXI9300Deck(Deck): + """PRCXI 9300 的专用 Deck 类,继承自 Deck。 + + 该类定义了 PRCXI 9300 的工作台布局和槽位信息。 + """ + + def __init__(self, name: str, size_x: float, size_y: float, size_z: float): + super().__init__(name, size_x, size_y, size_z) + self.slots = [None] * 6 # PRCXI 9300 有 6 个槽位 + + +class PRCXI9300Container(Plate): + """PRCXI 9300 的专用 Deck 类,继承自 Deck。 + + 该类定义了 PRCXI 9300 的工作台布局和槽位信息。 + """ + + def __init__(self, name: str, size_x: float, size_y: float, size_z: float, category: str): + super().__init__(name, size_x, size_y, size_z, category=category, ordering=collections.OrderedDict()) + self._unilabos_state = {} + + def load_state(self, state: Dict[str, Any]) -> None: + """从给定的状态加载工作台信息。""" + super().load_state(state) + self._unilabos_state = state + + def serialize_state(self) -> Dict[str, Dict[str, Any]]: + data = super().serialize_state() + data.update(self._unilabos_state) + return data + + +class PRCXI9300Handler(LiquidHandlerAbstract): + def __init__(self, deck: Deck, host: str, port: int, timeout: float, setup=True): + tablets_info = [] + count = 0 + for child in deck.children: + if "Material" in child._unilabos_state: + count += 1 + tablets_info.append( + WorkTablets(Number=count, Code=f"T{count}", Material=child._unilabos_state["Material"]) + ) + self._unilabos_backend = PRCXI9300Backend(tablets_info, host, port, timeout, setup) + super().__init__(backend=self._unilabos_backend, deck=deck) + + 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] = [], + ): + self._unilabos_backend.create_protocol(protocol_name) + + async def run_protocol(self): + self._unilabos_backend.run_protocol() + + async def remove_liquid( + self, + vols: List[float], + sources: Sequence[Container], + waste_liquid: Optional[Container] = None, + *, + use_channels: Optional[List[int]] = None, + flow_rates: Optional[List[Optional[float]]] = None, + offsets: Optional[List[Coordinate]] = None, + liquid_height: Optional[List[Optional[float]]] = None, + blow_out_air_volume: Optional[List[Optional[float]]] = None, + 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] = [], + ): + return await super().remove_liquid( + vols, + sources, + waste_liquid, + use_channels=use_channels, + flow_rates=flow_rates, + offsets=offsets, + liquid_height=liquid_height, + blow_out_air_volume=blow_out_air_volume, + spread=spread, + delays=delays, + is_96_well=is_96_well, + top=top, + none_keys=none_keys, + ) + + async def add_liquid( + self, + asp_vols: Union[List[float], float], + dis_vols: Union[List[float], float], + reagent_sources: Sequence[Container], + targets: Sequence[Container], + *, + use_channels: Optional[List[int]] = None, + flow_rates: Optional[List[Optional[float]]] = None, + offsets: Optional[List[Coordinate]] = None, + liquid_height: Optional[List[Optional[float]]] = None, + blow_out_air_volume: Optional[List[Optional[float]]] = None, + spread: Optional[Literal["wide", "tight", "custom"]] = "wide", + is_96_well: bool = False, + delays: Optional[List[int]] = None, + mix_time: Optional[int] = None, + mix_vol: Optional[int] = None, + mix_rate: Optional[int] = None, + mix_liquid_height: Optional[float] = None, + none_keys: List[str] = [], + ): + return await super().add_liquid( + asp_vols, + dis_vols, + reagent_sources, + targets, + use_channels=use_channels, + flow_rates=flow_rates, + offsets=offsets, + liquid_height=liquid_height, + blow_out_air_volume=blow_out_air_volume, + spread=spread, + is_96_well=is_96_well, + delays=delays, + mix_time=mix_time, + mix_vol=mix_vol, + mix_rate=mix_rate, + mix_liquid_height=mix_liquid_height, + none_keys=none_keys, + ) + + async 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[List[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] = [], + ): + return await super().transfer_liquid( + sources, + targets, + tip_racks, + use_channels=use_channels, + asp_vols=asp_vols, + dis_vols=dis_vols, + 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, + ) + + async def custom_delay(self, seconds=0, msg=None): + return await super().custom_delay(seconds, msg) + + async def touch_tip(self, targets: Sequence[Container]): + return await super().touch_tip(targets) + + async def mix( + self, + targets: Sequence[Container], + mix_time: int = None, + mix_vol: Optional[int] = None, + height_to_bottom: Optional[float] = None, + offsets: Optional[Coordinate] = None, + mix_rate: Optional[float] = None, + none_keys: List[str] = [], + ): + return await super().mix(targets, mix_time, mix_vol, height_to_bottom, offsets, mix_rate, none_keys) + + def iter_tips(self, tip_racks: Sequence[TipRack]) -> Iterator[Resource]: + return super().iter_tips(tip_racks) + + def set_tiprack(self, tip_racks: Sequence[TipRack]): + super().set_tiprack(tip_racks) + + async def move_to(self, well: Well, dis_to_top: float = 0, channel: int = 0): + return await super().move_to(well, dis_to_top, channel) + + +class PRCXI9300Backend(LiquidHandlerBackend): + """PRCXI 9300 的后端实现,继承自 LiquidHandlerBackend。 + + 该类提供了与 PRCXI 9300 设备进行通信的基本方法,包括方案管理、自动化控制、运行状态查询等。 + """ + + _num_channels = 8 # 默认通道数为 8 + matrix_info: MatrixInfo + protocol_name: str + steps_todo_list = [] + + def __init__( + self, + tablets_info: list[WorkTablets], + host: str = "127.0.0.1", + port: int = 9999, + timeout: float = 10.0, + setup=True, + ) -> None: + super().__init__() + self.tablets_info = tablets_info + self.api_client = PRCXI9300Api(host, port, timeout) self.host, self.port, self.timeout = host, port, timeout + self._num_channels = 8 + self._execute_setup = setup + def create_protocol(self, protocol_name): + self.protocol_name = protocol_name + self.steps_todo_list = [] + + def run_protocol(self): + run_time = time.time() + self.matrix_info = MatrixInfo( + MatrixId=f"matrix_{run_time}", + MatrixName=f"protocol_{run_time}", + MatrixCount=len(self.tablets_info), + WorkTablets=self.tablets_info, + ) + self.api_client.add_WorkTablet_Matrix(self.matrix_info) + solution_id = self.api_client.add_solution( + f"protocol_{run_time}", self.matrix_info["MatrixId"], self.steps_todo_list + ) + self.api_client.load_solution(solution_id) + self.api_client.start() + + @classmethod + def check_channels(cls, use_channels: List[int]) -> List[int]: + """检查通道是否符合要求,PRCXI9300Backend 只支持所有 8 个通道。""" + if use_channels != [0, 1, 2, 3, 4, 5, 6, 7]: + print("PRCXI9300Backend only supports all 8 channels, using default [0, 1, 2, 3, 4, 5, 6, 7].") + return [0, 1, 2, 3, 4, 5, 6, 7] + return use_channels + + async def setup(self): + await super().setup() + try: + if self._execute_setup: + self.api_client.call("IAutomation", "Reset") + except ConnectionRefusedError as e: + raise RuntimeError( + f"Failed to connect to PRCXI9300 API at {self.host}:{self.port}. " + "Please ensure the PRCXI9300 service is running." + ) from e + + async def stop(self): + self.api_client.call("IAutomation", "Stop") + + async def pick_up_tips(self, ops: List[Pickup], use_channels: List[int] = None): + """Pick up tips from the specified resource.""" + # 12列,要PickUp A-H 1 + # PlateNo = 1-6 # 2行3列 + PlateNo = 1 # 第一块板 + hole_col = 2 # 第二列的8个孔 + step = self.api_client.Load( + "Left", + dosage=0, + plate_no=PlateNo, + is_whole_plate=False, + hole_row=1, + hole_col=hole_col, + blending_times=0, + balance_height=0, + plate_or_hole=f"H{hole_col}-8,T{PlateNo}", + hole_numbers="1,2,3,4,5,6,7,8", + ) + self.steps_todo_list.append(step) + print("PRCXI9300Backend pick_up_tips logged.") + + async def drop_tips(self, ops: List[Drop], use_channels: List[int] = None): + PlateNo = 1 + hole_col = 2 + step = self.api_client.UnLoad( + "Left", + dosage=0, + plate_no=PlateNo, + is_whole_plate=False, + hole_row=1, + hole_col=hole_col, + blending_times=0, + balance_height=0, + plate_or_hole=f"H{hole_col}-8,T{PlateNo}", + hole_numbers="1,2,3,4,5,6,7,8", + ) + allow_drop = False + for s in self.steps_todo_list: + if s.get("Function") == "Load": + self.steps_todo_list.append(step) + allow_drop = True + break + if not allow_drop: + raise ValueError("No matching Load step found for drop_tips.") + print("PRCXI9300Backend drop_tips logged.") + + async def aspirate(self, ops: List[SingleChannelAspiration], use_channels: List[int] = None): + volumes = [op.volume for op in ops] + print(f"PRCXI9300Backend aspirate volumes: {volumes[0]} -> {int(volumes[0])} μL") + PlateNo = 1 + hole_col = 2 + step = self.api_client.Imbibing( + "Left", + dosage=int(volumes[0]), + plate_no=PlateNo, + is_whole_plate=False, + hole_row=1, + hole_col=hole_col, + blending_times=0, + balance_height=0, + plate_or_hole=f"H{hole_col}-8,T{PlateNo}", + hole_numbers="1,2,3,4,5,6,7,8", + ) + self.steps_todo_list.append(step) + + async def dispense(self, ops: List[SingleChannelDispense], use_channels: List[int] = None): + volumes = [op.volume for op in ops] + print(f"PRCXI9300Backend dispense volumes: {volumes[0]} -> {int(volumes[0])} μL") + PlateNo = 1 + hole_col = 2 + step = self.api_client.Tapping( + "Left", + dosage=int(volumes[0]), + plate_no=PlateNo, + is_whole_plate=False, + hole_row=1, + hole_col=hole_col, + blending_times=0, + balance_height=0, + plate_or_hole=f"H{hole_col}-8,T{PlateNo}", + hole_numbers="1,2,3,4,5,6,7,8", + ) + self.steps_todo_list.append(step) + + async def pick_up_tips96(self, pickup: PickupTipRack): + raise NotImplementedError("The PRCXI backend does not support the 96 head.") + + async def drop_tips96(self, drop: DropTipRack): + raise NotImplementedError("The PRCXI backend does not support the 96 head.") + + async def aspirate96(self, aspiration: Union[MultiHeadAspirationPlate, MultiHeadAspirationContainer]): + raise NotImplementedError("The Opentrons backend does not support the 96 head.") + + async def dispense96(self, dispense: Union[MultiHeadDispensePlate, MultiHeadDispenseContainer]): + raise NotImplementedError("The Opentrons backend does not support the 96 head.") + + async def pick_up_resource(self, pickup: ResourcePickup): + raise NotImplementedError("The Opentrons backend does not support the robotic arm.") + + async def move_picked_up_resource(self, move: ResourceMove): + raise NotImplementedError("The Opentrons backend does not support the robotic arm.") + + async def drop_resource(self, drop: ResourceDrop): + raise NotImplementedError("The Opentrons backend does not support the robotic arm.") + + def can_pick_up_tip(self, channel_idx: int, tip: Tip) -> bool: + return True # PRCXI9300Backend does not have tip compatibility issues + + def serialize(self) -> dict: + raise NotImplementedError() + + @property + def num_channels(self) -> int: + return self._num_channels + + +class PRCXI9300Api: + def __init__(self, host: str = "127.0.0.1", port: int = 9999, timeout: float = 10.0) -> None: + self.host, self.port, self.timeout = host, port, timeout @staticmethod def _len_prefix(n: int) -> bytes: @@ -30,17 +469,30 @@ class PRCXI9300: if not chunk: break if first: - chunk, first = chunk[8:], False + chunk, first = chunk[8:], False chunks.append(chunk) return b"".join(chunks).decode() - def _call(self, service: str, method: str, - params: Optional[list] = None) -> Any: + # ---------------------------------------------------- 方案相关(ISolution) + def list_solutions(self) -> List[Dict[str, Any]]: + """GetSolutionList""" + return self.call("ISolution", "GetSolutionList") + + def load_solution(self, solution_id: str) -> bool: + """LoadSolution""" + return self.call("ISolution", "LoadSolution", [solution_id]) + + def add_solution(self, name: str, matrix_id: str, steps: List[Dict[str, Any]]) -> str: + """AddSolution → 返回新方案 GUID""" + return self.call("ISolution", "AddSolution", [name, matrix_id, steps]) + + # ---------------------------------------------------- 自动化控制(IAutomation) + def start(self) -> bool: + return self.call("IAutomation", "Start") + + def call(self, service: str, method: str, params: Optional[list] = None) -> Any: payload = json.dumps( - {"ServiceName": service, - "MethodName": method, - "Paramters": params or []}, - separators=(",", ":") + {"ServiceName": service, "MethodName": method, "Paramters": params or []}, separators=(",", ":") ) resp = json.loads(self._raw_request(payload)) if not resp.get("Success", False): @@ -51,87 +503,53 @@ class PRCXI9300: except (TypeError, json.JSONDecodeError): return data - # ---------------------------------------------------- 方案相关(ISolution) - def list_solutions(self) -> List[Dict[str, Any]]: - """GetSolutionList""" - return self._call("ISolution", "GetSolutionList") - - def load_solution(self, solution_id: str) -> bool: - """LoadSolution""" - return self._call("ISolution", "LoadSolution", [solution_id]) - - def add_solution(self, name: str, matrix_id: str, - steps: List[Dict[str, Any]]) -> str: - """AddSolution → 返回新方案 GUID""" - return self._call("ISolution", "AddSolution", - [name, matrix_id, steps]) - - # ---------------------------------------------------- 自动化控制(IAutomation) - def start(self) -> bool: - return self._call("IAutomation", "Start") - - def stop(self) -> bool: - """Stop""" - return self._call("IAutomation", "Stop") - - def reset(self) -> bool: - """Reset""" - return self._call("IAutomation", "Reset") - def pause(self) -> bool: """Pause""" - return self._call("IAutomation", "Pause") + return self.call("IAutomation", "Pause") def resume(self) -> bool: """Resume""" - return self._call("IAutomation", "Resume") + return self.call("IAutomation", "Resume") def get_error_code(self) -> Optional[str]: """GetErrorCode""" - return self._call("IAutomation", "GetErrorCode") + return self.call("IAutomation", "GetErrorCode") def clear_error_code(self) -> bool: """RemoveErrorCodet""" - return self._call("IAutomation", "RemoveErrorCodet") + return self.call("IAutomation", "RemoveErrorCodet") # ---------------------------------------------------- 运行状态(IMachineState) def step_state_list(self) -> List[Dict[str, Any]]: """GetStepStateList""" - return self._call("IMachineState", "GetStepStateList") + return self.call("IMachineState", "GetStepStateList") def step_status(self, seq_num: int) -> Dict[str, Any]: """GetStepStatus""" - return self._call("IMachineState", "GetStepStatus", [seq_num]) + return self.call("IMachineState", "GetStepStatus", [seq_num]) def step_state(self, seq_num: int) -> Dict[str, Any]: """GetStepState""" - return self._call("IMachineState", "GetStepState", [seq_num]) + return self.call("IMachineState", "GetStepState", [seq_num]) def axis_location(self, axis_num: int = 1) -> Dict[str, Any]: """GetLocation""" - return self._call("IMachineState", "GetLocation", [axis_num]) + return self.call("IMachineState", "GetLocation", [axis_num]) # ---------------------------------------------------- 版位矩阵(IMatrix) def list_matrices(self) -> List[Dict[str, Any]]: """GetWorkTabletMatrices""" - return self._call("IMatrix", "GetWorkTabletMatrices") + return self.call("IMatrix", "GetWorkTabletMatrices") def matrix_by_id(self, matrix_id: str) -> Dict[str, Any]: """GetWorkTabletMatrixById""" - return self._call("IMatrix", "GetWorkTabletMatrixById", [matrix_id]) - - def add_WorkTablet_Matrix(self,matrix): - return self._call("IMatrix", "AddWorkTabletMatrix", [matrix]) + return self.call("IMatrix", "GetWorkTabletMatrixById", [matrix_id]) - # ---------------------------------------------------- 一键运行 - def run_solution(self, solution_id: str, channel_idx: int = 1) -> None: - self.load_solution(solution_id) - self.start(channel_idx) - -# ---------------------------------------------------- 单点动作 + def add_WorkTablet_Matrix(self, matrix: MatrixInfo): + return self.call("IMatrix", "AddWorkTabletMatrix", [matrix]) def Load( - self, + self, axis: str, dosage: int, plate_no: int, @@ -147,7 +565,7 @@ class PRCXI9300: assist_fun3: str = "", assist_fun4: str = "", assist_fun5: str = "", - liquid_method: str = "NormalDispense" + liquid_method: str = "NormalDispense", ) -> Dict[str, Any]: return { "StepAxis": axis, @@ -166,11 +584,11 @@ class PRCXI9300: "AssistFun4": assist_fun4, "AssistFun5": assist_fun5, "HoleNumbers": hole_numbers, - "LiquidDispensingMethod": liquid_method + "LiquidDispensingMethod": liquid_method, } def Imbibing( - self, + self, axis: str, dosage: int, plate_no: int, @@ -186,7 +604,7 @@ class PRCXI9300: assist_fun3: str = "", assist_fun4: str = "", assist_fun5: str = "", - liquid_method: str = "NormalDispense" + liquid_method: str = "NormalDispense", ) -> Dict[str, Any]: return { "StepAxis": axis, @@ -205,12 +623,11 @@ class PRCXI9300: "AssistFun4": assist_fun4, "AssistFun5": assist_fun5, "HoleNumbers": hole_numbers, - "LiquidDispensingMethod": liquid_method + "LiquidDispensingMethod": liquid_method, } - def Tapping( - self, + self, axis: str, dosage: int, plate_no: int, @@ -226,7 +643,7 @@ class PRCXI9300: assist_fun3: str = "", assist_fun4: str = "", assist_fun5: str = "", - liquid_method: str = "NormalDispense" + liquid_method: str = "NormalDispense", ) -> Dict[str, Any]: return { "StepAxis": axis, @@ -245,12 +662,11 @@ class PRCXI9300: "AssistFun4": assist_fun4, "AssistFun5": assist_fun5, "HoleNumbers": hole_numbers, - "LiquidDispensingMethod": liquid_method + "LiquidDispensingMethod": liquid_method, } - def Blending( - self, + self, axis: str, dosage: int, plate_no: int, @@ -266,7 +682,7 @@ class PRCXI9300: assist_fun3: str = "", assist_fun4: str = "", assist_fun5: str = "", - liquid_method: str = "NormalDispense" + liquid_method: str = "NormalDispense", ) -> Dict[str, Any]: return { "StepAxis": axis, @@ -285,11 +701,11 @@ class PRCXI9300: "AssistFun4": assist_fun4, "AssistFun5": assist_fun5, "HoleNumbers": hole_numbers, - "LiquidDispensingMethod": liquid_method + "LiquidDispensingMethod": liquid_method, } def UnLoad( - self, + self, axis: str, dosage: int, plate_no: int, @@ -305,7 +721,7 @@ class PRCXI9300: assist_fun3: str = "", assist_fun4: str = "", assist_fun5: str = "", - liquid_method: str = "NormalDispense" + liquid_method: str = "NormalDispense", ) -> Dict[str, Any]: return { "StepAxis": axis, @@ -324,5 +740,5 @@ class PRCXI9300: "AssistFun4": assist_fun4, "AssistFun5": assist_fun5, "HoleNumbers": hole_numbers, - "LiquidDispensingMethod": liquid_method + "LiquidDispensingMethod": liquid_method, } diff --git a/unilabos/registry/devices/liquid_handler.yaml b/unilabos/registry/devices/liquid_handler.yaml index ea14223..046c52b 100644 --- a/unilabos/registry/devices/liquid_handler.yaml +++ b/unilabos/registry/devices/liquid_handler.yaml @@ -6064,6 +6064,516 @@ liquid_handler.biomek: required: - success type: object +liquid_handler.prcxi: + class: + action_value_mappings: + auto-add_liquid: + feedback: {} + goal: {} + goal_default: + asp_vols: null + blow_out_air_volume: null + delays: null + dis_vols: null + flow_rates: null + is_96_well: false + liquid_height: null + mix_liquid_height: null + mix_rate: null + mix_time: null + mix_vol: null + none_keys: [] + offsets: null + reagent_sources: null + spread: wide + targets: null + use_channels: null + handles: [] + result: {} + schema: + description: add_liquid的参数schema + properties: + feedback: {} + goal: + properties: + asp_vols: + type: string + blow_out_air_volume: + type: string + delays: + type: string + dis_vols: + type: string + flow_rates: + type: string + is_96_well: + default: false + type: boolean + liquid_height: + type: string + mix_liquid_height: + type: string + mix_rate: + type: string + mix_time: + type: string + mix_vol: + type: string + none_keys: + default: [] + type: array + offsets: + type: string + reagent_sources: + type: string + spread: + default: wide + type: string + targets: + type: string + use_channels: + type: string + required: + - asp_vols + - dis_vols + - reagent_sources + - targets + type: object + result: {} + required: + - goal + title: add_liquid参数 + type: object + type: UniLabJsonCommandAsync + auto-create_protocol: + feedback: {} + goal: {} + goal_default: + none_keys: [] + protocol_author: null + protocol_date: null + protocol_description: null + protocol_name: null + protocol_type: null + protocol_version: null + handles: [] + result: {} + schema: + description: create_protocol的参数schema + properties: + feedback: {} + goal: + properties: + none_keys: + default: [] + type: array + protocol_author: + type: string + protocol_date: + type: string + protocol_description: + type: string + protocol_name: + type: string + protocol_type: + type: string + protocol_version: + type: string + required: + - protocol_name + - protocol_description + - protocol_version + - protocol_author + - protocol_date + - protocol_type + type: object + result: {} + required: + - goal + title: create_protocol参数 + type: object + type: UniLabJsonCommandAsync + auto-custom_delay: + feedback: {} + goal: {} + goal_default: + msg: null + seconds: 0 + handles: [] + result: {} + schema: + description: custom_delay的参数schema + properties: + feedback: {} + goal: + properties: + msg: + type: string + seconds: + default: 0 + type: string + required: [] + type: object + result: {} + required: + - goal + title: custom_delay参数 + type: object + type: UniLabJsonCommandAsync + auto-iter_tips: + feedback: {} + goal: {} + goal_default: + tip_racks: null + handles: [] + result: {} + schema: + description: iter_tips的参数schema + properties: + feedback: {} + goal: + properties: + tip_racks: + type: string + required: + - tip_racks + type: object + result: {} + required: + - goal + title: iter_tips参数 + type: object + type: UniLabJsonCommand + auto-mix: + feedback: {} + goal: {} + goal_default: + height_to_bottom: null + mix_rate: null + mix_time: null + mix_vol: null + none_keys: [] + offsets: null + targets: null + handles: [] + result: {} + schema: + description: mix的参数schema + properties: + feedback: {} + goal: + properties: + height_to_bottom: + type: string + mix_rate: + type: string + mix_time: + type: integer + mix_vol: + type: string + none_keys: + default: [] + type: array + offsets: + type: string + targets: + type: string + required: + - targets + type: object + result: {} + required: + - goal + title: mix参数 + type: object + type: UniLabJsonCommandAsync + auto-move_to: + feedback: {} + goal: {} + goal_default: + channel: 0 + dis_to_top: 0 + well: null + handles: [] + result: {} + schema: + description: move_to的参数schema + properties: + feedback: {} + goal: + properties: + channel: + default: 0 + type: integer + dis_to_top: + default: 0 + type: number + well: + type: string + required: + - well + type: object + result: {} + required: + - goal + title: move_to参数 + type: object + type: UniLabJsonCommandAsync + auto-remove_liquid: + feedback: {} + goal: {} + goal_default: + blow_out_air_volume: null + delays: null + flow_rates: null + is_96_well: false + liquid_height: null + none_keys: [] + offsets: null + sources: null + spread: wide + top: null + use_channels: null + vols: null + waste_liquid: null + handles: [] + result: {} + schema: + description: remove_liquid的参数schema + properties: + feedback: {} + goal: + properties: + blow_out_air_volume: + type: string + delays: + type: string + flow_rates: + type: string + is_96_well: + default: false + type: string + liquid_height: + type: string + none_keys: + default: [] + type: array + offsets: + type: string + sources: + type: string + spread: + default: wide + type: string + top: + type: string + use_channels: + type: string + vols: + type: array + waste_liquid: + type: string + required: + - vols + - sources + type: object + result: {} + required: + - goal + title: remove_liquid参数 + type: object + type: UniLabJsonCommandAsync + auto-run_protocol: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: run_protocol的参数schema + properties: + feedback: {} + goal: + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: run_protocol参数 + type: object + type: UniLabJsonCommandAsync + auto-set_tiprack: + feedback: {} + goal: {} + goal_default: + tip_racks: null + handles: [] + result: {} + schema: + description: set_tiprack的参数schema + properties: + feedback: {} + goal: + properties: + tip_racks: + type: string + required: + - tip_racks + type: object + result: {} + required: + - goal + title: set_tiprack参数 + type: object + type: UniLabJsonCommand + auto-touch_tip: + feedback: {} + goal: {} + goal_default: + targets: null + handles: [] + result: {} + schema: + description: touch_tip的参数schema + properties: + feedback: {} + goal: + properties: + targets: + type: string + required: + - targets + type: object + result: {} + required: + - goal + title: touch_tip参数 + type: object + type: UniLabJsonCommandAsync + auto-transfer_liquid: + feedback: {} + goal: {} + goal_default: + asp_flow_rates: null + asp_vols: null + blow_out_air_volume: null + delays: null + dis_flow_rates: null + dis_vols: null + is_96_well: false + liquid_height: null + mix_liquid_height: null + mix_rate: null + mix_stage: none + mix_times: null + mix_vol: null + none_keys: [] + offsets: null + sources: null + spread: wide + targets: null + tip_racks: null + touch_tip: false + use_channels: null + handles: [] + result: {} + schema: + description: transfer_liquid的参数schema + properties: + feedback: {} + goal: + properties: + asp_flow_rates: + type: string + asp_vols: + type: string + blow_out_air_volume: + type: string + delays: + type: string + dis_flow_rates: + type: string + dis_vols: + type: string + is_96_well: + default: false + type: boolean + liquid_height: + type: string + mix_liquid_height: + type: string + mix_rate: + type: string + mix_stage: + default: none + type: string + mix_times: + type: string + mix_vol: + type: string + none_keys: + default: [] + type: array + offsets: + type: string + sources: + type: string + spread: + default: wide + type: string + targets: + type: string + tip_racks: + type: string + touch_tip: + default: false + type: boolean + use_channels: + type: string + required: + - sources + - targets + - tip_racks + - asp_vols + - dis_vols + type: object + result: {} + required: + - goal + title: transfer_liquid参数 + type: object + type: UniLabJsonCommandAsync + module: unilabos.devices.liquid_handling.prcxi.prcxi:PRCXI9300Handler + status_types: {} + type: python + description: prcxi液体处理器设备,基于pylabrobot控制 + handles: [] + icon: icon_yiyezhan.webp + init_param_schema: + config: + properties: + deck: + type: string + host: + type: string + port: + type: integer + setup: + default: true + type: string + timeout: + type: number + required: + - deck + - host + - port + - timeout + type: object + data: + properties: {} + required: [] + type: object liquid_handler.revvity: class: action_value_mappings: diff --git a/unilabos/registry/devices/work_station.yaml b/unilabos/registry/devices/work_station.yaml index 5941645..ed8b86f 100644 --- a/unilabos/registry/devices/work_station.yaml +++ b/unilabos/registry/devices/work_station.yaml @@ -356,6 +356,85 @@ workstation: title: Add type: object type: Add + AdjustPHProtocol: + feedback: {} + goal: + ph_value: ph_value + reagent: reagent + vessel: vessel + goal_default: + ph_value: 0.0 + reagent: '' + vessel: '' + handles: + input: + - data_key: vessel + data_source: handle + data_type: resource + handler_key: Vessel + label: Vessel + - data_key: reagent + data_source: handle + data_type: resource + handler_key: reagent + label: Reagent + output: + - data_key: vessel + data_source: executor + data_type: resource + handler_key: VesselOut + label: Vessel + result: {} + schema: + description: ROS Action AdjustPH 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + progress: + type: number + status: + type: string + required: + - status + - progress + title: AdjustPH_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + ph_value: + type: number + reagent: + type: string + vessel: + type: string + required: + - vessel + - ph_value + - reagent + title: AdjustPH_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: AdjustPH_Result + type: object + required: + - goal + title: AdjustPH + type: object + type: AdjustPH CentrifugeProtocol: feedback: {} goal: @@ -751,6 +830,75 @@ workstation: title: Dissolve type: object type: Dissolve + DryProtocol: + feedback: {} + goal: + compound: compound + vessel: vessel + goal_default: + compound: '' + vessel: '' + handles: + input: + - data_key: vessel + data_source: handle + data_type: resource + handler_key: Vessel + label: Vessel + output: + - data_key: vessel + data_source: executor + data_type: resource + handler_key: VesselOut + label: Vessel + result: {} + schema: + description: ROS Action Dry 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + progress: + type: number + status: + type: string + required: + - status + - progress + title: Dry_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + compound: + type: string + vessel: + type: string + required: + - compound + - vessel + title: Dry_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: Dry_Result + type: object + required: + - goal + title: Dry + type: object + type: Dry EvacuateAndRefillProtocol: feedback: {} goal: @@ -1399,6 +1547,80 @@ workstation: title: HeatChillStop type: object type: HeatChillStop + HydrogenateProtocol: + feedback: {} + goal: + temp: temp + time: time + vessel: vessel + goal_default: + temp: '' + time: '' + vessel: '' + handles: + input: + - data_key: vessel + data_source: handle + data_type: resource + handler_key: Vessel + label: Vessel + output: + - data_key: vessel + data_source: executor + data_type: resource + handler_key: VesselOut + label: Vessel + result: {} + schema: + description: ROS Action Hydrogenate 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + progress: + type: number + status: + type: string + required: + - status + - progress + title: Hydrogenate_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + temp: + type: string + time: + type: string + vessel: + type: string + required: + - temp + - time + - vessel + title: Hydrogenate_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: Hydrogenate_Result + type: object + required: + - goal + title: Hydrogenate + type: object + type: Hydrogenate PumpTransferProtocol: feedback: {} goal: @@ -1554,6 +1776,159 @@ workstation: title: PumpTransfer type: object type: PumpTransfer + RecrystallizeProtocol: + feedback: {} + goal: + ratio: ratio + solvent1: solvent1 + solvent2: solvent2 + vessel: vessel + volume: volume + goal_default: + ratio: '' + solvent1: '' + solvent2: '' + vessel: '' + volume: 0.0 + handles: + input: + - data_key: vessel + data_source: handle + data_type: resource + handler_key: Vessel + label: Vessel + - data_key: solvent + data_source: handle + data_type: resource + handler_key: solvent1 + label: Solvent 1 + - data_key: solvent + data_source: handle + data_type: resource + handler_key: solvent2 + label: Solvent 2 + output: + - data_key: vessel + data_source: executor + data_type: resource + handler_key: VesselOut + label: Vessel + result: {} + schema: + description: ROS Action Recrystallize 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + progress: + type: number + status: + type: string + required: + - status + - progress + title: Recrystallize_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + ratio: + type: string + solvent1: + type: string + solvent2: + type: string + vessel: + type: string + volume: + type: number + required: + - ratio + - solvent1 + - solvent2 + - vessel + - volume + title: Recrystallize_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: Recrystallize_Result + type: object + required: + - goal + title: Recrystallize + type: object + type: Recrystallize + ResetHandlingProtocol: + feedback: {} + goal: + solvent: solvent + goal_default: + solvent: '' + handles: + input: + - data_key: solvent + data_source: handle + data_type: resource + handler_key: solvent + label: Solvent + output: [] + result: {} + schema: + description: ROS Action ResetHandling 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + progress: + type: number + status: + type: string + required: + - status + - progress + title: ResetHandling_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + solvent: + type: string + required: + - solvent + title: ResetHandling_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: ResetHandling_Result + type: object + required: + - goal + title: ResetHandling + type: object + type: ResetHandling RunColumnProtocol: feedback: {} goal: @@ -2355,381 +2730,6 @@ workstation: title: initialize_device参数 type: object type: UniLabJsonCommand - AdjustPHProtocol: - feedback: {} - goal: - vessel: vessel - ph_value: ph_value - reagent: reagent - goal_default: - vessel: '' - ph_value: 7.0 - reagent: '' - handles: - input: - - data_key: vessel - data_source: handle - data_type: resource - handler_key: Vessel - label: Vessel - - data_key: reagent - data_source: handle - data_type: resource - handler_key: reagent - label: Reagent - output: - - data_key: vessel - data_source: executor - data_type: resource - handler_key: VesselOut - label: Vessel - result: {} - schema: - description: ROS Action AdjustPH 的 JSON Schema - properties: - feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 - properties: - status: - type: string - progress: - type: number - required: - - status - - progress - title: AdjustPH_Feedback - type: object - goal: - description: Action 目标 - 从客户端发送到服务器 - properties: - vessel: - type: string - ph_value: - type: number - reagent: - type: string - required: - - vessel - - ph_value - - reagent - title: AdjustPH_Goal - type: object - result: - description: Action 结果 - 完成后从服务器发送到客户端 - properties: - message: - type: string - return_info: - type: string - success: - type: boolean - required: - - success - - message - - return_info - title: AdjustPH_Result - type: object - required: - - goal - title: AdjustPH - type: object - type: AdjustPH - ResetHandlingProtocol: - feedback: {} - goal: - solvent: solvent - goal_default: - solvent: '' - handles: - input: - - data_key: solvent - data_source: handle - data_type: resource - handler_key: solvent - label: Solvent - output: [] - result: {} - schema: - description: ROS Action ResetHandling 的 JSON Schema - properties: - feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 - properties: - status: - type: string - progress: - type: number - required: - - status - - progress - title: ResetHandling_Feedback - type: object - goal: - description: Action 目标 - 从客户端发送到服务器 - properties: - solvent: - type: string - required: - - solvent - title: ResetHandling_Goal - type: object - result: - description: Action 结果 - 完成后从服务器发送到客户端 - properties: - message: - type: string - return_info: - type: string - success: - type: boolean - required: - - success - - message - - return_info - title: ResetHandling_Result - type: object - required: - - goal - title: ResetHandling - type: object - type: ResetHandling - DryProtocol: - feedback: {} - goal: - compound: compound - vessel: vessel - goal_default: - compound: '' - vessel: '' - handles: - input: - - data_key: vessel - data_source: handle - data_type: resource - handler_key: Vessel - label: Vessel - output: - - data_key: vessel - data_source: executor - data_type: resource - handler_key: VesselOut - label: Vessel - result: {} - schema: - description: ROS Action Dry 的 JSON Schema - properties: - feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 - properties: - status: - type: string - progress: - type: number - required: - - status - - progress - title: Dry_Feedback - type: object - goal: - description: Action 目标 - 从客户端发送到服务器 - properties: - compound: - type: string - vessel: - type: string - required: - - compound - - vessel - title: Dry_Goal - type: object - result: - description: Action 结果 - 完成后从服务器发送到客户端 - properties: - message: - type: string - return_info: - type: string - success: - type: boolean - required: - - success - - message - - return_info - title: Dry_Result - type: object - required: - - goal - title: Dry - type: object - type: Dry - HydrogenateProtocol: - feedback: {} - goal: - temp: temp - time: time - vessel: vessel - goal_default: - temp: '' - time: '' - vessel: '' - handles: - input: - - data_key: vessel - data_source: handle - data_type: resource - handler_key: Vessel - label: Vessel - output: - - data_key: vessel - data_source: executor - data_type: resource - handler_key: VesselOut - label: Vessel - result: {} - schema: - description: ROS Action Hydrogenate 的 JSON Schema - properties: - feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 - properties: - status: - type: string - progress: - type: number - required: - - status - - progress - title: Hydrogenate_Feedback - type: object - goal: - description: Action 目标 - 从客户端发送到服务器 - properties: - temp: - type: string - time: - type: string - vessel: - type: string - required: - - temp - - time - - vessel - title: Hydrogenate_Goal - type: object - result: - description: Action 结果 - 完成后从服务器发送到客户端 - properties: - message: - type: string - return_info: - type: string - success: - type: boolean - required: - - success - - message - - return_info - title: Hydrogenate_Result - type: object - required: - - goal - title: Hydrogenate - type: object - type: Hydrogenate - RecrystallizeProtocol: - feedback: {} - goal: - ratio: ratio - solvent1: solvent1 - solvent2: solvent2 - vessel: vessel - volume: volume - goal_default: - ratio: '' - solvent1: '' - solvent2: '' - vessel: '' - volume: 0.0 - handles: - input: - - data_key: vessel - data_source: handle - data_type: resource - handler_key: Vessel - label: Vessel - - data_key: solvent - data_source: handle - data_type: resource - handler_key: solvent1 - label: Solvent 1 - - data_key: solvent - data_source: handle - data_type: resource - handler_key: solvent2 - label: Solvent 2 - output: - - data_key: vessel - data_source: executor - data_type: resource - handler_key: VesselOut - label: Vessel - result: {} - schema: - description: ROS Action Recrystallize 的 JSON Schema - properties: - feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 - properties: - status: - type: string - progress: - type: number - required: - - status - - progress - title: Recrystallize_Feedback - type: object - goal: - description: Action 目标 - 从客户端发送到服务器 - properties: - ratio: - type: string - solvent1: - type: string - solvent2: - type: string - vessel: - type: string - volume: - type: number - required: - - ratio - - solvent1 - - solvent2 - - vessel - - volume - title: Recrystallize_Goal - type: object - result: - description: Action 结果 - 完成后从服务器发送到客户端 - properties: - message: - type: string - return_info: - type: string - success: - type: boolean - required: - - success - - message - - return_info - title: Recrystallize_Result - type: object - required: - - goal - title: Recrystallize - type: object - type: Recrystallize module: unilabos.ros.nodes.presets.protocol_node:ROS2ProtocolNode status_types: {} type: ros2 diff --git a/unilabos/ros/nodes/base_device_node.py b/unilabos/ros/nodes/base_device_node.py index 4b7eb07..d4ea392 100644 --- a/unilabos/ros/nodes/base_device_node.py +++ b/unilabos/ros/nodes/base_device_node.py @@ -923,11 +923,18 @@ class ROS2DeviceNode: driver_class.__module__.startswith("pylabrobot") or driver_class.__name__ == "LiquidHandlerAbstract" or driver_class.__name__ == "LiquidHandlerBiomek" + or driver_class.__name__ == "PRCXI9300Handler" ) # TODO: 要在创建之前预先请求服务器是否有当前id的物料,放到resource_tracker中,让pylabrobot进行创建 # 创建设备类实例 if use_pylabrobot_creator: + # 先对pylabrobot的子资源进行加载,不然subclass无法认出 + # 在下方对于加载Deck等Resource要手动import + # noinspection PyUnresolvedReferences + from unilabos.devices.liquid_handling.prcxi.prcxi import PRCXI9300Deck + # noinspection PyUnresolvedReferences + from unilabos.devices.liquid_handling.prcxi.prcxi import PRCXI9300Container self._driver_creator = PyLabRobotCreator( driver_class, children=children, resource_tracker=self.resource_tracker ) diff --git a/unilabos/ros/utils/driver_creator.py b/unilabos/ros/utils/driver_creator.py index 7fd726b..c76cc3b 100644 --- a/unilabos/ros/utils/driver_creator.py +++ b/unilabos/ros/utils/driver_creator.py @@ -148,7 +148,7 @@ class PyLabRobotCreator(DeviceClassCreator[T]): contain_model = not issubclass(target_type, Deck) resource, target_type = self._process_resource_mapping(resource, target_type) resource_instance: Resource = resource_ulab_to_plr(resource, contain_model) - + states[prefix_path] = resource_instance.serialize_all_state() # 使用 prefix_path 作为 key 存储资源状态 if to_dict: serialized = resource_instance.serialize() @@ -199,7 +199,7 @@ class PyLabRobotCreator(DeviceClassCreator[T]): spect = inspect.signature(deserialize_method) spec_args = spect.parameters for param_name, param_value in data.copy().items(): - if "_resource_child_name" in param_value and "_resource_type" not in param_value: + if isinstance(param_value, dict) and "_resource_child_name" in param_value and "_resource_type" not in param_value: arg_value = spec_args[param_name].annotation data[param_name]["_resource_type"] = self.device_cls.__module__ + ":" + arg_value logger.debug(f"自动补充 _resource_type: {data[param_name]['_resource_type']}") @@ -230,7 +230,7 @@ class PyLabRobotCreator(DeviceClassCreator[T]): spect = inspect.signature(self.device_cls.__init__) spec_args = spect.parameters for param_name, param_value in data.copy().items(): - if "_resource_child_name" in param_value and "_resource_type" not in param_value: + if isinstance(param_value, dict) and "_resource_child_name" in param_value and "_resource_type" not in param_value: arg_value = spec_args[param_name].annotation data[param_name]["_resource_type"] = self.device_cls.__module__ + ":" + arg_value logger.debug(f"自动补充 _resource_type: {data[param_name]['_resource_type']}") From 50282664e0b4c6291232e3f874b02c809160c899 Mon Sep 17 00:00:00 2001 From: q434343 <73513873+q434343@users.noreply.github.com> Date: Tue, 8 Jul 2025 15:49:35 +0800 Subject: [PATCH 23/96] =?UTF-8?q?=E4=BF=AE=E6=94=B9moveit=5Finterface?= =?UTF-8?q?=EF=BC=8C=E5=B9=B6=E5=9C=A8mqtt=E4=B8=8A=E6=8A=A5=E6=97=B6?= =?UTF-8?q?=E5=8F=91=E9=80=81=E4=B8=80=E4=B8=AA=E6=97=B6=E9=97=B4=E6=88=B3?= =?UTF-8?q?=EF=BC=8C=E6=96=B9=E4=BE=BF=E7=BD=91=E9=A1=B5=E7=AB=AF=E5=AF=B9?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=9A=84=E7=AD=9B=E9=80=89=20(#62)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update README and MQTTClient for installation instructions and code improvements * feat: 支持local_config启动 add: 增加对crt path的说明,为传入config.py的相对路径 move: web component * add: registry description * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * feat: node_info_update srv fix: OTDeck cant create * close #12 feat: slave node registry * feat: show machine name fix: host node registry not uploaded * feat: add hplc registry * feat: add hplc registry * fix: hplc status typo * fix: devices/ * 完成启动OT并联动rviz * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * fix: device.class possible null * fix: HPLC additions with online service * fix: slave mode spin not working * fix: slave mode spin not working * 修复rviz位置问题, 修复rviz位置问题, 在无tf变动时减缓发送频率 在backend中添加物料跟随方法 * feat: 多ProtocolNode 允许子设备ID相同 feat: 上报发现的ActionClient feat: Host重启动,通过discover机制要求slaveNode重新注册,实现信息及时上报 * feat: 支持env设置config * fix: running logic * fix: running logic * fix: missing ot * 在main中直接初始化republisher和物料的mesh节点 * 将joint_republisher和resource_mesh_manager添加进 main_slave_run.py中 * Device visualization (#14) * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * 修复rviz位置问题, 修复rviz位置问题, 在无tf变动时减缓发送频率 在backend中添加物料跟随方法 * fix: running logic * fix: running logic * fix: missing ot * 在main中直接初始化republisher和物料的mesh节点 * 将joint_republisher和resource_mesh_manager添加进 main_slave_run.py中 --------- Co-authored-by: zhangshixiang <@zhangshixiang> Co-authored-by: wznln <18435084+Xuwznln@users.noreply.github.com> * fix: missing hostname in devices_names fix: upload_file for model file * fix: missing paho-mqtt package bump version to 0.9.0 * fix startup add ResourceCreateFromOuter.action * fix type hint * update actions * update actions * host node add_resource_from_outer fix cmake list * pass device config to device class * add: bind_parent_ids to resource create action fix: message convert string * fix: host node should not be re_discovered * feat: resource tracker support dict * feat: add more necessary params * feat: fix boolean null in registry action data * feat: add outer resource * 编写mesh添加action * feat: append resource * add action * feat: vis 2d for plr * fix * fix: browser on rviz * fix: cloud bridge error fallback to local * fix: salve auto run rviz * 初始化两个plate * Device visualization (#22) * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * 修复rviz位置问题, 修复rviz位置问题, 在无tf变动时减缓发送频率 在backend中添加物料跟随方法 * fix: running logic * fix: running logic * fix: missing ot * 在main中直接初始化republisher和物料的mesh节点 * 将joint_republisher和resource_mesh_manager添加进 main_slave_run.py中 * 编写mesh添加action * add action * fix * fix: browser on rviz * fix: cloud bridge error fallback to local * fix: salve auto run rviz * 初始化两个plate --------- Co-authored-by: zhangshixiang <@zhangshixiang> Co-authored-by: wznln <18435084+Xuwznln@users.noreply.github.com> * fix: multi channel * fix: aspirate * fix: aspirate * fix: aspirate * fix: aspirate * 提交 * fix: jobadd * fix: jobadd * fix: msg converter * tijiao * add resource creat easy action * identify debug msg * mq client id * 提取lh的joint发布 * unify liquid_handler definition * 修改物料跟随与物料添加逻辑 修改物料跟随与物料添加逻辑 将joint_publisher类移出lh的backends,但仍需要对lh的backends进行一些改写 * Revert "修改物料跟随与物料添加逻辑" This reverts commit 498c997ad764263366f6d6207e0722fbc7a909a8. * Reapply "修改物料跟随与物料添加逻辑" This reverts commit 3a60d2ae8125a7b24506bb681e3baaf69f2ebf6b. * Revert "Merge remote-tracking branch 'upstream/dev' into device_visualization" This reverts commit fa727220afa8546b84f1763730818d6360c26251, reversing changes made to 498c997ad764263366f6d6207e0722fbc7a909a8. * 修改物料放下时的方法,如果选择 修改物料放下时的方法, 如果选择drop_trash,则删除物料显示 如果选择drop,则让其解除连接 * unilab添加moveit启动 1,整合所有moveit节点到一个move_group中,并整合所有的controller依次激活 2,添加pymoveit2的节点,使用json可直接启动 3,修改机械臂规划方式,添加约束,让冗余关节不会进行过多移动 * 修改物体attach时,多次赋值当前时间导致卡顿问题, * Revert "修改物体attach时,多次赋值当前时间导致卡顿问题," This reverts commit 56d45b94f55d1339d54d9725ffe3c8cca7cbb73a. * Reapply "修改物体attach时,多次赋值当前时间导致卡顿问题," This reverts commit 07d9db20c3b43bc8af048b9e2c4af210ec16d446. * 添加缺少物料:"plate_well_G12", * add * fix tip resource data * liquid states * change to debug level * Revert "change to debug level" This reverts commit 5d9953c3e58d9f33818f21232c3fdcc30a4f766c. * Reapply "change to debug level" This reverts commit 2487bb6ffc6590b2da13a3dd5226825e0a164993. * fix tip resource data * add full device * add moveit yaml * 修复moveit 增加post_init阶段,给予ros_node反向 * remove necessary node * fix moveit action client * remove necessary imports * Update moveit_interface.py * fix handler_key uppercase * json add liquids * fix setup * add * change to "sources" and "targets" for lh * bump version * remove parent's parent link * change arm's name * change name * fix ik error * 修改moveit_interface,并在mqtt上报时发送一个时间戳 --------- Co-authored-by: Harvey Que Co-authored-by: wznln <18435084+Xuwznln@users.noreply.github.com> Co-authored-by: zhangshixiang <@zhangshixiang> Co-authored-by: Junhan Chang --- unilabos/app/mq.py | 4 ++-- unilabos/devices/ros_dev/moveit_interface.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/unilabos/app/mq.py b/unilabos/app/mq.py index 061add2..c569c04 100644 --- a/unilabos/app/mq.py +++ b/unilabos/app/mq.py @@ -163,10 +163,10 @@ class MQTTClient: # status = device_status.get(device_id, {}) if self.mqtt_disable: return - status = {"data": device_status.get(device_id, {}), "device_id": device_id} + status = {"data": device_status.get(device_id, {}), "device_id": device_id, "timestamp": time.time()} address = f"labs/{MQConfig.lab_id}/devices/" self.client.publish(address, json.dumps(status), qos=2) - logger.debug(f"Device status published: address: {address}, {status}") + logger.info(f"Device status published: address: {address}, {status}") def publish_job_status(self, feedback_data: dict, job_id: str, status: str, return_info: Optional[str] = None): if self.mqtt_disable: diff --git a/unilabos/devices/ros_dev/moveit_interface.py b/unilabos/devices/ros_dev/moveit_interface.py index d065403..81c2d11 100644 --- a/unilabos/devices/ros_dev/moveit_interface.py +++ b/unilabos/devices/ros_dev/moveit_interface.py @@ -17,7 +17,7 @@ class MoveitInterface: tf_buffer: Buffer tf_listener: TransformListener - def __init__(self, moveit_type, joint_poses, rotation=None, device_config=None): + def __init__(self, moveit_type, joint_poses, rotation=None, device_config=None, **kwargs): self.device_config = device_config self.rotation = rotation self.data_config = json.load( From e2052d4a2c1ee4a7ff46702027e5189e730f487d Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Fri, 11 Jul 2025 15:11:44 +0800 Subject: [PATCH 24/96] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=AE=9E=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/experiments/prcxi.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/experiments/prcxi.json b/test/experiments/prcxi.json index 72ea23b..153d9db 100644 --- a/test/experiments/prcxi.json +++ b/test/experiments/prcxi.json @@ -1,8 +1,8 @@ { "nodes": [ { - "id": "PLR_STATION_PRCXI", - "name": "PLR_LH_TEST", + "id": "中析PRCXI", + "name": "PLR_PRCXI", "parent": null, "type": "device", "class": "liquid_handler.prcxi", From 18f6685e183eec3e0dc1fdb63943a4fd35fd52f3 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Fri, 11 Jul 2025 15:36:46 +0800 Subject: [PATCH 25/96] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=AE=9E=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/experiments/prcxi.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/experiments/prcxi.json b/test/experiments/prcxi.json index 153d9db..e29ac04 100644 --- a/test/experiments/prcxi.json +++ b/test/experiments/prcxi.json @@ -1,7 +1,7 @@ { "nodes": [ { - "id": "中析PRCXI", + "id": "PRCXI", "name": "PLR_PRCXI", "parent": null, "type": "device", From 61ee4465423c2fb8d6d7315e283bf5c558efe7f4 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Fri, 11 Jul 2025 15:42:01 +0800 Subject: [PATCH 26/96] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=AE=9E=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/experiments/prcxi.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/experiments/prcxi.json b/test/experiments/prcxi.json index e29ac04..737ba32 100644 --- a/test/experiments/prcxi.json +++ b/test/experiments/prcxi.json @@ -2,7 +2,7 @@ "nodes": [ { "id": "PRCXI", - "name": "PLR_PRCXI", + "name": "PRCXI", "parent": null, "type": "device", "class": "liquid_handler.prcxi", @@ -37,7 +37,7 @@ "rackT4", "plateT5" ], - "parent": "PLR_STATION_PRCXI", + "parent": "PRCXI", "type": "device", "class": "", "position": { @@ -46,7 +46,7 @@ "z": 0 }, "config": { - "type": "PRCXI9300Deck" + "type": "PRCXI9300DeckPRCXI" }, "data": {} }, From 644feced55d2d3f3a8dc0110199ba7368b80a71d Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Fri, 11 Jul 2025 15:50:30 +0800 Subject: [PATCH 27/96] =?UTF-8?q?=E4=BF=AE=E6=AD=A3prcxi=E5=90=AF=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/experiments/prcxi.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/experiments/prcxi.json b/test/experiments/prcxi.json index 737ba32..7a26531 100644 --- a/test/experiments/prcxi.json +++ b/test/experiments/prcxi.json @@ -46,7 +46,7 @@ "z": 0 }, "config": { - "type": "PRCXI9300DeckPRCXI" + "type": "PRCXI9300Deck" }, "data": {} }, From 5a2cc2d7097c61c4626d5e2eb8594f919c4d1f38 Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Fri, 11 Jul 2025 16:00:45 +0800 Subject: [PATCH 28/96] =?UTF-8?q?=E6=9B=B4=E6=96=B0PRCXI=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E6=94=B9=E4=B8=BB=E6=9C=BA=E5=9C=B0=E5=9D=80?= =?UTF-8?q?=E5=92=8C=E8=AE=BE=E7=BD=AE=E7=8A=B6=E6=80=81=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=A4=BA=E4=BE=8B=E7=94=A8=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + test/experiments/prcxi.json | 4 +- .../devices/liquid_handling/prcxi/prcxi.py | 63 +++++++++++++++++++ 3 files changed, 66 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index b6ca0d4..9ba3b0e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +configs/ ## Python # Byte-compiled / optimized / DLL files diff --git a/test/experiments/prcxi.json b/test/experiments/prcxi.json index 7a26531..4078756 100644 --- a/test/experiments/prcxi.json +++ b/test/experiments/prcxi.json @@ -16,10 +16,10 @@ "_resource_child_name": "deck", "_resource_type": "unilabos.devices.liquid_handling.prcxi.prcxi:PRCXI9300Deck" }, - "host": "127.0.0.1", + "host": "192.168.3.9", "port": 9999, "timeout": 10.0, - "setup": false + "setup": true }, "data": {}, "children": [ diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index 25180cf..e7e3129 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -1,3 +1,4 @@ +import asyncio import collections import contextlib import json @@ -742,3 +743,65 @@ class PRCXI9300Api: "HoleNumbers": hole_numbers, "LiquidDispensingMethod": liquid_method, } + + +if __name__ == "__main__": + # Example usage + deck = PRCXI9300Deck(name="PRCXI Deck", size_x=100, size_y=100, size_z=100) + plate1 = PRCXI9300Container(name="rackT1", size_x=50, size_y=50, size_z=10, category="plate") + plate1.load_state({ + "Material": { + "uuid": "80652665f6a54402b2408d50b40398df", + "Code": "ZX-001-1000", + "Name": "1000μL Tip头", + "SummaryName": "1000μL Tip头", + "PipetteHeight": 100, + "materialEnum": 1 + } + }) + + plate2 = PRCXI9300Container(name="plateT2", size_x=50, size_y=50, size_z=10, category="plate") + plate2.load_state({ + "Material": { + "uuid": "57b1e4711e9e4a32b529f3132fc5931f", + } + }) + + plate3 = PRCXI9300Container(name="plateT3", size_x=50, size_y=50, size_z=10, category="plate") + plate3.load_state({ + "Material": { + "uuid": "57b1e4711e9e4a32b529f3132fc5931f", + } + }) + + plate4 = PRCXI9300Container(name="rackT4", size_x=50, size_y=50, size_z=10, category="plate") + plate4.load_state({ + "Material": { + "uuid": "80652665f6a54402b2408d50b40398df", + "Code": "ZX-001-1000", + "Name": "1000μL Tip头", + "SummaryName": "1000μL Tip头", + "PipetteHeight": 100, + "materialEnum": 1 + } + }) + + plate5 = PRCXI9300Container(name="plateT5", size_x=50, size_y=50, size_z=10, category="plate") + plate5.load_state({ + "Material": { + "uuid": "57b1e4711e9e4a32b529f3132fc5931f", + } + }) + deck.assign_child_resource(plate1, location=Coordinate(0, 0, 0)) + deck.assign_child_resource(plate2, location=Coordinate(0, 0, 0)) + deck.assign_child_resource(plate3, location=Coordinate(0, 0, 0)) + deck.assign_child_resource(plate4, location=Coordinate(0, 0, 0)) + deck.assign_child_resource(plate5, location=Coordinate(0, 0, 0)) + + handler = PRCXI9300Handler(deck=deck, host="192.168.3.9", port=9999, timeout=10.0, setup=True) + asyncio.run(handler.setup()) # Initialize the handler and setup the connection + + + + input("Press Enter to continue...") # Wait for user input before proceeding + print("PRCXI9300Handler initialized with deck and host settings.") From b85722f44dfc27b08672c71546ab98cf2d7ba2aa Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Fri, 11 Jul 2025 16:09:53 +0800 Subject: [PATCH 29/96] add pickup tips for prcxi --- .../devices/liquid_handling/prcxi/prcxi.py | 28 +- unilabos/registry/devices/liquid_handler.yaml | 321 ++++++++++++++++++ 2 files changed, 348 insertions(+), 1 deletion(-) diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index e7e3129..cc097e5 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -24,7 +24,7 @@ from pylabrobot.liquid_handling.standard import ( ResourceMove, ResourceDrop, ) -from pylabrobot.resources import Tip, Deck, Plate, Well, TipRack, Resource, Container, Coordinate +from pylabrobot.resources import Tip, Deck, Plate, Well, TipRack, Resource, Container, Coordinate, TipSpot from unilabos.devices.liquid_handling.liquid_handler_abstract import LiquidHandlerAbstract @@ -259,6 +259,32 @@ class PRCXI9300Handler(LiquidHandlerAbstract): def iter_tips(self, tip_racks: Sequence[TipRack]) -> Iterator[Resource]: return super().iter_tips(tip_racks) + async def pick_up_tips(self, tip_spots: List[TipSpot], use_channels: Optional[List[int]] = None, + offsets: Optional[List[Coordinate]] = None, **backend_kwargs): + return await super().pick_up_tips(tip_spots, use_channels, offsets, **backend_kwargs) + + async def aspirate(self, resources: Sequence[Container], vols: List[float], + use_channels: Optional[List[int]] = None, flow_rates: Optional[List[Optional[float]]] = None, + offsets: Optional[List[Coordinate]] = None, + liquid_height: Optional[List[Optional[float]]] = None, + blow_out_air_volume: Optional[List[Optional[float]]] = None, + spread: Literal["wide", "tight", "custom"] = "wide", **backend_kwargs): + return await super().aspirate(resources, vols, use_channels, flow_rates, offsets, liquid_height, + blow_out_air_volume, spread, **backend_kwargs) + + async def dispense(self, resources: Sequence[Container], vols: List[float], + use_channels: Optional[List[int]] = None, flow_rates: Optional[List[Optional[float]]] = None, + offsets: Optional[List[Coordinate]] = None, + liquid_height: Optional[List[Optional[float]]] = None, + blow_out_air_volume: Optional[List[Optional[float]]] = None, + spread: Literal["wide", "tight", "custom"] = "wide", **backend_kwargs): + return await super().dispense(resources, vols, use_channels, flow_rates, offsets, liquid_height, + blow_out_air_volume, spread, **backend_kwargs) + + async def discard_tips(self, use_channels: Optional[List[int]] = None, allow_nonzero_volume: bool = True, + offsets: Optional[List[Coordinate]] = None, **backend_kwargs): + return await super().discard_tips(use_channels, allow_nonzero_volume, offsets, **backend_kwargs) + def set_tiprack(self, tip_racks: Sequence[TipRack]): super().set_tiprack(tip_racks) diff --git a/unilabos/registry/devices/liquid_handler.yaml b/unilabos/registry/devices/liquid_handler.yaml index 046c52b..5ba410d 100644 --- a/unilabos/registry/devices/liquid_handler.yaml +++ b/unilabos/registry/devices/liquid_handler.yaml @@ -6145,6 +6145,53 @@ liquid_handler.prcxi: title: add_liquid参数 type: object type: UniLabJsonCommandAsync + auto-aspirate: + feedback: {} + goal: {} + goal_default: + blow_out_air_volume: null + flow_rates: null + liquid_height: null + offsets: null + resources: null + spread: wide + use_channels: null + vols: null + handles: [] + result: {} + schema: + description: aspirate的参数schema + properties: + feedback: {} + goal: + properties: + blow_out_air_volume: + type: string + flow_rates: + type: string + liquid_height: + type: string + offsets: + type: string + resources: + type: string + spread: + default: wide + type: string + use_channels: + type: string + vols: + type: array + required: + - resources + - vols + type: object + result: {} + required: + - goal + title: aspirate参数 + type: object + type: UniLabJsonCommandAsync auto-create_protocol: feedback: {} goal: {} @@ -6220,6 +6267,83 @@ liquid_handler.prcxi: title: custom_delay参数 type: object type: UniLabJsonCommandAsync + auto-discard_tips: + feedback: {} + goal: {} + goal_default: + allow_nonzero_volume: true + offsets: null + use_channels: null + handles: [] + result: {} + schema: + description: discard_tips的参数schema + properties: + feedback: {} + goal: + properties: + allow_nonzero_volume: + default: true + type: boolean + offsets: + type: string + use_channels: + type: string + required: [] + type: object + result: {} + required: + - goal + title: discard_tips参数 + type: object + type: UniLabJsonCommandAsync + auto-dispense: + feedback: {} + goal: {} + goal_default: + blow_out_air_volume: null + flow_rates: null + liquid_height: null + offsets: null + resources: null + spread: wide + use_channels: null + vols: null + handles: [] + result: {} + schema: + description: dispense的参数schema + properties: + feedback: {} + goal: + properties: + blow_out_air_volume: + type: string + flow_rates: + type: string + liquid_height: + type: string + offsets: + type: string + resources: + type: string + spread: + default: wide + type: string + use_channels: + type: string + vols: + type: array + required: + - resources + - vols + type: object + result: {} + required: + - goal + title: dispense参数 + type: object + type: UniLabJsonCommandAsync auto-iter_tips: feedback: {} goal: {} @@ -6319,6 +6443,36 @@ liquid_handler.prcxi: title: move_to参数 type: object type: UniLabJsonCommandAsync + auto-pick_up_tips: + feedback: {} + goal: {} + goal_default: + offsets: null + tip_spots: null + use_channels: null + handles: [] + result: {} + schema: + description: pick_up_tips的参数schema + properties: + feedback: {} + goal: + properties: + offsets: + type: string + tip_spots: + type: array + use_channels: + type: string + required: + - tip_spots + type: object + result: {} + required: + - goal + title: pick_up_tips参数 + type: object + type: UniLabJsonCommandAsync auto-remove_liquid: feedback: {} goal: {} @@ -6544,6 +6698,173 @@ liquid_handler.prcxi: title: transfer_liquid参数 type: object type: UniLabJsonCommandAsync + pick_up_tips: + feedback: {} + goal: + offsets: offsets + tip_spots: tip_spots + use_channels: use_channels + goal_default: + offsets: + - x: 0.0 + y: 0.0 + z: 0.0 + tip_spots: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + use_channels: + - 0 + handles: [] + result: {} + schema: + description: ROS Action LiquidHandlerPickUpTips 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerPickUpTips_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + offsets: + items: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + type: array + tip_spots: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + use_channels: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + required: + - tip_spots + - use_channels + - offsets + title: LiquidHandlerPickUpTips_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerPickUpTips_Result + type: object + required: + - goal + title: LiquidHandlerPickUpTips + type: object + type: LiquidHandlerPickUpTips module: unilabos.devices.liquid_handling.prcxi.prcxi:PRCXI9300Handler status_types: {} type: python From cd9e7ef12c3a6479c361edafa7fa85adb4d628ac Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Fri, 11 Jul 2025 16:30:56 +0800 Subject: [PATCH 30/96] =?UTF-8?q?=E4=BB=BB=E6=84=8F=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E9=83=BD=E5=BA=94=E8=AF=A5=E8=BF=94=E5=9B=9E?= =?UTF-8?q?failed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- unilabos/app/controler.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/unilabos/app/controler.py b/unilabos/app/controler.py index 730578e..7a74691 100644 --- a/unilabos/app/controler.py +++ b/unilabos/app/controler.py @@ -1,8 +1,10 @@ import json +import traceback import uuid from unilabos.app.model import JobAddReq, JobData from unilabos.ros.nodes.presets.host_node import HostNode +from unilabos.utils.type_check import serialize_result_info def get_resources() -> tuple: @@ -33,5 +35,10 @@ def job_add(req: JobAddReq) -> JobData: if "command" in action_args: action_args = action_args["command"] # print(f"job_add:{req.device_id} {action_name} {action_kwargs}") - HostNode.get_instance().send_goal(req.device_id, action_type=action_type, action_name=action_name, action_kwargs=action_args, goal_uuid=req.job_id, server_info=req.server_info) + try: + HostNode.get_instance().send_goal(req.device_id, action_type=action_type, action_name=action_name, action_kwargs=action_args, goal_uuid=req.job_id, server_info=req.server_info) + except Exception as e: + for bridge in HostNode.get_instance().bridges: + if hasattr(bridge, "publish_job_status"): + bridge.publish_job_status({}, req.job_id, "failed", serialize_result_info(traceback.format_exc(), False, {})) return JobData(jobId=req.job_id) From 72c67ba25c7fbf8b3587129d83b4a087b0d52156 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Fri, 11 Jul 2025 16:33:55 +0800 Subject: [PATCH 31/96] =?UTF-8?q?=E4=BB=BB=E6=84=8F=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E9=83=BD=E5=BA=94=E8=AF=A5=E8=BF=94=E5=9B=9E?= =?UTF-8?q?failed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- unilabos/ros/nodes/presets/host_node.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/unilabos/ros/nodes/presets/host_node.py b/unilabos/ros/nodes/presets/host_node.py index 0cb3db7..29cdea9 100644 --- a/unilabos/ros/nodes/presets/host_node.py +++ b/unilabos/ros/nodes/presets/host_node.py @@ -603,8 +603,7 @@ class HostNode(BaseROS2DeviceNode): if action_name == "test_latency" and server_info is not None: self.server_latest_timestamp = server_info.get("send_timestamp", 0.0) if action_id not in self._action_clients: - self.lab_logger().error(f"[Host Node] ActionClient {action_id} not found.") - return + raise ValueError(f"ActionClient {action_id} not found.") action_client: ActionClient = self._action_clients[action_id] From 25960c2ed5fae33a4659af2b45ab5da1d213527a Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Fri, 11 Jul 2025 18:10:21 +0800 Subject: [PATCH 32/96] Add plateT6 to PRCXI configuration and enhance error handling in liquid handling --- test/experiments/prcxi.json | 28 +++- .../liquid_handler_abstract.py | 4 +- .../devices/liquid_handling/prcxi/prcxi.py | 123 +++++++++++++++--- unilabos/ros/msgs/message_converter.py | 2 +- 4 files changed, 135 insertions(+), 22 deletions(-) diff --git a/test/experiments/prcxi.json b/test/experiments/prcxi.json index 4078756..e362558 100644 --- a/test/experiments/prcxi.json +++ b/test/experiments/prcxi.json @@ -35,7 +35,8 @@ "plateT2", "plateT3", "rackT4", - "plateT5" + "plateT5", + "plateT6" ], "parent": "PRCXI", "type": "device", @@ -184,6 +185,31 @@ "uuid": "57b1e4711e9e4a32b529f3132fc5931f" } } + }, + { + "id": "plateT6", + "name": "plateT6", + "sample_id": null, + "children": [], + "parent": "deck", + "type": "device", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 120.98, + "size_y": 82.12, + "size_z": 50.3 + }, + "data": { + "Material": { + "uuid": "57b1e4711e9e4a32b529f3132fc5931f" + } + } } ], "links": [] diff --git a/unilabos/devices/liquid_handling/liquid_handler_abstract.py b/unilabos/devices/liquid_handling/liquid_handler_abstract.py index 54257ac..dc8757b 100644 --- a/unilabos/devices/liquid_handling/liquid_handler_abstract.py +++ b/unilabos/devices/liquid_handling/liquid_handler_abstract.py @@ -1,5 +1,6 @@ from __future__ import annotations +import traceback from typing import List, Sequence, Optional, Literal, Union, Iterator import asyncio @@ -117,7 +118,7 @@ class LiquidHandlerAbstract(LiquidHandler): pass # This mode is not verified. else: if len(asp_vols) != len(targets): - raise ValueError("Length of `vols` must match `targets`.") + raise ValueError(f"Length of `asp_vols` {len(asp_vols)} must match `targets` {len(targets)}.") tip = next(self.current_tip) await self.pick_up_tips(tip) @@ -160,6 +161,7 @@ class LiquidHandlerAbstract(LiquidHandler): await self.discard_tips() except Exception as e: + traceback.print_exc() raise RuntimeError(f"Liquid addition failed: {e}") from e # --------------------------------------------------------------- diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index cc097e5..6dd6e71 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -88,6 +88,12 @@ class PRCXI9300Container(Plate): class PRCXI9300Handler(LiquidHandlerAbstract): + @property + def reset_ok(self) -> bool: + """检查设备是否已重置成功。""" + return self._unilabos_backend.is_reset_ok + + def __init__(self, deck: Deck, host: str, port: int, timeout: float, setup=True): tablets_info = [] count = 0 @@ -102,18 +108,18 @@ class PRCXI9300Handler(LiquidHandlerAbstract): async def create_protocol( self, - protocol_name: str, - protocol_description: str, - protocol_version: str, - protocol_author: str, - protocol_date: str, - protocol_type: str, + protocol_name: str = "", + protocol_description: str = "", + protocol_version: str = "", + protocol_author: str = "", + protocol_date: str = "", + protocol_type: str = "", none_keys: List[str] = [], ): self._unilabos_backend.create_protocol(protocol_name) async def run_protocol(self): - self._unilabos_backend.run_protocol() + return self._unilabos_backend.run_protocol() async def remove_liquid( self, @@ -299,6 +305,13 @@ class PRCXI9300Backend(LiquidHandlerBackend): """ _num_channels = 8 # 默认通道数为 8 + _is_reset_ok = False + + @property + def is_reset_ok(self) -> bool: + self._is_reset_ok = self.api_client.get_reset_status() + return self._is_reset_ok + matrix_info: MatrixInfo protocol_name: str steps_todo_list = [] @@ -323,19 +336,24 @@ class PRCXI9300Backend(LiquidHandlerBackend): self.steps_todo_list = [] def run_protocol(self): + assert self.is_reset_ok, "PRCXI9300Backend is not reset successfully. Please call setup() first." run_time = time.time() self.matrix_info = MatrixInfo( - MatrixId=f"matrix_{run_time}", + MatrixId=f"{int(run_time)}", MatrixName=f"protocol_{run_time}", MatrixCount=len(self.tablets_info), WorkTablets=self.tablets_info, ) - self.api_client.add_WorkTablet_Matrix(self.matrix_info) + print(json.dumps(self.matrix_info, indent=2)) + res = self.api_client.add_WorkTablet_Matrix(self.matrix_info) + assert res["Success"], f"Failed to create matrix: {res.get('Message', 'Unknown error')}" + print(f"PRCXI9300Backend created matrix with ID: {self.matrix_info['MatrixId']}, result: {res}") solution_id = self.api_client.add_solution( f"protocol_{run_time}", self.matrix_info["MatrixId"], self.steps_todo_list ) + print(f"PRCXI9300Backend created solution with ID: {solution_id}") self.api_client.load_solution(solution_id) - self.api_client.start() + return self.api_client.start() @classmethod def check_channels(cls, use_channels: List[int]) -> List[int]: @@ -350,6 +368,10 @@ class PRCXI9300Backend(LiquidHandlerBackend): try: if self._execute_setup: self.api_client.call("IAutomation", "Reset") + while not self.is_reset_ok: + print("Waiting for PRCXI9300 to reset...") + await asyncio.sleep(1) + print("PRCXI9300 reset successfully.") except ConnectionRefusedError as e: raise RuntimeError( f"Failed to connect to PRCXI9300 API at {self.host}:{self.port}. " @@ -363,6 +385,18 @@ class PRCXI9300Backend(LiquidHandlerBackend): """Pick up tips from the specified resource.""" # 12列,要PickUp A-H 1 # PlateNo = 1-6 # 2行3列 + print("!!!!!!!!!" * 10) + print(ops, "====="*10) + # plate: PRCXI9300Container = ops[0].resource.parent.parent + # deck: PRCXI9300Deck = plate.parent + # plate_index = deck.children.index(plate) + # tipspot = ops[0].resource + # tipspot_index = tipspot.parent.children.index(tipspot) + # print(f"PRCXI9300Backend pick_up_tips: plate_index={plate_index}, tipspot_index={tipspot_index}") + # print(f"PRCXI9300Backend pick_up_tips: plate_index={plate_index}, plate.name={plate.name}") + # print(plate._unilabos_state["Material"]) + # for op in ops: + # print(f"PRCXI9300Backend pick_up_tips: {op.resource.name}") PlateNo = 1 # 第一块板 hole_col = 2 # 第二列的8个孔 step = self.api_client.Load( @@ -406,10 +440,11 @@ class PRCXI9300Backend(LiquidHandlerBackend): print("PRCXI9300Backend drop_tips logged.") async def aspirate(self, ops: List[SingleChannelAspiration], use_channels: List[int] = None): - volumes = [op.volume for op in ops] - print(f"PRCXI9300Backend aspirate volumes: {volumes[0]} -> {int(volumes[0])} μL") - PlateNo = 1 - hole_col = 2 + volumes = [1] + # volumes = [op.volume for op in ops] + # print(f"PRCXI9300Backend aspirate volumes: {volumes[0]} -> {int(volumes[0])} μL") + PlateNo = 2 + hole_col = 4 step = self.api_client.Imbibing( "Left", dosage=int(volumes[0]), @@ -425,9 +460,10 @@ class PRCXI9300Backend(LiquidHandlerBackend): self.steps_todo_list.append(step) async def dispense(self, ops: List[SingleChannelDispense], use_channels: List[int] = None): - volumes = [op.volume for op in ops] - print(f"PRCXI9300Backend dispense volumes: {volumes[0]} -> {int(volumes[0])} μL") - PlateNo = 1 + volumes = [1] + # volumes = [op.volume for op in ops] + # print(f"PRCXI9300Backend dispense volumes: {volumes[0]} -> {int(volumes[0])} μL") + PlateNo = 2 hole_col = 2 step = self.api_client.Tapping( "Left", @@ -542,6 +578,11 @@ class PRCXI9300Api: """GetErrorCode""" return self.call("IAutomation", "GetErrorCode") + def get_reset_status(self) -> Optional[str]: + """GetErrorCode""" + res = self.call("IAutomation", "GetResetStatus") + return not res + def clear_error_code(self) -> bool: """RemoveErrorCodet""" return self.call("IAutomation", "RemoveErrorCodet") @@ -818,15 +859,59 @@ if __name__ == "__main__": "uuid": "57b1e4711e9e4a32b529f3132fc5931f", } }) + plate6 = PRCXI9300Container(name="plateT6", size_x=50, size_y=50, size_z=10, category="plate") + plate6.load_state({ + "Material": { + "uuid": "57b1e4711e9e4a32b529f3132fc5931f", + } + }) + + from pylabrobot.resources.opentrons.tip_racks import tipone_96_tiprack_200ul + from pylabrobot.resources.opentrons.plates import corning_96_wellplate_360ul_flat + tip_rack = tipone_96_tiprack_200ul("TipRack") + well_containers = corning_96_wellplate_360ul_flat("Plate") + # from pprint import pprint + # pprint(well_containers.children) + plate1.assign_child_resource(tip_rack, location=Coordinate(0, 0, 0)) + plate2.assign_child_resource(well_containers, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate1, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate2, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate3, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate4, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate5, location=Coordinate(0, 0, 0)) - - handler = PRCXI9300Handler(deck=deck, host="192.168.3.9", port=9999, timeout=10.0, setup=True) + deck.assign_child_resource(plate6, location=Coordinate(0, 0, 0)) + input("debug....") + handler = PRCXI9300Handler(deck=deck, host="192.168.3.9", port=9999, timeout=10.0, setup=False) + handler.set_tiprack([tip_rack]) # Set the tip rack for the handler asyncio.run(handler.setup()) # Initialize the handler and setup the connection + asyncio.run(handler.create_protocol(protocol_name="Test Protocol")) # Initialize the backend and setup the connection + input("Creating protocol...") + # asyncio.run(handler.pick_up_tips(tip_rack.children[:8],[0,1,2,3,4,5,6,7])) + # asyncio.run(handler.aspirate(tip_rack.children[:8],[0,1,2,3,4,5,6,7])) + # asyncio.run(handler.dispense(tip_rack.children[:8],[0,1,2,3,4,5,6,7])) + # asyncio.run(handler.drop_tips(tip_rack.children[:8],[0,1,2,3,4,5,6,7])) + asyncio.run(handler.pick_up_tips([], [], [])) + asyncio.run(handler.aspirate([], [], [])) + asyncio.run(handler.dispense([], [], [])) + asyncio.run(handler.drop_tips([], [], [])) + # asyncio.run(handler.add_liquid( + # asp_vols=[100]*8, + # dis_vols=[100]*8, + # reagent_sources=well_containers.children[-8:], + # targets=well_containers.children[:8], + # use_channels=[0, 1, 2, 3, 4, 5, 6, 7], + # flow_rates=[None] * 8, + # offsets=[Coordinate(0, 0, 0)] * 8, + # liquid_height=[None] * 8, + # blow_out_air_volume=[None] * 8, + # spread="wide", + # )) + input("pick_up_tips add step") + asyncio.run(handler.run_protocol()) # Run the protocol + input("Running protocol...") + print(json.dumps(handler._unilabos_backend.steps_todo_list, indent=2)) # Print matrix info + input("Press Enter to continue...") # Wait for user input before proceeding diff --git a/unilabos/ros/msgs/message_converter.py b/unilabos/ros/msgs/message_converter.py index f0e9468..9dceef8 100644 --- a/unilabos/ros/msgs/message_converter.py +++ b/unilabos/ros/msgs/message_converter.py @@ -132,7 +132,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) if not isinstance(x, dict) else Point(x=x.get("x", 0.0), y=x.get("y", 0.0), z=x.get("z", 0.0)), + Point: lambda x: Point(x=x.x, y=x.y, z=x.z) if not isinstance(x, dict) else Point(x=float(x.get("x", 0.0)), y=float(x.get("y", 0.0)), z=float(x.get("z", 0.0))), Resource: lambda x: Resource( id=x.get("id", ""), name=x.get("name", ""), From 7b68545db362a54680e4143aa48e5dd03f44ff00 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Fri, 11 Jul 2025 18:11:44 +0800 Subject: [PATCH 33/96] prcxi blending --- .../devices/liquid_handling/prcxi/prcxi.py | 37 ++++++++++++++++++- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index 6dd6e71..547a868 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -24,7 +24,7 @@ from pylabrobot.liquid_handling.standard import ( ResourceMove, ResourceDrop, ) -from pylabrobot.resources import Tip, Deck, Plate, Well, TipRack, Resource, Container, Coordinate, TipSpot +from pylabrobot.resources import Tip, Deck, Plate, Well, TipRack, Resource, Container, Coordinate, TipSpot, Trash from unilabos.devices.liquid_handling.liquid_handler_abstract import LiquidHandlerAbstract @@ -260,7 +260,7 @@ class PRCXI9300Handler(LiquidHandlerAbstract): mix_rate: Optional[float] = None, none_keys: List[str] = [], ): - return await super().mix(targets, mix_time, mix_vol, height_to_bottom, offsets, mix_rate, none_keys) + return await self._unilabos_backend.mix(targets, mix_time, mix_vol, height_to_bottom, offsets, mix_rate, none_keys) def iter_tips(self, tip_racks: Sequence[TipRack]) -> Iterator[Resource]: return super().iter_tips(tip_racks) @@ -278,6 +278,11 @@ class PRCXI9300Handler(LiquidHandlerAbstract): return await super().aspirate(resources, vols, use_channels, flow_rates, offsets, liquid_height, blow_out_air_volume, spread, **backend_kwargs) + async def drop_tips(self, tip_spots: Sequence[Union[TipSpot, Trash]], use_channels: Optional[List[int]] = None, + offsets: Optional[List[Coordinate]] = None, allow_nonzero_volume: bool = False, + **backend_kwargs): + return await super().drop_tips(tip_spots, use_channels, offsets, allow_nonzero_volume, **backend_kwargs) + async def dispense(self, resources: Sequence[Container], vols: List[float], use_channels: Optional[List[int]] = None, flow_rates: Optional[List[Optional[float]]] = None, offsets: Optional[List[Coordinate]] = None, @@ -439,6 +444,33 @@ class PRCXI9300Backend(LiquidHandlerBackend): raise ValueError("No matching Load step found for drop_tips.") print("PRCXI9300Backend drop_tips logged.") + async def mix( + self, + targets: Sequence[Container], + mix_time: int = None, + mix_vol: Optional[int] = None, + height_to_bottom: Optional[float] = None, + offsets: Optional[Coordinate] = None, + mix_rate: Optional[float] = None, + none_keys: List[str] = [], + ): + volumes = [1] + PlateNo = 2 + hole_col = 2 + step = self.api_client.Blending( + "Left", + dosage=int(volumes[0]), + plate_no=PlateNo, + is_whole_plate=False, + hole_row=1, + hole_col=hole_col, + blending_times=0, + balance_height=0, + plate_or_hole=f"H{hole_col}-8,T{PlateNo}", + hole_numbers="1,2,3,4,5,6,7,8", + ) + self.steps_todo_list.append(step) + async def aspirate(self, ops: List[SingleChannelAspiration], use_channels: List[int] = None): volumes = [1] # volumes = [op.volume for op in ops] @@ -893,6 +925,7 @@ if __name__ == "__main__": asyncio.run(handler.pick_up_tips([], [], [])) asyncio.run(handler.aspirate([], [], [])) asyncio.run(handler.dispense([], [], [])) + asyncio.run(handler.mix([], mix_time=3, mix_vol=10, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) asyncio.run(handler.drop_tips([], [], [])) # asyncio.run(handler.add_liquid( From 0e11dacead770ec30b4adf69082beda03af85845 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Fri, 11 Jul 2025 18:15:41 +0800 Subject: [PATCH 34/96] assert blending_times > 0 --- unilabos/devices/liquid_handling/prcxi/prcxi.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index 547a868..b28f0d2 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -457,6 +457,8 @@ class PRCXI9300Backend(LiquidHandlerBackend): volumes = [1] PlateNo = 2 hole_col = 2 + blending_times = 1 + assert blending_times > 0 step = self.api_client.Blending( "Left", dosage=int(volumes[0]), @@ -464,7 +466,7 @@ class PRCXI9300Backend(LiquidHandlerBackend): is_whole_plate=False, hole_row=1, hole_col=hole_col, - blending_times=0, + blending_times=blending_times, balance_height=0, plate_or_hole=f"H{hole_col}-8,T{PlateNo}", hole_numbers="1,2,3,4,5,6,7,8", From 5d214ebcd83a958b9126d88829479ff447d45c50 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Fri, 11 Jul 2025 18:20:50 +0800 Subject: [PATCH 35/96] update prcxi --- unilabos/registry/devices/liquid_handler.yaml | 807 +++++++++++++++++- 1 file changed, 791 insertions(+), 16 deletions(-) diff --git a/unilabos/registry/devices/liquid_handler.yaml b/unilabos/registry/devices/liquid_handler.yaml index 5ba410d..617723d 100644 --- a/unilabos/registry/devices/liquid_handler.yaml +++ b/unilabos/registry/devices/liquid_handler.yaml @@ -6067,6 +6067,202 @@ liquid_handler.biomek: liquid_handler.prcxi: class: action_value_mappings: + aspirate: + feedback: {} + goal: {} + goal_default: + blow_out_air_volume: + - 0.0 + flow_rates: + - 0.0 + liquid_height: + - 0.0 + offsets: + - x: 0.0 + y: 0.0 + z: 0.0 + resources: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + spread: '' + use_channels: + - 0 + vols: + - 0.0 + handles: [] + result: {} + schema: + description: ROS Action LiquidHandlerAspirate 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerAspirate_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + blow_out_air_volume: + items: + type: number + type: array + flow_rates: + items: + type: number + type: array + liquid_height: + items: + type: number + type: array + offsets: + items: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + type: array + resources: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + spread: + type: string + use_channels: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + vols: + items: + type: number + type: array + required: + - resources + - vols + - use_channels + - flow_rates + - offsets + - liquid_height + - blow_out_air_volume + - spread + title: LiquidHandlerAspirate_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerAspirate_Result + type: object + required: + - goal + title: LiquidHandlerAspirate + type: object + type: LiquidHandlerAspirate auto-add_liquid: feedback: {} goal: {} @@ -6197,12 +6393,12 @@ liquid_handler.prcxi: goal: {} goal_default: none_keys: [] - protocol_author: null - protocol_date: null - protocol_description: null - protocol_name: null - protocol_type: null - protocol_version: null + protocol_author: '' + protocol_date: '' + protocol_description: '' + protocol_name: '' + protocol_type: '' + protocol_version: '' handles: [] result: {} schema: @@ -6215,24 +6411,24 @@ liquid_handler.prcxi: default: [] type: array protocol_author: + default: '' type: string protocol_date: + default: '' type: string protocol_description: + default: '' type: string protocol_name: + default: '' type: string protocol_type: + default: '' type: string protocol_version: + default: '' type: string - required: - - protocol_name - - protocol_description - - protocol_version - - protocol_author - - protocol_date - - protocol_type + required: [] type: object result: {} required: @@ -6344,6 +6540,40 @@ liquid_handler.prcxi: title: dispense参数 type: object type: UniLabJsonCommandAsync + auto-drop_tips: + feedback: {} + goal: {} + goal_default: + allow_nonzero_volume: false + offsets: null + tip_spots: null + use_channels: null + handles: [] + result: {} + schema: + description: drop_tips的参数schema + properties: + feedback: {} + goal: + properties: + allow_nonzero_volume: + default: false + type: boolean + offsets: + type: string + tip_spots: + type: string + use_channels: + type: string + required: + - tip_spots + type: object + result: {} + required: + - goal + title: drop_tips参数 + type: object + type: UniLabJsonCommandAsync auto-iter_tips: feedback: {} goal: {} @@ -6698,6 +6928,547 @@ liquid_handler.prcxi: title: transfer_liquid参数 type: object type: UniLabJsonCommandAsync + dispense: + feedback: {} + goal: {} + goal_default: + blow_out_air_volume: + - 0 + flow_rates: + - 0.0 + offsets: + - x: 0.0 + y: 0.0 + z: 0.0 + resources: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + spread: '' + use_channels: + - 0 + vols: + - 0.0 + handles: [] + result: {} + schema: + description: ROS Action LiquidHandlerDispense 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerDispense_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + blow_out_air_volume: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + flow_rates: + items: + type: number + type: array + offsets: + items: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + type: array + resources: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + spread: + type: string + use_channels: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + vols: + items: + type: number + type: array + required: + - resources + - vols + - use_channels + - flow_rates + - offsets + - blow_out_air_volume + - spread + title: LiquidHandlerDispense_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerDispense_Result + type: object + required: + - goal + title: LiquidHandlerDispense + type: object + type: LiquidHandlerDispense + drop_tips: + feedback: {} + goal: {} + goal_default: + allow_nonzero_volume: false + offsets: + - x: 0.0 + y: 0.0 + z: 0.0 + tip_spots: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + use_channels: + - 0 + handles: [] + result: {} + schema: + description: ROS Action LiquidHandlerDropTips 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerDropTips_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + allow_nonzero_volume: + type: boolean + offsets: + items: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + type: array + tip_spots: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + use_channels: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + required: + - tip_spots + - use_channels + - offsets + - allow_nonzero_volume + title: LiquidHandlerDropTips_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerDropTips_Result + type: object + required: + - goal + title: LiquidHandlerDropTips + type: object + type: LiquidHandlerDropTips + mix: + feedback: {} + goal: {} + goal_default: + height_to_bottom: 0.0 + mix_rate: 0.0 + mix_time: 0 + mix_vol: 0 + none_keys: + - '' + offsets: + - x: 0.0 + y: 0.0 + z: 0.0 + targets: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + handles: [] + result: {} + schema: + description: ROS Action LiquidHandlerMix 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerMix_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + height_to_bottom: + type: number + mix_rate: + type: number + mix_time: + maximum: 2147483647 + minimum: -2147483648 + type: integer + mix_vol: + maximum: 2147483647 + minimum: -2147483648 + type: integer + none_keys: + items: + type: string + type: array + offsets: + items: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + type: array + targets: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + required: + - targets + - mix_time + - mix_vol + - height_to_bottom + - offsets + - mix_rate + - none_keys + title: LiquidHandlerMix_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerMix_Result + type: object + required: + - goal + title: LiquidHandlerMix + type: object + type: LiquidHandlerMix pick_up_tips: feedback: {} goal: @@ -6866,7 +7637,8 @@ liquid_handler.prcxi: type: object type: LiquidHandlerPickUpTips module: unilabos.devices.liquid_handling.prcxi.prcxi:PRCXI9300Handler - status_types: {} + status_types: + reset_ok: bool type: python description: prcxi液体处理器设备,基于pylabrobot控制 handles: [] @@ -6892,8 +7664,11 @@ liquid_handler.prcxi: - timeout type: object data: - properties: {} - required: [] + properties: + reset_ok: + type: boolean + required: + - reset_ok type: object liquid_handler.revvity: class: From 694a779c6659d845b61611769737d96191c01906 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Fri, 11 Jul 2025 18:43:11 +0800 Subject: [PATCH 36/96] update prcxi registry --- unilabos/registry/devices/liquid_handler.yaml | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/unilabos/registry/devices/liquid_handler.yaml b/unilabos/registry/devices/liquid_handler.yaml index 617723d..8dfd600 100644 --- a/unilabos/registry/devices/liquid_handler.yaml +++ b/unilabos/registry/devices/liquid_handler.yaml @@ -6069,7 +6069,15 @@ liquid_handler.prcxi: action_value_mappings: aspirate: feedback: {} - goal: {} + goal: + blow_out_air_volume: blow_out_air_volume + end_delay: end_delay + flow_rates: flow_rates + liquid_height: liquid_height + offsets: offsets + resources: resources + use_channels: use_channels + vols: vols goal_default: blow_out_air_volume: - 0.0 @@ -6930,7 +6938,14 @@ liquid_handler.prcxi: type: UniLabJsonCommandAsync dispense: feedback: {} - goal: {} + goal: + blow_out_air_volume: blow_out_air_volume + flow_rates: flow_rates + offsets: offsets + resources: resources + spread: spread + use_channels: use_channels + vols: vols goal_default: blow_out_air_volume: - 0 @@ -7289,7 +7304,14 @@ liquid_handler.prcxi: type: LiquidHandlerDropTips mix: feedback: {} - goal: {} + goal: + height_to_bottom: height_to_bottom + mix_rate: mix_rate + mix_time: mix_time + mix_vol: mix_vol + none_keys: none_keys + offsets: offsets + targets: targets goal_default: height_to_bottom: 0.0 mix_rate: 0.0 From 4456529cfbaf5c2dba3f890b07a0d67d2f753eed Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Mon, 14 Jul 2025 15:23:31 +0800 Subject: [PATCH 37/96] Update prcxi.py to fit the function in unilabos. --- .../devices/liquid_handling/prcxi/prcxi.py | 225 +++++++++++++----- unilabos/utils/log.py | 4 +- 2 files changed, 161 insertions(+), 68 deletions(-) diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index b28f0d2..9e2b35b 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -275,6 +275,7 @@ class PRCXI9300Handler(LiquidHandlerAbstract): liquid_height: Optional[List[Optional[float]]] = None, blow_out_air_volume: Optional[List[Optional[float]]] = None, spread: Literal["wide", "tight", "custom"] = "wide", **backend_kwargs): + return await super().aspirate(resources, vols, use_channels, flow_rates, offsets, liquid_height, blow_out_air_volume, spread, **backend_kwargs) @@ -349,7 +350,7 @@ class PRCXI9300Backend(LiquidHandlerBackend): MatrixCount=len(self.tablets_info), WorkTablets=self.tablets_info, ) - print(json.dumps(self.matrix_info, indent=2)) + #print(json.dumps(self.matrix_info, indent=2)) res = self.api_client.add_WorkTablet_Matrix(self.matrix_info) assert res["Success"], f"Failed to create matrix: {res.get('Message', 'Unknown error')}" print(f"PRCXI9300Backend created matrix with ID: {self.matrix_info['MatrixId']}, result: {res}") @@ -388,22 +389,30 @@ class PRCXI9300Backend(LiquidHandlerBackend): async def pick_up_tips(self, ops: List[Pickup], use_channels: List[int] = None): """Pick up tips from the specified resource.""" - # 12列,要PickUp A-H 1 - # PlateNo = 1-6 # 2行3列 - print("!!!!!!!!!" * 10) - print(ops, "====="*10) - # plate: PRCXI9300Container = ops[0].resource.parent.parent - # deck: PRCXI9300Deck = plate.parent - # plate_index = deck.children.index(plate) - # tipspot = ops[0].resource - # tipspot_index = tipspot.parent.children.index(tipspot) - # print(f"PRCXI9300Backend pick_up_tips: plate_index={plate_index}, tipspot_index={tipspot_index}") - # print(f"PRCXI9300Backend pick_up_tips: plate_index={plate_index}, plate.name={plate.name}") - # print(plate._unilabos_state["Material"]) - # for op in ops: - # print(f"PRCXI9300Backend pick_up_tips: {op.resource.name}") - PlateNo = 1 # 第一块板 - hole_col = 2 # 第二列的8个孔 + + if len(ops) != 8: + raise ValueError(f"PRCXI9300Backend pick_up_tips: Expected 8 pickups, got {len(ops)}") + + plate_indexes = [] + for op in ops: + plate = op.resource.parent.parent + deck = plate.parent + plate_index = deck.children.index(plate) + plate_indexes.append(plate_index) + if len(set(plate_indexes)) != 1: + raise ValueError("All pickups must be from the same plate. Found different plates: " + str(plate_indexes)) + + tip_columns = [] + for op in ops: + tipspot = op.resource + tipspot_index = tipspot.parent.children.index(tipspot) + tip_columns.append(tipspot_index // 8) + if len(set(tip_columns)) != 1: + raise ValueError("All pickups must be from the same tip column. Found different columns: " + str(tip_columns)) + + PlateNo = plate_indexes[0] + 1 + hole_col = tip_columns[0] + 1 + step = self.api_client.Load( "Left", dosage=0, @@ -417,11 +426,35 @@ class PRCXI9300Backend(LiquidHandlerBackend): hole_numbers="1,2,3,4,5,6,7,8", ) self.steps_todo_list.append(step) - print("PRCXI9300Backend pick_up_tips logged.") + async def drop_tips(self, ops: List[Drop], use_channels: List[int] = None): - PlateNo = 1 - hole_col = 2 + + """Pick up tips from the specified resource.""" + + if len(ops) != 8: + raise ValueError(f"PRCXI9300Backend drop_tips: Expected 8 pickups, got {len(ops)}") + + plate_indexes = [] + for op in ops: + plate = op.resource.parent.parent + deck = plate.parent + plate_index = deck.children.index(plate) + plate_indexes.append(plate_index) + if len(set(plate_indexes)) != 1: + raise ValueError("All drop_tips must be from the same plate. Found different plates: " + str(plate_indexes)) + + tip_columns = [] + for op in ops: + tipspot = op.resource + tipspot_index = tipspot.parent.children.index(tipspot) + tip_columns.append(tipspot_index // 8) + if len(set(tip_columns)) != 1: + raise ValueError("All drop_tips must be from the same tip column. Found different columns: " + str(tip_columns)) + + PlateNo = plate_indexes[0] + 1 + hole_col = tip_columns[0] + 1 + step = self.api_client.UnLoad( "Left", dosage=0, @@ -434,15 +467,7 @@ class PRCXI9300Backend(LiquidHandlerBackend): plate_or_hole=f"H{hole_col}-8,T{PlateNo}", hole_numbers="1,2,3,4,5,6,7,8", ) - allow_drop = False - for s in self.steps_todo_list: - if s.get("Function") == "Load": - self.steps_todo_list.append(step) - allow_drop = True - break - if not allow_drop: - raise ValueError("No matching Load step found for drop_tips.") - print("PRCXI9300Backend drop_tips logged.") + self.steps_todo_list.append(step) async def mix( self, @@ -454,19 +479,41 @@ class PRCXI9300Backend(LiquidHandlerBackend): mix_rate: Optional[float] = None, none_keys: List[str] = [], ): - volumes = [1] - PlateNo = 2 - hole_col = 2 - blending_times = 1 - assert blending_times > 0 + + """Mix liquid in the specified resources.""" + + if len(targets) != 8: + raise ValueError(f"PRCXI9300Backend aspirate: Expected 8 aspirate, got {len(targets)}") + + plate_indexes = [] + for op in targets: + deck = op.parent.parent.parent + plate = op.parent.parent + plate_index = deck.children.index(plate) + plate_indexes.append(plate_index) + + if len(set(plate_indexes)) != 1: + raise ValueError("All pickups must be from the same plate. Found different plates: " + str(plate_indexes)) + + tip_columns = [] + for op in targets: + tipspot_index = op.parent.children.index(op) + tip_columns.append(tipspot_index // 8) + + if len(set(tip_columns)) != 1: + raise ValueError("All pickups must be from the same tip column. Found different columns: " + str(tip_columns)) + + PlateNo = plate_indexes[0] + 1 + hole_col = tip_columns[0] + 1 + assert mix_time > 0 step = self.api_client.Blending( "Left", - dosage=int(volumes[0]), + dosage=mix_vol, plate_no=PlateNo, is_whole_plate=False, hole_row=1, hole_col=hole_col, - blending_times=blending_times, + blending_times=mix_time, balance_height=0, plate_or_hole=f"H{hole_col}-8,T{PlateNo}", hole_numbers="1,2,3,4,5,6,7,8", @@ -474,11 +521,38 @@ class PRCXI9300Backend(LiquidHandlerBackend): self.steps_todo_list.append(step) async def aspirate(self, ops: List[SingleChannelAspiration], use_channels: List[int] = None): - volumes = [1] - # volumes = [op.volume for op in ops] - # print(f"PRCXI9300Backend aspirate volumes: {volumes[0]} -> {int(volumes[0])} μL") - PlateNo = 2 - hole_col = 4 + + """Aspirate liquid from the specified resources.""" + + if len(ops) != 8: + raise ValueError(f"PRCXI9300Backend aspirate: Expected 8 aspirate, got {len(ops)}") + + plate_indexes = [] + for op in ops: + plate = op.resource.parent.parent + deck = plate.parent + plate_index = deck.children.index(plate) + plate_indexes.append(plate_index) + + if len(set(plate_indexes)) != 1: + raise ValueError("All pickups must be from the same plate. Found different plates: " + str(plate_indexes)) + + tip_columns = [] + for op in ops: + tipspot = op.resource + tipspot_index = tipspot.parent.children.index(tipspot) + tip_columns.append(tipspot_index // 8) + + if len(set(tip_columns)) != 1: + raise ValueError("All pickups must be from the same tip column. Found different columns: " + str(tip_columns)) + + volumes = [op.volume for op in ops] + if len(set(volumes)) != 1: + raise ValueError("All aspirate volumes must be the same. Found different volumes: " + str(volumes)) + + PlateNo = plate_indexes[0] + 1 + hole_col = tip_columns[0] + 1 + step = self.api_client.Imbibing( "Left", dosage=int(volumes[0]), @@ -493,12 +567,40 @@ class PRCXI9300Backend(LiquidHandlerBackend): ) self.steps_todo_list.append(step) + async def dispense(self, ops: List[SingleChannelDispense], use_channels: List[int] = None): - volumes = [1] - # volumes = [op.volume for op in ops] - # print(f"PRCXI9300Backend dispense volumes: {volumes[0]} -> {int(volumes[0])} μL") - PlateNo = 2 - hole_col = 2 + + """Dispense liquid into the specified resources.""" + + if len(ops) != 8: + raise ValueError(f"PRCXI9300Backend dispense: Expected 8 dispense, got {len(ops)}") + + plate_indexes = [] + for op in ops: + plate = op.resource.parent.parent + deck = plate.parent + plate_index = deck.children.index(plate) + plate_indexes.append(plate_index) + + if len(set(plate_indexes)) != 1: + raise ValueError("All dispense must be from the same plate. Found different plates: " + str(plate_indexes)) + + tip_columns = [] + for op in ops: + tipspot = op.resource + tipspot_index = tipspot.parent.children.index(tipspot) + tip_columns.append(tipspot_index // 8) + + if len(set(tip_columns)) != 1: + raise ValueError("All dispense must be from the same tip column. Found different columns: " + str(tip_columns)) + + volumes = [op.volume for op in ops] + if len(set(volumes)) != 1: + raise ValueError("All dispense volumes must be the same. Found different volumes: " + str(volumes)) + + PlateNo = plate_indexes[0] + 1 + hole_col = tip_columns[0] + 1 + step = self.api_client.Tapping( "Left", dosage=int(volumes[0]), @@ -914,22 +1016,17 @@ if __name__ == "__main__": deck.assign_child_resource(plate4, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate5, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate6, location=Coordinate(0, 0, 0)) - input("debug....") + handler = PRCXI9300Handler(deck=deck, host="192.168.3.9", port=9999, timeout=10.0, setup=False) handler.set_tiprack([tip_rack]) # Set the tip rack for the handler asyncio.run(handler.setup()) # Initialize the handler and setup the connection asyncio.run(handler.create_protocol(protocol_name="Test Protocol")) # Initialize the backend and setup the connection - input("Creating protocol...") - # asyncio.run(handler.pick_up_tips(tip_rack.children[:8],[0,1,2,3,4,5,6,7])) - # asyncio.run(handler.aspirate(tip_rack.children[:8],[0,1,2,3,4,5,6,7])) - # asyncio.run(handler.dispense(tip_rack.children[:8],[0,1,2,3,4,5,6,7])) - # asyncio.run(handler.drop_tips(tip_rack.children[:8],[0,1,2,3,4,5,6,7])) - asyncio.run(handler.pick_up_tips([], [], [])) - asyncio.run(handler.aspirate([], [], [])) - asyncio.run(handler.dispense([], [], [])) - asyncio.run(handler.mix([], mix_time=3, mix_vol=10, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) - asyncio.run(handler.drop_tips([], [], [])) - + asyncio.run(handler.pick_up_tips(tip_rack.children[:8],[0,1,2,3,4,5,6,7])) + asyncio.run(handler.aspirate(well_containers.children[:8],[50]*8, [0,1,2,3,4,5,6,7])) + asyncio.run(handler.dispense(well_containers.children[:8],[50]*8,[0,1,2,3,4,5,6,7])) + asyncio.run(handler.drop_tips(tip_rack.children[8:16],[0,1,2,3,4,5,6,7])) + asyncio.run(handler.mix(well_containers.children[:8], mix_time=3, mix_vol=50, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) + print(json.dumps(handler._unilabos_backend.steps_todo_list, indent=2)) # Print matrix info # asyncio.run(handler.add_liquid( # asp_vols=[100]*8, # dis_vols=[100]*8, @@ -942,12 +1039,8 @@ if __name__ == "__main__": # blow_out_air_volume=[None] * 8, # spread="wide", # )) - input("pick_up_tips add step") + # input("pick_up_tips add step") asyncio.run(handler.run_protocol()) # Run the protocol - input("Running protocol...") - print(json.dumps(handler._unilabos_backend.steps_todo_list, indent=2)) # Print matrix info - - - - input("Press Enter to continue...") # Wait for user input before proceeding - print("PRCXI9300Handler initialized with deck and host settings.") + # input("Running protocol...") + # input("Press Enter to continue...") # Wait for user input before proceeding + # print("PRCXI9300Handler initialized with deck and host settings.") diff --git a/unilabos/utils/log.py b/unilabos/utils/log.py index 61c95a1..eb04fd0 100644 --- a/unilabos/utils/log.py +++ b/unilabos/utils/log.py @@ -148,7 +148,7 @@ def configure_logger(): """配置日志记录器""" # 获取根日志记录器 root_logger = logging.getLogger() - root_logger.setLevel(logging.DEBUG) # 修改为DEBUG以显示所有级别 + root_logger.setLevel(logging.INFO) # 修改为DEBUG以显示所有级别 # 移除已存在的处理器 for handler in root_logger.handlers[:]: @@ -156,7 +156,7 @@ def configure_logger(): # 创建控制台处理器 console_handler = logging.StreamHandler() - console_handler.setLevel(logging.DEBUG) # 修改为DEBUG以显示所有级别 + console_handler.setLevel(logging.INFO) # 修改为DEBUG以显示所有级别 # 使用自定义的颜色格式化器 color_formatter = ColoredFormatter() From 10cb645191a149057a726118871ccb826b701aeb Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Tue, 15 Jul 2025 13:56:34 +0800 Subject: [PATCH 38/96] =?UTF-8?q?=E4=B8=8D=E7=94=9F=E6=88=90=E5=B7=B2?= =?UTF-8?q?=E9=85=8D=E7=BD=AEaction=E7=9A=84=E5=8A=A8=E4=BD=9C=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0prcxi=E7=9A=84debug=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + test/experiments/prcxi.json | 3 ++- .../devices/liquid_handling/prcxi/prcxi.py | 18 ++++++++++++------ unilabos/registry/registry.py | 3 ++- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 9ba3b0e..728d704 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ configs/ +temp/ ## Python # Byte-compiled / optimized / DLL files diff --git a/test/experiments/prcxi.json b/test/experiments/prcxi.json index e362558..b483a3a 100644 --- a/test/experiments/prcxi.json +++ b/test/experiments/prcxi.json @@ -19,7 +19,8 @@ "host": "192.168.3.9", "port": 9999, "timeout": 10.0, - "setup": true + "setup": false, + "debug": true }, "data": {}, "children": [ diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index 9e2b35b..e711993 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -91,10 +91,11 @@ class PRCXI9300Handler(LiquidHandlerAbstract): @property def reset_ok(self) -> bool: """检查设备是否已重置成功。""" + if self._unilabos_backend.debug: + return True return self._unilabos_backend.is_reset_ok - - def __init__(self, deck: Deck, host: str, port: int, timeout: float, setup=True): + def __init__(self, deck: Deck, host: str, port: int, timeout: float, setup=True, debug=False): tablets_info = [] count = 0 for child in deck.children: @@ -103,7 +104,7 @@ class PRCXI9300Handler(LiquidHandlerAbstract): tablets_info.append( WorkTablets(Number=count, Code=f"T{count}", Material=child._unilabos_state["Material"]) ) - self._unilabos_backend = PRCXI9300Backend(tablets_info, host, port, timeout, setup) + self._unilabos_backend = PRCXI9300Backend(tablets_info, host, port, timeout, setup, debug) super().__init__(backend=self._unilabos_backend, deck=deck) async def create_protocol( @@ -329,13 +330,15 @@ class PRCXI9300Backend(LiquidHandlerBackend): port: int = 9999, timeout: float = 10.0, setup=True, + debug=False, ) -> None: super().__init__() self.tablets_info = tablets_info - self.api_client = PRCXI9300Api(host, port, timeout) + self.api_client = PRCXI9300Api(host, port, timeout, debug) self.host, self.port, self.timeout = host, port, timeout self._num_channels = 8 self._execute_setup = setup + self.debug = debug def create_protocol(self, protocol_name): self.protocol_name = protocol_name @@ -648,14 +651,17 @@ class PRCXI9300Backend(LiquidHandlerBackend): class PRCXI9300Api: - def __init__(self, host: str = "127.0.0.1", port: int = 9999, timeout: float = 10.0) -> None: + def __init__(self, host: str = "127.0.0.1", port: int = 9999, timeout: float = 10.0, debug: bool = False) -> None: self.host, self.port, self.timeout = host, port, timeout + self.debug = debug @staticmethod def _len_prefix(n: int) -> bytes: return bytes.fromhex(format(n, "016x")) def _raw_request(self, payload: str) -> str: + if self.debug: + return " " with contextlib.closing(socket.socket()) as sock: sock.settimeout(self.timeout) sock.connect((self.host, self.port)) @@ -1017,7 +1023,7 @@ if __name__ == "__main__": deck.assign_child_resource(plate5, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate6, location=Coordinate(0, 0, 0)) - handler = PRCXI9300Handler(deck=deck, host="192.168.3.9", port=9999, timeout=10.0, setup=False) + handler = PRCXI9300Handler(deck=deck, host="192.168.3.9", port=9999, timeout=10.0, setup=False, debug=True) handler.set_tiprack([tip_rack]) # Set the tip rack for the handler asyncio.run(handler.setup()) # Initialize the handler and setup the connection asyncio.run(handler.create_protocol(protocol_name="Test Protocol")) # Initialize the backend and setup the connection diff --git a/unilabos/registry/registry.py b/unilabos/registry/registry.py index c5a6981..96d74d8 100644 --- a/unilabos/registry/registry.py +++ b/unilabos/registry/registry.py @@ -365,7 +365,8 @@ class Registry: "goal_default": {i["name"]: i["default"] for i in v["args"]}, "handles": [], } - for k, v in enhanced_info["action_methods"].items() + # 不生成已配置action的动作 + for k, v in enhanced_info["action_methods"].items() if k not in device_config["class"]["action_value_mappings"] } ) device_config["init_param_schema"] = {} From f9aae441747c4d12a7c69a65265a931e92dc0fb4 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Wed, 16 Jul 2025 01:05:16 +0800 Subject: [PATCH 39/96] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E8=A1=A8=E7=89=88=E6=9C=AC=E5=8F=82=E6=95=B0=EF=BC=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=B0=86auto-=E6=8C=87=E4=BB=A4=E4=BA=BA=E5=B7=A5?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E5=90=8E=E9=9D=9Eauto=EF=BC=8C=E4=B8=8D?= =?UTF-8?q?=E7=94=9F=E6=88=90=E4=BA=BA=E5=B7=A5=E5=B7=B2=E6=A3=80=E6=9F=A5?= =?UTF-8?q?=E7=9A=84=E6=8C=87=E4=BB=A4=EF=BC=8C=E5=8F=96=E6=B6=88=E4=B8=8D?= =?UTF-8?q?=E5=BF=85=E8=A6=81=E7=9A=84description=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- unilabos/registry/devices/camera.yaml | 6 +- .../devices/characterization_optic.yaml | 52 +- unilabos/registry/devices/hotel.yaml | 2 +- .../registry/devices/laiyu_add_solid.yaml | 221 +-- unilabos/registry/devices/liquid_handler.yaml | 879 +----------- unilabos/registry/devices/mock_devices.yaml | 1245 ----------------- unilabos/registry/devices/moveit_config.yaml | 166 +-- .../devices/organic_miscellaneous.yaml | 95 +- unilabos/registry/devices/pump_and_valve.yaml | 79 +- unilabos/registry/devices/robot_agv.yaml | 31 +- unilabos/registry/devices/robot_arm.yaml | 37 +- unilabos/registry/devices/robot_gripper.yaml | 54 +- .../registry/devices/robot_linear_motion.yaml | 77 +- unilabos/registry/devices/sim_nodes.yaml | 2 +- unilabos/registry/devices/temperature.yaml | 161 +-- .../registry/devices/vacuum_and_purge.yaml | 150 +- unilabos/registry/devices/virtual_device.yaml | 877 ------------ unilabos/registry/devices/work_station.yaml | 78 -- unilabos/registry/devices/zhida_hplc.yaml | 59 +- unilabos/registry/registry.py | 86 +- unilabos/ros/msgs/message_converter.py | 170 +-- unilabos/ros/nodes/base_device_node.py | 2 +- unilabos/ros/nodes/presets/host_node.py | 2 +- unilabos/ros/nodes/presets/protocol_node.py | 2 +- 24 files changed, 247 insertions(+), 4286 deletions(-) diff --git a/unilabos/registry/devices/camera.yaml b/unilabos/registry/devices/camera.yaml index 55f5246..788e714 100644 --- a/unilabos/registry/devices/camera.yaml +++ b/unilabos/registry/devices/camera.yaml @@ -8,7 +8,7 @@ camera: handles: [] result: {} schema: - description: destroy_node的参数schema + description: 用于安全地关闭摄像头设备,释放摄像头资源,停止视频采集和发布服务。调用此函数将清理OpenCV摄像头连接并销毁ROS2节点。 properties: feedback: {} goal: @@ -28,7 +28,7 @@ camera: handles: [] result: {} schema: - description: timer_callback的参数schema + description: 定时器回调函数的参数schema。此函数负责定期采集摄像头视频帧,将OpenCV格式的图像转换为ROS Image消息格式,并发布到指定的视频话题。默认以10Hz频率执行,确保视频流的连续性和实时性。 properties: feedback: {} goal: @@ -44,7 +44,7 @@ camera: module: unilabos.ros.nodes.presets.camera:VideoPublisher status_types: {} type: ros2 - description: '' + description: VideoPublisher摄像头设备节点,用于实时视频采集和流媒体发布。该设备通过OpenCV连接本地摄像头(如USB摄像头、内置摄像头等),定时采集视频帧并将其转换为ROS2的sensor_msgs/Image消息格式发布到视频话题。主要用于实验室自动化系统中的视觉监控、图像分析、实时观察等应用场景。支持可配置的摄像头索引、发布频率等参数。 handles: [] icon: '' init_param_schema: diff --git a/unilabos/registry/devices/characterization_optic.yaml b/unilabos/registry/devices/characterization_optic.yaml index a7fd543..a627c9e 100644 --- a/unilabos/registry/devices/characterization_optic.yaml +++ b/unilabos/registry/devices/characterization_optic.yaml @@ -8,7 +8,7 @@ hplc.agilent: handles: [] result: {} schema: - description: check_status的参数schema + description: 检查安捷伦HPLC设备状态的函数。用于监控设备的运行状态、连接状态、错误信息等关键指标。该函数定期查询设备状态,确保系统稳定运行,及时发现和报告设备异常。适用于自动化流程中的设备监控、故障诊断、系统维护等场景。 properties: feedback: {} goal: @@ -29,7 +29,7 @@ hplc.agilent: handles: [] result: {} schema: - description: extract_data_from_txt的参数schema + description: 从文本文件中提取分析数据的函数。用于解析安捷伦HPLC生成的结果文件,提取峰面积、保留时间、浓度等关键分析数据。支持多种文件格式的自动识别和数据结构化处理,为后续数据分析和报告生成提供标准化的数据格式。适用于批量数据处理、结果验证、质量控制等分析工作流程。 properties: feedback: {} goal: @@ -55,7 +55,7 @@ hplc.agilent: handles: [] result: {} schema: - description: start_sequence的参数schema + description: 启动安捷伦HPLC分析序列的函数。用于执行预定义的分析方法序列,包括样品进样、色谱分离、检测等完整的分析流程。支持参数配置、资源分配、工作流程管理等功能,实现全自动的样品分析。适用于批量样品处理、标准化分析、质量检测等需要连续自动分析的应用场景。 properties: feedback: {} goal: @@ -83,7 +83,7 @@ hplc.agilent: handles: [] result: {} schema: - description: try_close_sub_device的参数schema + description: 尝试关闭HPLC子设备的函数。用于安全地关闭泵、检测器、进样器等各个子模块,确保设备正常断开连接并保护硬件安全。该函数提供错误处理和状态确认机制,避免强制关闭可能造成的设备损坏。适用于设备维护、系统重启、紧急停机等需要安全关闭设备的场景。 properties: feedback: {} goal: @@ -106,7 +106,7 @@ hplc.agilent: handles: [] result: {} schema: - description: try_open_sub_device的参数schema + description: 尝试打开HPLC子设备的函数。用于初始化和连接泵、检测器、进样器等各个子模块,建立设备通信并进行自检。该函数提供连接验证和错误恢复机制,确保子设备正常启动并准备就绪。适用于设备初始化、系统启动、设备重连等需要建立设备连接的场景。 properties: feedback: {} goal: @@ -134,7 +134,6 @@ hplc.agilent: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -143,7 +142,6 @@ hplc.agilent: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -152,7 +150,6 @@ hplc.agilent: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -179,7 +176,7 @@ hplc.agilent: status_text: str success: bool type: python - description: HPLC device + description: 安捷伦高效液相色谱(HPLC)分析设备,用于复杂化合物的分离、检测和定量分析。该设备通过UI自动化技术控制安捷伦ChemStation软件,实现全自动的样品分析流程。具备序列启动、设备状态监控、数据文件提取、结果处理等功能。支持多样品批量处理和实时状态反馈,适用于药物分析、环境检测、食品安全、化学研究等需要高精度色谱分析的实验室应用。 handles: [] icon: '' init_param_schema: @@ -229,7 +226,7 @@ raman_home_made: handles: [] result: {} schema: - description: ccd_time的参数schema + description: 设置CCD检测器积分时间的函数。用于配置拉曼光谱仪的信号采集时间,控制光谱数据的质量和信噪比。较长的积分时间可获得更高的信号强度和更好的光谱质量,但会增加测量时间。该函数允许根据样品特性和测量要求动态调整检测参数,优化测量效果。 properties: feedback: {} goal: @@ -253,7 +250,7 @@ raman_home_made: handles: [] result: {} schema: - description: laser_on_power的参数schema + description: 设置激光器输出功率的函数。用于控制拉曼光谱仪激光器的功率输出,调节激光强度以适应不同样品的测量需求。适当的激光功率能够获得良好的拉曼信号同时避免样品损伤。该函数支持精确的功率控制,确保测量结果的稳定性和重现性。 properties: feedback: {} goal: @@ -269,30 +266,6 @@ raman_home_made: title: laser_on_power参数 type: object type: UniLabJsonCommand - auto-raman_cmd: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: raman_cmd的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: raman_cmd参数 - type: object - type: UniLabJsonCommand auto-raman_without_background: feedback: {} goal: {} @@ -302,7 +275,7 @@ raman_home_made: handles: [] result: {} schema: - description: raman_without_background的参数schema + description: 执行无背景扣除的拉曼光谱测量函数。用于直接采集样品的拉曼光谱信号,不进行背景校正处理。该函数配置积分时间和激光功率参数,获取原始光谱数据用于后续的数据处理分析。适用于对光谱数据质量要求较高或需要自定义背景处理流程的测量场景。 properties: feedback: {} goal: @@ -332,7 +305,7 @@ raman_home_made: handles: [] result: {} schema: - description: raman_without_background_average的参数schema + description: 执行多次平均的无背景拉曼光谱测量函数。通过多次测量取平均值来提高光谱数据的信噪比和测量精度,减少随机噪声影响。该函数支持自定义平均次数、积分时间、激光功率等参数,并可为样品指定名称便于数据管理。适用于对测量精度要求较高的定量分析和研究应用。 properties: feedback: {} goal: @@ -370,7 +343,6 @@ raman_home_made: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -379,7 +351,6 @@ raman_home_made: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -388,7 +359,6 @@ raman_home_made: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -407,7 +377,7 @@ raman_home_made: module: unilabos.devices.raman_uv.home_made_raman:RamanObj status_types: {} type: python - description: Raman spectroscopy device + description: 拉曼光谱分析设备,用于物质的分子结构和化学成分表征。该设备集成激光器和CCD检测器,通过串口通信控制激光功率和光谱采集。具备背景扣除、多次平均、自动数据处理等功能,支持高精度的拉曼光谱测量。适用于材料表征、化学分析、质量控制、研究开发等需要分子指纹识别和结构分析的实验应用。 handles: [] icon: '' init_param_schema: diff --git a/unilabos/registry/devices/hotel.yaml b/unilabos/registry/devices/hotel.yaml index e5cfc06..95d23bd 100644 --- a/unilabos/registry/devices/hotel.yaml +++ b/unilabos/registry/devices/hotel.yaml @@ -5,7 +5,7 @@ hotel.thermo_orbitor_rs2_hotel: status_types: rotation: String type: python - description: Thermo Orbitor RS2 Hotel + description: Thermo Orbitor RS2 Hotel容器设备,用于实验室样品的存储和管理。该设备通过HotelContainer类实现容器的旋转控制和状态监控,主要用于存储实验样品、试剂瓶或其他实验器具,支持旋转功能以便于样品的自动化存取。适用于需要有序存储和快速访问大量样品的实验室自动化场景。 handles: [] icon: '' init_param_schema: diff --git a/unilabos/registry/devices/laiyu_add_solid.yaml b/unilabos/registry/devices/laiyu_add_solid.yaml index 02b8014..5421a5f 100644 --- a/unilabos/registry/devices/laiyu_add_solid.yaml +++ b/unilabos/registry/devices/laiyu_add_solid.yaml @@ -15,16 +15,14 @@ laiyu_add_solid: result: actual_mass_mg: actual_mass_mg schema: - description: ROS Action SolidDispenseAddPowderTube 的 JSON Schema + description: 向目标粉筒位置添加固体粉末。该函数通过Modbus RTU协议与设备通信,控制粉末分装机将指定质量的粉末添加到目标粉筒位置。支持精确称量和批量处理,适用于实验室化学试剂的自动分装。 properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: SolidDispenseAddPowderTube_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: compound_mass: type: number @@ -41,7 +39,6 @@ laiyu_add_solid: title: SolidDispenseAddPowderTube_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: actual_mass_mg: type: number @@ -60,38 +57,6 @@ laiyu_add_solid: title: SolidDispenseAddPowderTube type: object type: SolidDispenseAddPowderTube - auto-add_powder_tube: - feedback: {} - goal: {} - goal_default: - compound_mass: null - powder_tube_number: null - target_tube_position: null - handles: [] - result: {} - schema: - description: add_powder_tube的参数schema - properties: - feedback: {} - goal: - properties: - compound_mass: - type: string - powder_tube_number: - type: string - target_tube_position: - type: string - required: - - powder_tube_number - - target_tube_position - - compound_mass - type: object - result: {} - required: - - goal - title: add_powder_tube参数 - type: object - type: UniLabJsonCommand auto-calculate_crc: feedback: {} goal: {} @@ -100,7 +65,7 @@ laiyu_add_solid: handles: [] result: {} schema: - description: calculate_crc的参数schema + description: Modbus CRC-16校验码计算函数。计算Modbus RTU通信协议所需的CRC-16校验码,确保数据传输的完整性和可靠性。该函数实现标准的CRC-16算法,用于构造完整的Modbus指令帧。 properties: feedback: {} goal: @@ -116,154 +81,6 @@ laiyu_add_solid: title: calculate_crc参数 type: object type: UniLabJsonCommand - auto-discharge: - feedback: {} - goal: {} - goal_default: - float_in: null - handles: [] - result: {} - schema: - description: discharge的参数schema - properties: - feedback: {} - goal: - properties: - float_in: - type: number - required: - - float_in - type: object - result: {} - required: - - goal - title: discharge参数 - type: object - type: UniLabJsonCommand - auto-move_to_plate: - feedback: {} - goal: {} - goal_default: - string: null - handles: [] - result: {} - schema: - description: move_to_plate的参数schema - properties: - feedback: {} - goal: - properties: - string: - type: string - required: - - string - type: object - result: {} - required: - - goal - title: move_to_plate参数 - type: object - type: UniLabJsonCommand - auto-move_to_xyz: - feedback: {} - goal: {} - goal_default: - x: null - y: null - z: null - handles: [] - result: {} - schema: - description: move_to_xyz的参数schema - properties: - feedback: {} - goal: - properties: - x: - type: number - y: - type: number - z: - type: number - required: - - x - - y - - z - type: object - result: {} - required: - - goal - title: move_to_xyz参数 - type: object - type: UniLabJsonCommand - auto-pick_powder_tube: - feedback: {} - goal: {} - goal_default: - int_input: null - handles: [] - result: {} - schema: - description: pick_powder_tube的参数schema - properties: - feedback: {} - goal: - properties: - int_input: - type: integer - required: - - int_input - type: object - result: {} - required: - - goal - title: pick_powder_tube参数 - type: object - type: UniLabJsonCommand - auto-put_powder_tube: - feedback: {} - goal: {} - goal_default: - int_input: null - handles: [] - result: {} - schema: - description: put_powder_tube的参数schema - properties: - feedback: {} - goal: - properties: - int_input: - type: integer - required: - - int_input - type: object - result: {} - required: - - goal - title: put_powder_tube参数 - type: object - type: UniLabJsonCommand - auto-reset: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: reset的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: reset参数 - type: object - type: UniLabJsonCommand auto-send_command: feedback: {} goal: {} @@ -272,7 +89,7 @@ laiyu_add_solid: handles: [] result: {} schema: - description: send_command的参数schema + description: Modbus指令发送函数。构造完整的Modbus RTU指令帧(包含CRC校验),发送给分装设备并等待响应。该函数处理底层通信协议,确保指令的正确传输和响应接收,支持最长3分钟的响应等待时间。 properties: feedback: {} goal: @@ -297,16 +114,14 @@ laiyu_add_solid: handles: [] result: {} schema: - description: ROS Action FloatSingleInput 的 JSON Schema + description: 执行出料操作,传入出料质量(单位0.1mg) properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: FloatSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: float_in: type: number @@ -315,7 +130,6 @@ laiyu_add_solid: title: FloatSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -340,16 +154,14 @@ laiyu_add_solid: handles: [] result: {} schema: - description: ROS Action StrSingleInput 的 JSON Schema + description: 移动到某个孔板位置。 properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: StrSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: string: type: string @@ -358,7 +170,6 @@ laiyu_add_solid: title: StrSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -387,16 +198,14 @@ laiyu_add_solid: handles: [] result: {} schema: - description: ROS Action Point3DSeparateInput 的 JSON Schema + description: 按照坐标移动,单位为0.1mm properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: Point3DSeparateInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: x: type: number @@ -411,7 +220,6 @@ laiyu_add_solid: title: Point3DSeparateInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -436,16 +244,14 @@ laiyu_add_solid: handles: [] result: {} schema: - description: ROS Action IntSingleInput 的 JSON Schema + description: 装载粉筒,传入粉筒编号 properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: IntSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: int_input: maximum: 2147483647 @@ -456,7 +262,6 @@ laiyu_add_solid: title: IntSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -481,16 +286,14 @@ laiyu_add_solid: handles: [] result: {} schema: - description: ROS Action IntSingleInput 的 JSON Schema + description: 放回粉筒 properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: IntSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: int_input: maximum: 2147483647 @@ -501,7 +304,6 @@ laiyu_add_solid: title: IntSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -524,22 +326,19 @@ laiyu_add_solid: handles: [] result: {} schema: - description: ROS Action EmptyIn 的 JSON Schema + description: 重置指令 properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -556,7 +355,7 @@ laiyu_add_solid: status_types: status: str type: python - description: Laiyu Add Solid + description: 来渝固体粉末自动分装设备,用于实验室化学试剂的精确称量和分装。该设备通过Modbus RTU协议与控制系统通信,集成了精密天平、三轴运动平台、粉筒管理系统等组件。支持多种粉末试剂的自动拿取、精确称量、定点分装和归位操作。具备高精度称量、位置控制和批量处理能力,适用于化学合成、药物研发、材料制备等需要精确固体试剂配制的实验室应用场景。 handles: [] icon: '' init_param_schema: diff --git a/unilabos/registry/devices/liquid_handler.yaml b/unilabos/registry/devices/liquid_handler.yaml index 8dfd600..8e56225 100644 --- a/unilabos/registry/devices/liquid_handler.yaml +++ b/unilabos/registry/devices/liquid_handler.yaml @@ -91,13 +91,11 @@ liquid_handler: description: ROS Action LiquidHandlerAdd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerAdd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: asp_vols: items: @@ -333,7 +331,6 @@ liquid_handler: title: LiquidHandlerAdd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -403,13 +400,11 @@ liquid_handler: description: ROS Action LiquidHandlerAspirate 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerAspirate_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: blow_out_air_volume: items: @@ -538,7 +533,6 @@ liquid_handler: title: LiquidHandlerAspirate_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -554,84 +548,6 @@ liquid_handler: title: LiquidHandlerAspirate type: object type: LiquidHandlerAspirate - auto-add_liquid: - feedback: {} - goal: {} - goal_default: - asp_vols: null - blow_out_air_volume: null - delays: null - dis_vols: null - flow_rates: null - is_96_well: false - liquid_height: null - mix_liquid_height: null - mix_rate: null - mix_time: null - mix_vol: null - none_keys: [] - offsets: null - reagent_sources: null - spread: wide - targets: null - use_channels: null - handles: [] - result: {} - schema: - description: add_liquid的参数schema - properties: - feedback: {} - goal: - properties: - asp_vols: - type: string - blow_out_air_volume: - type: string - delays: - type: string - dis_vols: - type: string - flow_rates: - type: string - is_96_well: - default: false - type: boolean - liquid_height: - type: string - mix_liquid_height: - type: string - mix_rate: - type: string - mix_time: - type: string - mix_vol: - type: string - none_keys: - default: [] - type: string - offsets: - type: string - reagent_sources: - type: string - spread: - default: wide - type: string - targets: - type: string - use_channels: - type: string - required: - - asp_vols - - dis_vols - - reagent_sources - - targets - type: object - result: {} - required: - - goal - title: add_liquid参数 - type: object - type: UniLabJsonCommandAsync auto-create_protocol: feedback: {} goal: {} @@ -646,7 +562,7 @@ liquid_handler: handles: [] result: {} schema: - description: create_protocol的参数schema + description: 创建实验协议函数。用于建立新的液体处理实验协议,定义协议名称、描述、版本、作者、日期等基本信息。该函数支持协议模板化管理,便于实验流程的标准化和重复性。适用于实验设计、方法开发、标准操作程序建立等需要协议管理的应用场景。 properties: feedback: {} goal: @@ -689,7 +605,7 @@ liquid_handler: handles: [] result: {} schema: - description: custom_delay的参数schema + description: 自定义延时函数。在实验流程中插入可配置的等待时间,用于满足特定的反应时间、孵育时间或设备稳定时间要求。支持自定义延时消息和秒数设置,提供流程控制和时间管理功能。适用于酶反应等待、温度平衡、样品孵育等需要时间控制的实验步骤。 properties: feedback: {} goal: @@ -715,7 +631,7 @@ liquid_handler: handles: [] result: {} schema: - description: iter_tips的参数schema + description: 吸头迭代函数。用于自动管理和切换吸头架中的吸头,实现批量实验中的吸头自动分配和追踪。该函数监控吸头使用状态,自动切换到下一个可用吸头位置,确保实验流程的连续性。适用于高通量实验、批量处理、自动化流水线等需要大量吸头管理的应用场景。 properties: feedback: {} goal: @@ -731,81 +647,6 @@ liquid_handler: title: iter_tips参数 type: object type: UniLabJsonCommand - auto-mix: - feedback: {} - goal: {} - goal_default: - height_to_bottom: null - mix_rate: null - mix_time: null - mix_vol: null - none_keys: [] - offsets: null - targets: null - handles: [] - result: {} - schema: - description: mix的参数schema - properties: - feedback: {} - goal: - properties: - height_to_bottom: - type: string - mix_rate: - type: string - mix_time: - type: integer - mix_vol: - type: string - none_keys: - default: [] - type: string - offsets: - type: string - targets: - type: string - required: - - targets - type: object - result: {} - required: - - goal - title: mix参数 - type: object - type: UniLabJsonCommandAsync - auto-move_to: - feedback: {} - goal: {} - goal_default: - channel: 0 - dis_to_top: 0 - well: null - handles: [] - result: {} - schema: - description: move_to的参数schema - properties: - feedback: {} - goal: - properties: - channel: - default: 0 - type: integer - dis_to_top: - default: 0 - type: number - well: - type: string - required: - - well - type: object - result: {} - required: - - goal - title: move_to参数 - type: object - type: UniLabJsonCommandAsync auto-remove_liquid: feedback: {} goal: {} @@ -826,7 +667,7 @@ liquid_handler: handles: [] result: {} schema: - description: remove_liquid的参数schema + description: 液体移除操作函数。从指定容器位置移除液体并转移到废液容器中。支持多源位置批量操作、流速控制、液面高度检测、96孔板模式等功能。可配置延时、吹气体积、位置偏移等参数,确保液体完全移除和容器清洁。适用于样品清洗、废液处理、容器清空等实验清理操作。 properties: feedback: {} goal: @@ -878,7 +719,7 @@ liquid_handler: handles: [] result: {} schema: - description: set_tiprack的参数schema + description: 吸头架设置函数。用于配置和初始化液体处理系统的吸头架信息,包括吸头架位置、类型、容量等参数。该函数建立吸头资源管理系统,为后续的吸头选择和使用提供基础配置。适用于系统初始化、吸头架更换、实验配置等需要吸头资源管理的操作场景。 properties: feedback: {} goal: @@ -902,7 +743,7 @@ liquid_handler: handles: [] result: {} schema: - description: touch_tip的参数schema + description: 吸头碰触函数。控制移液器吸头轻触容器边缘或底部,用于去除吸头外壁附着的液滴,提高移液精度和减少污染。该函数支持多目标位置操作,可配置碰触参数和位置偏移。适用于精密移液、减少液体残留、防止交叉污染等需要提高移液质量的实验操作。 properties: feedback: {} goal: @@ -918,99 +759,6 @@ liquid_handler: title: touch_tip参数 type: object type: UniLabJsonCommandAsync - auto-transfer_liquid: - feedback: {} - goal: {} - goal_default: - asp_flow_rates: null - asp_vols: null - blow_out_air_volume: null - delays: null - dis_flow_rates: null - dis_vols: null - is_96_well: false - liquid_height: null - mix_liquid_height: null - mix_rate: null - mix_stage: none - mix_times: null - mix_vol: null - none_keys: [] - offsets: null - sources: null - spread: wide - targets: null - tip_racks: null - touch_tip: false - use_channels: null - handles: [] - result: {} - schema: - description: transfer_liquid的参数schema - properties: - feedback: {} - goal: - properties: - asp_flow_rates: - type: string - asp_vols: - type: string - blow_out_air_volume: - type: string - delays: - type: string - dis_flow_rates: - type: string - dis_vols: - type: string - is_96_well: - default: false - type: boolean - liquid_height: - type: string - mix_liquid_height: - type: string - mix_rate: - type: string - mix_stage: - default: none - type: string - mix_times: - type: string - mix_vol: - type: string - none_keys: - default: [] - type: string - offsets: - type: string - sources: - type: string - spread: - default: wide - type: string - targets: - type: string - tip_racks: - type: string - touch_tip: - default: false - type: boolean - use_channels: - type: string - required: - - sources - - targets - - tip_racks - - asp_vols - - dis_vols - type: object - result: {} - required: - - goal - title: transfer_liquid参数 - type: object - type: UniLabJsonCommandAsync discard_tips: feedback: {} goal: @@ -1025,13 +773,11 @@ liquid_handler: description: ROS Action LiquidHandlerDiscardTips 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerDiscardTips_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: use_channels: items: @@ -1044,7 +790,6 @@ liquid_handler: title: LiquidHandlerDiscardTips_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1111,13 +856,11 @@ liquid_handler: description: ROS Action LiquidHandlerDispense 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerDispense_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: blow_out_air_volume: items: @@ -1243,7 +986,6 @@ liquid_handler: title: LiquidHandlerDispense_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1301,13 +1043,11 @@ liquid_handler: description: ROS Action LiquidHandlerDropTips 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerDropTips_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: allow_nonzero_volume: type: boolean @@ -1416,7 +1156,6 @@ liquid_handler: title: LiquidHandlerDropTips_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1471,13 +1210,11 @@ liquid_handler: description: ROS Action LiquidHandlerDropTips96 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerDropTips96_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: allow_nonzero_volume: type: boolean @@ -1575,7 +1312,6 @@ liquid_handler: title: LiquidHandlerDropTips96_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1638,13 +1374,11 @@ liquid_handler: description: ROS Action LiquidHandlerMix 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerMix_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: height_to_bottom: type: number @@ -1764,7 +1498,6 @@ liquid_handler: title: LiquidHandlerMix_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1858,13 +1591,11 @@ liquid_handler: description: ROS Action LiquidHandlerMoveLid 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerMoveLid_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: destination_offset: properties: @@ -2080,7 +1811,6 @@ liquid_handler: title: LiquidHandlerMoveLid_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2178,13 +1908,11 @@ liquid_handler: description: ROS Action LiquidHandlerMovePlate 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerMovePlate_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: destination_offset: properties: @@ -2415,7 +2143,6 @@ liquid_handler: title: LiquidHandlerMovePlate_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2493,13 +2220,11 @@ liquid_handler: description: ROS Action LiquidHandlerMoveResource 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerMoveResource_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: destination_offset: properties: @@ -2656,7 +2381,6 @@ liquid_handler: title: LiquidHandlerMoveResource_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2707,13 +2431,11 @@ liquid_handler: description: ROS Action LiquidHandlerMoveTo 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerMoveTo_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: channel: maximum: 2147483647 @@ -2801,7 +2523,6 @@ liquid_handler: title: LiquidHandlerMoveTo_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2857,13 +2578,11 @@ liquid_handler: description: ROS Action LiquidHandlerPickUpTips 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerPickUpTips_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: offsets: items: @@ -2969,7 +2688,6 @@ liquid_handler: title: LiquidHandlerPickUpTips_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3022,13 +2740,11 @@ liquid_handler: description: ROS Action LiquidHandlerPickUpTips96 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerPickUpTips96_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: offset: properties: @@ -3123,7 +2839,6 @@ liquid_handler: title: LiquidHandlerPickUpTips96_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3224,13 +2939,11 @@ liquid_handler: description: ROS Action LiquidHandlerRemove 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerRemove_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: blow_out_air_volume: items: @@ -3453,7 +3166,6 @@ liquid_handler: title: LiquidHandlerRemove_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3485,13 +3197,11 @@ liquid_handler: description: ROS Action LiquidHandlerReturnTips 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerReturnTips_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: allow_nonzero_volume: type: boolean @@ -3507,7 +3217,6 @@ liquid_handler: title: LiquidHandlerReturnTips_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3536,13 +3245,11 @@ liquid_handler: description: ROS Action LiquidHandlerReturnTips96 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerReturnTips96_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: allow_nonzero_volume: type: boolean @@ -3551,7 +3258,6 @@ liquid_handler: title: LiquidHandlerReturnTips96_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3626,13 +3332,11 @@ liquid_handler: description: ROS Action LiquidHandlerStamp 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerStamp_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: aspiration_flow_rate: type: number @@ -3795,7 +3499,6 @@ liquid_handler: title: LiquidHandlerStamp_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3917,13 +3620,11 @@ liquid_handler: description: ROS Action LiquidHandlerTransfer 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerTransfer_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: asp_flow_rates: items: @@ -4255,7 +3956,6 @@ liquid_handler: title: LiquidHandlerTransfer_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -4393,13 +4093,11 @@ liquid_handler: description: ROS Action LiquidHandlerTransfer 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerTransfer_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: asp_flow_rates: items: @@ -4731,7 +4429,6 @@ liquid_handler: title: LiquidHandlerTransfer_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -4785,54 +4482,6 @@ liquid_handler: liquid_handler.biomek: class: action_value_mappings: - auto-create_protocol: - feedback: {} - goal: {} - goal_default: - none_keys: [] - protocol_author: null - protocol_date: null - protocol_description: null - protocol_name: null - protocol_type: null - protocol_version: null - handles: [] - result: {} - schema: - description: create_protocol的参数schema - properties: - feedback: {} - goal: - properties: - none_keys: - default: [] - type: array - protocol_author: - type: string - protocol_date: - type: string - protocol_description: - type: string - protocol_name: - type: string - protocol_type: - type: string - protocol_version: - type: string - required: - - protocol_name - - protocol_description - - protocol_version - - protocol_author - - protocol_date - - protocol_type - type: object - result: {} - required: - - goal - title: create_protocol参数 - type: object - type: UniLabJsonCommand auto-create_resource: feedback: {} goal: {} @@ -4885,30 +4534,6 @@ liquid_handler.biomek: title: create_resource参数 type: object type: UniLabJsonCommand - auto-incubation_biomek: - feedback: {} - goal: {} - goal_default: - time: null - handles: [] - result: {} - schema: - description: incubation_biomek的参数schema - properties: - feedback: {} - goal: - properties: - time: - type: integer - required: - - time - type: object - result: {} - required: - - goal - title: incubation_biomek参数 - type: object - type: UniLabJsonCommand auto-instrument_setup_biomek: feedback: {} goal: {} @@ -4957,219 +4582,6 @@ liquid_handler.biomek: title: instrument_setup_biomek参数 type: object type: UniLabJsonCommand - auto-move_biomek: - feedback: {} - goal: {} - goal_default: - source: null - target: null - handles: [] - result: {} - schema: - description: move_biomek的参数schema - properties: - feedback: {} - goal: - properties: - source: - type: string - target: - type: string - required: - - source - - target - type: object - result: {} - required: - - goal - title: move_biomek参数 - type: object - type: UniLabJsonCommand - auto-oscillation_biomek: - feedback: {} - goal: {} - goal_default: - rpm: null - time: null - handles: [] - result: {} - schema: - description: oscillation_biomek的参数schema - properties: - feedback: {} - goal: - properties: - rpm: - type: integer - time: - type: integer - required: - - rpm - - time - type: object - result: {} - required: - - goal - title: oscillation_biomek参数 - type: object - type: UniLabJsonCommand - auto-run_protocol: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: run_protocol的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: run_protocol参数 - type: object - type: UniLabJsonCommand - auto-transfer_biomek: - feedback: {} - goal: {} - goal_default: - aspirate_techniques: null - dispense_techniques: null - source: null - target: null - tip_rack: null - volume: null - handles: [] - result: {} - schema: - description: transfer_biomek的参数schema - properties: - feedback: {} - goal: - properties: - aspirate_techniques: - type: string - dispense_techniques: - type: string - source: - type: string - target: - type: string - tip_rack: - type: string - volume: - type: number - required: - - source - - target - - tip_rack - - volume - - aspirate_techniques - - dispense_techniques - type: object - result: {} - required: - - goal - title: transfer_biomek参数 - type: object - type: UniLabJsonCommand - auto-transfer_liquid: - feedback: {} - goal: {} - goal_default: - asp_flow_rates: null - asp_vols: null - blow_out_air_volume: null - delays: null - dis_flow_rates: null - dis_vols: null - is_96_well: false - liquid_height: null - mix_liquid_height: null - mix_rate: null - mix_stage: none - mix_times: null - mix_vol: null - none_keys: [] - offsets: null - sources: null - spread: wide - targets: null - tip_racks: null - touch_tip: false - use_channels: null - handles: [] - result: {} - schema: - description: transfer_liquid的参数schema - properties: - feedback: {} - goal: - properties: - asp_flow_rates: - type: string - asp_vols: - type: string - blow_out_air_volume: - type: string - delays: - type: string - dis_flow_rates: - type: string - dis_vols: - type: string - is_96_well: - default: false - type: boolean - liquid_height: - type: string - mix_liquid_height: - type: string - mix_rate: - type: string - mix_stage: - default: none - type: string - mix_times: - type: string - mix_vol: - type: string - none_keys: - default: [] - type: array - offsets: - type: string - sources: - type: string - spread: - default: wide - type: string - targets: - type: string - tip_racks: - type: string - touch_tip: - default: false - type: boolean - use_channels: - type: string - required: - - sources - - targets - - tip_racks - - asp_vols - - dis_vols - type: object - result: {} - required: - - goal - title: transfer_liquid参数 - type: object - type: UniLabJsonCommand create_protocol: feedback: {} goal: @@ -5195,13 +4607,11 @@ liquid_handler.biomek: description: ROS Action LiquidHandlerProtocolCreation 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerProtocolCreation_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: none_keys: items: @@ -5230,7 +4640,6 @@ liquid_handler.biomek: title: LiquidHandlerProtocolCreation_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -5267,13 +4676,11 @@ liquid_handler.biomek: description: ROS Action LiquidHandlerIncubateBiomek 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerIncubateBiomek_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: time: maximum: 2147483647 @@ -5284,7 +4691,6 @@ liquid_handler.biomek: title: LiquidHandlerIncubateBiomek_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -5327,13 +4733,11 @@ liquid_handler.biomek: description: ROS Action LiquidHandlerMoveBiomek 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerMoveBiomek_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: sources: type: string @@ -5345,7 +4749,6 @@ liquid_handler.biomek: title: LiquidHandlerMoveBiomek_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -5387,13 +4790,11 @@ liquid_handler.biomek: description: ROS Action LiquidHandlerOscillateBiomek 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerOscillateBiomek_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: rpm: maximum: 2147483647 @@ -5409,7 +4810,6 @@ liquid_handler.biomek: title: LiquidHandlerOscillateBiomek_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -5435,19 +4835,16 @@ liquid_handler.biomek: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -5509,13 +4906,11 @@ liquid_handler.biomek: description: ROS Action LiquidHandlerTransferBiomek 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerTransferBiomek_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: aspirate_technique: type: string @@ -5539,7 +4934,6 @@ liquid_handler.biomek: title: LiquidHandlerTransferBiomek_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -5691,13 +5085,11 @@ liquid_handler.biomek: description: ROS Action LiquidHandlerTransfer 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerTransfer_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: asp_flow_rates: items: @@ -6029,7 +5421,6 @@ liquid_handler.biomek: title: LiquidHandlerTransfer_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -6120,13 +5511,11 @@ liquid_handler.prcxi: description: ROS Action LiquidHandlerAspirate 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerAspirate_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: blow_out_air_volume: items: @@ -6255,7 +5644,6 @@ liquid_handler.prcxi: title: LiquidHandlerAspirate_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -6349,53 +5737,6 @@ liquid_handler.prcxi: title: add_liquid参数 type: object type: UniLabJsonCommandAsync - auto-aspirate: - feedback: {} - goal: {} - goal_default: - blow_out_air_volume: null - flow_rates: null - liquid_height: null - offsets: null - resources: null - spread: wide - use_channels: null - vols: null - handles: [] - result: {} - schema: - description: aspirate的参数schema - properties: - feedback: {} - goal: - properties: - blow_out_air_volume: - type: string - flow_rates: - type: string - liquid_height: - type: string - offsets: - type: string - resources: - type: string - spread: - default: wide - type: string - use_channels: - type: string - vols: - type: array - required: - - resources - - vols - type: object - result: {} - required: - - goal - title: aspirate参数 - type: object - type: UniLabJsonCommandAsync auto-create_protocol: feedback: {} goal: {} @@ -6501,87 +5842,6 @@ liquid_handler.prcxi: title: discard_tips参数 type: object type: UniLabJsonCommandAsync - auto-dispense: - feedback: {} - goal: {} - goal_default: - blow_out_air_volume: null - flow_rates: null - liquid_height: null - offsets: null - resources: null - spread: wide - use_channels: null - vols: null - handles: [] - result: {} - schema: - description: dispense的参数schema - properties: - feedback: {} - goal: - properties: - blow_out_air_volume: - type: string - flow_rates: - type: string - liquid_height: - type: string - offsets: - type: string - resources: - type: string - spread: - default: wide - type: string - use_channels: - type: string - vols: - type: array - required: - - resources - - vols - type: object - result: {} - required: - - goal - title: dispense参数 - type: object - type: UniLabJsonCommandAsync - auto-drop_tips: - feedback: {} - goal: {} - goal_default: - allow_nonzero_volume: false - offsets: null - tip_spots: null - use_channels: null - handles: [] - result: {} - schema: - description: drop_tips的参数schema - properties: - feedback: {} - goal: - properties: - allow_nonzero_volume: - default: false - type: boolean - offsets: - type: string - tip_spots: - type: string - use_channels: - type: string - required: - - tip_spots - type: object - result: {} - required: - - goal - title: drop_tips参数 - type: object - type: UniLabJsonCommandAsync auto-iter_tips: feedback: {} goal: {} @@ -6606,49 +5866,6 @@ liquid_handler.prcxi: title: iter_tips参数 type: object type: UniLabJsonCommand - auto-mix: - feedback: {} - goal: {} - goal_default: - height_to_bottom: null - mix_rate: null - mix_time: null - mix_vol: null - none_keys: [] - offsets: null - targets: null - handles: [] - result: {} - schema: - description: mix的参数schema - properties: - feedback: {} - goal: - properties: - height_to_bottom: - type: string - mix_rate: - type: string - mix_time: - type: integer - mix_vol: - type: string - none_keys: - default: [] - type: array - offsets: - type: string - targets: - type: string - required: - - targets - type: object - result: {} - required: - - goal - title: mix参数 - type: object - type: UniLabJsonCommandAsync auto-move_to: feedback: {} goal: {} @@ -6681,36 +5898,6 @@ liquid_handler.prcxi: title: move_to参数 type: object type: UniLabJsonCommandAsync - auto-pick_up_tips: - feedback: {} - goal: {} - goal_default: - offsets: null - tip_spots: null - use_channels: null - handles: [] - result: {} - schema: - description: pick_up_tips的参数schema - properties: - feedback: {} - goal: - properties: - offsets: - type: string - tip_spots: - type: array - use_channels: - type: string - required: - - tip_spots - type: object - result: {} - required: - - goal - title: pick_up_tips参数 - type: object - type: UniLabJsonCommandAsync auto-remove_liquid: feedback: {} goal: {} @@ -6986,13 +6173,11 @@ liquid_handler.prcxi: description: ROS Action LiquidHandlerDispense 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerDispense_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: blow_out_air_volume: items: @@ -7118,7 +6303,6 @@ liquid_handler.prcxi: title: LiquidHandlerDispense_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -7171,13 +6355,11 @@ liquid_handler.prcxi: description: ROS Action LiquidHandlerDropTips 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerDropTips_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: allow_nonzero_volume: type: boolean @@ -7286,7 +6468,6 @@ liquid_handler.prcxi: title: LiquidHandlerDropTips_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -7349,13 +6530,11 @@ liquid_handler.prcxi: description: ROS Action LiquidHandlerMix 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerMix_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: height_to_bottom: type: number @@ -7475,7 +6654,6 @@ liquid_handler.prcxi: title: LiquidHandlerMix_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -7530,13 +6708,11 @@ liquid_handler.prcxi: description: ROS Action LiquidHandlerPickUpTips 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerPickUpTips_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: offsets: items: @@ -7642,7 +6818,6 @@ liquid_handler.prcxi: title: LiquidHandlerPickUpTips_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -7668,6 +6843,9 @@ liquid_handler.prcxi: init_param_schema: config: properties: + debug: + default: false + type: string deck: type: string host: @@ -7695,42 +6873,6 @@ liquid_handler.prcxi: liquid_handler.revvity: class: action_value_mappings: - auto-run: - feedback: {} - goal: {} - goal_default: - file_path: null - params: null - resource: - AichemecoHiwo: - id: AichemecoHiwo - handles: [] - result: {} - schema: - description: run的参数schema - properties: - feedback: {} - goal: - properties: - file_path: - type: string - params: - type: string - resource: - default: - AichemecoHiwo: - id: AichemecoHiwo - type: object - required: - - file_path - - params - type: object - result: {} - required: - - goal - title: run参数 - type: object - type: UniLabJsonCommand run: feedback: status: status @@ -7768,7 +6910,6 @@ liquid_handler.revvity: description: ROS Action WorkStationRun 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: gantt: type: string @@ -7780,7 +6921,6 @@ liquid_handler.revvity: title: WorkStationRun_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: params: type: string @@ -7866,7 +7006,6 @@ liquid_handler.revvity: title: WorkStationRun_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string diff --git a/unilabos/registry/devices/mock_devices.yaml b/unilabos/registry/devices/mock_devices.yaml index 4341434..be57ffa 100644 --- a/unilabos/registry/devices/mock_devices.yaml +++ b/unilabos/registry/devices/mock_devices.yaml @@ -1,82 +1,6 @@ mock_chiller: class: action_value_mappings: - auto-emergency_stop: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: emergency_stop的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: emergency_stop参数 - type: object - type: UniLabJsonCommand - auto-heat_chill_start: - feedback: {} - goal: {} - goal_default: - purpose: null - temp: null - vessel: null - handles: [] - result: {} - schema: - description: heat_chill_start的参数schema - properties: - feedback: {} - goal: - properties: - purpose: - type: string - temp: - type: number - vessel: - type: string - required: - - vessel - - temp - - purpose - type: object - result: {} - required: - - goal - title: heat_chill_start参数 - type: object - type: UniLabJsonCommand - auto-heat_chill_stop: - feedback: {} - goal: {} - goal_default: - vessel: null - handles: [] - result: {} - schema: - description: heat_chill_stop的参数schema - properties: - feedback: {} - goal: - properties: - vessel: - type: string - required: - - vessel - type: object - result: {} - required: - - goal - title: heat_chill_stop参数 - type: object - type: UniLabJsonCommand emergency_stop: feedback: {} goal: {} @@ -88,19 +12,16 @@ mock_chiller: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -131,7 +52,6 @@ mock_chiller: description: ROS Action HeatChillStart 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -140,7 +60,6 @@ mock_chiller: title: HeatChillStart_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: purpose: type: string @@ -155,7 +74,6 @@ mock_chiller: title: HeatChillStart_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -185,7 +103,6 @@ mock_chiller: description: ROS Action HeatChillStop 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -194,7 +111,6 @@ mock_chiller: title: HeatChillStop_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: vessel: type: string @@ -203,7 +119,6 @@ mock_chiller: title: HeatChillStop_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -292,94 +207,6 @@ mock_filter: title: emergency_stop参数 type: object type: UniLabJsonCommand - auto-filter: - feedback: {} - goal: {} - goal_default: - continue_heatchill: false - filtrate_vessel: null - stir: false - stir_speed: 0.0 - temp: 25.0 - vessel: null - volume: 0.0 - handles: [] - result: {} - schema: - description: filter的参数schema - properties: - feedback: {} - goal: - properties: - continue_heatchill: - default: false - type: boolean - filtrate_vessel: - type: string - stir: - default: false - type: boolean - stir_speed: - default: 0.0 - type: number - temp: - default: 25.0 - type: number - vessel: - type: string - volume: - default: 0.0 - type: number - required: - - vessel - - filtrate_vessel - type: object - result: {} - required: - - goal - title: filter参数 - type: object - type: UniLabJsonCommand - auto-replace_filter: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: replace_filter的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: replace_filter参数 - type: object - type: UniLabJsonCommand - auto-stop_filtering: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: stop_filtering的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: stop_filtering参数 - type: object - type: UniLabJsonCommand filter: feedback: current_status: current_status @@ -410,7 +237,6 @@ mock_filter: description: ROS Action Filter 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_status: type: string @@ -428,7 +254,6 @@ mock_filter: title: Filter_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: continue_heatchill: type: boolean @@ -455,7 +280,6 @@ mock_filter: title: Filter_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -485,19 +309,16 @@ mock_filter: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -521,19 +342,16 @@ mock_filter: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -627,126 +445,6 @@ mock_filter: mock_heater: class: action_value_mappings: - auto-emergency_stop: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: emergency_stop的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: emergency_stop参数 - type: object - type: UniLabJsonCommand - auto-heat_chill: - feedback: {} - goal: {} - goal_default: - purpose: Unknown - stir: false - stir_speed: 0.0 - temp: null - time: null - vessel: null - handles: [] - result: {} - schema: - description: heat_chill的参数schema - properties: - feedback: {} - goal: - properties: - purpose: - default: Unknown - type: string - stir: - default: false - type: boolean - stir_speed: - default: 0.0 - type: number - temp: - type: number - time: - type: number - vessel: - type: string - required: - - vessel - - temp - - time - type: object - result: {} - required: - - goal - title: heat_chill参数 - type: object - type: UniLabJsonCommand - auto-heat_chill_start: - feedback: {} - goal: {} - goal_default: - purpose: null - temp: null - vessel: null - handles: [] - result: {} - schema: - description: heat_chill_start的参数schema - properties: - feedback: {} - goal: - properties: - purpose: - type: string - temp: - type: number - vessel: - type: string - required: - - vessel - - temp - - purpose - type: object - result: {} - required: - - goal - title: heat_chill_start参数 - type: object - type: UniLabJsonCommand - auto-heat_chill_stop: - feedback: {} - goal: {} - goal_default: - vessel: null - handles: [] - result: {} - schema: - description: heat_chill_stop的参数schema - properties: - feedback: {} - goal: - properties: - vessel: - type: string - required: - - vessel - type: object - result: {} - required: - - goal - title: heat_chill_stop参数 - type: object - type: UniLabJsonCommand auto-set_heating_power: feedback: {} goal: {} @@ -806,19 +504,16 @@ mock_heater: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -855,7 +550,6 @@ mock_heater: description: ROS Action HeatChill 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -864,7 +558,6 @@ mock_heater: title: HeatChill_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: purpose: type: string @@ -888,7 +581,6 @@ mock_heater: title: HeatChill_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -922,7 +614,6 @@ mock_heater: description: ROS Action HeatChillStart 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -931,7 +622,6 @@ mock_heater: title: HeatChillStart_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: purpose: type: string @@ -946,7 +636,6 @@ mock_heater: title: HeatChillStart_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -976,7 +665,6 @@ mock_heater: description: ROS Action HeatChillStop 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -985,7 +673,6 @@ mock_heater: title: HeatChillStop_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: vessel: type: string @@ -994,7 +681,6 @@ mock_heater: title: HeatChillStop_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1095,126 +781,6 @@ mock_pump: title: emergency_stop参数 type: object type: UniLabJsonCommand - auto-pause_pump: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: pause_pump的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: pause_pump参数 - type: object - type: UniLabJsonCommand - auto-pump_transfer: - feedback: {} - goal: {} - goal_default: - amount: '' - from_vessel: null - rinsing_repeats: 0 - rinsing_solvent: '' - rinsing_volume: 0.0 - solid: false - time: 0.0 - to_vessel: null - viscous: false - volume: null - handles: [] - result: {} - schema: - description: pump_transfer的参数schema - properties: - feedback: {} - goal: - properties: - amount: - default: '' - type: string - from_vessel: - type: string - rinsing_repeats: - default: 0 - type: integer - rinsing_solvent: - default: '' - type: string - rinsing_volume: - default: 0.0 - type: number - solid: - default: false - type: boolean - time: - default: 0.0 - type: number - to_vessel: - type: string - viscous: - default: false - type: boolean - volume: - type: number - required: - - from_vessel - - to_vessel - - volume - type: object - result: {} - required: - - goal - title: pump_transfer参数 - type: object - type: UniLabJsonCommand - auto-reset_volume_counter: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: reset_volume_counter的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: reset_volume_counter参数 - type: object - type: UniLabJsonCommand - auto-resume_pump: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: resume_pump的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: resume_pump参数 - type: object - type: UniLabJsonCommand pause_pump: feedback: {} goal: {} @@ -1226,19 +792,16 @@ mock_pump: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1286,7 +849,6 @@ mock_pump: description: ROS Action PumpTransfer 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -1330,7 +892,6 @@ mock_pump: title: PumpTransfer_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: amount: type: string @@ -1368,7 +929,6 @@ mock_pump: title: PumpTransfer_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1395,19 +955,16 @@ mock_pump: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1431,19 +988,16 @@ mock_pump: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1585,166 +1139,6 @@ mock_rotavap: title: emergency_stop参数 type: object type: UniLabJsonCommand - auto-set_pump_time: - feedback: {} - goal: {} - goal_default: - time_seconds: null - handles: [] - result: {} - schema: - description: set_pump_time的参数schema - properties: - feedback: {} - goal: - properties: - time_seconds: - type: number - required: - - time_seconds - type: object - result: {} - required: - - goal - title: set_pump_time参数 - type: object - type: UniLabJsonCommand - auto-set_rotate_speed: - feedback: {} - goal: {} - goal_default: - speed: null - handles: [] - result: {} - schema: - description: set_rotate_speed的参数schema - properties: - feedback: {} - goal: - properties: - speed: - type: number - required: - - speed - type: object - result: {} - required: - - goal - title: set_rotate_speed参数 - type: object - type: UniLabJsonCommand - auto-set_rotate_time: - feedback: {} - goal: {} - goal_default: - time_seconds: null - handles: [] - result: {} - schema: - description: set_rotate_time的参数schema - properties: - feedback: {} - goal: - properties: - time_seconds: - type: number - required: - - time_seconds - type: object - result: {} - required: - - goal - title: set_rotate_time参数 - type: object - type: UniLabJsonCommand - auto-set_temperature: - feedback: {} - goal: {} - goal_default: - temperature: null - handles: [] - result: {} - schema: - description: set_temperature的参数schema - properties: - feedback: {} - goal: - properties: - temperature: - type: number - required: - - temperature - type: object - result: {} - required: - - goal - title: set_temperature参数 - type: object - type: UniLabJsonCommand - auto-set_timer: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: set_timer的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: set_timer参数 - type: object - type: UniLabJsonCommand - auto-start_pump: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: start_pump的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: start_pump参数 - type: object - type: UniLabJsonCommand - auto-start_rotation: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: start_rotation的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: start_rotation参数 - type: object - type: UniLabJsonCommand auto-stop_all_operations: feedback: {} goal: {} @@ -1778,13 +1172,11 @@ mock_rotavap: description: ROS Action FloatSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: FloatSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: float_in: type: number @@ -1793,7 +1185,6 @@ mock_rotavap: title: FloatSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1822,13 +1213,11 @@ mock_rotavap: description: ROS Action FloatSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: FloatSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: float_in: type: number @@ -1837,7 +1226,6 @@ mock_rotavap: title: FloatSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1866,13 +1254,11 @@ mock_rotavap: description: ROS Action FloatSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: FloatSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: float_in: type: number @@ -1881,7 +1267,6 @@ mock_rotavap: title: FloatSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1910,13 +1295,11 @@ mock_rotavap: description: ROS Action FloatSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: FloatSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: float_in: type: number @@ -1925,7 +1308,6 @@ mock_rotavap: title: FloatSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1954,13 +1336,11 @@ mock_rotavap: description: ROS Action StrSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: StrSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: string: type: string @@ -1969,7 +1349,6 @@ mock_rotavap: title: StrSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1996,19 +1375,16 @@ mock_rotavap: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2032,19 +1408,16 @@ mock_rotavap: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2118,146 +1491,6 @@ mock_rotavap: mock_separator: class: action_value_mappings: - auto-separate: - feedback: {} - goal: {} - goal_default: - from_vessel: null - product_phase: null - purpose: null - repeats: 1 - separation_vessel: null - settling_time: 60.0 - solvent: '' - solvent_volume: 0.0 - stir_speed: 0.0 - stir_time: 0.0 - through: '' - to_vessel: null - waste_phase_to_vessel: '' - handles: [] - result: {} - schema: - description: separate的参数schema - properties: - feedback: {} - goal: - properties: - from_vessel: - type: string - product_phase: - type: string - purpose: - type: string - repeats: - default: 1 - type: integer - separation_vessel: - type: string - settling_time: - default: 60.0 - type: number - solvent: - default: '' - type: string - solvent_volume: - default: 0.0 - type: number - stir_speed: - default: 0.0 - type: number - stir_time: - default: 0.0 - type: number - through: - default: '' - type: string - to_vessel: - type: string - waste_phase_to_vessel: - default: '' - type: string - required: - - purpose - - product_phase - - from_vessel - - separation_vessel - - to_vessel - type: object - result: {} - required: - - goal - title: separate参数 - type: object - type: UniLabJsonCommand - auto-set_valve: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: set_valve的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: set_valve参数 - type: object - type: UniLabJsonCommand - auto-shake: - feedback: {} - goal: {} - goal_default: - shake_time: null - handles: [] - result: {} - schema: - description: shake的参数schema - properties: - feedback: {} - goal: - properties: - shake_time: - type: number - required: - - shake_time - type: object - result: {} - required: - - goal - title: shake参数 - type: object - type: UniLabJsonCommand - auto-stop_operations: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: stop_operations的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: stop_operations参数 - type: object - type: UniLabJsonCommand separate: feedback: current_device: current_device @@ -2299,7 +1532,6 @@ mock_separator: description: ROS Action Separate 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -2343,7 +1575,6 @@ mock_separator: title: Separate_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: from_vessel: type: string @@ -2390,7 +1621,6 @@ mock_separator: title: Separate_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2419,13 +1649,11 @@ mock_separator: description: ROS Action StrSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: StrSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: string: type: string @@ -2434,7 +1662,6 @@ mock_separator: title: StrSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2464,13 +1691,11 @@ mock_separator: description: ROS Action FloatSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: FloatSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: float_in: type: number @@ -2479,7 +1704,6 @@ mock_separator: title: FloatSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2506,19 +1730,16 @@ mock_separator: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2636,26 +1857,6 @@ mock_separator: mock_solenoid_valve: class: action_value_mappings: - auto-close_valve: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: close_valve的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: close_valve参数 - type: object - type: UniLabJsonCommand auto-is_closed: feedback: {} goal: {} @@ -2696,50 +1897,6 @@ mock_solenoid_valve: title: is_open参数 type: object type: UniLabJsonCommand - auto-open_valve: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: open_valve的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: open_valve参数 - type: object - type: UniLabJsonCommand - auto-set_valve_status: - feedback: {} - goal: {} - goal_default: - status: null - handles: [] - result: {} - schema: - description: set_valve_status的参数schema - properties: - feedback: {} - goal: - properties: - status: - type: string - required: - - status - type: object - result: {} - required: - - goal - title: set_valve_status参数 - type: object - type: UniLabJsonCommand close_valve: feedback: {} goal: {} @@ -2751,19 +1908,16 @@ mock_solenoid_valve: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2787,19 +1941,16 @@ mock_solenoid_valve: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2825,13 +1976,11 @@ mock_solenoid_valve: description: ROS Action StrSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: StrSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: string: type: string @@ -2840,7 +1989,6 @@ mock_solenoid_valve: title: StrSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2905,98 +2053,6 @@ mock_stirrer: title: emergency_stop参数 type: object type: UniLabJsonCommand - auto-heating_control: - feedback: {} - goal: {} - goal_default: - heating_state: 'On' - handles: [] - result: {} - schema: - description: heating_control的参数schema - properties: - feedback: {} - goal: - properties: - heating_state: - default: 'On' - type: string - required: [] - type: object - result: {} - required: - - goal - title: heating_control参数 - type: object - type: UniLabJsonCommand - auto-set_stir_speed: - feedback: {} - goal: {} - goal_default: - speed: null - handles: [] - result: {} - schema: - description: set_stir_speed的参数schema - properties: - feedback: {} - goal: - properties: - speed: - type: number - required: - - speed - type: object - result: {} - required: - - goal - title: set_stir_speed参数 - type: object - type: UniLabJsonCommand - auto-set_temperature: - feedback: {} - goal: {} - goal_default: - temperature: null - handles: [] - result: {} - schema: - description: set_temperature的参数schema - properties: - feedback: {} - goal: - properties: - temperature: - type: number - required: - - temperature - type: object - result: {} - required: - - goal - title: set_temperature参数 - type: object - type: UniLabJsonCommand - auto-start_stirring: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: start_stirring的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: start_stirring参数 - type: object - type: UniLabJsonCommand auto-stop_all_operations: feedback: {} goal: {} @@ -3017,26 +2073,6 @@ mock_stirrer: title: stop_all_operations参数 type: object type: UniLabJsonCommand - auto-stop_stirring: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: stop_stirring的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: stop_stirring参数 - type: object - type: UniLabJsonCommand heating_control: feedback: {} goal: @@ -3050,13 +2086,11 @@ mock_stirrer: description: ROS Action StrSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: StrSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: string: type: string @@ -3065,7 +2099,6 @@ mock_stirrer: title: StrSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3094,13 +2127,11 @@ mock_stirrer: description: ROS Action FloatSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: FloatSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: float_in: type: number @@ -3109,7 +2140,6 @@ mock_stirrer: title: FloatSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3138,13 +2168,11 @@ mock_stirrer: description: ROS Action FloatSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: FloatSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: float_in: type: number @@ -3153,7 +2181,6 @@ mock_stirrer: title: FloatSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3180,19 +2207,16 @@ mock_stirrer: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3216,19 +2240,16 @@ mock_stirrer: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3306,94 +2327,6 @@ mock_stirrer: mock_stirrer_new: class: action_value_mappings: - auto-start_stir: - feedback: {} - goal: {} - goal_default: - purpose: '' - stir_speed: 0.0 - vessel: null - handles: [] - result: {} - schema: - description: start_stir的参数schema - properties: - feedback: {} - goal: - properties: - purpose: - default: '' - type: string - stir_speed: - default: 0.0 - type: number - vessel: - type: string - required: - - vessel - type: object - result: {} - required: - - goal - title: start_stir参数 - type: object - type: UniLabJsonCommand - auto-stir: - feedback: {} - goal: {} - goal_default: - settling_time: null - stir_speed: null - stir_time: null - handles: [] - result: {} - schema: - description: stir的参数schema - properties: - feedback: {} - goal: - properties: - settling_time: - type: number - stir_speed: - type: number - stir_time: - type: number - required: - - stir_time - - stir_speed - - settling_time - type: object - result: {} - required: - - goal - title: stir参数 - type: object - type: UniLabJsonCommand - auto-stop_stir: - feedback: {} - goal: {} - goal_default: - vessel: null - handles: [] - result: {} - schema: - description: stop_stir的参数schema - properties: - feedback: {} - goal: - properties: - vessel: - type: string - required: - - vessel - type: object - result: {} - required: - - goal - title: stop_stir参数 - type: object - type: UniLabJsonCommand start_stir: feedback: current_speed: stir_speed @@ -3415,7 +2348,6 @@ mock_stirrer_new: description: ROS Action StartStir 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_speed: type: number @@ -3430,7 +2362,6 @@ mock_stirrer_new: title: StartStir_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: purpose: type: string @@ -3445,7 +2376,6 @@ mock_stirrer_new: title: StartStir_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -3482,7 +2412,6 @@ mock_stirrer_new: description: ROS Action Stir 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -3491,7 +2420,6 @@ mock_stirrer_new: title: Stir_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: settling_time: type: number @@ -3506,7 +2434,6 @@ mock_stirrer_new: title: Stir_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3538,7 +2465,6 @@ mock_stirrer_new: description: ROS Action StopStir 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_status: type: string @@ -3550,7 +2476,6 @@ mock_stirrer_new: title: StopStir_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: vessel: type: string @@ -3559,7 +2484,6 @@ mock_stirrer_new: title: StopStir_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -3663,154 +2587,6 @@ mock_vacuum: title: emergency_stop参数 type: object type: UniLabJsonCommand - auto-pause_vacuum: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: pause_vacuum的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: pause_vacuum参数 - type: object - type: UniLabJsonCommand - auto-power_control: - feedback: {} - goal: {} - goal_default: - power_state: 'On' - handles: [] - result: {} - schema: - description: power_control的参数schema - properties: - feedback: {} - goal: - properties: - power_state: - default: 'On' - type: string - required: [] - type: object - result: {} - required: - - goal - title: power_control参数 - type: object - type: UniLabJsonCommand - auto-resume_vacuum: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: resume_vacuum的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: resume_vacuum参数 - type: object - type: UniLabJsonCommand - auto-set_vacuum_level: - feedback: {} - goal: {} - goal_default: - vacuum_level: null - handles: [] - result: {} - schema: - description: set_vacuum_level的参数schema - properties: - feedback: {} - goal: - properties: - vacuum_level: - type: number - required: - - vacuum_level - type: object - result: {} - required: - - goal - title: set_vacuum_level参数 - type: object - type: UniLabJsonCommand - auto-start_vacuum: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: start_vacuum的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: start_vacuum参数 - type: object - type: UniLabJsonCommand - auto-stop_vacuum: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: stop_vacuum的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: stop_vacuum参数 - type: object - type: UniLabJsonCommand - auto-vent_to_atmosphere: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: vent_to_atmosphere的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: vent_to_atmosphere参数 - type: object - type: UniLabJsonCommand pause_vacuum: feedback: {} goal: {} @@ -3822,19 +2598,16 @@ mock_vacuum: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3860,13 +2633,11 @@ mock_vacuum: description: ROS Action StrSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: StrSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: string: type: string @@ -3875,7 +2646,6 @@ mock_vacuum: title: StrSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3902,19 +2672,16 @@ mock_vacuum: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3940,13 +2707,11 @@ mock_vacuum: description: ROS Action FloatSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: FloatSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: float_in: type: number @@ -3955,7 +2720,6 @@ mock_vacuum: title: FloatSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3982,19 +2746,16 @@ mock_vacuum: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -4018,19 +2779,16 @@ mock_vacuum: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -4054,19 +2812,16 @@ mock_vacuum: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string diff --git a/unilabos/registry/devices/moveit_config.yaml b/unilabos/registry/devices/moveit_config.yaml index e556bc8..2166887 100644 --- a/unilabos/registry/devices/moveit_config.yaml +++ b/unilabos/registry/devices/moveit_config.yaml @@ -117,30 +117,6 @@ moveit.arm_slider: title: moveit_task参数 type: object type: UniLabJsonCommand - auto-pick_and_place: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: pick_and_place的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: pick_and_place参数 - type: object - type: UniLabJsonCommand auto-post_init: feedback: {} goal: {} @@ -193,54 +169,6 @@ moveit.arm_slider: title: resource_manager参数 type: object type: UniLabJsonCommand - auto-set_position: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: set_position的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: set_position参数 - type: object - type: UniLabJsonCommand - auto-set_status: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: set_status的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: set_status参数 - type: object - type: UniLabJsonCommand auto-wait_for_resource_action: feedback: {} goal: {} @@ -273,7 +201,6 @@ moveit.arm_slider: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -282,7 +209,6 @@ moveit.arm_slider: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -291,7 +217,6 @@ moveit.arm_slider: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -319,7 +244,6 @@ moveit.arm_slider: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -328,7 +252,6 @@ moveit.arm_slider: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -337,7 +260,6 @@ moveit.arm_slider: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -365,7 +287,6 @@ moveit.arm_slider: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -374,7 +295,6 @@ moveit.arm_slider: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -383,7 +303,6 @@ moveit.arm_slider: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -402,7 +321,7 @@ moveit.arm_slider: module: unilabos.devices.ros_dev.moveit_interface:MoveitInterface status_types: {} type: python - description: Arm with Slider + description: 机械臂与滑块运动系统,基于MoveIt2运动规划框架的多自由度机械臂控制设备。该系统集成机械臂和线性滑块,通过ROS2和MoveIt2实现精确的轨迹规划和协调运动控制。支持笛卡尔空间和关节空间的运动规划、碰撞检测、逆运动学求解等功能。适用于复杂的pick-and-place操作、精密装配、多工位协作等需要高精度多轴协调运动的实验室自动化应用。 handles: [] icon: '' init_param_schema: @@ -546,30 +465,6 @@ moveit.toyo_xyz: title: moveit_task参数 type: object type: UniLabJsonCommand - auto-pick_and_place: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: pick_and_place的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: pick_and_place参数 - type: object - type: UniLabJsonCommand auto-post_init: feedback: {} goal: {} @@ -622,54 +517,6 @@ moveit.toyo_xyz: title: resource_manager参数 type: object type: UniLabJsonCommand - auto-set_position: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: set_position的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: set_position参数 - type: object - type: UniLabJsonCommand - auto-set_status: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: set_status的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: set_status参数 - type: object - type: UniLabJsonCommand auto-wait_for_resource_action: feedback: {} goal: {} @@ -702,7 +549,6 @@ moveit.toyo_xyz: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -711,7 +557,6 @@ moveit.toyo_xyz: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -720,7 +565,6 @@ moveit.toyo_xyz: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -748,7 +592,6 @@ moveit.toyo_xyz: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -757,7 +600,6 @@ moveit.toyo_xyz: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -766,7 +608,6 @@ moveit.toyo_xyz: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -794,7 +635,6 @@ moveit.toyo_xyz: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -803,7 +643,6 @@ moveit.toyo_xyz: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -812,7 +651,6 @@ moveit.toyo_xyz: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -831,7 +669,7 @@ moveit.toyo_xyz: module: unilabos.devices.ros_dev.moveit_interface:MoveitInterface status_types: {} type: python - description: Toyo XYZ + description: 东洋XYZ三轴运动平台,基于MoveIt2运动规划框架的精密定位设备。该设备通过ROS2和MoveIt2实现三维空间的精确运动控制,支持复杂轨迹规划、多点定位、速度控制等功能。具备高精度定位、平稳运动、实时轨迹监控等特性。适用于精密加工、样品定位、检测扫描、自动化装配等需要高精度三维运动控制的实验室和工业应用场景。 handles: [] icon: '' init_param_schema: diff --git a/unilabos/registry/devices/organic_miscellaneous.yaml b/unilabos/registry/devices/organic_miscellaneous.yaml index 00e7550..041bfb0 100644 --- a/unilabos/registry/devices/organic_miscellaneous.yaml +++ b/unilabos/registry/devices/organic_miscellaneous.yaml @@ -93,30 +93,6 @@ rotavap.one: title: set_rotate_time参数 type: object type: UniLabJsonCommand - auto-set_timer: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: set_timer的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: set_timer参数 - type: object - type: UniLabJsonCommand set_timer: feedback: {} goal: @@ -130,7 +106,6 @@ rotavap.one: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -139,7 +114,6 @@ rotavap.one: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -148,7 +122,6 @@ rotavap.one: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -167,7 +140,7 @@ rotavap.one: module: unilabos.devices.rotavap.rotavap_one:RotavapOne status_types: {} type: python - description: Rotavap device + description: 旋转蒸发仪设备,用于有机化学实验中的溶剂回收和浓缩操作。该设备通过串口通信控制,集成旋转和真空泵功能,支持定时控制和自动化操作。具备旋转速度调节、真空度控制、温度管理等功能,实现高效的溶剂蒸发和回收。适用于有机合成、天然产物提取、药物制备等需要溶剂去除和浓缩的实验室应用场景。 handles: [] icon: '' init_param_schema: @@ -208,38 +181,6 @@ separator.homemade: title: read_sensor_loop参数 type: object type: UniLabJsonCommand - auto-stir: - feedback: {} - goal: {} - goal_default: - settling_time: 10 - stir_speed: 300 - stir_time: 10 - handles: [] - result: {} - schema: - description: stir的参数schema - properties: - feedback: {} - goal: - properties: - settling_time: - default: 10 - type: number - stir_speed: - default: 300 - type: number - stir_time: - default: 10 - type: number - required: [] - type: object - result: {} - required: - - goal - title: stir参数 - type: object - type: UniLabJsonCommand auto-valve_open: feedback: {} goal: {} @@ -268,30 +209,6 @@ separator.homemade: title: valve_open参数 type: object type: UniLabJsonCommand - auto-valve_open_cmd: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: valve_open_cmd的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: valve_open_cmd参数 - type: object - type: UniLabJsonCommand auto-write: feedback: {} goal: {} @@ -334,7 +251,6 @@ separator.homemade: description: ROS Action Stir 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -343,7 +259,6 @@ separator.homemade: title: Stir_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: settling_time: type: number @@ -358,7 +273,6 @@ separator.homemade: title: Stir_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -382,13 +296,12 @@ separator.homemade: goal_default: command: '' handles: [] - result": + result: success: success schema: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -397,7 +310,6 @@ separator.homemade: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -406,7 +318,6 @@ separator.homemade: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -425,7 +336,7 @@ separator.homemade: module: unilabos.devices.separator.homemade_grbl_conductivity:SeparatorController status_types: {} type: python - description: Separator device with homemade grbl controller + description: 液-液分离器设备,基于自制Grbl控制器的自动化分离系统。该设备集成搅拌、沉降、阀门控制和电导率传感器,通过串口通信实现精确的分离操作控制。支持自动搅拌、分层沉降、基于传感器反馈的智能分液等功能。适用于有机化学中的萃取分离、相分离、液-液提取等需要精确分离控制的实验应用。 handles: [] icon: '' init_param_schema: diff --git a/unilabos/registry/devices/pump_and_valve.yaml b/unilabos/registry/devices/pump_and_valve.yaml index dc50dde..72e3e16 100644 --- a/unilabos/registry/devices/pump_and_valve.yaml +++ b/unilabos/registry/devices/pump_and_valve.yaml @@ -125,30 +125,6 @@ solenoid_valve: title: send_command参数 type: object type: UniLabJsonCommand - auto-set_valve_position: - feedback: {} - goal: {} - goal_default: - position: null - handles: [] - result: {} - schema: - description: set_valve_position的参数schema - properties: - feedback: {} - goal: - properties: - position: - type: string - required: - - position - type: object - result: {} - required: - - goal - title: set_valve_position参数 - type: object - type: UniLabJsonCommand set_valve_position: feedback: {} goal: @@ -161,13 +137,11 @@ solenoid_valve: description: ROS Action StrSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: StrSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: string: type: string @@ -176,7 +150,6 @@ solenoid_valve: title: StrSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -197,7 +170,7 @@ solenoid_valve: status: str valve_position: str type: python - description: Solenoid valve + description: 电磁阀控制设备,用于精确的流体路径控制和开关操作。该设备通过串口通信控制电磁阀的开关状态,支持远程操作和状态监测。具备快速响应、可靠密封、状态反馈等特性,广泛应用于流体输送、样品进样、路径切换等需要精确流体控制的实验室自动化应用。 handles: [] icon: '' init_param_schema: @@ -221,26 +194,6 @@ solenoid_valve: solenoid_valve.mock: class: action_value_mappings: - auto-close: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: close的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: close参数 - type: object - type: UniLabJsonCommand auto-is_closed: feedback: {} goal: {} @@ -281,26 +234,6 @@ solenoid_valve.mock: title: is_open参数 type: object type: UniLabJsonCommand - auto-open: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: open的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: open参数 - type: object - type: UniLabJsonCommand auto-set_valve_position: feedback: {} goal: {} @@ -335,19 +268,16 @@ solenoid_valve.mock: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -370,19 +300,16 @@ solenoid_valve.mock: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -400,7 +327,7 @@ solenoid_valve.mock: status: str valve_position: str type: python - description: Mock solenoid valve + description: 模拟电磁阀设备,用于系统测试和开发调试。该设备模拟真实电磁阀的开关操作和状态变化,提供与实际设备相同的控制接口和反馈机制。支持流体路径的虚拟控制,便于在没有实际硬件的情况下进行流体系统的集成测试和算法验证。适用于系统开发、流程调试和培训演示等场景。 handles: - data_type: fluid handler_key: in @@ -825,7 +752,7 @@ syringe_pump_with_valve.runze: velocity_grade: String velocity_init: String type: python - description: Runze Syringe pump with valve + description: 润泽精密注射泵设备,集成阀门控制的高精度流体输送系统。该设备通过串口通信控制,支持多种运行模式和精确的体积控制。具备可变速度控制、精密定位、阀门切换、实时状态监控等功能。适用于微量液体输送、精密进样、流速控制、化学反应进料等需要高精度流体操作的实验室自动化应用。 handles: [] icon: '' init_param_schema: diff --git a/unilabos/registry/devices/robot_agv.yaml b/unilabos/registry/devices/robot_agv.yaml index 51b59c2..7f04d9c 100644 --- a/unilabos/registry/devices/robot_agv.yaml +++ b/unilabos/registry/devices/robot_agv.yaml @@ -11,7 +11,7 @@ agv.SEER: handles: [] result: {} schema: - description: send的参数schema + description: AGV底层通信命令发送函数。通过TCP socket连接向AGV发送底层控制命令,支持pose(位置)、status(状态)、nav(导航)等命令类型。用于获取AGV当前位置坐标、运行状态或发送导航指令。该函数封装了AGV的通信协议,将命令转换为十六进制数据包并处理响应解析。 properties: feedback: {} goal: @@ -33,30 +33,6 @@ agv.SEER: title: send参数 type: object type: UniLabJsonCommand - auto-send_nav_task: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: send_nav_task的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: send_nav_task参数 - type: object - type: UniLabJsonCommand send_nav_task: feedback: {} goal: @@ -70,7 +46,6 @@ agv.SEER: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -79,7 +54,6 @@ agv.SEER: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -88,7 +62,6 @@ agv.SEER: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -109,7 +82,7 @@ agv.SEER: pose: list status: str type: python - description: SEER AGV + description: SEER AGV自动导引车设备,用于实验室内物料和设备的自主移动运输。该AGV通过TCP socket与导航系统通信,具备精确的定位和路径规划能力。支持实时位置监控、状态查询和导航任务执行,可在预设的实验室环境中自主移动至指定位置。适用于样品运输、设备转移、多工位协作等实验室自动化物流场景。 handles: [] icon: '' init_param_schema: diff --git a/unilabos/registry/devices/robot_arm.yaml b/unilabos/registry/devices/robot_arm.yaml index 72f0155..de5b677 100644 --- a/unilabos/registry/devices/robot_arm.yaml +++ b/unilabos/registry/devices/robot_arm.yaml @@ -8,7 +8,7 @@ robotic_arm.UR: handles: [] result: {} schema: - description: arm_init的参数schema + description: 机械臂初始化函数。执行UR机械臂的完整初始化流程,包括上电、释放制动器、解除保护停止状态等。该函数确保机械臂从安全停止状态恢复到可操作状态,是机械臂使用前的必要步骤。初始化完成后机械臂将处于就绪状态,可以接收后续的运动指令。 properties: feedback: {} goal: @@ -29,7 +29,7 @@ robotic_arm.UR: handles: [] result: {} schema: - description: load_pose_data的参数schema + description: 从JSON字符串加载位置数据函数。接收包含机械臂位置信息的JSON格式字符串,解析并存储位置数据供后续运动任务使用。位置数据通常包含多个预定义的工作位置坐标,用于实现精确的多点运动控制。适用于动态配置机械臂工作位置的场景。 properties: feedback: {} goal: @@ -53,7 +53,7 @@ robotic_arm.UR: handles: [] result: {} schema: - description: load_pose_file的参数schema + description: 从文件加载位置数据函数。读取指定的JSON文件并加载其中的机械臂位置信息。该函数支持从外部配置文件中获取预设的工作位置,便于位置数据的管理和重用。适用于需要从固定配置文件中读取复杂位置序列的应用场景。 properties: feedback: {} goal: @@ -69,30 +69,6 @@ robotic_arm.UR: title: load_pose_file参数 type: object type: UniLabJsonCommand - auto-move_pos_task: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: move_pos_task的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: move_pos_task参数 - type: object - type: UniLabJsonCommand auto-reload_pose: feedback: {} goal: {} @@ -100,7 +76,7 @@ robotic_arm.UR: handles: [] result: {} schema: - description: reload_pose的参数schema + description: 重新加载位置数据函数。重新读取并解析之前设置的位置文件,更新内存中的位置数据。该函数用于在位置文件被修改后刷新机械臂的位置配置,无需重新初始化整个系统。适用于动态更新机械臂工作位置的场景。 properties: feedback: {} goal: @@ -126,7 +102,6 @@ robotic_arm.UR: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -135,7 +110,6 @@ robotic_arm.UR: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -144,7 +118,6 @@ robotic_arm.UR: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -167,7 +140,7 @@ robotic_arm.UR: gripper_pose: float gripper_status: str type: python - description: UR robotic arm + description: Universal Robots机械臂设备,用于实验室精密操作和自动化作业。该设备集成了UR机械臂本体、Robotiq夹爪和RTDE通信接口,支持六自由度精确运动控制和力觉反馈。具备实时位置监控、状态反馈、轨迹规划等功能,可执行复杂的多点位运动任务。适用于样品抓取、精密装配、实验器具操作等需要高精度和高重复性的实验室自动化场景。 handles: [] icon: '' init_param_schema: diff --git a/unilabos/registry/devices/robot_gripper.yaml b/unilabos/registry/devices/robot_gripper.yaml index 8a3be30..03592b6 100644 --- a/unilabos/registry/devices/robot_gripper.yaml +++ b/unilabos/registry/devices/robot_gripper.yaml @@ -51,7 +51,7 @@ gripper.misumi_rz: handles: [] result: {} schema: - description: gripper_move的参数schema + description: 夹爪抓取运动控制函数。控制夹爪的开合运动,支持位置、速度、力矩的精确设定。位置参数控制夹爪开合程度,速度参数控制运动快慢,力矩参数控制夹持强度。该函数提供安全的力控制,避免损坏被抓取物体,适用于各种形状和材质的物品抓取。 properties: feedback: {} goal: @@ -80,7 +80,7 @@ gripper.misumi_rz: handles: [] result: {} schema: - description: init_gripper的参数schema + description: 夹爪初始化函数。执行Misumi RZ夹爪的完整初始化流程,包括Modbus通信建立、电机参数配置、传感器校准等。该函数确保夹爪系统从安全状态恢复到可操作状态,是夹爪使用前的必要步骤。初始化完成后夹爪将处于就绪状态,可接收抓取和旋转指令。 properties: feedback: {} goal: @@ -169,7 +169,7 @@ gripper.misumi_rz: handles: [] result: {} schema: - description: node_gripper_move的参数schema + description: 节点夹爪移动任务函数。接收逗号分隔的命令字符串,解析位置、速度、力矩参数并执行夹爪抓取动作。该函数等待运动完成并返回执行结果,提供同步的运动控制接口。适用于需要可靠完成确认的精密抓取操作。 properties: feedback: {} goal: @@ -193,7 +193,7 @@ gripper.misumi_rz: handles: [] result: {} schema: - description: node_rotate_move的参数schema + description: 节点旋转移动任务函数。接收逗号分隔的命令字符串,解析角度、速度、力矩参数并执行夹爪旋转动作。该函数等待旋转完成并返回执行结果,提供同步的旋转控制接口。适用于需要精确角度定位和完成确认的旋转操作。 properties: feedback: {} goal: @@ -251,7 +251,7 @@ gripper.misumi_rz: handles: [] result: {} schema: - description: rotate_move_abs的参数schema + description: 夹爪绝对位置旋转控制函数。控制夹爪主轴旋转到指定的绝对角度位置,支持360度连续旋转。位置参数指定目标角度,速度参数控制旋转速率,力矩参数设定旋转阻力限制。该函数提供高精度的角度定位,适用于需要精确方向控制的操作场景。 properties: feedback: {} goal: @@ -382,7 +382,6 @@ gripper.misumi_rz: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -391,7 +390,6 @@ gripper.misumi_rz: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -400,7 +398,6 @@ gripper.misumi_rz: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -420,7 +417,7 @@ gripper.misumi_rz: status_types: status: str type: python - description: Misumi RZ gripper + description: Misumi RZ系列电子夹爪设备,集成旋转和抓取双重功能的精密夹爪系统。该设备通过Modbus RTU协议与控制系统通信,支持位置、速度、力矩的精确控制。具备高精度的位置反馈、实时状态监控和故障检测功能。适用于需要精密抓取和旋转操作的实验室自动化场景,如样品管理、精密装配、器件操作等应用。 handles: [] icon: '' init_param_schema: @@ -461,7 +458,7 @@ gripper.mock: handles: [] result: {} schema: - description: edit_id的参数schema + description: 模拟夹爪资源ID编辑函数。用于测试和演示资源管理功能,模拟修改夹爪资源的标识信息。该函数接收工作流名称、参数和资源对象,模拟真实的资源更新过程并返回修改后的资源信息。适用于系统测试和开发调试场景。 properties: feedback: {} goal: @@ -484,38 +481,6 @@ gripper.mock: title: edit_id参数 type: object type: UniLabJsonCommand - auto-push_to: - feedback: {} - goal: {} - goal_default: - position: null - torque: null - velocity: 0.0 - handles: [] - result: {} - schema: - description: push_to的参数schema - properties: - feedback: {} - goal: - properties: - position: - type: number - torque: - type: number - velocity: - default: 0.0 - type: number - required: - - position - - torque - type: object - result: {} - required: - - goal - title: push_to参数 - type: object - type: UniLabJsonCommand push_to: feedback: effort: torque @@ -535,7 +500,6 @@ gripper.mock: description: ROS Action GripperCommand 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: effort: type: number @@ -553,7 +517,6 @@ gripper.mock: title: GripperCommand_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: properties: @@ -571,7 +534,6 @@ gripper.mock: title: GripperCommand_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: effort: type: number @@ -600,7 +562,7 @@ gripper.mock: torque: float velocity: float type: python - description: Mock gripper + description: 模拟夹爪设备,用于系统测试和开发调试。该设备模拟真实夹爪的位置、速度、力矩等物理特性,支持虚拟的抓取和移动操作。提供与真实夹爪相同的接口和状态反馈,便于在没有实际硬件的情况下进行系统集成测试和算法验证。适用于软件开发、系统调试和培训演示等场景。 handles: [] icon: '' init_param_schema: diff --git a/unilabos/registry/devices/robot_linear_motion.yaml b/unilabos/registry/devices/robot_linear_motion.yaml index fa98ca9..52f673e 100644 --- a/unilabos/registry/devices/robot_linear_motion.yaml +++ b/unilabos/registry/devices/robot_linear_motion.yaml @@ -8,7 +8,7 @@ linear_motion.grbl: handles: [] result: {} schema: - description: initialize的参数schema + description: CNC设备初始化函数。执行Grbl CNC的完整初始化流程,包括归零操作、轴校准和状态复位。该函数将所有轴移动到原点位置(0,0,0),确保设备处于已知的参考状态。初始化完成后设备进入空闲状态,可接收后续的运动指令。 properties: feedback: {} goal: @@ -21,30 +21,6 @@ linear_motion.grbl: title: initialize参数 type: object type: UniLabJsonCommand - auto-move_through_points: - feedback: {} - goal: {} - goal_default: - positions: null - handles: [] - result: {} - schema: - description: move_through_points的参数schema - properties: - feedback: {} - goal: - properties: - positions: - type: array - required: - - positions - type: object - result: {} - required: - - goal - title: move_through_points参数 - type: object - type: UniLabJsonCommand auto-set_position: feedback: {} goal: {} @@ -53,7 +29,7 @@ linear_motion.grbl: handles: [] result: {} schema: - description: set_position的参数schema + description: CNC绝对位置设定函数。控制CNC设备移动到指定的三维坐标位置(x,y,z)。该函数支持安全限位检查,防止超出设备工作范围。移动过程中会监控设备状态,确保安全到达目标位置。适用于精确定位和轨迹控制操作。 properties: feedback: {} goal: @@ -69,34 +45,6 @@ linear_motion.grbl: title: set_position参数 type: object type: UniLabJsonCommand - auto-set_spindle_speed: - feedback: {} - goal: {} - goal_default: - max_velocity: 500 - spindle_speed: null - handles: [] - result: {} - schema: - description: set_spindle_speed的参数schema - properties: - feedback: {} - goal: - properties: - max_velocity: - default: 500 - type: number - spindle_speed: - type: number - required: - - spindle_speed - type: object - result: {} - required: - - goal - title: set_spindle_speed参数 - type: object - type: UniLabJsonCommand auto-stop_operation: feedback: {} goal: {} @@ -104,7 +52,7 @@ linear_motion.grbl: handles: [] result: {} schema: - description: stop_operation的参数schema + description: CNC操作停止函数。立即停止当前正在执行的所有CNC运动,包括轴移动和主轴旋转。该函数用于紧急停止或任务中断,确保设备和工件的安全。停止后设备将保持当前位置,等待新的指令。 properties: feedback: {} goal: @@ -169,7 +117,6 @@ linear_motion.grbl: description: ROS Action NavigateThroughPoses 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_pose: properties: @@ -290,7 +237,6 @@ linear_motion.grbl: title: NavigateThroughPoses_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: behavior_tree: type: string @@ -371,7 +317,6 @@ linear_motion.grbl: title: NavigateThroughPoses_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: result: properties: {} @@ -404,7 +349,6 @@ linear_motion.grbl: description: ROS Action SingleJointPosition 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: error: type: number @@ -444,7 +388,6 @@ linear_motion.grbl: title: SingleJointPosition_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: max_velocity: type: number @@ -472,7 +415,6 @@ linear_motion.grbl: title: SingleJointPosition_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: {} required: [] title: SingleJointPosition_Result @@ -488,7 +430,7 @@ linear_motion.grbl: spindle_speed: float status: str type: python - description: Grbl CNC + description: Grbl数控机床(CNC)设备,用于实验室精密加工和三轴定位操作。该设备基于Grbl固件,通过串口通信控制步进电机实现X、Y、Z三轴的精确运动。支持绝对定位、轨迹规划、主轴控制和实时状态监控。具备安全限位保护和运动平滑控制功能。适用于精密钻孔、铣削、雕刻、样品制备等需要高精度定位和加工的实验室应用场景。 handles: [] icon: '' init_param_schema: @@ -537,7 +479,7 @@ motor.iCL42: handles: [] result: {} schema: - description: execute_run_motor的参数schema + description: 步进电机执行运动函数。直接执行电机运动命令,包括位置设定、速度控制和路径规划。该函数处理底层的电机控制协议,消除警告信息,设置运动参数并启动电机运行。适用于需要直接控制电机运动的应用场景。 properties: feedback: {} goal: @@ -566,7 +508,7 @@ motor.iCL42: handles: [] result: {} schema: - description: init_device的参数schema + description: iCL42电机设备初始化函数。建立与iCL42步进电机驱动器的串口通信连接,配置通信参数包括波特率、数据位、校验位等。该函数是电机使用前的必要步骤,确保驱动器处于可控状态并准备接收运动指令。 properties: feedback: {} goal: @@ -589,7 +531,7 @@ motor.iCL42: handles: [] result: {} schema: - description: run_motor的参数schema + description: 步进电机运动控制函数。根据指定的运动模式、目标位置和速度参数控制电机运动。支持多种运动模式和精确的位置控制,自动处理运动轨迹规划和执行。该函数提供异步执行和状态反馈,确保运动的准确性和可靠性。 properties: feedback: {} goal: @@ -624,7 +566,6 @@ motor.iCL42: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -633,7 +574,6 @@ motor.iCL42: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -642,7 +582,6 @@ motor.iCL42: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -664,7 +603,7 @@ motor.iCL42: motor_position: int success: bool type: python - description: iCL42 motor + description: iCL42步进电机驱动器,用于实验室设备的精密线性运动控制。该设备通过串口通信控制iCL42型步进电机驱动器,支持多种运动模式和精确的位置、速度控制。具备位置反馈、运行状态监控和故障检测功能。适用于自动进样器、样品传送、精密定位平台等需要准确线性运动控制的实验室自动化设备。 handles: [] icon: '' init_param_schema: diff --git a/unilabos/registry/devices/sim_nodes.yaml b/unilabos/registry/devices/sim_nodes.yaml index 07d1d1d..c2bfa44 100644 --- a/unilabos/registry/devices/sim_nodes.yaml +++ b/unilabos/registry/devices/sim_nodes.yaml @@ -285,7 +285,7 @@ lh_joint_publisher: module: unilabos.devices.ros_dev.liquid_handler_joint_publisher:LiquidHandlerJointPublisher status_types: {} type: ros2 - description: '' + description: 液体处理器关节发布器,用于ROS2仿真系统中的液体处理设备运动控制。该节点通过发布关节状态驱动仿真模型中的机械臂运动,支持三维坐标到关节空间的逆运动学转换、多关节协调控制、资源跟踪和TF变换。具备精确的位置控制、速度调节、pick-and-place操作等功能。适用于液体处理系统的虚拟仿真、运动规划验证、系统集成测试等应用场景。 handles: [] icon: '' init_param_schema: diff --git a/unilabos/registry/devices/temperature.yaml b/unilabos/registry/devices/temperature.yaml index 68a4f5e..7eb157c 100644 --- a/unilabos/registry/devices/temperature.yaml +++ b/unilabos/registry/devices/temperature.yaml @@ -89,30 +89,6 @@ chiller: title: modbus_crc参数 type: object type: UniLabJsonCommand - auto-set_temperature: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: set_temperature的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: set_temperature参数 - type: object - type: UniLabJsonCommand auto-stop: feedback: {} goal: {} @@ -146,7 +122,6 @@ chiller: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -155,7 +130,6 @@ chiller: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -164,7 +138,6 @@ chiller: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -183,7 +156,7 @@ chiller: module: unilabos.devices.temperature.chiller:Chiller status_types: {} type: python - description: Chiller + description: 实验室制冷设备,用于精确的温度控制和冷却操作。该设备通过Modbus RTU协议与控制系统通信,支持精确的温度设定和监控。具备快速降温、恒温控制和温度保持功能,广泛应用于需要低温环境的化学反应、样品保存、结晶操作等实验场景。提供稳定可靠的冷却性能,确保实验过程的温度精度。 handles: [] icon: '' init_param_schema: @@ -224,50 +197,6 @@ heaterstirrer.dalong: title: close参数 type: object type: UniLabJsonCommand - auto-heatchill: - feedback: {} - goal: {} - goal_default: - purpose: reaction - stir: true - stir_speed: 300 - temp: null - time: 3600 - vessel: null - handles: [] - result: {} - schema: - description: heatchill的参数schema - properties: - feedback: {} - goal: - properties: - purpose: - default: reaction - type: string - stir: - default: true - type: boolean - stir_speed: - default: 300 - type: number - temp: - type: number - time: - default: 3600 - type: number - vessel: - type: string - required: - - vessel - - temp - type: object - result: {} - required: - - goal - title: heatchill参数 - type: object - type: UniLabJsonCommand auto-set_stir_speed: feedback: {} goal: {} @@ -320,54 +249,6 @@ heaterstirrer.dalong: title: set_temp_inner参数 type: object type: UniLabJsonCommand - auto-set_temp_target: - feedback: {} - goal: {} - goal_default: - temp: null - handles: [] - result: {} - schema: - description: set_temp_target的参数schema - properties: - feedback: {} - goal: - properties: - temp: - type: string - required: - - temp - type: object - result: {} - required: - - goal - title: set_temp_target参数 - type: object - type: UniLabJsonCommand - auto-set_temp_warning: - feedback: {} - goal: {} - goal_default: - temp: null - handles: [] - result: {} - schema: - description: set_temp_warning的参数schema - properties: - feedback: {} - goal: - properties: - temp: - type: string - required: - - temp - type: object - result: {} - required: - - goal - title: set_temp_warning参数 - type: object - type: UniLabJsonCommand heatchill: feedback: status: status @@ -390,7 +271,6 @@ heaterstirrer.dalong: description: ROS Action HeatChill 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -399,7 +279,6 @@ heaterstirrer.dalong: title: HeatChill_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: purpose: type: string @@ -423,7 +302,6 @@ heaterstirrer.dalong: title: HeatChill_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -452,7 +330,6 @@ heaterstirrer.dalong: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -461,7 +338,6 @@ heaterstirrer.dalong: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -470,7 +346,6 @@ heaterstirrer.dalong: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -499,7 +374,6 @@ heaterstirrer.dalong: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -508,7 +382,6 @@ heaterstirrer.dalong: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -517,7 +390,6 @@ heaterstirrer.dalong: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -541,7 +413,7 @@ heaterstirrer.dalong: temp_target: float temp_warning: float type: python - description: DaLong heater stirrer + description: 大龙加热搅拌器,集成加热和搅拌双重功能的实验室设备。该设备通过串口通信控制,支持精确的温度调节、搅拌速度控制和安全保护功能。具备实时温度监测、目标温度设定、安全温度报警等特性。适用于化学合成、样品制备、反应控制等需要同时进行加热和搅拌的实验操作,提供稳定均匀的反应环境。 handles: [] icon: '' init_param_schema: @@ -688,30 +560,6 @@ tempsensor: title: send_prototype_command参数 type: object type: UniLabJsonCommand - auto-set_warning: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: set_warning的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: set_warning参数 - type: object - type: UniLabJsonCommand set_warning: feedback: {} goal: @@ -725,7 +573,6 @@ tempsensor: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -734,7 +581,6 @@ tempsensor: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -743,7 +589,6 @@ tempsensor: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -763,7 +608,7 @@ tempsensor: status_types: value: float type: python - description: Temperature sensor + description: 高精度温度传感器设备,用于实验室环境和设备的温度监测。该传感器通过Modbus RTU协议与控制系统通信,提供实时准确的温度数据。具备高精度测量、报警温度设定、数据稳定性好等特点。适用于反应器监控、环境温度监测、设备保护等需要精确温度测量的实验场景,为实验安全和数据可靠性提供保障。 handles: [] icon: '' init_param_schema: diff --git a/unilabos/registry/devices/vacuum_and_purge.yaml b/unilabos/registry/devices/vacuum_and_purge.yaml index 7239432..e284f38 100644 --- a/unilabos/registry/devices/vacuum_and_purge.yaml +++ b/unilabos/registry/devices/vacuum_and_purge.yaml @@ -1,26 +1,6 @@ gas_source.mock: class: action_value_mappings: - auto-close: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: close的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: close参数 - type: object - type: UniLabJsonCommand auto-is_closed: feedback: {} goal: {} @@ -61,50 +41,6 @@ gas_source.mock: title: is_open参数 type: object type: UniLabJsonCommand - auto-open: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: open的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: open参数 - type: object - type: UniLabJsonCommand - auto-set_status: - feedback: {} - goal: {} - goal_default: - string: null - handles: [] - result: {} - schema: - description: set_status的参数schema - properties: - feedback: {} - goal: - properties: - string: - type: string - required: - - string - type: object - result: {} - required: - - goal - title: set_status参数 - type: object - type: UniLabJsonCommand close: feedback: {} goal: {} @@ -115,19 +51,16 @@ gas_source.mock: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -150,19 +83,16 @@ gas_source.mock: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -187,13 +117,11 @@ gas_source.mock: description: ROS Action StrSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: StrSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: string: type: string @@ -202,7 +130,6 @@ gas_source.mock: title: StrSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -222,7 +149,7 @@ gas_source.mock: status_types: status: str type: python - description: Mock gas source + description: 模拟气体源设备,用于系统测试和开发调试。该设备模拟真实气体源的开关控制和状态监测功能,支持气体供应的启停操作。提供与真实气体源相同的接口和状态反馈,便于在没有实际硬件的情况下进行系统集成测试和算法验证。适用于气路系统调试、软件开发和实验流程验证等场景。 handles: - data_key: fluid_out data_source: executor @@ -249,26 +176,6 @@ gas_source.mock: vacuum_pump.mock: class: action_value_mappings: - auto-close: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: close的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: close参数 - type: object - type: UniLabJsonCommand auto-is_closed: feedback: {} goal: {} @@ -309,50 +216,6 @@ vacuum_pump.mock: title: is_open参数 type: object type: UniLabJsonCommand - auto-open: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: open的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: open参数 - type: object - type: UniLabJsonCommand - auto-set_status: - feedback: {} - goal: {} - goal_default: - string: null - handles: [] - result: {} - schema: - description: set_status的参数schema - properties: - feedback: {} - goal: - properties: - string: - type: string - required: - - string - type: object - result: {} - required: - - goal - title: set_status参数 - type: object - type: UniLabJsonCommand close: feedback: {} goal: {} @@ -363,19 +226,16 @@ vacuum_pump.mock: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -398,19 +258,16 @@ vacuum_pump.mock: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -435,13 +292,11 @@ vacuum_pump.mock: description: ROS Action StrSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: StrSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: string: type: string @@ -450,7 +305,6 @@ vacuum_pump.mock: title: StrSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -470,7 +324,7 @@ vacuum_pump.mock: status_types: status: str type: python - description: Mock vacuum pump + description: 模拟真空泵设备,用于系统测试和开发调试。该设备模拟真实真空泵的抽气功能和状态控制,支持真空系统的启停操作和状态监测。提供与真实真空泵相同的接口和控制逻辑,便于在没有实际硬件的情况下进行真空系统的集成测试。适用于真空工艺调试、软件开发和实验流程验证等场景。 handles: - data_key: fluid_in data_source: handle diff --git a/unilabos/registry/devices/virtual_device.yaml b/unilabos/registry/devices/virtual_device.yaml index 8894314..095628c 100644 --- a/unilabos/registry/devices/virtual_device.yaml +++ b/unilabos/registry/devices/virtual_device.yaml @@ -1,42 +1,6 @@ virtual_centrifuge: class: action_value_mappings: - auto-centrifuge: - feedback: {} - goal: {} - goal_default: - speed: null - temp: 25.0 - time: null - vessel: null - handles: [] - result: {} - schema: - description: centrifuge的参数schema - properties: - feedback: {} - goal: - properties: - speed: - type: number - temp: - default: 25.0 - type: number - time: - type: number - vessel: - type: string - required: - - vessel - - speed - - time - type: object - result: {} - required: - - goal - title: centrifuge参数 - type: object - type: UniLabJsonCommandAsync auto-cleanup: feedback: {} goal: {} @@ -101,7 +65,6 @@ virtual_centrifuge: description: ROS Action Centrifuge 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_speed: type: number @@ -119,7 +82,6 @@ virtual_centrifuge: title: Centrifuge_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: speed: type: number @@ -137,7 +99,6 @@ virtual_centrifuge: title: Centrifuge_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -274,38 +235,6 @@ virtual_column: title: initialize参数 type: object type: UniLabJsonCommandAsync - auto-run_column: - feedback: {} - goal: {} - goal_default: - column: null - from_vessel: null - to_vessel: null - handles: [] - result: {} - schema: - description: run_column的参数schema - properties: - feedback: {} - goal: - properties: - column: - type: string - from_vessel: - type: string - to_vessel: - type: string - required: - - from_vessel - - to_vessel - - column - type: object - result: {} - required: - - goal - title: run_column参数 - type: object - type: UniLabJsonCommandAsync run_column: feedback: current_status: current_status @@ -328,7 +257,6 @@ virtual_column: description: ROS Action RunColumn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -340,7 +268,6 @@ virtual_column: title: RunColumn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: column: type: string @@ -355,7 +282,6 @@ virtual_column: title: RunColumn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -468,54 +394,6 @@ virtual_filter: title: cleanup参数 type: object type: UniLabJsonCommandAsync - auto-filter: - feedback: {} - goal: {} - goal_default: - continue_heatchill: false - filtrate_vessel: '' - stir: false - stir_speed: 300.0 - temp: 25.0 - vessel: null - volume: 0.0 - handles: [] - result: {} - schema: - description: filter的参数schema - properties: - feedback: {} - goal: - properties: - continue_heatchill: - default: false - type: boolean - filtrate_vessel: - default: '' - type: string - stir: - default: false - type: boolean - stir_speed: - default: 300.0 - type: number - temp: - default: 25.0 - type: number - vessel: - type: string - volume: - default: 0.0 - type: number - required: - - vessel - type: object - result: {} - required: - - goal - title: filter参数 - type: object - type: UniLabJsonCommandAsync auto-initialize: feedback: {} goal: {} @@ -567,7 +445,6 @@ virtual_filter: description: ROS Action Filter 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_status: type: string @@ -585,7 +462,6 @@ virtual_filter: title: Filter_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: continue_heatchill: type: boolean @@ -612,7 +488,6 @@ virtual_filter: title: Filter_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -733,26 +608,6 @@ virtual_gas_source: title: cleanup参数 type: object type: UniLabJsonCommandAsync - auto-close: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: close的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: close参数 - type: object - type: UniLabJsonCommand auto-initialize: feedback: {} goal: {} @@ -813,50 +668,6 @@ virtual_gas_source: title: is_open参数 type: object type: UniLabJsonCommand - auto-open: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: open的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: open参数 - type: object - type: UniLabJsonCommand - auto-set_status: - feedback: {} - goal: {} - goal_default: - string: null - handles: [] - result: {} - schema: - description: set_status的参数schema - properties: - feedback: {} - goal: - properties: - string: - type: string - required: - - string - type: object - result: {} - required: - - goal - title: set_status参数 - type: object - type: UniLabJsonCommand close: feedback: {} goal: {} @@ -867,19 +678,16 @@ virtual_gas_source: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -902,19 +710,16 @@ virtual_gas_source: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -939,13 +744,11 @@ virtual_gas_source: description: ROS Action StrSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: StrSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: string: type: string @@ -954,7 +757,6 @@ virtual_gas_source: title: StrSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1024,106 +826,6 @@ virtual_heatchill: title: cleanup参数 type: object type: UniLabJsonCommandAsync - auto-heat_chill: - feedback: {} - goal: {} - goal_default: - purpose: null - stir: null - stir_speed: null - temp: null - time: null - vessel: null - handles: [] - result: {} - schema: - description: heat_chill的参数schema - properties: - feedback: {} - goal: - properties: - purpose: - type: string - stir: - type: boolean - stir_speed: - type: number - temp: - type: number - time: - type: number - vessel: - type: string - required: - - vessel - - temp - - time - - stir - - stir_speed - - purpose - type: object - result: {} - required: - - goal - title: heat_chill参数 - type: object - type: UniLabJsonCommandAsync - auto-heat_chill_start: - feedback: {} - goal: {} - goal_default: - purpose: null - temp: null - vessel: null - handles: [] - result: {} - schema: - description: heat_chill_start的参数schema - properties: - feedback: {} - goal: - properties: - purpose: - type: string - temp: - type: number - vessel: - type: string - required: - - vessel - - temp - - purpose - type: object - result: {} - required: - - goal - title: heat_chill_start参数 - type: object - type: UniLabJsonCommandAsync - auto-heat_chill_stop: - feedback: {} - goal: {} - goal_default: - vessel: null - handles: [] - result: {} - schema: - description: heat_chill_stop的参数schema - properties: - feedback: {} - goal: - properties: - vessel: - type: string - required: - - vessel - type: object - result: {} - required: - - goal - title: heat_chill_stop参数 - type: object - type: UniLabJsonCommandAsync auto-initialize: feedback: {} goal: {} @@ -1168,7 +870,6 @@ virtual_heatchill: description: ROS Action HeatChill 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -1177,7 +878,6 @@ virtual_heatchill: title: HeatChill_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: purpose: type: string @@ -1201,7 +901,6 @@ virtual_heatchill: title: HeatChill_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1235,7 +934,6 @@ virtual_heatchill: description: ROS Action HeatChillStart 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -1244,7 +942,6 @@ virtual_heatchill: title: HeatChillStart_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: purpose: type: string @@ -1259,7 +956,6 @@ virtual_heatchill: title: HeatChillStart_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1289,7 +985,6 @@ virtual_heatchill: description: ROS Action HeatChillStop 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -1298,7 +993,6 @@ virtual_heatchill: title: HeatChillStop_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: vessel: type: string @@ -1307,7 +1001,6 @@ virtual_heatchill: title: HeatChillStop_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1501,30 +1194,6 @@ virtual_multiway_valve: title: reset参数 type: object type: UniLabJsonCommand - auto-set_position: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: set_position的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: set_position参数 - type: object - type: UniLabJsonCommand auto-set_to_port: feedback: {} goal: {} @@ -1569,30 +1238,6 @@ virtual_multiway_valve: title: set_to_pump_position参数 type: object type: UniLabJsonCommand - auto-set_valve_position: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: set_valve_position的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: set_valve_position参数 - type: object - type: UniLabJsonCommand auto-switch_between_pump_and_port: feedback: {} goal: {} @@ -1630,7 +1275,6 @@ virtual_multiway_valve: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -1639,7 +1283,6 @@ virtual_multiway_valve: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -1648,7 +1291,6 @@ virtual_multiway_valve: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1677,7 +1319,6 @@ virtual_multiway_valve: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -1686,7 +1327,6 @@ virtual_multiway_valve: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -1695,7 +1335,6 @@ virtual_multiway_valve: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1927,66 +1566,6 @@ virtual_pump: title: initialize参数 type: object type: UniLabJsonCommandAsync - auto-transfer: - feedback: {} - goal: {} - goal_default: - amount: '' - from_vessel: null - rinsing_repeats: 0 - rinsing_solvent: '' - rinsing_volume: 0.0 - solid: false - time: 0.0 - to_vessel: null - viscous: false - volume: null - handles: [] - result: {} - schema: - description: transfer的参数schema - properties: - feedback: {} - goal: - properties: - amount: - default: '' - type: string - from_vessel: - type: string - rinsing_repeats: - default: 0 - type: integer - rinsing_solvent: - default: '' - type: string - rinsing_volume: - default: 0.0 - type: number - solid: - default: false - type: boolean - time: - default: 0.0 - type: number - to_vessel: - type: string - viscous: - default: false - type: boolean - volume: - type: number - required: - - from_vessel - - to_vessel - - volume - type: object - result: {} - required: - - goal - title: transfer参数 - type: object - type: UniLabJsonCommandAsync set_valve_position: feedback: status: status @@ -2001,13 +1580,11 @@ virtual_pump: description: ROS Action FloatSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: FloatSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: float_in: type: number @@ -2016,7 +1593,6 @@ virtual_pump: title: FloatSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2064,7 +1640,6 @@ virtual_pump: description: ROS Action PumpTransfer 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -2108,7 +1683,6 @@ virtual_pump: title: PumpTransfer_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: amount: type: string @@ -2146,7 +1720,6 @@ virtual_pump: title: PumpTransfer_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2251,46 +1824,6 @@ virtual_rotavap: title: cleanup参数 type: object type: UniLabJsonCommandAsync - auto-evaporate: - feedback: {} - goal: {} - goal_default: - pressure: 0.1 - stir_speed: 100.0 - temp: 60.0 - time: 1800.0 - vessel: null - handles: [] - result: {} - schema: - description: evaporate的参数schema - properties: - feedback: {} - goal: - properties: - pressure: - default: 0.1 - type: number - stir_speed: - default: 100.0 - type: number - temp: - default: 60.0 - type: number - time: - default: 1800.0 - type: number - vessel: - type: string - required: - - vessel - type: object - result: {} - required: - - goal - title: evaporate参数 - type: object - type: UniLabJsonCommandAsync auto-initialize: feedback: {} goal: {} @@ -2337,7 +1870,6 @@ virtual_rotavap: description: ROS Action Evaporate 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -2381,7 +1913,6 @@ virtual_rotavap: title: Evaporate_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: pressure: type: number @@ -2402,7 +1933,6 @@ virtual_rotavap: title: Evaporate_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2548,78 +2078,6 @@ virtual_separator: title: initialize参数 type: object type: UniLabJsonCommandAsync - auto-separate: - feedback: {} - goal: {} - goal_default: - from_vessel: null - product_phase: null - purpose: null - repeats: 1 - separation_vessel: null - settling_time: 300.0 - solvent: '' - solvent_volume: 50.0 - stir_speed: 300.0 - stir_time: 30.0 - through: '' - to_vessel: null - waste_phase_to_vessel: '' - handles: [] - result: {} - schema: - description: separate的参数schema - properties: - feedback: {} - goal: - properties: - from_vessel: - type: string - product_phase: - type: string - purpose: - type: string - repeats: - default: 1 - type: integer - separation_vessel: - type: string - settling_time: - default: 300.0 - type: number - solvent: - default: '' - type: string - solvent_volume: - default: 50.0 - type: number - stir_speed: - default: 300.0 - type: number - stir_time: - default: 30.0 - type: number - through: - default: '' - type: string - to_vessel: - type: string - waste_phase_to_vessel: - default: '' - type: string - required: - - purpose - - product_phase - - from_vessel - - separation_vessel - - to_vessel - type: object - result: {} - required: - - goal - title: separate参数 - type: object - type: UniLabJsonCommandAsync separate: feedback: current_status: status @@ -2660,7 +2118,6 @@ virtual_separator: description: ROS Action Separate 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -2704,7 +2161,6 @@ virtual_separator: title: Separate_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: from_vessel: type: string @@ -2751,7 +2207,6 @@ virtual_separator: title: Separate_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2877,26 +2332,6 @@ virtual_solenoid_valve: title: cleanup参数 type: object type: UniLabJsonCommandAsync - auto-close: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: close的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: close参数 - type: object - type: UniLabJsonCommandAsync auto-initialize: feedback: {} goal: {} @@ -2937,26 +2372,6 @@ virtual_solenoid_valve: title: is_closed参数 type: object type: UniLabJsonCommand - auto-open: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: open的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: open参数 - type: object - type: UniLabJsonCommandAsync auto-reset: feedback: {} goal: {} @@ -2977,53 +2392,6 @@ virtual_solenoid_valve: title: reset参数 type: object type: UniLabJsonCommandAsync - auto-set_state: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: set_state的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: set_state参数 - type: object - type: UniLabJsonCommandAsync - auto-set_valve_position: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: set_valve_position的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: [] - type: object - result: {} - required: - - goal - title: set_valve_position参数 - type: object - type: UniLabJsonCommandAsync auto-toggle: feedback: {} goal: {} @@ -3057,7 +2425,6 @@ virtual_solenoid_valve: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -3066,7 +2433,6 @@ virtual_solenoid_valve: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -3075,7 +2441,6 @@ virtual_solenoid_valve: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3104,7 +2469,6 @@ virtual_solenoid_valve: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -3113,7 +2477,6 @@ virtual_solenoid_valve: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -3122,7 +2485,6 @@ virtual_solenoid_valve: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3151,7 +2513,6 @@ virtual_solenoid_valve: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -3160,7 +2521,6 @@ virtual_solenoid_valve: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -3169,7 +2529,6 @@ virtual_solenoid_valve: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3198,7 +2557,6 @@ virtual_solenoid_valve: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -3207,7 +2565,6 @@ virtual_solenoid_valve: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -3216,7 +2573,6 @@ virtual_solenoid_valve: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3330,94 +2686,6 @@ virtual_stirrer: title: initialize参数 type: object type: UniLabJsonCommandAsync - auto-start_stir: - feedback: {} - goal: {} - goal_default: - purpose: null - stir_speed: null - vessel: null - handles: [] - result: {} - schema: - description: start_stir的参数schema - properties: - feedback: {} - goal: - properties: - purpose: - type: string - stir_speed: - type: number - vessel: - type: string - required: - - vessel - - stir_speed - - purpose - type: object - result: {} - required: - - goal - title: start_stir参数 - type: object - type: UniLabJsonCommandAsync - auto-stir: - feedback: {} - goal: {} - goal_default: - settling_time: null - stir_speed: null - stir_time: null - handles: [] - result: {} - schema: - description: stir的参数schema - properties: - feedback: {} - goal: - properties: - settling_time: - type: number - stir_speed: - type: number - stir_time: - type: number - required: - - stir_time - - stir_speed - - settling_time - type: object - result: {} - required: - - goal - title: stir参数 - type: object - type: UniLabJsonCommandAsync - auto-stop_stir: - feedback: {} - goal: {} - goal_default: - vessel: null - handles: [] - result: {} - schema: - description: stop_stir的参数schema - properties: - feedback: {} - goal: - properties: - vessel: - type: string - required: - - vessel - type: object - result: {} - required: - - goal - title: stop_stir参数 - type: object - type: UniLabJsonCommandAsync start_stir: feedback: status: status @@ -3436,7 +2704,6 @@ virtual_stirrer: description: ROS Action StartStir 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_speed: type: number @@ -3451,7 +2718,6 @@ virtual_stirrer: title: StartStir_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: purpose: type: string @@ -3466,7 +2732,6 @@ virtual_stirrer: title: StartStir_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -3503,7 +2768,6 @@ virtual_stirrer: description: ROS Action Stir 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -3512,7 +2776,6 @@ virtual_stirrer: title: Stir_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: settling_time: type: number @@ -3527,7 +2790,6 @@ virtual_stirrer: title: Stir_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3557,7 +2819,6 @@ virtual_stirrer: description: ROS Action StopStir 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_status: type: string @@ -3569,7 +2830,6 @@ virtual_stirrer: title: StopStir_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: vessel: type: string @@ -3578,7 +2838,6 @@ virtual_stirrer: title: StopStir_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -3909,33 +3168,6 @@ virtual_transfer_pump: title: set_max_velocity参数 type: object type: UniLabJsonCommand - auto-set_position: - feedback: {} - goal: {} - goal_default: - max_velocity: null - position: null - handles: [] - result: {} - schema: - description: set_position的参数schema - properties: - feedback: {} - goal: - properties: - max_velocity: - type: number - position: - type: number - required: - - position - type: object - result: {} - required: - - goal - title: set_position参数 - type: object - type: UniLabJsonCommandAsync auto-stop_operation: feedback: {} goal: {} @@ -3956,36 +3188,6 @@ virtual_transfer_pump: title: stop_operation参数 type: object type: UniLabJsonCommandAsync - auto-transfer: - feedback: {} - goal: {} - goal_default: - aspirate_velocity: null - dispense_velocity: null - volume: null - handles: [] - result: {} - schema: - description: transfer的参数schema - properties: - feedback: {} - goal: - properties: - aspirate_velocity: - type: number - dispense_velocity: - type: number - volume: - type: number - required: - - volume - type: object - result: {} - required: - - goal - title: transfer参数 - type: object - type: UniLabJsonCommandAsync set_position: feedback: current_position: current_position @@ -4005,7 +3207,6 @@ virtual_transfer_pump: description: ROS Action SetPumpPosition 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_position: type: number @@ -4020,7 +3221,6 @@ virtual_transfer_pump: title: SetPumpPosition_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: max_velocity: type: number @@ -4032,7 +3232,6 @@ virtual_transfer_pump: title: SetPumpPosition_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -4086,7 +3285,6 @@ virtual_transfer_pump: description: ROS Action Transfer 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_status: type: string @@ -4101,7 +3299,6 @@ virtual_transfer_pump: title: Transfer_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: amount: type: string @@ -4139,7 +3336,6 @@ virtual_transfer_pump: title: Transfer_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -4236,26 +3432,6 @@ virtual_vacuum_pump: title: cleanup参数 type: object type: UniLabJsonCommandAsync - auto-close: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: close的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: close参数 - type: object - type: UniLabJsonCommand auto-initialize: feedback: {} goal: {} @@ -4316,50 +3492,6 @@ virtual_vacuum_pump: title: is_open参数 type: object type: UniLabJsonCommand - auto-open: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: open的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: open参数 - type: object - type: UniLabJsonCommand - auto-set_status: - feedback: {} - goal: {} - goal_default: - string: null - handles: [] - result: {} - schema: - description: set_status的参数schema - properties: - feedback: {} - goal: - properties: - string: - type: string - required: - - string - type: object - result: {} - required: - - goal - title: set_status参数 - type: object - type: UniLabJsonCommand close: feedback: {} goal: {} @@ -4370,19 +3502,16 @@ virtual_vacuum_pump: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -4405,19 +3534,16 @@ virtual_vacuum_pump: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -4442,13 +3568,11 @@ virtual_vacuum_pump: description: ROS Action StrSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: StrSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: string: type: string @@ -4457,7 +3581,6 @@ virtual_vacuum_pump: title: StrSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string diff --git a/unilabos/registry/devices/work_station.yaml b/unilabos/registry/devices/work_station.yaml index ed8b86f..dbfe017 100644 --- a/unilabos/registry/devices/work_station.yaml +++ b/unilabos/registry/devices/work_station.yaml @@ -57,7 +57,6 @@ workstation: description: ROS Action AGVTransfer 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -66,7 +65,6 @@ workstation: title: AGVTransfer_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: from_repo: properties: @@ -226,7 +224,6 @@ workstation: title: AGVTransfer_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -289,7 +286,6 @@ workstation: description: ROS Action Add 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_status: type: string @@ -301,7 +297,6 @@ workstation: title: Add_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: amount: type: string @@ -337,7 +332,6 @@ workstation: title: Add_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -389,7 +383,6 @@ workstation: description: ROS Action AdjustPH 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -401,7 +394,6 @@ workstation: title: AdjustPH_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: ph_value: type: number @@ -416,7 +408,6 @@ workstation: title: AdjustPH_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -465,7 +456,6 @@ workstation: description: ROS Action Centrifuge 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_speed: type: number @@ -483,7 +473,6 @@ workstation: title: Centrifuge_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: speed: type: number @@ -501,7 +490,6 @@ workstation: title: Centrifuge_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -557,7 +545,6 @@ workstation: description: ROS Action Clean 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -601,7 +588,6 @@ workstation: title: Clean_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: repeats: maximum: 2147483647 @@ -624,7 +610,6 @@ workstation: title: Clean_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -677,7 +662,6 @@ workstation: description: ROS Action CleanVessel 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -689,7 +673,6 @@ workstation: title: CleanVessel_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: repeats: maximum: 2147483647 @@ -712,7 +695,6 @@ workstation: title: CleanVessel_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -772,7 +754,6 @@ workstation: description: ROS Action Dissolve 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -784,7 +765,6 @@ workstation: title: Dissolve_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: amount: type: string @@ -811,7 +791,6 @@ workstation: title: Dissolve_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -856,7 +835,6 @@ workstation: description: ROS Action Dry 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -868,7 +846,6 @@ workstation: title: Dry_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: compound: type: string @@ -880,7 +857,6 @@ workstation: title: Dry_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -927,7 +903,6 @@ workstation: description: ROS Action EvacuateAndRefill 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -971,7 +946,6 @@ workstation: title: EvacuateAndRefill_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: gas: type: string @@ -988,7 +962,6 @@ workstation: title: EvacuateAndRefill_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1036,7 +1009,6 @@ workstation: description: ROS Action Evaporate 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -1080,7 +1052,6 @@ workstation: title: Evaporate_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: pressure: type: number @@ -1101,7 +1072,6 @@ workstation: title: Evaporate_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1163,7 +1133,6 @@ workstation: description: ROS Action Filter 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_status: type: string @@ -1181,7 +1150,6 @@ workstation: title: Filter_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: continue_heatchill: type: boolean @@ -1208,7 +1176,6 @@ workstation: title: Filter_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -1278,7 +1245,6 @@ workstation: description: ROS Action FilterThrough 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -1290,7 +1256,6 @@ workstation: title: FilterThrough_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: eluting_repeats: maximum: 2147483647 @@ -1319,7 +1284,6 @@ workstation: title: FilterThrough_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -1372,7 +1336,6 @@ workstation: description: ROS Action HeatChill 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -1381,7 +1344,6 @@ workstation: title: HeatChill_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: purpose: type: string @@ -1405,7 +1367,6 @@ workstation: title: HeatChill_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1449,7 +1410,6 @@ workstation: description: ROS Action HeatChillStart 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -1458,7 +1418,6 @@ workstation: title: HeatChillStart_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: purpose: type: string @@ -1473,7 +1432,6 @@ workstation: title: HeatChillStart_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1513,7 +1471,6 @@ workstation: description: ROS Action HeatChillStop 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -1522,7 +1479,6 @@ workstation: title: HeatChillStop_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: vessel: type: string @@ -1531,7 +1487,6 @@ workstation: title: HeatChillStop_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1575,7 +1530,6 @@ workstation: description: ROS Action Hydrogenate 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -1587,7 +1541,6 @@ workstation: title: Hydrogenate_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: temp: type: string @@ -1602,7 +1555,6 @@ workstation: title: Hydrogenate_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -1678,7 +1630,6 @@ workstation: description: ROS Action PumpTransfer 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -1722,7 +1673,6 @@ workstation: title: PumpTransfer_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: amount: type: string @@ -1760,7 +1710,6 @@ workstation: title: PumpTransfer_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1818,7 +1767,6 @@ workstation: description: ROS Action Recrystallize 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -1830,7 +1778,6 @@ workstation: title: Recrystallize_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: ratio: type: string @@ -1851,7 +1798,6 @@ workstation: title: Recrystallize_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -1889,7 +1835,6 @@ workstation: description: ROS Action ResetHandling 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -1901,7 +1846,6 @@ workstation: title: ResetHandling_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: solvent: type: string @@ -1910,7 +1854,6 @@ workstation: title: ResetHandling_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -1967,7 +1910,6 @@ workstation: description: ROS Action RunColumn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -1979,7 +1921,6 @@ workstation: title: RunColumn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: column: type: string @@ -1994,7 +1935,6 @@ workstation: title: RunColumn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -2076,7 +2016,6 @@ workstation: description: ROS Action Separate 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -2120,7 +2059,6 @@ workstation: title: Separate_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: from_vessel: type: string @@ -2167,7 +2105,6 @@ workstation: title: Separate_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2211,7 +2148,6 @@ workstation: description: ROS Action StartStir 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_speed: type: number @@ -2226,7 +2162,6 @@ workstation: title: StartStir_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: purpose: type: string @@ -2241,7 +2176,6 @@ workstation: title: StartStir_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -2288,7 +2222,6 @@ workstation: description: ROS Action Stir 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -2297,7 +2230,6 @@ workstation: title: Stir_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: settling_time: type: number @@ -2312,7 +2244,6 @@ workstation: title: Stir_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2352,7 +2283,6 @@ workstation: description: ROS Action StopStir 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_status: type: string @@ -2364,7 +2294,6 @@ workstation: title: StopStir_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: vessel: type: string @@ -2373,7 +2302,6 @@ workstation: title: StopStir_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -2449,7 +2377,6 @@ workstation: description: ROS Action Transfer 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_status: type: string @@ -2464,7 +2391,6 @@ workstation: title: Transfer_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: amount: type: string @@ -2502,7 +2428,6 @@ workstation: title: Transfer_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -2576,7 +2501,6 @@ workstation: description: ROS Action WashSolid 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -2588,7 +2512,6 @@ workstation: title: WashSolid_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: filtrate_vessel: type: string @@ -2623,7 +2546,6 @@ workstation: title: WashSolid_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string diff --git a/unilabos/registry/devices/zhida_hplc.yaml b/unilabos/registry/devices/zhida_hplc.yaml index 644ab7f..62f1e06 100644 --- a/unilabos/registry/devices/zhida_hplc.yaml +++ b/unilabos/registry/devices/zhida_hplc.yaml @@ -11,19 +11,16 @@ zhida_hplc: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -36,26 +33,6 @@ zhida_hplc: title: EmptyIn type: object type: EmptyIn - auto-abort: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: abort的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: abort参数 - type: object - type: UniLabJsonCommand auto-close: feedback: {} goal: {} @@ -63,7 +40,7 @@ zhida_hplc: handles: [] result: {} schema: - description: close的参数schema + description: HPLC设备连接关闭函数。安全地断开与智达HPLC设备的TCP socket连接,释放网络资源。该函数确保连接的正确关闭,避免网络资源泄露。通常在设备使用完毕或系统关闭时调用。 properties: feedback: {} goal: @@ -83,7 +60,7 @@ zhida_hplc: handles: [] result: {} schema: - description: connect的参数schema + description: HPLC设备连接建立函数。与智达HPLC设备建立TCP socket通信连接,配置通信超时参数。该函数是设备使用前的必要步骤,建立成功后可进行状态查询、方法获取、任务启动等操作。连接失败时会抛出异常。 properties: feedback: {} goal: @@ -96,30 +73,6 @@ zhida_hplc: title: connect参数 type: object type: UniLabJsonCommand - auto-start: - feedback: {} - goal: {} - goal_default: - text: null - handles: [] - result: {} - schema: - description: start的参数schema - properties: - feedback: {} - goal: - properties: - text: - type: string - required: - - text - type: object - result: {} - required: - - goal - title: start参数 - type: object - type: UniLabJsonCommand get_methods: feedback: {} goal: {} @@ -130,19 +83,16 @@ zhida_hplc: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -167,13 +117,11 @@ zhida_hplc: description: ROS Action StrSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: StrSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: string: type: string @@ -182,7 +130,6 @@ zhida_hplc: title: StrSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -203,7 +150,7 @@ zhida_hplc: methods: dict status: dict type: python - description: Zhida HPLC + description: 智达高效液相色谱(HPLC)分析设备,用于实验室样品的分离、检测和定量分析。该设备通过TCP socket与HPLC控制系统通信,支持远程控制和状态监控。具备自动进样、梯度洗脱、多检测器数据采集等功能,可执行复杂的色谱分析方法。适用于化学分析、药物检测、环境监测、生物样品分析等需要高精度分离分析的实验室应用场景。 handles: [] icon: '' init_param_schema: diff --git a/unilabos/registry/registry.py b/unilabos/registry/registry.py index 96d74d8..7725cec 100644 --- a/unilabos/registry/registry.py +++ b/unilabos/registry/registry.py @@ -2,6 +2,8 @@ import copy import io import os import sys +import inspect +import importlib from pathlib import Path from typing import Any, Dict, List @@ -99,6 +101,12 @@ class Registry: } ] }, + # todo: support nested keys, switch to non ros message schema + "placeholder_keys": { + "res_id": "unilabos_resources", # 将当前实验室的全部物料id作为下拉框可选择 + "device_id": "unilabos_devices", # 将当前实验室的全部设备id作为下拉框可选择 + "parent": "unilabos_devices", # 将当前实验室的全部设备id作为下拉框可选择 + }, }, "test_latency": { "type": self.EmptyIn, @@ -161,6 +169,54 @@ class Registry: else: logger.debug(f"[UniLab Registry] Res File-{i+1}/{len(files)} Not Valid YAML File: {file.absolute()}") + def _extract_class_docstrings(self, module_string: str) -> Dict[str, str]: + """ + 从模块字符串中提取类和方法的docstring信息 + + Args: + module_string: 模块字符串,格式为 "module.path:ClassName" + + Returns: + 包含类和方法docstring信息的字典 + """ + docstrings = {"class_docstring": "", "methods": {}} + + if not module_string or ":" not in module_string: + return docstrings + + try: + module_path, class_name = module_string.split(":", 1) + + # 动态导入模块 + module = importlib.import_module(module_path) + + # 获取类 + if hasattr(module, class_name): + cls = getattr(module, class_name) + + # 获取类的docstring + class_doc = inspect.getdoc(cls) + if class_doc: + docstrings["class_docstring"] = class_doc.strip() + + # 获取所有方法的docstring + for method_name, method in inspect.getmembers(cls, predicate=inspect.isfunction): + method_doc = inspect.getdoc(method) + if method_doc: + docstrings["methods"][method_name] = method_doc.strip() + + # 也获取属性方法的docstring + for method_name, method in inspect.getmembers(cls, predicate=lambda x: isinstance(x, property)): + if hasattr(method, "fget") and method.fget: + method_doc = inspect.getdoc(method.fget) + if method_doc: + docstrings["methods"][method_name] = method_doc.strip() + + except Exception as e: + logger.warning(f"[UniLab Registry] 无法提取docstring信息,模块: {module_string}, 错误: {str(e)}") + + return docstrings + def _replace_type_with_class(self, type_name: str, device_id: str, field_name: str) -> Any: """ 将类型名称替换为实际的类对象 @@ -274,15 +330,13 @@ class Registry: param_type = arg_info.get("type", "") param_default = arg_info.get("default") param_required = arg_info.get("required", True) - schema["properties"][param_name] = self._generate_schema_from_info( - param_name, param_type, param_default - ) + schema["properties"][param_name] = self._generate_schema_from_info(param_name, param_type, param_default) if param_required: schema["required"].append(param_name) return { "title": f"{method_name}参数", - "description": f"{method_name}的参数schema", + "description": f"", "type": "object", "properties": {"goal": schema, "feedback": {}, "result": {}}, "required": ["goal"], @@ -348,6 +402,14 @@ class Registry: sorted(device_config["class"]["status_types"].items()) ) if complete_registry: + # 保存原有的description信息 + old_descriptions = {} + for action_name, action_config in device_config["class"]["action_value_mappings"].items(): + if "description" in action_config.get("schema", {}): + description = action_config["schema"]["description"] + if len(description): + old_descriptions[action_name] = action_config["schema"]["description"] + device_config["class"]["action_value_mappings"] = { k: v for k, v in device_config["class"]["action_value_mappings"].items() @@ -366,9 +428,14 @@ class Registry: "handles": [], } # 不生成已配置action的动作 - for k, v in enhanced_info["action_methods"].items() if k not in device_config["class"]["action_value_mappings"] + for k, v in enhanced_info["action_methods"].items() + if k not in device_config["class"]["action_value_mappings"] } ) + + # 恢复原有的description信息(auto开头的不修改) + for action_name, description in old_descriptions.items(): + device_config["class"]["action_value_mappings"][action_name]["schema"]["description"] = description device_config["init_param_schema"] = {} device_config["init_param_schema"]["config"] = self._generate_unilab_json_command_schema( enhanced_info["init_params"], "__init__" @@ -432,6 +499,8 @@ class Registry: } if "registry_type" not in device_config: device_config["registry_type"] = "device" + if "version" not in device_config: + device_config["version"] = "0.0.1" device_config["file_path"] = str(file.absolute()).replace("\\", "/") device_config["registry_type"] = "device" logger.debug( @@ -472,6 +541,13 @@ class Registry: }, **schema["properties"]["goal"]["properties"], } + # 将 placeholder_keys 信息添加到 schema 中 + if "placeholder_keys" in action_config and action_config.get("schema", {}).get( + "properties", {} + ).get("goal", {}): + action_config["schema"]["properties"]["goal"]["_unilabos_placeholder_info"] = action_config[ + "placeholder_keys" + ] msg = {"id": device_id, **device_info_copy} devices.append(msg) diff --git a/unilabos/ros/msgs/message_converter.py b/unilabos/ros/msgs/message_converter.py index 9dceef8..5e0bb08 100644 --- a/unilabos/ros/msgs/message_converter.py +++ b/unilabos/ros/msgs/message_converter.py @@ -132,7 +132,11 @@ _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) if not isinstance(x, dict) else Point(x=float(x.get("x", 0.0)), y=float(x.get("y", 0.0)), z=float(x.get("z", 0.0))), + Point: lambda x: ( + Point(x=x.x, y=x.y, z=x.z) + if not isinstance(x, dict) + else Point(x=float(x.get("x", 0.0)), y=float(x.get("y", 0.0)), z=float(x.get("z", 0.0))) + ), Resource: lambda x: Resource( id=x.get("id", ""), name=x.get("name", ""), @@ -142,7 +146,13 @@ _msg_converter: Dict[Type, Any] = { type=x.get("type", ""), category=x.get("class", "") or x.get("type", ""), pose=( - Pose(position=Point(x=float(x.get("position", {}).get("x", 0.0)), y=float(x.get("position", {}).get("y", 0.0)), z=float(x.get("position", {}).get("z", 0.0)))) + Pose( + position=Point( + x=float(x.get("position", {}).get("x", 0.0)), + y=float(x.get("position", {}).get("y", 0.0)), + z=float(x.get("position", {}).get("z", 0.0)), + ) + ) if x.get("position", None) is not None else Pose() ), @@ -151,6 +161,7 @@ _msg_converter: Dict[Type, Any] = { ), } + def json_or_yaml_loads(data: str) -> Any: try: return json.loads(data) @@ -161,6 +172,7 @@ def json_or_yaml_loads(data: str) -> Any: pass raise e + # ROS消息到Python转换器 _msg_converter_back: Dict[Type, Any] = { float: float, @@ -571,30 +583,30 @@ from unilabos.utils.import_manager import ImportManager from unilabos.config.config import ROSConfig basic_type_map = { - 'bool': {'type': 'boolean'}, - 'int8': {'type': 'integer', 'minimum': -128, 'maximum': 127}, - 'uint8': {'type': 'integer', 'minimum': 0, 'maximum': 255}, - 'int16': {'type': 'integer', 'minimum': -32768, 'maximum': 32767}, - 'uint16': {'type': 'integer', 'minimum': 0, 'maximum': 65535}, - 'int32': {'type': 'integer', 'minimum': -2147483648, 'maximum': 2147483647}, - 'uint32': {'type': 'integer', 'minimum': 0, 'maximum': 4294967295}, - 'int64': {'type': 'integer'}, - 'uint64': {'type': 'integer', 'minimum': 0}, - 'double': {'type': 'number'}, - 'float': {'type': 'number'}, - 'float32': {'type': 'number'}, - 'float64': {'type': 'number'}, - 'string': {'type': 'string'}, - 'boolean': {'type': 'boolean'}, - 'char': {'type': 'string', 'maxLength': 1}, - 'byte': {'type': 'integer', 'minimum': 0, 'maximum': 255}, + "bool": {"type": "boolean"}, + "int8": {"type": "integer", "minimum": -128, "maximum": 127}, + "uint8": {"type": "integer", "minimum": 0, "maximum": 255}, + "int16": {"type": "integer", "minimum": -32768, "maximum": 32767}, + "uint16": {"type": "integer", "minimum": 0, "maximum": 65535}, + "int32": {"type": "integer", "minimum": -2147483648, "maximum": 2147483647}, + "uint32": {"type": "integer", "minimum": 0, "maximum": 4294967295}, + "int64": {"type": "integer"}, + "uint64": {"type": "integer", "minimum": 0}, + "double": {"type": "number"}, + "float": {"type": "number"}, + "float32": {"type": "number"}, + "float64": {"type": "number"}, + "string": {"type": "string"}, + "boolean": {"type": "boolean"}, + "char": {"type": "string", "maxLength": 1}, + "byte": {"type": "integer", "minimum": 0, "maximum": 255}, } -def ros_field_type_to_json_schema(type_info: Type | str, slot_type: str=None) -> Dict[str, Any]: +def ros_field_type_to_json_schema(type_info: Type | str, slot_type: str = None) -> Dict[str, Any]: """ 将 ROS 字段类型转换为 JSON Schema 类型定义 - + Args: type_info: ROS 类型 slot_type: ROS 类型 @@ -603,10 +615,7 @@ def ros_field_type_to_json_schema(type_info: Type | str, slot_type: str=None) -> 对应的 JSON Schema 类型定义 """ if isinstance(type_info, UnboundedSequence): - return { - 'type': 'array', - 'items': ros_field_type_to_json_schema(type_info.value_type) - } + return {"type": "array", "items": ros_field_type_to_json_schema(type_info.value_type)} if isinstance(type_info, NamespacedType): cls_name = ".".join(type_info.namespaces) + ":" + type_info.name type_class = msg_converter_manager.get_class(cls_name) @@ -614,20 +623,20 @@ def ros_field_type_to_json_schema(type_info: Type | str, slot_type: str=None) -> elif isinstance(type_info, BasicType): return ros_field_type_to_json_schema(type_info.typename) elif isinstance(type_info, UnboundedString): - return basic_type_map['string'] + return basic_type_map["string"] elif isinstance(type_info, str): if type_info in basic_type_map: return basic_type_map[type_info] # 处理时间和持续时间类型 - if type_info in ('time', 'duration', 'builtin_interfaces/Time', 'builtin_interfaces/Duration'): + if type_info in ("time", "duration", "builtin_interfaces/Time", "builtin_interfaces/Duration"): return { - 'type': 'object', - 'properties': { - 'sec': {'type': 'integer', 'description': '秒'}, - 'nanosec': {'type': 'integer', 'description': '纳秒'} + "type": "object", + "properties": { + "sec": {"type": "integer", "description": "秒"}, + "nanosec": {"type": "integer", "description": "纳秒"}, }, - 'required': ['sec', 'nanosec'] + "required": ["sec", "nanosec"], } else: return ros_message_to_json_schema(type_info) @@ -638,9 +647,7 @@ def ros_field_type_to_json_schema(type_info: Type | str, slot_type: str=None) -> # 'type': 'array', # 'items': ros_field_type_to_json_schema(item_type) # } - - # # 处理复杂类型(尝试加载并处理) # try: # # 如果它是一个完整的消息类型规范 (包名/msg/类型名) @@ -655,34 +662,31 @@ def ros_field_type_to_json_schema(type_info: Type | str, slot_type: str=None) -> # logger.debug(f"无法解析类型 {field_type}: {str(e)}") # return {'type': 'object', 'description': f'未知类型: {field_type}'} + def ros_message_to_json_schema(msg_class: Any) -> Dict[str, Any]: """ 将 ROS 消息类转换为 JSON Schema - + Args: msg_class: ROS 消息类 - + Returns: 对应的 JSON Schema 定义 """ - schema = { - 'type': 'object', - 'properties': {}, - 'required': [] - } - + schema = {"type": "object", "properties": {}, "required": []} + # 获取类名作为标题 - if hasattr(msg_class, '__name__'): - schema['title'] = msg_class.__name__ - + if hasattr(msg_class, "__name__"): + schema["title"] = msg_class.__name__ + # 获取消息的字段和字段类型 try: for ind, slot_info in enumerate(msg_class._fields_and_field_types.items()): slot_name, slot_type = slot_info type_info = msg_class.SLOT_TYPES[ind] field_schema = ros_field_type_to_json_schema(type_info, slot_type) - schema['properties'][slot_name] = field_schema - schema['required'].append(slot_name) + schema["properties"][slot_name] = field_schema + schema["required"].append(slot_name) # if hasattr(msg_class, 'get_fields_and_field_types'): # fields_and_types = msg_class.get_fields_and_field_types() # @@ -707,61 +711,65 @@ def ros_message_to_json_schema(msg_class: Any) -> Dict[str, Any]: # schema['required'].append(clean_name) except Exception as e: # 如果获取字段类型失败,添加错误信息 - schema['description'] = f"解析消息字段时出错: {str(e)}" + schema["description"] = f"解析消息字段时出错: {str(e)}" logger.error(f"解析 {msg_class.__name__} 消息字段失败: {str(e)}") - + return schema + def ros_action_to_json_schema(action_class: Any) -> Dict[str, Any]: """ 将 ROS Action 类转换为 JSON Schema - + Args: action_class: ROS Action 类 - + Returns: 完整的 JSON Schema 定义 """ - if not hasattr(action_class, 'Goal') or not hasattr(action_class, 'Feedback') or not hasattr(action_class, 'Result'): + if ( + not hasattr(action_class, "Goal") + or not hasattr(action_class, "Feedback") + or not hasattr(action_class, "Result") + ): raise ValueError(f"{action_class.__name__} 不是有效的 ROS Action 类") - + # 创建基础 schema schema = { - 'title': action_class.__name__, - 'description': f"ROS Action {action_class.__name__} 的 JSON Schema", - 'type': 'object', - 'properties': { - 'goal': { - 'description': 'Action 目标 - 从客户端发送到服务器', + "title": action_class.__name__, + "description": f"ROS Action {action_class.__name__} 的 JSON Schema", + "type": "object", + "properties": { + "goal": { + # 'description': 'Action 目标 - 从客户端发送到服务器', **ros_message_to_json_schema(action_class.Goal) }, - 'feedback': { - 'description': 'Action 反馈 - 执行过程中从服务器发送到客户端', + "feedback": { + # 'description': 'Action 反馈 - 执行过程中从服务器发送到客户端', **ros_message_to_json_schema(action_class.Feedback) }, - 'result': { - 'description': 'Action 结果 - 完成后从服务器发送到客户端', + "result": { + # 'description': 'Action 结果 - 完成后从服务器发送到客户端', **ros_message_to_json_schema(action_class.Result) - } + }, }, - 'required': ['goal'] + "required": ["goal"], } - + return schema + def convert_ros_action_to_jsonschema( - action_name_or_type: Union[str, Type], - output_file: Optional[str] = None, - format: str = 'json' + action_name_or_type: Union[str, Type], output_file: Optional[str] = None, format: str = "json" ) -> Dict[str, Any]: """ 将 ROS Action 类型转换为 JSON Schema,并可选地保存到文件 - + Args: action_name_or_type: ROS Action 类型名称或类 output_file: 可选,输出 JSON Schema 的文件路径 format: 输出格式,'json' 或 'yaml' - + Returns: JSON Schema 定义(字典) """ @@ -771,21 +779,21 @@ def convert_ros_action_to_jsonschema( action_type = get_ros_type_by_msgname(action_name_or_type) else: action_type = action_name_or_type - + # 生成 JSON Schema schema = ros_action_to_json_schema(action_type) - + # 如果指定了输出文件,将 Schema 保存到文件 if output_file: - if format.lower() == 'json': - with open(output_file, 'w', encoding='utf-8') as f: + if format.lower() == "json": + with open(output_file, "w", encoding="utf-8") as f: json.dump(schema, f, indent=2, ensure_ascii=False) - elif format.lower() == 'yaml': - with open(output_file, 'w', encoding='utf-8') as f: + elif format.lower() == "yaml": + with open(output_file, "w", encoding="utf-8") as f: yaml.safe_dump(schema, f, default_flow_style=False, allow_unicode=True) else: raise ValueError(f"不支持的格式: {format},请使用 'json' 或 'yaml'") - + return schema @@ -794,14 +802,14 @@ if __name__ == "__main__": # 示例:转换 NavigateToPose action try: from nav2_msgs.action import NavigateToPose - + # 转换为 JSON Schema 并打印 schema = convert_ros_action_to_jsonschema(NavigateToPose) print(json.dumps(schema, indent=2, ensure_ascii=False)) - + # 保存到文件 # convert_ros_action_to_jsonschema(NavigateToPose, "navigate_to_pose_schema.json") - + # 或者使用字符串形式的 action 名称 # schema = convert_ros_action_to_jsonschema("nav2_msgs/action/NavigateToPose") except ImportError: diff --git a/unilabos/ros/nodes/base_device_node.py b/unilabos/ros/nodes/base_device_node.py index d4ea392..b226edc 100644 --- a/unilabos/ros/nodes/base_device_node.py +++ b/unilabos/ros/nodes/base_device_node.py @@ -307,7 +307,7 @@ class BaseROS2DeviceNode(Node, Generic[T]): # 创建动作服务 if self.create_action_server: for action_name, action_value_mapping in self._action_value_mappings.items(): - if action_name.startswith("auto-"): + if action_name.startswith("auto-") or str(action_value_mapping.get("type", "")).startswith("UniLabJsonCommand"): continue self.create_ros_action_server(action_name, action_value_mapping) diff --git a/unilabos/ros/nodes/presets/host_node.py b/unilabos/ros/nodes/presets/host_node.py index 29cdea9..c7c273d 100644 --- a/unilabos/ros/nodes/presets/host_node.py +++ b/unilabos/ros/nodes/presets/host_node.py @@ -459,7 +459,7 @@ class HostNode(BaseROS2DeviceNode): self.devices_instances[device_id] = d # noinspection PyProtectedMember for action_name, action_value_mapping in d._ros_node._action_value_mappings.items(): - if action_name.startswith("auto-"): + if action_name.startswith("auto-") or str(action_value_mapping.get("type", "")).startswith("UniLabJsonCommand"): continue action_id = f"/devices/{device_id}/{action_name}" if action_id not in self._action_clients: diff --git a/unilabos/ros/nodes/presets/protocol_node.py b/unilabos/ros/nodes/presets/protocol_node.py index f8921da..d2eab27 100644 --- a/unilabos/ros/nodes/presets/protocol_node.py +++ b/unilabos/ros/nodes/presets/protocol_node.py @@ -134,7 +134,7 @@ class ROS2ProtocolNode(BaseROS2DeviceNode): if d is not None and hasattr(d, "ros_node_instance"): node = d.ros_node_instance for action_name, action_mapping in node._action_value_mappings.items(): - if action_name.startswith("auto-"): + if action_name.startswith("auto-") or str(action_mapping.get("type", "")).startswith("UniLabJsonCommand"): continue action_id = f"/devices/{device_id_abs}/{action_name}" if action_id not in self._action_clients: From 540c5e94b78f8e5faa05b754bf3449b68b8c54e5 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Wed, 16 Jul 2025 09:46:32 +0800 Subject: [PATCH 40/96] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E8=A1=A8=E7=89=88=E6=9C=AC=E5=8F=82=E6=95=B0=EF=BC=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=B0=86auto-=E6=8C=87=E4=BB=A4=E4=BA=BA=E5=B7=A5?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E5=90=8E=E9=9D=9Eauto=EF=BC=8C=E4=B8=8D?= =?UTF-8?q?=E7=94=9F=E6=88=90=E4=BA=BA=E5=B7=A5=E5=B7=B2=E6=A3=80=E6=9F=A5?= =?UTF-8?q?=E7=9A=84=E6=8C=87=E4=BB=A4=EF=BC=8C=E5=8F=96=E6=B6=88=E4=B8=8D?= =?UTF-8?q?=E5=BF=85=E8=A6=81=E7=9A=84description=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- unilabos/registry/device_comms/serial.yaml | 1 + unilabos/registry/devices/camera.yaml | 1 + .../devices/characterization_optic.yaml | 6 +- unilabos/registry/devices/hotel.yaml | 1 + .../registry/devices/laiyu_add_solid.yaml | 15 +-- unilabos/registry/devices/liquid_handler.yaml | 68 ++++++------- unilabos/registry/devices/mock_devices.yaml | 96 ++++++++++--------- unilabos/registry/devices/moveit_config.yaml | 14 +-- .../devices/organic_miscellaneous.yaml | 8 +- unilabos/registry/devices/pump_and_valve.yaml | 9 +- unilabos/registry/devices/robot_agv.yaml | 3 +- unilabos/registry/devices/robot_arm.yaml | 3 +- unilabos/registry/devices/robot_gripper.yaml | 6 +- .../registry/devices/robot_linear_motion.yaml | 8 +- unilabos/registry/devices/sim_nodes.yaml | 1 + unilabos/registry/devices/temperature.yaml | 13 ++- .../registry/devices/vacuum_and_purge.yaml | 14 +-- unilabos/registry/devices/virtual_device.yaml | 67 +++++++------ unilabos/registry/devices/work_station.yaml | 53 +++++----- unilabos/registry/devices/zhida_hplc.yaml | 7 +- unilabos/registry/registry.py | 11 ++- unilabos/ros/msgs/message_converter.py | 5 +- 22 files changed, 233 insertions(+), 177 deletions(-) diff --git a/unilabos/registry/device_comms/serial.yaml b/unilabos/registry/device_comms/serial.yaml index 97e6051..4e8f776 100644 --- a/unilabos/registry/device_comms/serial.yaml +++ b/unilabos/registry/device_comms/serial.yaml @@ -100,3 +100,4 @@ serial: properties: {} required: [] type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/camera.yaml b/unilabos/registry/devices/camera.yaml index 788e714..3e9cb1d 100644 --- a/unilabos/registry/devices/camera.yaml +++ b/unilabos/registry/devices/camera.yaml @@ -67,3 +67,4 @@ camera: properties: {} required: [] type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/characterization_optic.yaml b/unilabos/registry/devices/characterization_optic.yaml index a627c9e..88be207 100644 --- a/unilabos/registry/devices/characterization_optic.yaml +++ b/unilabos/registry/devices/characterization_optic.yaml @@ -131,7 +131,7 @@ hplc.agilent: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -215,6 +215,7 @@ hplc.agilent: - finish_status - data_file type: object + version: 0.0.1 raman_home_made: class: action_value_mappings: @@ -340,7 +341,7 @@ raman_home_made: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -401,3 +402,4 @@ raman_home_made: properties: {} required: [] type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/hotel.yaml b/unilabos/registry/devices/hotel.yaml index 95d23bd..98a6785 100644 --- a/unilabos/registry/devices/hotel.yaml +++ b/unilabos/registry/devices/hotel.yaml @@ -29,3 +29,4 @@ hotel.thermo_orbitor_rs2_hotel: model: mesh: thermo_orbitor_rs2_hotel type: device + version: 0.0.1 diff --git a/unilabos/registry/devices/laiyu_add_solid.yaml b/unilabos/registry/devices/laiyu_add_solid.yaml index 5421a5f..07c802b 100644 --- a/unilabos/registry/devices/laiyu_add_solid.yaml +++ b/unilabos/registry/devices/laiyu_add_solid.yaml @@ -15,7 +15,7 @@ laiyu_add_solid: result: actual_mass_mg: actual_mass_mg schema: - description: 向目标粉筒位置添加固体粉末。该函数通过Modbus RTU协议与设备通信,控制粉末分装机将指定质量的粉末添加到目标粉筒位置。支持精确称量和批量处理,适用于实验室化学试剂的自动分装。 + description: '' properties: feedback: properties: {} @@ -114,7 +114,7 @@ laiyu_add_solid: handles: [] result: {} schema: - description: 执行出料操作,传入出料质量(单位0.1mg) + description: '' properties: feedback: properties: {} @@ -154,7 +154,7 @@ laiyu_add_solid: handles: [] result: {} schema: - description: 移动到某个孔板位置。 + description: '' properties: feedback: properties: {} @@ -198,7 +198,7 @@ laiyu_add_solid: handles: [] result: {} schema: - description: 按照坐标移动,单位为0.1mm + description: '' properties: feedback: properties: {} @@ -244,7 +244,7 @@ laiyu_add_solid: handles: [] result: {} schema: - description: 装载粉筒,传入粉筒编号 + description: '' properties: feedback: properties: {} @@ -286,7 +286,7 @@ laiyu_add_solid: handles: [] result: {} schema: - description: 放回粉筒 + description: '' properties: feedback: properties: {} @@ -326,7 +326,7 @@ laiyu_add_solid: handles: [] result: {} schema: - description: 重置指令 + description: '' properties: feedback: properties: {} @@ -379,3 +379,4 @@ laiyu_add_solid: required: - status type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/liquid_handler.yaml b/unilabos/registry/devices/liquid_handler.yaml index 8e56225..3812043 100644 --- a/unilabos/registry/devices/liquid_handler.yaml +++ b/unilabos/registry/devices/liquid_handler.yaml @@ -88,7 +88,7 @@ liquid_handler: handles: [] result: {} schema: - description: ROS Action LiquidHandlerAdd 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -397,7 +397,7 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerAspirate 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -770,7 +770,7 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerDiscardTips 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -853,7 +853,7 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerDispense 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1040,7 +1040,7 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerDropTips 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1207,7 +1207,7 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerDropTips96 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1371,7 +1371,7 @@ liquid_handler: handles: [] result: {} schema: - description: ROS Action LiquidHandlerMix 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1588,7 +1588,7 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerMoveLid 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1905,7 +1905,7 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerMovePlate 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2217,7 +2217,7 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerMoveResource 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2428,7 +2428,7 @@ liquid_handler: handles: [] result: {} schema: - description: ROS Action LiquidHandlerMoveTo 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2575,7 +2575,7 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerPickUpTips 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2737,7 +2737,7 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerPickUpTips96 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2936,7 +2936,7 @@ liquid_handler: handles: [] result: {} schema: - description: ROS Action LiquidHandlerRemove 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -3194,7 +3194,7 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerReturnTips 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -3242,7 +3242,7 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerReturnTips96 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -3329,7 +3329,7 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerStamp 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -3617,7 +3617,7 @@ liquid_handler: - 0 handles: [] schema: - description: ROS Action LiquidHandlerTransfer 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -4090,7 +4090,7 @@ liquid_handler: handles: [] result: {} schema: - description: ROS Action LiquidHandlerTransfer 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -4479,6 +4479,7 @@ liquid_handler: properties: {} required: [] type: object + version: 0.0.1 liquid_handler.biomek: class: action_value_mappings: @@ -4604,7 +4605,7 @@ liquid_handler.biomek: handles: [] result: {} schema: - description: ROS Action LiquidHandlerProtocolCreation 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -4673,7 +4674,7 @@ liquid_handler.biomek: label: plate result: {} schema: - description: ROS Action LiquidHandlerIncubateBiomek 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -4730,7 +4731,7 @@ liquid_handler.biomek: result: name: name schema: - description: ROS Action LiquidHandlerMoveBiomek 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -4787,7 +4788,7 @@ liquid_handler.biomek: label: plate result: {} schema: - description: ROS Action LiquidHandlerOscillateBiomek 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -4832,7 +4833,7 @@ liquid_handler.biomek: handles: [] result: {} schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -4903,7 +4904,7 @@ liquid_handler.biomek: label: targets result: {} schema: - description: ROS Action LiquidHandlerTransferBiomek 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -5082,7 +5083,7 @@ liquid_handler.biomek: label: Liquid Output result: {} schema: - description: ROS Action LiquidHandlerTransfer 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -5455,6 +5456,7 @@ liquid_handler.biomek: required: - success type: object + version: 0.0.1 liquid_handler.prcxi: class: action_value_mappings: @@ -5508,7 +5510,7 @@ liquid_handler.prcxi: handles: [] result: {} schema: - description: ROS Action LiquidHandlerAspirate 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -6170,7 +6172,7 @@ liquid_handler.prcxi: handles: [] result: {} schema: - description: ROS Action LiquidHandlerDispense 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -6352,7 +6354,7 @@ liquid_handler.prcxi: handles: [] result: {} schema: - description: ROS Action LiquidHandlerDropTips 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -6527,7 +6529,7 @@ liquid_handler.prcxi: handles: [] result: {} schema: - description: ROS Action LiquidHandlerMix 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -6705,7 +6707,7 @@ liquid_handler.prcxi: handles: [] result: {} schema: - description: ROS Action LiquidHandlerPickUpTips 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -6870,6 +6872,7 @@ liquid_handler.prcxi: required: - reset_ok type: object + version: 0.0.1 liquid_handler.revvity: class: action_value_mappings: @@ -6907,7 +6910,7 @@ liquid_handler.revvity: result: success: success schema: - description: ROS Action WorkStationRun 的 JSON Schema + description: '' properties: feedback: properties: @@ -7044,3 +7047,4 @@ liquid_handler.revvity: - success - status type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/mock_devices.yaml b/unilabos/registry/devices/mock_devices.yaml index be57ffa..5bfe5d7 100644 --- a/unilabos/registry/devices/mock_devices.yaml +++ b/unilabos/registry/devices/mock_devices.yaml @@ -9,7 +9,7 @@ mock_chiller: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -49,7 +49,7 @@ mock_chiller: status: status success: success schema: - description: ROS Action HeatChillStart 的 JSON Schema + description: '' properties: feedback: properties: @@ -100,7 +100,7 @@ mock_chiller: status: status success: success schema: - description: ROS Action HeatChillStop 的 JSON Schema + description: '' properties: feedback: properties: @@ -184,6 +184,7 @@ mock_chiller: - purpose - status_info type: object + version: 0.0.1 mock_filter: class: action_value_mappings: @@ -234,7 +235,7 @@ mock_filter: message: message success: success schema: - description: ROS Action Filter 的 JSON Schema + description: '' properties: feedback: properties: @@ -306,7 +307,7 @@ mock_filter: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -339,7 +340,7 @@ mock_filter: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -442,6 +443,7 @@ mock_filter: - target_volume - status_info type: object + version: 0.0.1 mock_heater: class: action_value_mappings: @@ -501,7 +503,7 @@ mock_heater: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -547,7 +549,7 @@ mock_heater: result: success: success schema: - description: ROS Action HeatChill 的 JSON Schema + description: '' properties: feedback: properties: @@ -611,7 +613,7 @@ mock_heater: result: success: success schema: - description: ROS Action HeatChillStart 的 JSON Schema + description: '' properties: feedback: properties: @@ -662,7 +664,7 @@ mock_heater: result: success: success schema: - description: ROS Action HeatChillStop 的 JSON Schema + description: '' properties: feedback: properties: @@ -758,6 +760,7 @@ mock_heater: - stir_speed - status_info type: object + version: 0.0.1 mock_pump: class: action_value_mappings: @@ -789,7 +792,7 @@ mock_pump: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -846,7 +849,7 @@ mock_pump: result: success: success schema: - description: ROS Action PumpTransfer 的 JSON Schema + description: '' properties: feedback: properties: @@ -952,7 +955,7 @@ mock_pump: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -985,7 +988,7 @@ mock_pump: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1116,6 +1119,7 @@ mock_pump: - time_remaining - status_info type: object + version: 0.0.1 mock_rotavap: class: action_value_mappings: @@ -1169,7 +1173,7 @@ mock_rotavap: result: success: success schema: - description: ROS Action FloatSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1210,7 +1214,7 @@ mock_rotavap: result: success: success schema: - description: ROS Action FloatSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1251,7 +1255,7 @@ mock_rotavap: result: success: success schema: - description: ROS Action FloatSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1292,7 +1296,7 @@ mock_rotavap: result: success: success schema: - description: ROS Action FloatSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1333,7 +1337,7 @@ mock_rotavap: result: success: success schema: - description: ROS Action StrSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1372,7 +1376,7 @@ mock_rotavap: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1405,7 +1409,7 @@ mock_rotavap: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1488,6 +1492,7 @@ mock_rotavap: - target_temperature - status_info type: object + version: 0.0.1 mock_separator: class: action_value_mappings: @@ -1529,7 +1534,7 @@ mock_separator: result: success: success schema: - description: ROS Action Separate 的 JSON Schema + description: '' properties: feedback: properties: @@ -1646,7 +1651,7 @@ mock_separator: result: success: success schema: - description: ROS Action StrSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1688,7 +1693,7 @@ mock_separator: result: success: success schema: - description: ROS Action FloatSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1727,7 +1732,7 @@ mock_separator: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1854,6 +1859,7 @@ mock_separator: - time_remaining - status_info type: object + version: 0.0.1 mock_solenoid_valve: class: action_value_mappings: @@ -1905,7 +1911,7 @@ mock_solenoid_valve: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1938,7 +1944,7 @@ mock_solenoid_valve: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1973,7 +1979,7 @@ mock_solenoid_valve: result: success: success schema: - description: ROS Action StrSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2030,6 +2036,7 @@ mock_solenoid_valve: - status - valve_status type: object + version: 0.0.1 mock_stirrer: class: action_value_mappings: @@ -2083,7 +2090,7 @@ mock_stirrer: result: success: success schema: - description: ROS Action StrSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2124,7 +2131,7 @@ mock_stirrer: result: success: success schema: - description: ROS Action FloatSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2165,7 +2172,7 @@ mock_stirrer: result: success: success schema: - description: ROS Action FloatSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2204,7 +2211,7 @@ mock_stirrer: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2237,7 +2244,7 @@ mock_stirrer: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2324,6 +2331,7 @@ mock_stirrer: - max_temperature - status_info type: object + version: 0.0.1 mock_stirrer_new: class: action_value_mappings: @@ -2345,7 +2353,7 @@ mock_stirrer_new: message: message success: success schema: - description: ROS Action StartStir 的 JSON Schema + description: '' properties: feedback: properties: @@ -2409,7 +2417,7 @@ mock_stirrer_new: result: success: success schema: - description: ROS Action Stir 的 JSON Schema + description: '' properties: feedback: properties: @@ -2462,7 +2470,7 @@ mock_stirrer_new: message: message success: success schema: - description: ROS Action StopStir 的 JSON Schema + description: '' properties: feedback: properties: @@ -2564,6 +2572,7 @@ mock_stirrer_new: - progress - status_info type: object + version: 0.0.1 mock_vacuum: class: action_value_mappings: @@ -2595,7 +2604,7 @@ mock_vacuum: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2630,7 +2639,7 @@ mock_vacuum: result: success: success schema: - description: ROS Action StrSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2669,7 +2678,7 @@ mock_vacuum: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2704,7 +2713,7 @@ mock_vacuum: result: success: success schema: - description: ROS Action FloatSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2743,7 +2752,7 @@ mock_vacuum: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2776,7 +2785,7 @@ mock_vacuum: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2809,7 +2818,7 @@ mock_vacuum: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2888,3 +2897,4 @@ mock_vacuum: - max_pump_speed - status_info type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/moveit_config.yaml b/unilabos/registry/devices/moveit_config.yaml index 2166887..3823524 100644 --- a/unilabos/registry/devices/moveit_config.yaml +++ b/unilabos/registry/devices/moveit_config.yaml @@ -198,7 +198,7 @@ moveit.arm_slider: handles: [] result: {} schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -241,7 +241,7 @@ moveit.arm_slider: handles: [] result: {} schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -284,7 +284,7 @@ moveit.arm_slider: handles: [] result: {} schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -346,6 +346,7 @@ moveit.arm_slider: model: mesh: arm_slider type: device + version: 0.0.1 moveit.toyo_xyz: class: action_value_mappings: @@ -546,7 +547,7 @@ moveit.toyo_xyz: handles: [] result: {} schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -589,7 +590,7 @@ moveit.toyo_xyz: handles: [] result: {} schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -632,7 +633,7 @@ moveit.toyo_xyz: handles: [] result: {} schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -694,3 +695,4 @@ moveit.toyo_xyz: model: mesh: toyo_xyz type: device + version: 0.0.1 diff --git a/unilabos/registry/devices/organic_miscellaneous.yaml b/unilabos/registry/devices/organic_miscellaneous.yaml index 041bfb0..aca63df 100644 --- a/unilabos/registry/devices/organic_miscellaneous.yaml +++ b/unilabos/registry/devices/organic_miscellaneous.yaml @@ -103,7 +103,7 @@ rotavap.one: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -158,6 +158,7 @@ rotavap.one: properties: {} required: [] type: object + version: 0.0.1 separator.homemade: class: action_value_mappings: @@ -248,7 +249,7 @@ separator.homemade: result: success: success schema: - description: ROS Action Stir 的 JSON Schema + description: '' properties: feedback: properties: @@ -299,7 +300,7 @@ separator.homemade: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -360,3 +361,4 @@ separator.homemade: properties: {} required: [] type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/pump_and_valve.yaml b/unilabos/registry/devices/pump_and_valve.yaml index 72e3e16..18fbd14 100644 --- a/unilabos/registry/devices/pump_and_valve.yaml +++ b/unilabos/registry/devices/pump_and_valve.yaml @@ -134,7 +134,7 @@ solenoid_valve: handles: [] result: {} schema: - description: ROS Action StrSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -191,6 +191,7 @@ solenoid_valve: - status - valve_position type: object + version: 0.0.1 solenoid_valve.mock: class: action_value_mappings: @@ -265,7 +266,7 @@ solenoid_valve.mock: handles: [] result: {} schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -297,7 +298,7 @@ solenoid_valve.mock: handles: [] result: {} schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -358,6 +359,7 @@ solenoid_valve.mock: - status - valve_position type: object + version: 0.0.1 syringe_pump_with_valve.runze: class: action_value_mappings: @@ -802,3 +804,4 @@ syringe_pump_with_valve.runze: - position - plunger_position type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/robot_agv.yaml b/unilabos/registry/devices/robot_agv.yaml index 7f04d9c..d947de6 100644 --- a/unilabos/registry/devices/robot_agv.yaml +++ b/unilabos/registry/devices/robot_agv.yaml @@ -43,7 +43,7 @@ agv.SEER: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -103,3 +103,4 @@ agv.SEER: - pose - status type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/robot_arm.yaml b/unilabos/registry/devices/robot_arm.yaml index de5b677..82fa0dd 100644 --- a/unilabos/registry/devices/robot_arm.yaml +++ b/unilabos/registry/devices/robot_arm.yaml @@ -99,7 +99,7 @@ robotic_arm.UR: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -170,3 +170,4 @@ robotic_arm.UR: - arm_status - gripper_status type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/robot_gripper.yaml b/unilabos/registry/devices/robot_gripper.yaml index 03592b6..383bcff 100644 --- a/unilabos/registry/devices/robot_gripper.yaml +++ b/unilabos/registry/devices/robot_gripper.yaml @@ -379,7 +379,7 @@ gripper.misumi_rz: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -444,6 +444,7 @@ gripper.misumi_rz: required: - status type: object + version: 0.0.1 gripper.mock: class: action_value_mappings: @@ -497,7 +498,7 @@ gripper.mock: effort: torque position: position schema: - description: ROS Action GripperCommand 的 JSON Schema + description: '' properties: feedback: properties: @@ -586,3 +587,4 @@ gripper.mock: - torque - status type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/robot_linear_motion.yaml b/unilabos/registry/devices/robot_linear_motion.yaml index 52f673e..c33cace 100644 --- a/unilabos/registry/devices/robot_linear_motion.yaml +++ b/unilabos/registry/devices/robot_linear_motion.yaml @@ -114,7 +114,7 @@ linear_motion.grbl: handles: [] result: {} schema: - description: ROS Action NavigateThroughPoses 的 JSON Schema + description: '' properties: feedback: properties: @@ -346,7 +346,7 @@ linear_motion.grbl: handles: [] result: {} schema: - description: ROS Action SingleJointPosition 的 JSON Schema + description: '' properties: feedback: properties: @@ -466,6 +466,7 @@ linear_motion.grbl: - position - spindle_speed type: object + version: 0.0.1 motor.iCL42: class: action_value_mappings: @@ -563,7 +564,7 @@ motor.iCL42: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -630,3 +631,4 @@ motor.iCL42: - is_executing_run - success type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/sim_nodes.yaml b/unilabos/registry/devices/sim_nodes.yaml index c2bfa44..4476a02 100644 --- a/unilabos/registry/devices/sim_nodes.yaml +++ b/unilabos/registry/devices/sim_nodes.yaml @@ -309,3 +309,4 @@ lh_joint_publisher: properties: {} required: [] type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/temperature.yaml b/unilabos/registry/devices/temperature.yaml index 7eb157c..2da45fd 100644 --- a/unilabos/registry/devices/temperature.yaml +++ b/unilabos/registry/devices/temperature.yaml @@ -119,7 +119,7 @@ chiller: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -174,6 +174,7 @@ chiller: properties: {} required: [] type: object + version: 0.0.1 heaterstirrer.dalong: class: action_value_mappings: @@ -268,7 +269,7 @@ heaterstirrer.dalong: result: success: success schema: - description: ROS Action HeatChill 的 JSON Schema + description: '' properties: feedback: properties: @@ -327,7 +328,7 @@ heaterstirrer.dalong: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -371,7 +372,7 @@ heaterstirrer.dalong: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -449,6 +450,7 @@ heaterstirrer.dalong: - temp_warning - temp_target type: object + version: 0.0.1 tempsensor: class: action_value_mappings: @@ -570,7 +572,7 @@ tempsensor: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -635,3 +637,4 @@ tempsensor: required: - value type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/vacuum_and_purge.yaml b/unilabos/registry/devices/vacuum_and_purge.yaml index e284f38..85aefdc 100644 --- a/unilabos/registry/devices/vacuum_and_purge.yaml +++ b/unilabos/registry/devices/vacuum_and_purge.yaml @@ -48,7 +48,7 @@ gas_source.mock: handles: [] result: {} schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -80,7 +80,7 @@ gas_source.mock: handles: [] result: {} schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -114,7 +114,7 @@ gas_source.mock: handles: [] result: {} schema: - description: ROS Action StrSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -173,6 +173,7 @@ gas_source.mock: required: - status type: object + version: 0.0.1 vacuum_pump.mock: class: action_value_mappings: @@ -223,7 +224,7 @@ vacuum_pump.mock: handles: [] result: {} schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -255,7 +256,7 @@ vacuum_pump.mock: handles: [] result: {} schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -289,7 +290,7 @@ vacuum_pump.mock: handles: [] result: {} schema: - description: ROS Action StrSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -348,3 +349,4 @@ vacuum_pump.mock: required: - status type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/virtual_device.yaml b/unilabos/registry/devices/virtual_device.yaml index 095628c..d8f8f19 100644 --- a/unilabos/registry/devices/virtual_device.yaml +++ b/unilabos/registry/devices/virtual_device.yaml @@ -62,7 +62,7 @@ virtual_centrifuge: message: message success: success schema: - description: ROS Action Centrifuge 的 JSON Schema + description: '' properties: feedback: properties: @@ -192,6 +192,7 @@ virtual_centrifuge: - progress - message type: object + version: 0.0.1 virtual_column: class: action_value_mappings: @@ -254,7 +255,7 @@ virtual_column: return_info: current_status success: success schema: - description: ROS Action RunColumn 的 JSON Schema + description: '' properties: feedback: properties: @@ -371,6 +372,7 @@ virtual_column: - progress - current_status type: object + version: 0.0.1 virtual_filter: class: action_value_mappings: @@ -442,7 +444,7 @@ virtual_filter: return_info: message success: success schema: - description: ROS Action Filter 的 JSON Schema + description: '' properties: feedback: properties: @@ -585,6 +587,7 @@ virtual_filter: - max_stir_speed - max_volume type: object + version: 0.0.1 virtual_gas_source: class: action_value_mappings: @@ -675,7 +678,7 @@ virtual_gas_source: handles: [] result: {} schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -707,7 +710,7 @@ virtual_gas_source: handles: [] result: {} schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -741,7 +744,7 @@ virtual_gas_source: handles: [] result: {} schema: - description: ROS Action StrSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -803,6 +806,7 @@ virtual_gas_source: required: - status type: object + version: 0.0.1 virtual_heatchill: class: action_value_mappings: @@ -867,7 +871,7 @@ virtual_heatchill: result: success: success schema: - description: ROS Action HeatChill 的 JSON Schema + description: '' properties: feedback: properties: @@ -931,7 +935,7 @@ virtual_heatchill: result: success: success schema: - description: ROS Action HeatChillStart 的 JSON Schema + description: '' properties: feedback: properties: @@ -982,7 +986,7 @@ virtual_heatchill: result: success: success schema: - description: ROS Action HeatChillStop 的 JSON Schema + description: '' properties: feedback: properties: @@ -1063,6 +1067,7 @@ virtual_heatchill: - stir_speed - remaining_time type: object + version: 0.0.1 virtual_multiway_valve: class: action_value_mappings: @@ -1272,7 +1277,7 @@ virtual_multiway_valve: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -1316,7 +1321,7 @@ virtual_multiway_valve: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -1483,6 +1488,7 @@ virtual_multiway_valve: - flow_path - info type: object + version: 0.0.1 virtual_pump: class: action_value_mappings: @@ -1577,7 +1583,7 @@ virtual_pump: result: success: success schema: - description: ROS Action FloatSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1637,7 +1643,7 @@ virtual_pump: result: success: success schema: - description: ROS Action PumpTransfer 的 JSON Schema + description: '' properties: feedback: properties: @@ -1801,6 +1807,7 @@ virtual_pump: - transferred_volume - current_status type: object + version: 0.0.1 virtual_rotavap: class: action_value_mappings: @@ -1867,7 +1874,7 @@ virtual_rotavap: message: message success: success schema: - description: ROS Action Evaporate 的 JSON Schema + description: '' properties: feedback: properties: @@ -2035,6 +2042,7 @@ virtual_rotavap: - max_rotation_speed - remaining_time type: object + version: 0.0.1 virtual_separator: class: action_value_mappings: @@ -2115,7 +2123,7 @@ virtual_separator: message: message success: success schema: - description: ROS Action Separate 的 JSON Schema + description: '' properties: feedback: properties: @@ -2309,6 +2317,7 @@ virtual_separator: - progress - message type: object + version: 0.0.1 virtual_solenoid_valve: class: action_value_mappings: @@ -2422,7 +2431,7 @@ virtual_solenoid_valve: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -2466,7 +2475,7 @@ virtual_solenoid_valve: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -2510,7 +2519,7 @@ virtual_solenoid_valve: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -2554,7 +2563,7 @@ virtual_solenoid_valve: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -2643,6 +2652,7 @@ virtual_solenoid_valve: - valve_position - state type: object + version: 0.0.1 virtual_stirrer: class: action_value_mappings: @@ -2701,7 +2711,7 @@ virtual_stirrer: result: success: success schema: - description: ROS Action StartStir 的 JSON Schema + description: '' properties: feedback: properties: @@ -2765,7 +2775,7 @@ virtual_stirrer: result: success: success schema: - description: ROS Action Stir 的 JSON Schema + description: '' properties: feedback: properties: @@ -2816,7 +2826,7 @@ virtual_stirrer: result: success: success schema: - description: ROS Action StopStir 的 JSON Schema + description: '' properties: feedback: properties: @@ -2907,6 +2917,7 @@ virtual_stirrer: - is_stirring - remaining_time type: object + version: 0.0.1 virtual_transfer_pump: class: action_value_mappings: @@ -3204,7 +3215,7 @@ virtual_transfer_pump: message: message success: success schema: - description: ROS Action SetPumpPosition 的 JSON Schema + description: '' properties: feedback: properties: @@ -3282,7 +3293,7 @@ virtual_transfer_pump: message: message success: success schema: - description: ROS Action Transfer 的 JSON Schema + description: '' properties: feedback: properties: @@ -3409,6 +3420,7 @@ virtual_transfer_pump: - remaining_capacity - pump_info type: object + version: 0.0.1 virtual_vacuum_pump: class: action_value_mappings: @@ -3499,7 +3511,7 @@ virtual_vacuum_pump: handles: [] result: {} schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -3531,7 +3543,7 @@ virtual_vacuum_pump: handles: [] result: {} schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -3565,7 +3577,7 @@ virtual_vacuum_pump: handles: [] result: {} schema: - description: ROS Action StrSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -3627,3 +3639,4 @@ virtual_vacuum_pump: required: - status type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/work_station.yaml b/unilabos/registry/devices/work_station.yaml index dbfe017..91e4c4f 100644 --- a/unilabos/registry/devices/work_station.yaml +++ b/unilabos/registry/devices/work_station.yaml @@ -54,7 +54,7 @@ workstation: handles: [] result: {} schema: - description: ROS Action AGVTransfer 的 JSON Schema + description: '' properties: feedback: properties: @@ -283,7 +283,7 @@ workstation: label: Vessel result: {} schema: - description: ROS Action Add 的 JSON Schema + description: '' properties: feedback: properties: @@ -380,7 +380,7 @@ workstation: label: Vessel result: {} schema: - description: ROS Action AdjustPH 的 JSON Schema + description: '' properties: feedback: properties: @@ -453,7 +453,7 @@ workstation: label: Vessel result: {} schema: - description: ROS Action Centrifuge 的 JSON Schema + description: '' properties: feedback: properties: @@ -542,7 +542,7 @@ workstation: label: Vessel result: {} schema: - description: ROS Action Clean 的 JSON Schema + description: '' properties: feedback: properties: @@ -659,7 +659,7 @@ workstation: label: Vessel result: {} schema: - description: ROS Action CleanVessel 的 JSON Schema + description: '' properties: feedback: properties: @@ -751,7 +751,7 @@ workstation: label: Vessel result: {} schema: - description: ROS Action Dissolve 的 JSON Schema + description: '' properties: feedback: properties: @@ -832,7 +832,7 @@ workstation: label: Vessel result: {} schema: - description: ROS Action Dry 的 JSON Schema + description: '' properties: feedback: properties: @@ -900,7 +900,7 @@ workstation: label: Vessel result: {} schema: - description: ROS Action EvacuateAndRefill 的 JSON Schema + description: '' properties: feedback: properties: @@ -1006,7 +1006,7 @@ workstation: label: Vessel result: {} schema: - description: ROS Action Evaporate 的 JSON Schema + description: '' properties: feedback: properties: @@ -1130,7 +1130,7 @@ workstation: label: Filtrate Vessel result: {} schema: - description: ROS Action Filter 的 JSON Schema + description: '' properties: feedback: properties: @@ -1242,7 +1242,7 @@ workstation: label: To Vessel result: {} schema: - description: ROS Action FilterThrough 的 JSON Schema + description: '' properties: feedback: properties: @@ -1333,7 +1333,7 @@ workstation: label: Vessel result: {} schema: - description: ROS Action HeatChill 的 JSON Schema + description: '' properties: feedback: properties: @@ -1407,7 +1407,7 @@ workstation: label: Vessel result: {} schema: - description: ROS Action HeatChillStart 的 JSON Schema + description: '' properties: feedback: properties: @@ -1468,7 +1468,7 @@ workstation: label: Vessel result: {} schema: - description: ROS Action HeatChillStop 的 JSON Schema + description: '' properties: feedback: properties: @@ -1527,7 +1527,7 @@ workstation: label: Vessel result: {} schema: - description: ROS Action Hydrogenate 的 JSON Schema + description: '' properties: feedback: properties: @@ -1627,7 +1627,7 @@ workstation: label: To Vessel result: {} schema: - description: ROS Action PumpTransfer 的 JSON Schema + description: '' properties: feedback: properties: @@ -1764,7 +1764,7 @@ workstation: label: Vessel result: {} schema: - description: ROS Action Recrystallize 的 JSON Schema + description: '' properties: feedback: properties: @@ -1832,7 +1832,7 @@ workstation: output: [] result: {} schema: - description: ROS Action ResetHandling 的 JSON Schema + description: '' properties: feedback: properties: @@ -1907,7 +1907,7 @@ workstation: label: To Vessel result: {} schema: - description: ROS Action RunColumn 的 JSON Schema + description: '' properties: feedback: properties: @@ -2013,7 +2013,7 @@ workstation: label: To Vessel result: {} schema: - description: ROS Action Separate 的 JSON Schema + description: '' properties: feedback: properties: @@ -2145,7 +2145,7 @@ workstation: label: Vessel result: {} schema: - description: ROS Action StartStir 的 JSON Schema + description: '' properties: feedback: properties: @@ -2219,7 +2219,7 @@ workstation: label: Vessel result: {} schema: - description: ROS Action Stir 的 JSON Schema + description: '' properties: feedback: properties: @@ -2280,7 +2280,7 @@ workstation: label: Vessel result: {} schema: - description: ROS Action StopStir 的 JSON Schema + description: '' properties: feedback: properties: @@ -2374,7 +2374,7 @@ workstation: label: To Vessel result: {} schema: - description: ROS Action Transfer 的 JSON Schema + description: '' properties: feedback: properties: @@ -2498,7 +2498,7 @@ workstation: label: Filtrate Vessel result: {} schema: - description: ROS Action WashSolid 的 JSON Schema + description: '' properties: feedback: properties: @@ -2679,3 +2679,4 @@ workstation: properties: {} required: [] type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/zhida_hplc.yaml b/unilabos/registry/devices/zhida_hplc.yaml index 62f1e06..dc1e013 100644 --- a/unilabos/registry/devices/zhida_hplc.yaml +++ b/unilabos/registry/devices/zhida_hplc.yaml @@ -8,7 +8,7 @@ zhida_hplc: handles: [] result: {} schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -80,7 +80,7 @@ zhida_hplc: handles: [] result: {} schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -114,7 +114,7 @@ zhida_hplc: handles: [] result: {} schema: - description: ROS Action StrSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -177,3 +177,4 @@ zhida_hplc: - status - methods type: object + version: 0.0.1 diff --git a/unilabos/registry/registry.py b/unilabos/registry/registry.py index 7725cec..f496e0f 100644 --- a/unilabos/registry/registry.py +++ b/unilabos/registry/registry.py @@ -65,7 +65,7 @@ class Registry: }, "feedback": {}, "result": {"success": "success"}, - "schema": ros_action_to_json_schema(self.ResourceCreateFromOuter), + "schema": ros_action_to_json_schema(self.ResourceCreateFromOuter, '用于创建或更新物料资源,每次传入多个物料信息。'), "goal_default": yaml.safe_load( io.StringIO(get_yaml_from_goal_type(self.ResourceCreateFromOuter.Goal)) ), @@ -86,7 +86,7 @@ class Registry: }, "feedback": {}, "result": {"success": "success"}, - "schema": ros_action_to_json_schema(self.ResourceCreateFromOuterEasy), + "schema": ros_action_to_json_schema(self.ResourceCreateFromOuterEasy, '用于创建或更新物料资源,每次传入一个物料信息。'), "goal_default": yaml.safe_load( io.StringIO(get_yaml_from_goal_type(self.ResourceCreateFromOuterEasy.Goal)) ), @@ -113,12 +113,13 @@ class Registry: "goal": {}, "feedback": {}, "result": {"latency_ms": "latency_ms", "time_diff_ms": "time_diff_ms"}, - "schema": ros_action_to_json_schema(self.EmptyIn), + "schema": ros_action_to_json_schema(self.EmptyIn, '用于测试延迟的动作,返回延迟时间和时间差。'), "goal_default": {}, "handles": {}, }, }, }, + "version": "0.0.1", "icon": "icon_device.webp", "registry_type": "device", "handles": [], @@ -367,6 +368,8 @@ class Registry: # 在添加到注册表前处理类型替换 for device_id, device_config in data.items(): # 添加文件路径信息 - 使用规范化的完整文件路径 + if "version" not in device_config: + device_config["version"] = "0.0.1" if "description" not in device_config: device_config["description"] = "" if "icon" not in device_config: @@ -499,8 +502,6 @@ class Registry: } if "registry_type" not in device_config: device_config["registry_type"] = "device" - if "version" not in device_config: - device_config["version"] = "0.0.1" device_config["file_path"] = str(file.absolute()).replace("\\", "/") device_config["registry_type"] = "device" logger.debug( diff --git a/unilabos/ros/msgs/message_converter.py b/unilabos/ros/msgs/message_converter.py index 5e0bb08..230ad1f 100644 --- a/unilabos/ros/msgs/message_converter.py +++ b/unilabos/ros/msgs/message_converter.py @@ -717,12 +717,13 @@ def ros_message_to_json_schema(msg_class: Any) -> Dict[str, Any]: return schema -def ros_action_to_json_schema(action_class: Any) -> Dict[str, Any]: +def ros_action_to_json_schema(action_class: Any, description="") -> Dict[str, Any]: """ 将 ROS Action 类转换为 JSON Schema Args: action_class: ROS Action 类 + description: 描述 Returns: 完整的 JSON Schema 定义 @@ -737,7 +738,7 @@ def ros_action_to_json_schema(action_class: Any) -> Dict[str, Any]: # 创建基础 schema schema = { "title": action_class.__name__, - "description": f"ROS Action {action_class.__name__} 的 JSON Schema", + "description": description, "type": "object", "properties": { "goal": { From 0593f98f8160a1ffca4ddc7dd52bbb6dd97ff067 Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Wed, 16 Jul 2025 10:16:22 +0800 Subject: [PATCH 41/96] Update prcxi.py --- .../devices/liquid_handling/prcxi/prcxi.py | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index e711993..56bd12e 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -1033,18 +1033,18 @@ if __name__ == "__main__": asyncio.run(handler.drop_tips(tip_rack.children[8:16],[0,1,2,3,4,5,6,7])) asyncio.run(handler.mix(well_containers.children[:8], mix_time=3, mix_vol=50, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) print(json.dumps(handler._unilabos_backend.steps_todo_list, indent=2)) # Print matrix info - # asyncio.run(handler.add_liquid( - # asp_vols=[100]*8, - # dis_vols=[100]*8, - # reagent_sources=well_containers.children[-8:], - # targets=well_containers.children[:8], - # use_channels=[0, 1, 2, 3, 4, 5, 6, 7], - # flow_rates=[None] * 8, - # offsets=[Coordinate(0, 0, 0)] * 8, - # liquid_height=[None] * 8, - # blow_out_air_volume=[None] * 8, - # spread="wide", - # )) + asyncio.run(handler.add_liquid( + asp_vols=[100]*8, + dis_vols=[100]*8, + reagent_sources=well_containers.children[-8:], + targets=well_containers.children[:8], + use_channels=[0, 1, 2, 3, 4, 5, 6, 7], + flow_rates=[None] * 8, + offsets=[Coordinate(0, 0, 0)] * 8, + liquid_height=[None] * 8, + blow_out_air_volume=[None] * 8, + spread="wide", + )) # input("pick_up_tips add step") asyncio.run(handler.run_protocol()) # Run the protocol # input("Running protocol...") From acf7b6d3f71222e3f070a50f06c0461352862263 Mon Sep 17 00:00:00 2001 From: Kongchang Feng <2100011801@stu.pku.edu.cn> Date: Wed, 16 Jul 2025 11:12:02 +0800 Subject: [PATCH 42/96] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E9=83=A8?= =?UTF-8?q?=E5=88=86=E7=9A=84protocol=E5=9B=A0=E4=B8=BAXDL=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E5=AF=BC=E8=87=B4=E7=9A=84=E9=97=AE=E9=A2=98=20(#61)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 修复了部分的protocol因为XDL更新导致的问题 但是pumptransfer,add,dissolve,separate还没修,后续还需要写virtual固体加料器 * 补充了四个action * 添加了固体加样器,丰富了json,修改了add protocol * bump version to 0.9.9 * fix bugs from new actions * protocol完整修复版本& bump version to 0.9.10 * 修补了一些单位处理,bump version to 0.9.11 * 优化了全protocol的运行时间,除了pumptransfer相关的还没 * 补充了剩下的几个protocol --------- Co-authored-by: Junhan Chang Co-authored-by: Xuwznln <18435084+Xuwznln@users.noreply.github.com> --- README.md | 2 +- README_zh.md | 2 +- recipes/ros-humble-unilabos-msgs/recipe.yaml | 2 +- recipes/unilabos/recipe.yaml | 2 +- setup.py | 2 +- .../comprehensive_protocol/checklist.md | 90 +- .../comprehensive_station.json | 142 +- unilabos/app/mq.py | 2 +- unilabos/compile/add_protocol.py | 1183 +++++----- unilabos/compile/adjustph_protocol.py | 313 ++- unilabos/compile/dissolve_protocol.py | 1126 +++++++--- unilabos/compile/dry_protocol.py | 48 +- .../compile/evacuateandrefill_protocol.py | 779 ++++--- unilabos/compile/evaporate_protocol.py | 600 ++--- unilabos/compile/filter_protocol.py | 440 ++-- unilabos/compile/heatchill_protocol.py | 599 ++--- unilabos/compile/hydrogenate_protocol.py | 40 +- unilabos/compile/pump_protocol.py | 1982 +++++++++++++++-- unilabos/compile/recrystallize_protocol.py | 252 ++- unilabos/compile/reset_handling_protocol.py | 119 +- unilabos/compile/run_column_protocol.py | 806 +++++-- unilabos/compile/separate_protocol.py | 868 ++++++-- unilabos/compile/stir_protocol.py | 376 +++- unilabos/compile/utils/unit_parser.py | 206 ++ unilabos/compile/wash_solid_protocol.py | 486 ++-- unilabos/devices/virtual/virtual_column.py | 115 +- unilabos/devices/virtual/virtual_filter.py | 115 +- unilabos/devices/virtual/virtual_heatchill.py | 220 +- .../devices/virtual/virtual_multiway_valve.py | 167 +- unilabos/devices/virtual/virtual_rotavap.py | 168 +- .../devices/virtual/virtual_solenoid_valve.py | 56 +- .../virtual/virtual_solid_dispenser.py | 389 ++++ unilabos/devices/virtual/virtual_stirrer.py | 182 +- .../devices/virtual/virtual_transferpump.py | 205 +- unilabos/messages/__init__.py | 526 ++++- unilabos/registry/devices/mock_devices.yaml | 83 +- .../devices/organic_miscellaneous.yaml | 21 +- unilabos/registry/devices/temperature.yaml | 21 +- unilabos/registry/devices/virtual_device.yaml | 299 ++- unilabos/registry/devices/work_station.yaml | 319 ++- unilabos/ros/nodes/presets/protocol_node.py | 2 +- unilabos_msgs/CMakeLists.txt | 1 + unilabos_msgs/action/Add.action | 25 +- unilabos_msgs/action/AddSolid.action | 15 + unilabos_msgs/action/Dissolve.action | 21 +- unilabos_msgs/action/EvacuateAndRefill.action | 3 +- unilabos_msgs/action/Evaporate.action | 13 +- unilabos_msgs/action/Filter.action | 14 +- unilabos_msgs/action/HeatChill.action | 25 +- unilabos_msgs/action/PumpTransfer.action | 5 + unilabos_msgs/action/Recrystallize.action | 10 +- unilabos_msgs/action/RunColumn.action | 15 +- unilabos_msgs/action/Separate.action | 43 +- unilabos_msgs/action/Stir.action | 19 +- unilabos_msgs/action/WashSolid.action | 33 +- 55 files changed, 9928 insertions(+), 3669 deletions(-) create mode 100644 unilabos/compile/utils/unit_parser.py create mode 100644 unilabos/devices/virtual/virtual_solid_dispenser.py create mode 100644 unilabos_msgs/action/AddSolid.action diff --git a/README.md b/README.md index 0d02849..918e6fa 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.8-xxxxx.tar.bz2 +conda install ros-humble-unilabos-msgs-0.9.10-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 a80f06c..4163853 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.8-xxxxx.tar.bz2 +conda install ros-humble-unilabos-msgs-0.9.11-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 dde6acc..5807be8 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.8 + version: 0.9.11 source: path: ../../unilabos_msgs folder: ros-humble-unilabos-msgs/src/work diff --git a/recipes/unilabos/recipe.yaml b/recipes/unilabos/recipe.yaml index c54e141..2f72c32 100644 --- a/recipes/unilabos/recipe.yaml +++ b/recipes/unilabos/recipe.yaml @@ -1,6 +1,6 @@ package: name: unilabos - version: "0.9.8" + version: "0.9.11" source: path: ../.. diff --git a/setup.py b/setup.py index 4dde107..8a7eebd 100644 --- a/setup.py +++ b/setup.py @@ -4,7 +4,7 @@ package_name = 'unilabos' setup( name=package_name, - version='0.9.8', + version='0.9.11', packages=find_packages(), include_package_data=True, install_requires=['setuptools'], diff --git a/test/experiments/comprehensive_protocol/checklist.md b/test/experiments/comprehensive_protocol/checklist.md index 5bb14ae..67b4c3b 100644 --- a/test/experiments/comprehensive_protocol/checklist.md +++ b/test/experiments/comprehensive_protocol/checklist.md @@ -43,6 +43,15 @@ Hydrogenate 4. 参数对齐 + + + + + + + + + class PumpTransferProtocol(BaseModel): from_vessel: str to_vessel: str @@ -51,9 +60,9 @@ class PumpTransferProtocol(BaseModel): time: float = 0 viscous: bool = False rinsing_solvent: str = "air" - rinsing_volume: float = 5000 - rinsing_repeats: int = 2 - solid: bool = False + rinsing_volume: float = 5000 + rinsing_repeats: int = 2 + solid: bool = False 测完了三个都能跑✅ flowrate: float = 500 transfer_flowrate: float = 2500 @@ -66,25 +75,25 @@ class SeparateProtocol(BaseModel): waste_phase_to_vessel: str solvent: str solvent_volume: float - through: str - repeats: int - stir_time: float + through: str + repeats: int + stir_time: float stir_speed: float - settling_time: float + settling_time: float 测完了能跑✅ class EvaporateProtocol(BaseModel): vessel: str pressure: float temp: float - time: float + time: float 测完了能跑✅ stir_speed: float class EvacuateAndRefillProtocol(BaseModel): vessel: str gas: str - repeats: int + repeats: int 测完了能跑✅ class AddProtocol(BaseModel): vessel: str @@ -95,21 +104,27 @@ class AddProtocol(BaseModel): time: float stir: bool stir_speed: float + + + + + viscous: bool - purpose: str + purpose: str 测完了能跑✅ class CentrifugeProtocol(BaseModel): vessel: str speed: float - time: float 自创的 + time: float 没毛病 temp: float class FilterProtocol(BaseModel): vessel: str filtrate_vessel: str stir: bool - stir_speed: float - temp: float + stir_speed: float + temp: float 测完了能跑✅ continue_heatchill: bool volume: float @@ -118,7 +133,10 @@ class HeatChillProtocol(BaseModel): temp: float time: float - stir: bool + + + + stir: bool 测完了能跑✅ stir_speed: float purpose: str @@ -133,7 +151,9 @@ class HeatChillStopProtocol(BaseModel): class StirProtocol(BaseModel): stir_time: float stir_speed: float - settling_time: float + + + settling_time: float 测完了能跑✅ class StartStirProtocol(BaseModel): vessel: str @@ -149,11 +169,11 @@ class TransferProtocol(BaseModel): volume: float amount: str = "" time: float = 0 - viscous: bool = False + viscous: bool = False rinsing_solvent: str = "" rinsing_volume: float = 0.0 rinsing_repeats: int = 0 - solid: bool = False + solid: bool = False 这个protocol早该删掉了 class CleanVesselProtocol(BaseModel): vessel: str @@ -165,11 +185,11 @@ class CleanVesselProtocol(BaseModel): class DissolveProtocol(BaseModel): vessel: str solvent: str - volume: float - amount: str = "" - temp: float = 25.0 - time: float = 0.0 - stir_speed: float = 0.0 + volume: float + amount: str = "" + temp: float = 25.0 + time: float = 0.0 + stir_speed: float = 0.0 测完了能跑✅ class FilterThroughProtocol(BaseModel): from_vessel: str @@ -183,16 +203,19 @@ class FilterThroughProtocol(BaseModel): class RunColumnProtocol(BaseModel): from_vessel: str to_vessel: str - column: str + column: str 测完了能跑✅ class WashSolidProtocol(BaseModel): vessel: str solvent: str volume: float - filtrate_vessel: str = "" + filtrate_vessel: str = "" temp: float = 25.0 - stir: bool = False - stir_speed: float = 0.0 + stir: bool = False + + + + stir_speed: float = 0.0 测完了能跑✅ time: float = 0.0 repeats: int = 1 @@ -219,4 +242,17 @@ class RecrystallizeProtocol(BaseModel): class HydrogenateProtocol(BaseModel): temp: str = Field(..., description="反应温度(如 '45 °C')") time: str = Field(..., description="反应时间(如 '2 h')") <新写的,没问题> - vessel: str = Field(..., description="反应容器") \ No newline at end of file + vessel: str = Field(..., description="反应容器") + + 还差 + + + + + +单位修复: + evaporate + heatchill + recrysitallize + stir + wash solid \ No newline at end of file diff --git a/test/experiments/comprehensive_protocol/comprehensive_station.json b/test/experiments/comprehensive_protocol/comprehensive_station.json index d0f5c6a..43e4cc6 100644 --- a/test/experiments/comprehensive_protocol/comprehensive_station.json +++ b/test/experiments/comprehensive_protocol/comprehensive_station.json @@ -32,7 +32,11 @@ "separator_1", "collection_bottle_1", "collection_bottle_2", - "collection_bottle_3" + "collection_bottle_3", + "solid_dispenser_1", + "solid_reagent_bottle_1", + "solid_reagent_bottle_2", + "solid_reagent_bottle_3" ], "parent": null, "type": "device", @@ -672,6 +676,98 @@ "data": { "current_volume": 0.0 } + }, + { + "id": "solid_dispenser_1", + "name": "固体粉末加样器", + "children": [], + "parent": "OrganicSynthesisStation", + "type": "device", + "class": "virtual_solid_dispenser", + "position": { + "x": 600, + "y": 300, + "z": 0 + }, + "config": { + "max_capacity": 100.0, + "precision": 0.001 + }, + "data": { + "status": "Ready", + "current_reagent": "", + "dispensed_amount": 0.0, + "total_operations": 0 + } + }, + { + "id": "solid_reagent_bottle_1", + "name": "固体试剂瓶1-氯化钠", + "children": [], + "parent": "OrganicSynthesisStation", + "type": "container", + "class": "container", + "position": { + "x": 550, + "y": 250, + "z": 0 + }, + "config": { + "volume": 500.0, + "reagent": "sodium_chloride", + "physical_state": "solid" + }, + "data": { + "current_mass": 500.0, + "reagent_name": "sodium_chloride", + "physical_state": "solid" + } + }, + { + "id": "solid_reagent_bottle_2", + "name": "固体试剂瓶2-碳酸钠", + "children": [], + "parent": "OrganicSynthesisStation", + "type": "container", + "class": "container", + "position": { + "x": 600, + "y": 250, + "z": 0 + }, + "config": { + "volume": 500.0, + "reagent": "sodium_carbonate", + "physical_state": "solid" + }, + "data": { + "current_mass": 500.0, + "reagent_name": "sodium_carbonate", + "physical_state": "solid" + } + }, + { + "id": "solid_reagent_bottle_3", + "name": "固体试剂瓶3-氯化镁", + "children": [], + "parent": "OrganicSynthesisStation", + "type": "container", + "class": "container", + "position": { + "x": 650, + "y": 250, + "z": 0 + }, + "config": { + "volume": 500.0, + "reagent": "magnesium_chloride", + "physical_state": "solid" + }, + "data": { + "current_mass": 500.0, + "reagent_name": "magnesium_chloride", + "physical_state": "solid" + } } ], "links": [ @@ -802,7 +898,7 @@ "type": "fluid", "port": { "multiway_valve_2": "3", - "solenoid_valve_2": "in" + "solenoid_valve_2": "out" } }, { @@ -812,7 +908,7 @@ "type": "fluid", "port": { "gas_source_1": "gassource", - "solenoid_valve_2": "out" + "solenoid_valve_2": "in" } }, { @@ -964,6 +1060,46 @@ "solenoid_valve_3": "out", "main_reactor": "top" } + }, + { + "id": "link_solid_dispenser_to_reactor", + "source": "solid_dispenser_1", + "target": "main_reactor", + "type": "resource", + "port": { + "solid_dispenser_1": "SolidOut", + "main_reactor": "top" + } + }, + { + "id": "link_solid_bottle1_to_dispenser", + "source": "solid_reagent_bottle_1", + "target": "solid_dispenser_1", + "type": "resource", + "port": { + "solid_reagent_bottle_1": "top", + "solid_dispenser_1": "SolidIn" + } + }, + { + "id": "link_solid_bottle2_to_dispenser", + "source": "solid_reagent_bottle_2", + "target": "solid_dispenser_1", + "type": "resource", + "port": { + "solid_reagent_bottle_2": "top", + "solid_dispenser_1": "SolidIn" + } + }, + { + "id": "link_solid_bottle3_to_dispenser", + "source": "solid_reagent_bottle_3", + "target": "solid_dispenser_1", + "type": "resource", + "port": { + "solid_reagent_bottle_3": "top", + "solid_dispenser_1": "SolidIn" + } } ] } \ No newline at end of file diff --git a/unilabos/app/mq.py b/unilabos/app/mq.py index c569c04..3969ec4 100644 --- a/unilabos/app/mq.py +++ b/unilabos/app/mq.py @@ -166,7 +166,7 @@ class MQTTClient: status = {"data": device_status.get(device_id, {}), "device_id": device_id, "timestamp": time.time()} address = f"labs/{MQConfig.lab_id}/devices/" self.client.publish(address, json.dumps(status), qos=2) - logger.info(f"Device status published: address: {address}, {status}") + logger.debug(f"Device status published: address: {address}, {status}") def publish_job_status(self, feedback_data: dict, job_id: str, status: str, return_info: Optional[str] = None): if self.mqtt_disable: diff --git a/unilabos/compile/add_protocol.py b/unilabos/compile/add_protocol.py index 144ec96..c46befe 100644 --- a/unilabos/compile/add_protocol.py +++ b/unilabos/compile/add_protocol.py @@ -1,627 +1,702 @@ import networkx as nx -from typing import List, Dict, Any +import re +import logging +from typing import List, Dict, Any, Union from .pump_protocol import generate_pump_protocol_with_rinsing +logger = logging.getLogger(__name__) -def find_reagent_vessel(G: nx.DiGraph, reagent: str) -> str: +def debug_print(message): + """调试输出""" + print(f"[ADD] {message}", flush=True) + logger.info(f"[ADD] {message}") + +def parse_volume_input(volume_input: Union[str, float]) -> float: """ - 根据试剂名称查找对应的试剂瓶,支持多种匹配模式: - 1. 容器名称匹配(如 flask_DMF, reagent_bottle_1-DMF) - 2. 容器内液体类型匹配(如 liquid_type: "DMF", name: "ethanol") - 3. 试剂名称匹配(如 reagent_name: "DMF", config.reagent: "ethyl_acetate") + 解析体积输入,支持带单位的字符串 Args: - G: 网络图 - reagent: 试剂名称 + volume_input: 体积输入(如 "2.7 mL", "2.67 mL", "?", 10.0) Returns: - str: 试剂瓶的vessel ID - - Raises: - ValueError: 如果找不到对应的试剂瓶 + float: 体积(毫升) """ - print(f"ADD_PROTOCOL: 正在查找试剂 '{reagent}' 的容器...") + if isinstance(volume_input, (int, float)): + debug_print(f"📏 体积输入为数值: {volume_input}") + return float(volume_input) - # 第一步:通过容器名称匹配 - possible_names = [ - f"flask_{reagent}", # flask_DMF, flask_ethanol - f"bottle_{reagent}", # bottle_DMF, bottle_ethanol - f"vessel_{reagent}", # vessel_DMF, vessel_ethanol - f"{reagent}_flask", # DMF_flask, ethanol_flask - f"{reagent}_bottle", # DMF_bottle, ethanol_bottle - f"{reagent}", # 直接用试剂名 - f"reagent_{reagent}", # reagent_DMF, reagent_ethanol - f"reagent_bottle_{reagent}", # reagent_bottle_DMF - ] - - # 尝试名称匹配 - for vessel_name in possible_names: - if vessel_name in G.nodes(): - print(f"ADD_PROTOCOL: 通过名称匹配找到容器: {vessel_name}") - return vessel_name - - # 第二步:通过模糊名称匹配(名称中包含试剂名) - for node_id in G.nodes(): - if G.nodes[node_id].get('type') == 'container': - # 检查节点ID或名称中是否包含试剂名 - node_name = G.nodes[node_id].get('name', '').lower() - if (reagent.lower() in node_id.lower() or - reagent.lower() in node_name): - print(f"ADD_PROTOCOL: 通过模糊名称匹配找到容器: {node_id} (名称: {node_name})") - return node_id - - # 第三步:通过液体类型匹配 - for node_id in G.nodes(): - if G.nodes[node_id].get('type') == 'container': - vessel_data = G.nodes[node_id].get('data', {}) - liquids = vessel_data.get('liquid', []) - - for liquid in liquids: - if isinstance(liquid, dict): - # 支持两种格式的液体类型字段 - liquid_type = liquid.get('liquid_type') or liquid.get('name', '') - reagent_name = vessel_data.get('reagent_name', '') - config_reagent = G.nodes[node_id].get('config', {}).get('reagent', '') - - # 检查多个可能的字段 - if (liquid_type.lower() == reagent.lower() or - reagent_name.lower() == reagent.lower() or - config_reagent.lower() == reagent.lower()): - print(f"ADD_PROTOCOL: 通过液体类型匹配找到容器: {node_id}") - print(f" - liquid_type: {liquid_type}") - print(f" - reagent_name: {reagent_name}") - print(f" - config.reagent: {config_reagent}") - return node_id - - # 第四步:列出所有可用的容器信息帮助调试 - available_containers = [] - for node_id in G.nodes(): - if G.nodes[node_id].get('type') == 'container': - vessel_data = G.nodes[node_id].get('data', {}) - config_data = G.nodes[node_id].get('config', {}) - liquids = vessel_data.get('liquid', []) - - container_info = { - 'id': node_id, - 'name': G.nodes[node_id].get('name', ''), - 'liquid_types': [], - 'reagent_name': vessel_data.get('reagent_name', ''), - 'config_reagent': config_data.get('reagent', '') - } - - for liquid in liquids: - if isinstance(liquid, dict): - liquid_type = liquid.get('liquid_type') or liquid.get('name', '') - if liquid_type: - container_info['liquid_types'].append(liquid_type) - - available_containers.append(container_info) - - print(f"ADD_PROTOCOL: 可用容器列表:") - for container in available_containers: - print(f" - {container['id']}: {container['name']}") - print(f" 液体类型: {container['liquid_types']}") - print(f" 试剂名称: {container['reagent_name']}") - print(f" 配置试剂: {container['config_reagent']}") - - raise ValueError(f"找不到试剂 '{reagent}' 对应的试剂瓶。尝试了名称匹配: {possible_names}") - - -def find_reagent_vessel_by_any_match(G: nx.DiGraph, reagent: str) -> str: - """ - 增强版试剂容器查找,支持各种匹配方式的别名函数 - """ - return find_reagent_vessel(G, reagent) - - -def get_vessel_reagent_volume(G: nx.DiGraph, vessel: str) -> float: - """获取容器中的试剂体积""" - if vessel not in G.nodes(): + if not volume_input or not str(volume_input).strip(): + debug_print(f"⚠️ 体积输入为空,返回0.0mL") return 0.0 - vessel_data = G.nodes[vessel].get('data', {}) - liquids = vessel_data.get('liquid', []) + volume_str = str(volume_input).lower().strip() + debug_print(f"🔍 解析体积输入: '{volume_str}'") - total_volume = 0.0 - for liquid in liquids: - if isinstance(liquid, dict): - # 支持两种格式:新格式 (name, volume) 和旧格式 (liquid_type, liquid_volume) - volume = liquid.get('volume') or liquid.get('liquid_volume', 0.0) - total_volume += volume + # 处理未知体积 + if volume_str in ['?', 'unknown', 'tbd', 'to be determined']: + default_volume = 10.0 # 默认10mL + debug_print(f"❓ 检测到未知体积,使用默认值: {default_volume}mL 🎯") + return default_volume - return total_volume + # 移除空格并提取数字和单位 + volume_clean = re.sub(r'\s+', '', volume_str) + + # 匹配数字和单位的正则表达式 + match = re.match(r'([0-9]*\.?[0-9]+)\s*(ml|l|μl|ul|microliter|milliliter|liter)?', volume_clean) + + if not match: + debug_print(f"❌ 无法解析体积: '{volume_str}',使用默认值10mL") + return 10.0 + + value = float(match.group(1)) + unit = match.group(2) or 'ml' # 默认单位为毫升 + + # 转换为毫升 + if unit in ['l', 'liter']: + volume = value * 1000.0 # L -> mL + debug_print(f"🔄 体积转换: {value}L → {volume}mL") + elif unit in ['μl', 'ul', 'microliter']: + volume = value / 1000.0 # μL -> mL + debug_print(f"🔄 体积转换: {value}μL → {volume}mL") + else: # ml, milliliter 或默认 + volume = value # 已经是mL + debug_print(f"✅ 体积已为mL: {volume}mL") + + return volume - -def get_vessel_reagent_types(G: nx.DiGraph, vessel: str) -> List[str]: - """获取容器中所有试剂的类型""" - if vessel not in G.nodes(): - return [] - - vessel_data = G.nodes[vessel].get('data', {}) - liquids = vessel_data.get('liquid', []) - - reagent_types = [] - for liquid in liquids: - if isinstance(liquid, dict): - # 支持两种格式的试剂类型字段 - reagent_type = liquid.get('liquid_type') or liquid.get('name', '') - if reagent_type: - reagent_types.append(reagent_type) - - # 同时检查配置中的试剂信息 - config_reagent = G.nodes[vessel].get('config', {}).get('reagent', '') - reagent_name = vessel_data.get('reagent_name', '') - - if config_reagent and config_reagent not in reagent_types: - reagent_types.append(config_reagent) - if reagent_name and reagent_name not in reagent_types: - reagent_types.append(reagent_name) - - return reagent_types - - -def find_vessels_by_reagent(G: nx.DiGraph, reagent: str) -> List[str]: +def parse_mass_input(mass_input: Union[str, float]) -> float: """ - 根据试剂类型查找所有匹配的容器 - 返回匹配容器的ID列表 - """ - matching_vessels = [] + 解析质量输入,支持带单位的字符串 - for node_id in G.nodes(): - if G.nodes[node_id].get('type') == 'container': - # 检查容器名称匹配 - node_name = G.nodes[node_id].get('name', '').lower() - if reagent.lower() in node_id.lower() or reagent.lower() in node_name: - matching_vessels.append(node_id) - continue - - # 检查试剂类型匹配 - vessel_data = G.nodes[node_id].get('data', {}) - liquids = vessel_data.get('liquid', []) - config_data = G.nodes[node_id].get('config', {}) - - # 检查 reagent_name 和 config.reagent - reagent_name = vessel_data.get('reagent_name', '').lower() + Args: + mass_input: 质量输入(如 "19.3 g", "4.5 g", 2.5) + + Returns: + float: 质量(克) + """ + if isinstance(mass_input, (int, float)): + debug_print(f"⚖️ 质量输入为数值: {mass_input}g") + return float(mass_input) + + if not mass_input or not str(mass_input).strip(): + debug_print(f"⚠️ 质量输入为空,返回0.0g") + return 0.0 + + mass_str = str(mass_input).lower().strip() + debug_print(f"🔍 解析质量输入: '{mass_str}'") + + # 移除空格并提取数字和单位 + mass_clean = re.sub(r'\s+', '', mass_str) + + # 匹配数字和单位的正则表达式 + match = re.match(r'([0-9]*\.?[0-9]+)\s*(g|mg|kg|gram|milligram|kilogram)?', mass_clean) + + if not match: + debug_print(f"❌ 无法解析质量: '{mass_str}',返回0.0g") + return 0.0 + + value = float(match.group(1)) + unit = match.group(2) or 'g' # 默认单位为克 + + # 转换为克 + if unit in ['mg', 'milligram']: + mass = value / 1000.0 # mg -> g + debug_print(f"🔄 质量转换: {value}mg → {mass}g") + elif unit in ['kg', 'kilogram']: + mass = value * 1000.0 # kg -> g + debug_print(f"🔄 质量转换: {value}kg → {mass}g") + else: # g, gram 或默认 + mass = value # 已经是g + debug_print(f"✅ 质量已为g: {mass}g") + + return mass + +def parse_time_input(time_input: Union[str, float]) -> float: + """ + 解析时间输入,支持带单位的字符串 + + Args: + time_input: 时间输入(如 "1 h", "20 min", "30 s", 60.0) + + Returns: + float: 时间(秒) + """ + if isinstance(time_input, (int, float)): + debug_print(f"⏱️ 时间输入为数值: {time_input}秒") + return float(time_input) + + if not time_input or not str(time_input).strip(): + debug_print(f"⚠️ 时间输入为空,返回0秒") + return 0.0 + + time_str = str(time_input).lower().strip() + debug_print(f"🔍 解析时间输入: '{time_str}'") + + # 处理未知时间 + if time_str in ['?', 'unknown', 'tbd']: + default_time = 60.0 # 默认1分钟 + debug_print(f"❓ 检测到未知时间,使用默认值: {default_time}s (1分钟) ⏰") + return default_time + + # 移除空格并提取数字和单位 + time_clean = re.sub(r'\s+', '', time_str) + + # 匹配数字和单位的正则表达式 + match = re.match(r'([0-9]*\.?[0-9]+)\s*(s|sec|second|min|minute|h|hr|hour|d|day)?', time_clean) + + if not match: + debug_print(f"❌ 无法解析时间: '{time_str}',返回0s") + return 0.0 + + value = float(match.group(1)) + unit = match.group(2) or 's' # 默认单位为秒 + + # 转换为秒 + if unit in ['min', 'minute']: + time_sec = value * 60.0 # min -> s + debug_print(f"🔄 时间转换: {value}分钟 → {time_sec}秒") + elif unit in ['h', 'hr', 'hour']: + time_sec = value * 3600.0 # h -> s + debug_print(f"🔄 时间转换: {value}小时 → {time_sec}秒") + elif unit in ['d', 'day']: + time_sec = value * 86400.0 # d -> s + debug_print(f"🔄 时间转换: {value}天 → {time_sec}秒") + else: # s, sec, second 或默认 + time_sec = value # 已经是s + debug_print(f"✅ 时间已为秒: {time_sec}秒") + + return time_sec + +def find_reagent_vessel(G: nx.DiGraph, reagent: str) -> str: + """增强版试剂容器查找,支持固体和液体""" + debug_print(f"🔍 开始查找试剂 '{reagent}' 的容器...") + + # 🔧 方法1:直接搜索 data.reagent_name 和 config.reagent + debug_print(f"📋 方法1: 搜索reagent字段...") + for node in G.nodes(): + node_data = G.nodes[node].get('data', {}) + node_type = G.nodes[node].get('type', '') + config_data = G.nodes[node].get('config', {}) + + # 只搜索容器类型的节点 + if node_type == 'container': + reagent_name = node_data.get('reagent_name', '').lower() config_reagent = config_data.get('reagent', '').lower() - if (reagent.lower() == reagent_name or - reagent.lower() == config_reagent): - matching_vessels.append(node_id) - continue + # 精确匹配 + if reagent_name == reagent.lower() or config_reagent == reagent.lower(): + debug_print(f"✅ 通过reagent字段精确匹配到容器: {node} 🎯") + return node - # 检查液体列表 + # 模糊匹配 + if (reagent.lower() in reagent_name and reagent_name) or \ + (reagent.lower() in config_reagent and config_reagent): + debug_print(f"✅ 通过reagent字段模糊匹配到容器: {node} 🔍") + return node + + # 🔧 方法2:常见的容器命名规则 + debug_print(f"📋 方法2: 使用命名规则查找...") + reagent_clean = reagent.lower().replace(' ', '_').replace('-', '_') + possible_names = [ + reagent_clean, + f"flask_{reagent_clean}", + f"bottle_{reagent_clean}", + f"vessel_{reagent_clean}", + f"{reagent_clean}_flask", + f"{reagent_clean}_bottle", + f"reagent_{reagent_clean}", + f"reagent_bottle_{reagent_clean}", + f"solid_reagent_bottle_{reagent_clean}", + f"reagent_bottle_1", # 通用试剂瓶 + f"reagent_bottle_2", + f"reagent_bottle_3" + ] + + debug_print(f"🔍 尝试的容器名称: {possible_names[:5]}... (共{len(possible_names)}个)") + + for name in possible_names: + if name in G.nodes(): + node_type = G.nodes[name].get('type', '') + if node_type == 'container': + debug_print(f"✅ 通过命名规则找到容器: {name} 📝") + return name + + # 🔧 方法3:节点名称模糊匹配 + debug_print(f"📋 方法3: 节点名称模糊匹配...") + for node_id in G.nodes(): + node_data = G.nodes[node_id] + if node_data.get('type') == 'container': + # 检查节点名称是否包含试剂名称 + if reagent_clean in node_id.lower(): + debug_print(f"✅ 通过节点名称模糊匹配到容器: {node_id} 🔍") + return node_id + + # 检查液体类型匹配 + vessel_data = node_data.get('data', {}) + liquids = vessel_data.get('liquid', []) for liquid in liquids: if isinstance(liquid, dict): liquid_type = liquid.get('liquid_type') or liquid.get('name', '') if liquid_type.lower() == reagent.lower(): - matching_vessels.append(node_id) - break + debug_print(f"✅ 通过液体类型匹配到容器: {node_id} 💧") + return node_id - return matching_vessels - + # 🔧 方法4:使用第一个试剂瓶作为备选 + debug_print(f"📋 方法4: 查找备选试剂瓶...") + for node_id in G.nodes(): + node_data = G.nodes[node_id] + if (node_data.get('type') == 'container' and + ('reagent' in node_id.lower() or 'bottle' in node_id.lower())): + debug_print(f"⚠️ 未找到专用容器,使用备选试剂瓶: {node_id} 🔄") + return node_id + + debug_print(f"❌ 所有方法都失败了,无法找到容器!") + raise ValueError(f"找不到试剂 '{reagent}' 对应的容器") def find_connected_stirrer(G: nx.DiGraph, vessel: str) -> str: - """ - 查找与指定容器相连的搅拌器 + """查找连接到指定容器的搅拌器""" + debug_print(f"🔍 查找连接到容器 '{vessel}' 的搅拌器...") - Args: - G: 网络图 - vessel: 容器ID + stirrer_nodes = [] + for node in G.nodes(): + node_class = G.nodes[node].get('class', '').lower() + if 'stirrer' in node_class: + stirrer_nodes.append(node) + debug_print(f"📋 发现搅拌器: {node}") - Returns: - str: 搅拌器ID,如果找不到则返回None - """ - # 查找所有搅拌器节点 - stirrer_nodes = [node for node in G.nodes() - if (G.nodes[node].get('class') or '') == 'virtual_stirrer'] + debug_print(f"📊 共找到 {len(stirrer_nodes)} 个搅拌器") - # 检查哪个搅拌器与目标容器相连 + # 查找连接到容器的搅拌器 for stirrer in stirrer_nodes: if G.has_edge(stirrer, vessel) or G.has_edge(vessel, stirrer): + debug_print(f"✅ 找到连接的搅拌器: {stirrer} 🔗") return stirrer - # 如果没有直接连接,返回第一个可用的搅拌器 - return stirrer_nodes[0] if stirrer_nodes else None + # 返回第一个搅拌器 + if stirrer_nodes: + debug_print(f"⚠️ 未找到直接连接的搅拌器,使用第一个: {stirrer_nodes[0]} 🔄") + return stirrer_nodes[0] + + debug_print(f"❌ 未找到任何搅拌器") + return "" +def find_solid_dispenser(G: nx.DiGraph) -> str: + """查找固体加样器""" + debug_print(f"🔍 查找固体加样器...") + + for node in G.nodes(): + node_class = G.nodes[node].get('class', '').lower() + if 'solid_dispenser' in node_class or 'dispenser' in node_class: + debug_print(f"✅ 找到固体加样器: {node} 🥄") + return node + + debug_print(f"❌ 未找到固体加样器") + return "" + +# 🆕 创建进度日志动作 +def create_action_log(message: str, emoji: str = "📝") -> Dict[str, Any]: + """创建一个动作日志""" + full_message = f"{emoji} {message}" + debug_print(full_message) + logger.info(full_message) + print(f"[ACTION] {full_message}", flush=True) + + return { + "action_name": "wait", + "action_kwargs": { + "time": 0.1, + "log_message": full_message + } + } def generate_add_protocol( G: nx.DiGraph, vessel: str, reagent: str, - volume: float, - mass: float = 0.0, + # 🔧 修复:所有参数都用 Union 类型,支持字符串和数值 + volume: Union[str, float] = 0.0, + mass: Union[str, float] = 0.0, amount: str = "", - time: float = 0.0, - stir: bool = False, - stir_speed: float = 300.0, - viscous: bool = False, - purpose: str = "添加试剂" -) -> List[Dict[str, Any]]: - """ - 生成添加试剂的协议序列,支持智能试剂匹配 - - 基于pump_protocol的成熟算法,实现试剂添加功能: - 1. 智能查找试剂瓶(支持名称匹配、液体类型匹配、试剂配置匹配) - 2. **先启动搅拌,再进行转移** - 确保试剂添加更均匀 - 3. 使用pump_protocol实现液体转移 - - Args: - G: 有向图,节点为容器和设备,边为连接关系 - vessel: 目标容器(要添加试剂的容器) - reagent: 试剂名称(用于查找对应的试剂瓶) - volume: 要添加的体积 (mL) - mass: 要添加的质量 (g) - 暂时未使用,预留接口 - amount: 其他数量描述 - time: 添加时间 (s),如果指定则计算流速 - stir: 是否启用搅拌 - stir_speed: 搅拌速度 (RPM) - viscous: 是否为粘稠液体 - purpose: 添加目的描述 - - Returns: - List[Dict[str, Any]]: 动作序列 - - Raises: - ValueError: 当找不到必要的设备或容器时 - """ - action_sequence = [] - - print(f"ADD_PROTOCOL: 开始生成添加试剂协议") - print(f" - 目标容器: {vessel}") - print(f" - 试剂: {reagent}") - print(f" - 体积: {volume} mL") - print(f" - 质量: {mass} g") - print(f" - 搅拌: {stir} (速度: {stir_speed} RPM)") - print(f" - 粘稠: {viscous}") - print(f" - 目的: {purpose}") - - # 1. 验证目标容器存在 - if vessel not in G.nodes(): - raise ValueError(f"目标容器 '{vessel}' 不存在于系统中") - - # 2. 智能查找试剂瓶 - try: - reagent_vessel = find_reagent_vessel(G, reagent) - print(f"ADD_PROTOCOL: 找到试剂容器: {reagent_vessel}") - except ValueError as e: - raise ValueError(f"无法找到试剂 '{reagent}': {str(e)}") - - # 3. 验证试剂容器中的试剂体积 - available_volume = get_vessel_reagent_volume(G, reagent_vessel) - print(f"ADD_PROTOCOL: 试剂容器 {reagent_vessel} 中有 {available_volume} mL 试剂") - - if available_volume < volume: - print(f"ADD_PROTOCOL: 警告 - 试剂容器中的试剂不足!需要 {volume} mL,可用 {available_volume} mL") - - # 4. 验证是否存在从试剂瓶到目标容器的路径 - try: - path = nx.shortest_path(G, source=reagent_vessel, target=vessel) - print(f"ADD_PROTOCOL: 找到路径 {reagent_vessel} -> {vessel}: {path}") - except nx.NetworkXNoPath: - raise ValueError(f"从试剂瓶 '{reagent_vessel}' 到目标容器 '{vessel}' 没有可用路径") - - # 5. **先启动搅拌** - 关键改进! - if stir: - try: - stirrer_id = find_connected_stirrer(G, vessel) - - if stirrer_id: - print(f"ADD_PROTOCOL: 找到搅拌器 {stirrer_id},将在添加前启动搅拌") - - # 先启动搅拌 - stir_action = { - "device_id": stirrer_id, - "action_name": "start_stir", - "action_kwargs": { - "vessel": vessel, - "stir_speed": stir_speed, - "purpose": f"{purpose}: 启动搅拌,准备添加 {reagent}" - } - } - - action_sequence.append(stir_action) - print(f"ADD_PROTOCOL: 已添加搅拌动作,速度 {stir_speed} RPM") - - # 等待搅拌稳定 - action_sequence.append({ - "action_name": "wait", - "action_kwargs": {"time": 5} - }) - else: - print(f"ADD_PROTOCOL: 警告 - 需要搅拌但未找到与容器 {vessel} 相连的搅拌器") - - except Exception as e: - print(f"ADD_PROTOCOL: 搅拌器配置出错: {str(e)}") - - # 6. 如果指定了体积,执行液体转移 - if volume > 0: - # 6.1 计算流速参数 - if time > 0: - # 根据时间计算流速 - transfer_flowrate = volume / time - flowrate = transfer_flowrate - else: - # 使用默认流速 - if viscous: - transfer_flowrate = 0.3 # 粘稠液体用较慢速度 - flowrate = 1.0 - else: - transfer_flowrate = 0.5 # 普通液体默认速度 - flowrate = 2.5 - - print(f"ADD_PROTOCOL: 准备转移 {volume} mL 从 {reagent_vessel} 到 {vessel}") - print(f"ADD_PROTOCOL: 转移流速={transfer_flowrate} mL/s, 注入流速={flowrate} mL/s") - - # 6.2 使用pump_protocol的核心算法实现液体转移 - try: - pump_actions = generate_pump_protocol_with_rinsing( - G=G, - from_vessel=reagent_vessel, - to_vessel=vessel, - volume=volume, - amount=amount, - time=time, - viscous=viscous, - rinsing_solvent="", # 添加试剂通常不需要清洗 - rinsing_volume=0.0, - rinsing_repeats=0, - solid=False, - flowrate=flowrate, - transfer_flowrate=transfer_flowrate - ) - - # 添加pump actions到序列中 - action_sequence.extend(pump_actions) - - except Exception as e: - raise ValueError(f"生成泵协议时出错: {str(e)}") - - print(f"ADD_PROTOCOL: 生成了 {len(action_sequence)} 个动作") - print(f"ADD_PROTOCOL: 添加试剂协议生成完成") - - return action_sequence - - -def generate_add_protocol_with_cleaning( - G: nx.DiGraph, - vessel: str, - reagent: str, - volume: float, - mass: float = 0.0, - amount: str = "", - time: float = 0.0, + time: Union[str, float] = 0.0, stir: bool = False, stir_speed: float = 300.0, viscous: bool = False, purpose: str = "添加试剂", - cleaning_solvent: str = "air", - cleaning_volume: float = 5.0, - cleaning_repeats: int = 1 + # XDL扩展参数 + mol: str = "", + event: str = "", + rate_spec: str = "", + equiv: str = "", + ratio: str = "", + **kwargs ) -> List[Dict[str, Any]]: """ - 生成带清洗的添加试剂协议,支持智能试剂匹配 + 生成添加试剂协议 - 修复版 - 与普通添加协议的区别是会在添加后进行管道清洗 - - Args: - G: 有向图 - vessel: 目标容器 - reagent: 试剂名称 - volume: 添加体积 - mass: 添加质量(预留) - amount: 其他数量描述 - time: 添加时间 - stir: 是否搅拌 - stir_speed: 搅拌速度 - viscous: 是否粘稠 - purpose: 添加目的 - cleaning_solvent: 清洗溶剂("air"表示空气清洗) - cleaning_volume: 清洗体积 - cleaning_repeats: 清洗重复次数 - - Returns: - List[Dict[str, Any]]: 动作序列 + 支持所有XDL参数和单位: + - volume: "2.7 mL", "2.67 mL", "?" 或数值 + - mass: "19.3 g", "4.5 g" 或数值 + - time: "1 h", "20 min" 或数值(秒) + - mol: "0.28 mol", "16.2 mmol", "25.2 mmol" + - rate_spec: "portionwise", "dropwise" + - event: "A", "B" + - equiv: "1.1" + - ratio: "?", "1:1" """ + + debug_print("=" * 60) + debug_print("🚀 开始生成添加试剂协议") + debug_print(f"📋 原始参数:") + debug_print(f" 🥼 vessel: '{vessel}'") + debug_print(f" 🧪 reagent: '{reagent}'") + debug_print(f" 📏 volume: {volume} (类型: {type(volume)})") + debug_print(f" ⚖️ mass: {mass} (类型: {type(mass)})") + debug_print(f" ⏱️ time: {time} (类型: {type(time)})") + debug_print(f" 🧬 mol: '{mol}'") + debug_print(f" 🎯 event: '{event}'") + debug_print(f" ⚡ rate_spec: '{rate_spec}'") + debug_print(f" 🌪️ stir: {stir}") + debug_print(f" 🔄 stir_speed: {stir_speed} rpm") + debug_print("=" * 60) + action_sequence = [] - # 1. 智能查找试剂瓶 - reagent_vessel = find_reagent_vessel(G, reagent) + # === 参数验证 === + debug_print("🔍 步骤1: 参数验证...") + action_sequence.append(create_action_log(f"开始添加试剂 '{reagent}' 到容器 '{vessel}'", "🎬")) - # 2. **先启动搅拌** - if stir: - stirrer_id = find_connected_stirrer(G, vessel) - if stirrer_id: - action_sequence.append({ - "device_id": stirrer_id, - "action_name": "start_stir", - "action_kwargs": { - "vessel": vessel, - "stir_speed": stir_speed, - "purpose": f"{purpose}: 启动搅拌,准备添加 {reagent}" - } - }) + if not vessel: + debug_print("❌ vessel 参数不能为空") + raise ValueError("vessel 参数不能为空") + if not reagent: + debug_print("❌ reagent 参数不能为空") + raise ValueError("reagent 参数不能为空") + + if vessel not in G.nodes(): + debug_print(f"❌ 容器 '{vessel}' 不存在于系统中") + raise ValueError(f"容器 '{vessel}' 不存在于系统中") + + debug_print("✅ 基本参数验证通过") + + # === 🔧 关键修复:参数解析 === + debug_print("🔍 步骤2: 参数解析...") + action_sequence.append(create_action_log("正在解析添加参数...", "🔍")) + + # 解析各种参数为数值 + final_volume = parse_volume_input(volume) + final_mass = parse_mass_input(mass) + final_time = parse_time_input(time) + + debug_print(f"📊 解析结果:") + debug_print(f" 📏 体积: {final_volume}mL") + debug_print(f" ⚖️ 质量: {final_mass}g") + debug_print(f" ⏱️ 时间: {final_time}s") + debug_print(f" 🧬 摩尔: '{mol}'") + debug_print(f" 🎯 事件: '{event}'") + debug_print(f" ⚡ 速率: '{rate_spec}'") + + # === 判断添加类型 === + debug_print("🔍 步骤3: 判断添加类型...") + + # 🔧 修复:现在使用解析后的数值进行比较 + is_solid = (final_mass > 0 or (mol and mol.strip() != "")) + is_liquid = (final_volume > 0) + + if not is_solid and not is_liquid: + # 默认为液体,10mL + is_liquid = True + final_volume = 10.0 + debug_print("⚠️ 未指定体积或质量,默认为10mL液体") + + add_type = "固体" if is_solid else "液体" + add_emoji = "🧂" if is_solid else "💧" + debug_print(f"📋 添加类型: {add_type} {add_emoji}") + + action_sequence.append(create_action_log(f"确定添加类型: {add_type} {add_emoji}", "📋")) + + # === 执行添加流程 === + debug_print("🔍 步骤4: 执行添加流程...") + + try: + if is_solid: + # === 固体添加路径 === + debug_print(f"🧂 使用固体添加路径") + action_sequence.append(create_action_log("开始固体试剂添加流程", "🧂")) - # 等待搅拌稳定 - action_sequence.append({ - "action_name": "wait", - "action_kwargs": {"time": 5} - }) - - # 3. 计算流速 - if time > 0: - transfer_flowrate = volume / time - flowrate = transfer_flowrate - else: - if viscous: - transfer_flowrate = 0.3 - flowrate = 1.0 - else: - transfer_flowrate = 0.5 - flowrate = 2.5 - - # 4. 使用带清洗的pump_protocol - pump_actions = generate_pump_protocol_with_rinsing( - G=G, - from_vessel=reagent_vessel, - to_vessel=vessel, - volume=volume, - amount=amount, - time=time, - viscous=viscous, - rinsing_solvent=cleaning_solvent, - rinsing_volume=cleaning_volume, - rinsing_repeats=cleaning_repeats, - solid=False, - flowrate=flowrate, - transfer_flowrate=transfer_flowrate - ) - - action_sequence.extend(pump_actions) - - return action_sequence - - -def generate_sequential_add_protocol( - G: nx.DiGraph, - vessel: str, - reagents: List[Dict[str, Any]], - stir_between_additions: bool = True, - final_stir: bool = True, - final_stir_speed: float = 400.0, - final_stir_time: float = 300.0 -) -> List[Dict[str, Any]]: - """ - 生成连续添加多种试剂的协议,支持智能试剂匹配 - - Args: - G: 网络图 - vessel: 目标容器 - reagents: 试剂列表,每个元素包含试剂添加参数 - stir_between_additions: 是否在每次添加之间搅拌 - final_stir: 是否在所有添加完成后进行最终搅拌 - final_stir_speed: 最终搅拌速度 - final_stir_time: 最终搅拌时间 - - Returns: - List[Dict[str, Any]]: 完整的动作序列 - - Example: - reagents = [ - { - "reagent": "DMF", # 会匹配 reagent_bottle_1 (reagent_name: "DMF") - "volume": 10.0, - "viscous": False, - "stir_speed": 300.0 - }, - { - "reagent": "ethyl_acetate", # 会匹配 reagent_bottle_2 (reagent_name: "ethyl_acetate") - "volume": 5.0, - "viscous": False, - "stir_speed": 350.0 - } - ] - """ - action_sequence = [] - - print(f"ADD_PROTOCOL: 开始连续添加 {len(reagents)} 种试剂到容器 {vessel}") - - for i, reagent_params in enumerate(reagents): - reagent_name = reagent_params.get('reagent') - print(f"ADD_PROTOCOL: 处理第 {i+1}/{len(reagents)} 个试剂: {reagent_name}") - - # 生成单个试剂的添加协议 - add_actions = generate_add_protocol( - G=G, - vessel=vessel, - reagent=reagent_name, - volume=reagent_params.get('volume', 0.0), - mass=reagent_params.get('mass', 0.0), - amount=reagent_params.get('amount', ''), - time=reagent_params.get('time', 0.0), - stir=stir_between_additions, - stir_speed=reagent_params.get('stir_speed', 300.0), - viscous=reagent_params.get('viscous', False), - purpose=reagent_params.get('purpose', f'添加试剂 {reagent_name} ({i+1}/{len(reagents)})') - ) - - action_sequence.extend(add_actions) - - # 在添加之间加入等待时间 - if i < len(reagents) - 1: # 不是最后一个试剂 - action_sequence.append({ - "action_name": "wait", - "action_kwargs": {"time": 10} # 试剂混合时间 - }) - - # 最终搅拌 - if final_stir: - stirrer_id = find_connected_stirrer(G, vessel) - if stirrer_id: - print(f"ADD_PROTOCOL: 添加最终搅拌动作,速度 {final_stir_speed} RPM,时间 {final_stir_time} 秒") - action_sequence.extend([ - { - "device_id": stirrer_id, - "action_name": "stir", - "action_kwargs": { - "stir_time": final_stir_time, - "stir_speed": final_stir_speed, - "settling_time": 30.0 - } + solid_dispenser = find_solid_dispenser(G) + if solid_dispenser: + action_sequence.append(create_action_log(f"找到固体加样器: {solid_dispenser}", "🥄")) + + # 启动搅拌 + if stir: + debug_print("🌪️ 准备启动搅拌...") + action_sequence.append(create_action_log("准备启动搅拌器", "🌪️")) + + stirrer_id = find_connected_stirrer(G, vessel) + if stirrer_id: + action_sequence.append(create_action_log(f"启动搅拌器 {stirrer_id} (速度: {stir_speed} rpm)", "🔄")) + + action_sequence.append({ + "device_id": stirrer_id, + "action_name": "start_stir", + "action_kwargs": { + "vessel": vessel, + "stir_speed": stir_speed, + "purpose": f"准备添加固体 {reagent}" + } + }) + # 等待搅拌稳定 + action_sequence.append(create_action_log("等待搅拌稳定...", "⏳")) + action_sequence.append({ + "action_name": "wait", + "action_kwargs": {"time": 3} + }) + + # 固体加样 + add_kwargs = { + "vessel": vessel, + "reagent": reagent, + "purpose": purpose, + "event": event, + "rate_spec": rate_spec } - ]) + + if final_mass > 0: + add_kwargs["mass"] = str(final_mass) + action_sequence.append(create_action_log(f"准备添加固体: {final_mass}g", "⚖️")) + if mol and mol.strip(): + add_kwargs["mol"] = mol + action_sequence.append(create_action_log(f"按摩尔数添加: {mol}", "🧬")) + if equiv and equiv.strip(): + add_kwargs["equiv"] = equiv + action_sequence.append(create_action_log(f"当量: {equiv}", "🔢")) + + action_sequence.append(create_action_log("开始固体加样操作", "🥄")) + action_sequence.append({ + "device_id": solid_dispenser, + "action_name": "add_solid", + "action_kwargs": add_kwargs + }) + + action_sequence.append(create_action_log("固体加样完成", "✅")) + + # 添加后等待 + if final_time > 0: + wait_minutes = final_time / 60 + action_sequence.append(create_action_log(f"等待反应进行 ({wait_minutes:.1f}分钟)", "⏰")) + action_sequence.append({ + "action_name": "wait", + "action_kwargs": {"time": final_time} + }) + + debug_print(f"✅ 固体添加完成") + else: + debug_print("❌ 未找到固体加样器,跳过固体添加") + action_sequence.append(create_action_log("未找到固体加样器,无法添加固体", "❌")) + + else: + # === 液体添加路径 === + debug_print(f"💧 使用液体添加路径") + action_sequence.append(create_action_log("开始液体试剂添加流程", "💧")) + + # 查找试剂容器 + action_sequence.append(create_action_log("正在查找试剂容器...", "🔍")) + reagent_vessel = find_reagent_vessel(G, reagent) + action_sequence.append(create_action_log(f"找到试剂容器: {reagent_vessel}", "🧪")) + + # 启动搅拌 + if stir: + debug_print("🌪️ 准备启动搅拌...") + action_sequence.append(create_action_log("准备启动搅拌器", "🌪️")) + + stirrer_id = find_connected_stirrer(G, vessel) + if stirrer_id: + action_sequence.append(create_action_log(f"启动搅拌器 {stirrer_id} (速度: {stir_speed} rpm)", "🔄")) + + action_sequence.append({ + "device_id": stirrer_id, + "action_name": "start_stir", + "action_kwargs": { + "vessel": vessel, + "stir_speed": stir_speed, + "purpose": f"准备添加液体 {reagent}" + } + }) + # 等待搅拌稳定 + action_sequence.append(create_action_log("等待搅拌稳定...", "⏳")) + action_sequence.append({ + "action_name": "wait", + "action_kwargs": {"time": 5} + }) + + # 计算流速 + if final_time > 0: + flowrate = final_volume / final_time * 60 # mL/min + transfer_flowrate = flowrate + debug_print(f"⚡ 根据时间计算流速: {flowrate:.2f} mL/min") + else: + if rate_spec == "dropwise": + flowrate = 0.5 # 滴加,很慢 + transfer_flowrate = 0.2 + debug_print(f"💧 滴加模式,流速: {flowrate} mL/min") + elif viscous: + flowrate = 1.0 # 粘性液体 + transfer_flowrate = 0.3 + debug_print(f"🍯 粘性液体,流速: {flowrate} mL/min") + else: + flowrate = 2.5 # 正常流速 + transfer_flowrate = 0.5 + debug_print(f"⚡ 正常流速: {flowrate} mL/min") + + action_sequence.append(create_action_log(f"设置流速: {flowrate:.2f} mL/min", "⚡")) + action_sequence.append(create_action_log(f"开始转移 {final_volume}mL 液体", "🚰")) + + # 调用pump protocol + pump_actions = generate_pump_protocol_with_rinsing( + G=G, + from_vessel=reagent_vessel, + to_vessel=vessel, + volume=final_volume, + amount=amount, + time=final_time, + viscous=viscous, + rinsing_solvent="", + rinsing_volume=0.0, + rinsing_repeats=0, + solid=False, + flowrate=flowrate, + transfer_flowrate=transfer_flowrate, + rate_spec=rate_spec, + event=event, + through="", + **kwargs + ) + action_sequence.extend(pump_actions) + debug_print(f"✅ 液体转移完成,添加了 {len(pump_actions)} 个动作") + action_sequence.append(create_action_log(f"液体转移完成 ({len(pump_actions)} 个操作)", "✅")) + + except Exception as e: + debug_print(f"❌ 试剂添加失败: {str(e)}") + action_sequence.append(create_action_log(f"试剂添加失败: {str(e)}", "❌")) + # 添加错误日志 + action_sequence.append({ + "device_id": "system", + "action_name": "log_message", + "action_kwargs": { + "message": f"试剂 '{reagent}' 添加失败: {str(e)}" + } + }) + + # === 最终结果 === + debug_print("=" * 60) + debug_print(f"🎉 添加试剂协议生成完成") + debug_print(f"📊 总动作数: {len(action_sequence)}") + debug_print(f"📋 处理总结:") + debug_print(f" 🧪 试剂: {reagent}") + debug_print(f" {add_emoji} 添加类型: {add_type}") + debug_print(f" 🥼 目标容器: {vessel}") + if is_liquid: + debug_print(f" 📏 体积: {final_volume}mL") + if is_solid: + debug_print(f" ⚖️ 质量: {final_mass}g") + debug_print(f" 🧬 摩尔: {mol}") + debug_print("=" * 60) + + # 添加完成日志 + summary_msg = f"试剂添加协议完成: {reagent} → {vessel}" + if is_liquid: + summary_msg += f" ({final_volume}mL)" + if is_solid: + summary_msg += f" ({final_mass}g)" + + action_sequence.append(create_action_log(summary_msg, "🎉")) - print(f"ADD_PROTOCOL: 连续添加协议生成完成,共 {len(action_sequence)} 个动作") return action_sequence +# === 便捷函数 === -# 便捷函数:常用添加方案 -def generate_organic_add_protocol( - G: nx.DiGraph, - vessel: str, - organic_reagent: str, - volume: float, - stir_speed: float = 400.0 -) -> List[Dict[str, Any]]: - """有机试剂添加:慢速、搅拌""" +def add_liquid_volume(G: nx.DiGraph, vessel: str, reagent: str, volume: Union[str, float], + time: Union[str, float] = 0.0, rate_spec: str = "") -> List[Dict[str, Any]]: + """添加指定体积的液体试剂""" + debug_print(f"💧 快速添加液体: {reagent} ({volume}) → {vessel}") return generate_add_protocol( - G, vessel, organic_reagent, volume, 0.0, "", 0.0, - True, stir_speed, False, f"添加有机试剂 {organic_reagent}" + G, vessel, reagent, + volume=volume, + time=time, + rate_spec=rate_spec ) - -def generate_viscous_add_protocol( - G: nx.DiGraph, - vessel: str, - viscous_reagent: str, - volume: float, - addition_time: float = 120.0 -) -> List[Dict[str, Any]]: - """粘稠试剂添加:慢速、长时间""" +def add_solid_mass(G: nx.DiGraph, vessel: str, reagent: str, mass: Union[str, float], + event: str = "") -> List[Dict[str, Any]]: + """添加指定质量的固体试剂""" + debug_print(f"🧂 快速添加固体: {reagent} ({mass}) → {vessel}") return generate_add_protocol( - G, vessel, viscous_reagent, volume, 0.0, "", addition_time, - True, 250.0, True, f"缓慢添加粘稠试剂 {viscous_reagent}" + G, vessel, reagent, + mass=mass, + event=event ) - -def generate_solvent_add_protocol( - G: nx.DiGraph, - vessel: str, - solvent: str, - volume: float -) -> List[Dict[str, Any]]: - """溶剂添加:快速、无需特殊处理""" +def add_solid_moles(G: nx.DiGraph, vessel: str, reagent: str, mol: str, + event: str = "") -> List[Dict[str, Any]]: + """按摩尔数添加固体试剂""" + debug_print(f"🧬 按摩尔数添加固体: {reagent} ({mol}) → {vessel}") return generate_add_protocol( - G, vessel, solvent, volume, 0.0, "", 0.0, - False, 300.0, False, f"添加溶剂 {solvent}" + G, vessel, reagent, + mol=mol, + event=event ) +def add_dropwise_liquid(G: nx.DiGraph, vessel: str, reagent: str, volume: Union[str, float], + time: Union[str, float] = "20 min", event: str = "") -> List[Dict[str, Any]]: + """滴加液体试剂""" + debug_print(f"💧 滴加液体: {reagent} ({volume}) → {vessel} (用时: {time})") + return generate_add_protocol( + G, vessel, reagent, + volume=volume, + time=time, + rate_spec="dropwise", + event=event + ) -# 使用示例和测试函数 +def add_portionwise_solid(G: nx.DiGraph, vessel: str, reagent: str, mass: Union[str, float], + time: Union[str, float] = "1 h", event: str = "") -> List[Dict[str, Any]]: + """分批添加固体试剂""" + debug_print(f"🧂 分批添加固体: {reagent} ({mass}) → {vessel} (用时: {time})") + return generate_add_protocol( + G, vessel, reagent, + mass=mass, + time=time, + rate_spec="portionwise", + event=event + ) + +# 测试函数 def test_add_protocol(): - """测试添加协议的示例""" - print("=== ADD PROTOCOL 智能匹配测试 ===") - print("测试完成") - + """测试添加协议的各种参数解析""" + print("=== ADD PROTOCOL 增强版测试 ===") + + # 测试体积解析 + debug_print("🧪 测试体积解析...") + volumes = ["2.7 mL", "2.67 mL", "?", 10.0, "1 L", "500 μL"] + for vol in volumes: + result = parse_volume_input(vol) + print(f"📏 体积解析: {vol} → {result}mL") + + # 测试质量解析 + debug_print("⚖️ 测试质量解析...") + masses = ["19.3 g", "4.5 g", 2.5, "500 mg", "1 kg"] + for mass in masses: + result = parse_mass_input(mass) + print(f"⚖️ 质量解析: {mass} → {result}g") + + # 测试时间解析 + debug_print("⏱️ 测试时间解析...") + times = ["1 h", "20 min", "30 s", 60.0, "?"] + for time in times: + result = parse_time_input(time) + print(f"⏱️ 时间解析: {time} → {result}s") + + print("✅ 测试完成") if __name__ == "__main__": test_add_protocol() \ No newline at end of file diff --git a/unilabos/compile/adjustph_protocol.py b/unilabos/compile/adjustph_protocol.py index ce7c1c3..d8f1b1b 100644 --- a/unilabos/compile/adjustph_protocol.py +++ b/unilabos/compile/adjustph_protocol.py @@ -1,7 +1,30 @@ import networkx as nx +import logging from typing import List, Dict, Any from .pump_protocol import generate_pump_protocol_with_rinsing +logger = logging.getLogger(__name__) + +def debug_print(message): + """调试输出""" + print(f"[ADJUST_PH] {message}", flush=True) + logger.info(f"[ADJUST_PH] {message}") + +# 🆕 创建进度日志动作 +def create_action_log(message: str, emoji: str = "📝") -> Dict[str, Any]: + """创建一个动作日志""" + full_message = f"{emoji} {message}" + debug_print(full_message) + logger.info(full_message) + print(f"[ACTION] {full_message}", flush=True) + + return { + "action_name": "wait", + "action_kwargs": { + "time": 0.1, + "log_message": full_message + } + } def find_acid_base_vessel(G: nx.DiGraph, reagent: str) -> str: """ @@ -14,7 +37,7 @@ def find_acid_base_vessel(G: nx.DiGraph, reagent: str) -> str: Returns: str: 试剂容器ID """ - print(f"ADJUST_PH: 正在查找试剂 '{reagent}' 的容器...") + debug_print(f"🔍 正在查找试剂 '{reagent}' 的容器...") # 常见酸碱试剂的别名映射 reagent_aliases = { @@ -29,11 +52,16 @@ def find_acid_base_vessel(G: nx.DiGraph, reagent: str) -> str: # 构建搜索名称列表 search_names = [reagent.lower()] + debug_print(f"📋 基础搜索名称: {reagent.lower()}") # 添加别名 for base_name, aliases in reagent_aliases.items(): if reagent.lower() in base_name.lower() or base_name.lower() in reagent.lower(): search_names.extend([alias.lower() for alias in aliases]) + debug_print(f"🔗 添加别名: {aliases}") + break + + debug_print(f"📝 完整搜索列表: {search_names}") # 构建可能的容器名称 possible_names = [] @@ -49,13 +77,17 @@ def find_acid_base_vessel(G: nx.DiGraph, reagent: str) -> str: name_clean ]) + debug_print(f"🎯 可能的容器名称 (前5个): {possible_names[:5]}... (共{len(possible_names)}个)") + # 第一步:通过容器名称匹配 + debug_print(f"📋 方法1: 精确名称匹配...") for vessel_name in possible_names: if vessel_name in G.nodes(): - print(f"ADJUST_PH: 通过名称匹配找到容器: {vessel_name}") + debug_print(f"✅ 通过名称匹配找到容器: {vessel_name} 🎯") return vessel_name # 第二步:通过模糊匹配 + debug_print(f"📋 方法2: 模糊名称匹配...") for node_id in G.nodes(): if G.nodes[node_id].get('type') == 'container': node_name = G.nodes[node_id].get('name', '').lower() @@ -63,10 +95,11 @@ def find_acid_base_vessel(G: nx.DiGraph, reagent: str) -> str: # 检查是否包含任何搜索名称 for search_name in search_names: if search_name in node_id.lower() or search_name in node_name: - print(f"ADJUST_PH: 通过模糊匹配找到容器: {node_id}") + debug_print(f"✅ 通过模糊匹配找到容器: {node_id} 🔍") return node_id # 第三步:通过液体类型匹配 + debug_print(f"📋 方法3: 液体类型匹配...") for node_id in G.nodes(): if G.nodes[node_id].get('type') == 'container': vessel_data = G.nodes[node_id].get('data', {}) @@ -79,10 +112,11 @@ def find_acid_base_vessel(G: nx.DiGraph, reagent: str) -> str: for search_name in search_names: if search_name in liquid_type or search_name in reagent_name: - print(f"ADJUST_PH: 通过液体类型匹配找到容器: {node_id}") + debug_print(f"✅ 通过液体类型匹配找到容器: {node_id} 💧") return node_id # 列出可用容器帮助调试 + debug_print(f"📊 列出可用容器帮助调试...") available_containers = [] for node_id in G.nodes(): if G.nodes[node_id].get('type') == 'container': @@ -98,67 +132,92 @@ def find_acid_base_vessel(G: nx.DiGraph, reagent: str) -> str: 'reagent_name': vessel_data.get('reagent_name', '') }) - print(f"ADJUST_PH: 可用容器列表:") + debug_print(f"📋 可用容器列表:") for container in available_containers: - print(f" - {container['id']}: {container['name']}") - print(f" 液体: {container['liquids']}") - print(f" 试剂: {container['reagent_name']}") + debug_print(f" - 🧪 {container['id']}: {container['name']}") + debug_print(f" 💧 液体: {container['liquids']}") + debug_print(f" 🏷️ 试剂: {container['reagent_name']}") - raise ValueError(f"找不到试剂 '{reagent}' 对应的容器。尝试了: {possible_names}") - + debug_print(f"❌ 所有匹配方法都失败了") + raise ValueError(f"找不到试剂 '{reagent}' 对应的容器。尝试了: {possible_names[:10]}...") def find_connected_stirrer(G: nx.DiGraph, vessel: str) -> str: """查找与容器相连的搅拌器""" + debug_print(f"🔍 查找连接到容器 '{vessel}' 的搅拌器...") + stirrer_nodes = [node for node in G.nodes() if (G.nodes[node].get('class') or '') == 'virtual_stirrer'] + debug_print(f"📊 发现 {len(stirrer_nodes)} 个搅拌器: {stirrer_nodes}") + for stirrer in stirrer_nodes: if G.has_edge(stirrer, vessel) or G.has_edge(vessel, stirrer): + debug_print(f"✅ 找到连接的搅拌器: {stirrer} 🔗") return stirrer - return stirrer_nodes[0] if stirrer_nodes else None + if stirrer_nodes: + debug_print(f"⚠️ 未找到直接连接的搅拌器,使用第一个: {stirrer_nodes[0]} 🔄") + return stirrer_nodes[0] + + debug_print(f"❌ 未找到任何搅拌器") + return None - -def calculate_reagent_volume(target_ph_value: float, reagent: str, vessel_volume: float = 100.0) -> float: # 改为 target_ph_value +def calculate_reagent_volume(target_ph_value: float, reagent: str, vessel_volume: float = 100.0) -> float: """ 估算需要的试剂体积来调节pH Args: - target_ph_value: 目标pH值 # 改为 target_ph_value + target_ph_value: 目标pH值 reagent: 试剂名称 vessel_volume: 容器体积 (mL) Returns: float: 估算的试剂体积 (mL) """ + debug_print(f"🧮 计算试剂体积...") + debug_print(f" 📍 目标pH: {target_ph_value}") + debug_print(f" 🧪 试剂: {reagent}") + debug_print(f" 📏 容器体积: {vessel_volume}mL") + # 简化的pH调节体积估算(实际应用中需要更精确的计算) if "acid" in reagent.lower() or "hcl" in reagent.lower(): + debug_print(f"🍋 检测到酸性试剂") # 酸性试剂:pH越低需要的体积越大 - if target_ph_value < 3: # 改为 target_ph_value - return vessel_volume * 0.05 # 5% - elif target_ph_value < 5: # 改为 target_ph_value - return vessel_volume * 0.02 # 2% + if target_ph_value < 3: + volume = vessel_volume * 0.05 # 5% + debug_print(f" 💪 强酸性 (pH<3): 使用 5% 体积") + elif target_ph_value < 5: + volume = vessel_volume * 0.02 # 2% + debug_print(f" 🔸 中酸性 (pH<5): 使用 2% 体积") else: - return vessel_volume * 0.01 # 1% + volume = vessel_volume * 0.01 # 1% + debug_print(f" 🔹 弱酸性 (pH≥5): 使用 1% 体积") elif "hydroxide" in reagent.lower() or "naoh" in reagent.lower(): + debug_print(f"🧂 检测到碱性试剂") # 碱性试剂:pH越高需要的体积越大 - if target_ph_value > 11: # 改为 target_ph_value - return vessel_volume * 0.05 # 5% - elif target_ph_value > 9: # 改为 target_ph_value - return vessel_volume * 0.02 # 2% + if target_ph_value > 11: + volume = vessel_volume * 0.05 # 5% + debug_print(f" 💪 强碱性 (pH>11): 使用 5% 体积") + elif target_ph_value > 9: + volume = vessel_volume * 0.02 # 2% + debug_print(f" 🔸 中碱性 (pH>9): 使用 2% 体积") else: - return vessel_volume * 0.01 # 1% + volume = vessel_volume * 0.01 # 1% + debug_print(f" 🔹 弱碱性 (pH≤9): 使用 1% 体积") else: # 未知试剂,使用默认值 - return vessel_volume * 0.01 - + volume = vessel_volume * 0.01 + debug_print(f"❓ 未知试剂类型,使用默认 1% 体积") + + debug_print(f"📊 计算结果: {volume:.2f}mL") + return volume def generate_adjust_ph_protocol( G: nx.DiGraph, vessel: str, - ph_value: float, # 改为 ph_value + ph_value: float, reagent: str, **kwargs ) -> List[Dict[str, Any]]: @@ -168,13 +227,23 @@ def generate_adjust_ph_protocol( Args: G: 有向图,节点为容器和设备 vessel: 目标容器(需要调节pH的容器) - ph_value: 目标pH值(从XDL传入) # 改为 ph_value + ph_value: 目标pH值(从XDL传入) reagent: 酸碱试剂名称(从XDL传入) **kwargs: 其他可选参数,使用默认值 Returns: List[Dict[str, Any]]: 动作序列 """ + + debug_print("=" * 60) + debug_print("🧪 开始生成pH调节协议") + debug_print(f"📋 原始参数:") + debug_print(f" 🥼 vessel: '{vessel}'") + debug_print(f" 📊 ph_value: {ph_value}") + debug_print(f" 🧪 reagent: '{reagent}'") + debug_print(f" 📦 kwargs: {kwargs}") + debug_print("=" * 60) + action_sequence = [] # 从kwargs中获取可选参数,如果没有则使用默认值 @@ -184,48 +253,84 @@ def generate_adjust_ph_protocol( stir_time = kwargs.get('stir_time', 60.0) # 默认搅拌时间 settling_time = kwargs.get('settling_time', 30.0) # 默认平衡时间 - print(f"ADJUST_PH: 开始生成pH调节协议") - print(f" - 目标容器: {vessel}") - print(f" - 目标pH: {ph_value}") # 改为 ph_value - print(f" - 试剂: {reagent}") - print(f" - 使用默认参数: 体积=自动估算, 搅拌=True, 搅拌速度=300RPM") + debug_print(f"🔧 处理后的参数:") + debug_print(f" 📏 volume: {volume}mL (0.0表示自动估算)") + debug_print(f" 🌪️ stir: {stir}") + debug_print(f" 🔄 stir_speed: {stir_speed}rpm") + debug_print(f" ⏱️ stir_time: {stir_time}s") + debug_print(f" ⏳ settling_time: {settling_time}s") + + # 开始处理 + action_sequence.append(create_action_log(f"开始调节pH至 {ph_value}", "🧪")) + action_sequence.append(create_action_log(f"目标容器: {vessel}", "🥼")) + action_sequence.append(create_action_log(f"使用试剂: {reagent}", "⚗️")) # 1. 验证目标容器存在 + debug_print(f"🔍 步骤1: 验证目标容器...") if vessel not in G.nodes(): + debug_print(f"❌ 目标容器 '{vessel}' 不存在于系统中") raise ValueError(f"目标容器 '{vessel}' 不存在于系统中") + debug_print(f"✅ 目标容器验证通过") + action_sequence.append(create_action_log("目标容器验证通过", "✅")) + # 2. 查找酸碱试剂容器 + debug_print(f"🔍 步骤2: 查找试剂容器...") + action_sequence.append(create_action_log("正在查找试剂容器...", "🔍")) + try: reagent_vessel = find_acid_base_vessel(G, reagent) - print(f"ADJUST_PH: 找到试剂容器: {reagent_vessel}") + debug_print(f"✅ 找到试剂容器: {reagent_vessel}") + action_sequence.append(create_action_log(f"找到试剂容器: {reagent_vessel}", "🧪")) except ValueError as e: + debug_print(f"❌ 无法找到试剂容器: {str(e)}") + action_sequence.append(create_action_log(f"试剂容器查找失败: {str(e)}", "❌")) raise ValueError(f"无法找到试剂 '{reagent}': {str(e)}") - # 3. 如果未指定体积,自动估算 + # 3. 体积估算 + debug_print(f"🔍 步骤3: 体积处理...") if volume <= 0: + action_sequence.append(create_action_log("开始自动估算试剂体积", "🧮")) + # 获取目标容器的体积信息 vessel_data = G.nodes[vessel].get('data', {}) vessel_volume = vessel_data.get('max_volume', 100.0) # 默认100mL + debug_print(f"📏 容器最大体积: {vessel_volume}mL") - estimated_volume = calculate_reagent_volume(ph_value, reagent, vessel_volume) # 改为 ph_value + estimated_volume = calculate_reagent_volume(ph_value, reagent, vessel_volume) volume = estimated_volume - print(f"ADJUST_PH: 自动估算试剂体积: {volume:.2f} mL") + debug_print(f"✅ 自动估算试剂体积: {volume:.2f} mL") + action_sequence.append(create_action_log(f"估算试剂体积: {volume:.2f}mL", "📊")) + else: + debug_print(f"📏 使用指定体积: {volume}mL") + action_sequence.append(create_action_log(f"使用指定体积: {volume}mL", "📏")) # 4. 验证路径存在 + debug_print(f"🔍 步骤4: 路径验证...") + action_sequence.append(create_action_log("验证转移路径...", "🛤️")) + try: path = nx.shortest_path(G, source=reagent_vessel, target=vessel) - print(f"ADJUST_PH: 找到路径: {' → '.join(path)}") + debug_print(f"✅ 找到路径: {' → '.join(path)}") + action_sequence.append(create_action_log(f"找到转移路径: {' → '.join(path)}", "🛤️")) except nx.NetworkXNoPath: + debug_print(f"❌ 无法找到转移路径") + action_sequence.append(create_action_log("转移路径不存在", "❌")) raise ValueError(f"从试剂容器 '{reagent_vessel}' 到目标容器 '{vessel}' 没有可用路径") - # 5. 先启动搅拌(如果需要) + # 5. 搅拌器设置 + debug_print(f"🔍 步骤5: 搅拌器设置...") stirrer_id = None if stir: + action_sequence.append(create_action_log("准备启动搅拌器", "🌪️")) + try: stirrer_id = find_connected_stirrer(G, vessel) if stirrer_id: - print(f"ADJUST_PH: 找到搅拌器 {stirrer_id},启动搅拌") + debug_print(f"✅ 找到搅拌器 {stirrer_id},启动搅拌") + action_sequence.append(create_action_log(f"启动搅拌器 {stirrer_id} (速度: {stir_speed}rpm)", "🔄")) + action_sequence.append({ "device_id": stirrer_id, "action_name": "start_stir", @@ -237,23 +342,34 @@ def generate_adjust_ph_protocol( }) # 等待搅拌稳定 + action_sequence.append(create_action_log("等待搅拌稳定...", "⏳")) action_sequence.append({ "action_name": "wait", "action_kwargs": {"time": 5} }) else: - print(f"ADJUST_PH: 警告 - 未找到搅拌器,继续执行") + debug_print(f"⚠️ 未找到搅拌器,继续执行") + action_sequence.append(create_action_log("未找到搅拌器,跳过搅拌", "⚠️")) except Exception as e: - print(f"ADJUST_PH: 搅拌器配置出错: {str(e)}") + debug_print(f"❌ 搅拌器配置出错: {str(e)}") + action_sequence.append(create_action_log(f"搅拌器配置失败: {str(e)}", "❌")) + else: + debug_print(f"📋 跳过搅拌设置") + action_sequence.append(create_action_log("跳过搅拌设置", "⏭️")) - # 6. 缓慢添加试剂 - 使用pump_protocol - print(f"ADJUST_PH: 开始添加试剂 {volume:.2f} mL") + # 6. 试剂添加 + debug_print(f"🔍 步骤6: 试剂添加...") + action_sequence.append(create_action_log(f"开始添加试剂 {volume:.2f}mL", "🚰")) # 计算添加时间(pH调节需要缓慢添加) addition_time = max(30.0, volume * 2.0) # 至少30秒,每mL需要2秒 + debug_print(f"⏱️ 计算添加时间: {addition_time}s (缓慢注入)") + action_sequence.append(create_action_log(f"设置添加时间: {addition_time:.0f}s (缓慢注入)", "⏱️")) try: + action_sequence.append(create_action_log("调用泵协议进行试剂转移", "🔄")) + pump_actions = generate_pump_protocol_with_rinsing( G=G, from_vessel=reagent_vessel, @@ -266,17 +382,24 @@ def generate_adjust_ph_protocol( rinsing_volume=0.0, rinsing_repeats=0, solid=False, - flowrate=0.5 # 缓慢注入 + flowrate=0.5, # 缓慢注入 + transfer_flowrate=0.3 ) action_sequence.extend(pump_actions) + debug_print(f"✅ 泵协议生成完成,添加了 {len(pump_actions)} 个动作") + action_sequence.append(create_action_log(f"试剂转移完成 ({len(pump_actions)} 个操作)", "✅")) except Exception as e: + debug_print(f"❌ 生成泵协议时出错: {str(e)}") + action_sequence.append(create_action_log(f"泵协议生成失败: {str(e)}", "❌")) raise ValueError(f"生成泵协议时出错: {str(e)}") - # 7. 持续搅拌以混合和平衡 + # 7. 混合搅拌 if stir and stirrer_id: - print(f"ADJUST_PH: 持续搅拌 {stir_time} 秒以混合试剂") + debug_print(f"🔍 步骤7: 混合搅拌...") + action_sequence.append(create_action_log(f"开始混合搅拌 {stir_time:.0f}s", "🌀")) + action_sequence.append({ "device_id": stirrer_id, "action_name": "stir", @@ -284,25 +407,47 @@ def generate_adjust_ph_protocol( "stir_time": stir_time, "stir_speed": stir_speed, "settling_time": settling_time, - "purpose": f"pH调节: 混合试剂,目标pH={ph_value}" # 改为 ph_value + "purpose": f"pH调节: 混合试剂,目标pH={ph_value}" } }) + + debug_print(f"✅ 混合搅拌设置完成") + else: + debug_print(f"⏭️ 跳过混合搅拌") + action_sequence.append(create_action_log("跳过混合搅拌", "⏭️")) + + # 8. 等待平衡 + debug_print(f"🔍 步骤8: 反应平衡...") + action_sequence.append(create_action_log(f"等待pH平衡 {settling_time:.0f}s", "⚖️")) - # 8. 等待反应平衡 action_sequence.append({ "action_name": "wait", "action_kwargs": { "time": settling_time, - "description": f"等待pH平衡到目标值 {ph_value}" # 改为 ph_value + "description": f"等待pH平衡到目标值 {ph_value}" } }) - print(f"ADJUST_PH: 协议生成完成,共 {len(action_sequence)} 个动作") - print(f"ADJUST_PH: 预计总时间: {addition_time + stir_time + settling_time:.0f} 秒") + # 9. 完成总结 + total_time = addition_time + stir_time + settling_time + + debug_print("=" * 60) + debug_print(f"🎉 pH调节协议生成完成") + debug_print(f"📊 协议统计:") + debug_print(f" 📋 总动作数: {len(action_sequence)}") + debug_print(f" ⏱️ 预计总时间: {total_time:.0f}s ({total_time/60:.1f}分钟)") + debug_print(f" 🧪 试剂: {reagent}") + debug_print(f" 📏 体积: {volume:.2f}mL") + debug_print(f" 📊 目标pH: {ph_value}") + debug_print(f" 🥼 目标容器: {vessel}") + debug_print("=" * 60) + + # 添加完成日志 + summary_msg = f"pH调节协议完成: {vessel} → pH {ph_value} (使用 {volume:.2f}mL {reagent})" + action_sequence.append(create_action_log(summary_msg, "🎉")) return action_sequence - def generate_adjust_ph_protocol_stepwise( G: nx.DiGraph, vessel: str, @@ -317,7 +462,7 @@ def generate_adjust_ph_protocol_stepwise( Args: G: 网络图 vessel: 目标容器 - pH: 目标pH值 + ph_value: 目标pH值 reagent: 酸碱试剂 max_volume: 最大试剂体积 steps: 分步数量 @@ -325,15 +470,28 @@ def generate_adjust_ph_protocol_stepwise( Returns: List[Dict[str, Any]]: 动作序列 """ - action_sequence = [] + debug_print("=" * 60) + debug_print(f"🔄 开始分步pH调节") + debug_print(f"📋 分步参数:") + debug_print(f" 🥼 vessel: {vessel}") + debug_print(f" 📊 ph_value: {ph_value}") + debug_print(f" 🧪 reagent: {reagent}") + debug_print(f" 📏 max_volume: {max_volume}mL") + debug_print(f" 🔢 steps: {steps}") + debug_print("=" * 60) - print(f"ADJUST_PH: 开始分步pH调节({steps}步)") + action_sequence = [] # 每步添加的体积 step_volume = max_volume / steps + debug_print(f"📊 每步体积: {step_volume:.2f}mL") + + action_sequence.append(create_action_log(f"开始分步pH调节 ({steps}步)", "🔄")) + action_sequence.append(create_action_log(f"每步添加: {step_volume:.2f}mL", "📏")) for i in range(steps): - print(f"ADJUST_PH: 第 {i+1}/{steps} 步,添加 {step_volume} mL") + debug_print(f"🔄 执行第 {i+1}/{steps} 步,添加 {step_volume:.2f}mL") + action_sequence.append(create_action_log(f"第 {i+1}/{steps} 步开始", "🚀")) # 生成单步协议 step_actions = generate_adjust_ph_protocol( @@ -349,9 +507,13 @@ def generate_adjust_ph_protocol_stepwise( ) action_sequence.extend(step_actions) + debug_print(f"✅ 第 {i+1}/{steps} 步完成,添加了 {len(step_actions)} 个动作") + action_sequence.append(create_action_log(f"第 {i+1}/{steps} 步完成", "✅")) # 步骤间等待 if i < steps - 1: + debug_print(f"⏳ 步骤间等待30s") + action_sequence.append(create_action_log("步骤间等待...", "⏳")) action_sequence.append({ "action_name": "wait", "action_kwargs": { @@ -360,10 +522,11 @@ def generate_adjust_ph_protocol_stepwise( } }) - print(f"ADJUST_PH: 分步pH调节完成") + debug_print(f"🎉 分步pH调节完成,共 {len(action_sequence)} 个动作") + action_sequence.append(create_action_log("分步pH调节全部完成", "🎉")) + return action_sequence - # 便捷函数:常用pH调节 def generate_acidify_protocol( G: nx.DiGraph, @@ -372,11 +535,11 @@ def generate_acidify_protocol( acid: str = "hydrochloric acid" ) -> List[Dict[str, Any]]: """酸化协议""" + debug_print(f"🍋 生成酸化协议: {vessel} → pH {target_ph} (使用 {acid})") return generate_adjust_ph_protocol( - G, vessel, target_ph, acid, 0.0, True, 300.0, 120.0, 60.0 + G, vessel, target_ph, acid ) - def generate_basify_protocol( G: nx.DiGraph, vessel: str, @@ -384,28 +547,42 @@ def generate_basify_protocol( base: str = "sodium hydroxide" ) -> List[Dict[str, Any]]: """碱化协议""" + debug_print(f"🧂 生成碱化协议: {vessel} → pH {target_ph} (使用 {base})") return generate_adjust_ph_protocol( - G, vessel, target_ph, base, 0.0, True, 300.0, 120.0, 60.0 + G, vessel, target_ph, base ) - def generate_neutralize_protocol( G: nx.DiGraph, vessel: str, reagent: str = "sodium hydroxide" ) -> List[Dict[str, Any]]: """中和协议(pH=7)""" + debug_print(f"⚖️ 生成中和协议: {vessel} → pH 7.0 (使用 {reagent})") return generate_adjust_ph_protocol( - G, vessel, 7.0, reagent, 0.0, True, 350.0, 180.0, 90.0 + G, vessel, 7.0, reagent ) - # 测试函数 def test_adjust_ph_protocol(): """测试pH调节协议""" - print("=== ADJUST PH PROTOCOL 测试 ===") - print("测试完成") - + debug_print("=== ADJUST PH PROTOCOL 增强版测试 ===") + + # 测试体积计算 + debug_print("🧮 测试体积计算...") + test_cases = [ + (2.0, "hydrochloric acid", 100.0), + (4.0, "hydrochloric acid", 100.0), + (12.0, "sodium hydroxide", 100.0), + (10.0, "sodium hydroxide", 100.0), + (7.0, "unknown reagent", 100.0) + ] + + for ph, reagent, volume in test_cases: + result = calculate_reagent_volume(ph, reagent, volume) + debug_print(f"📊 {reagent} → pH {ph}: {result:.2f}mL") + + debug_print("✅ 测试完成") if __name__ == "__main__": test_adjust_ph_protocol() \ No newline at end of file diff --git a/unilabos/compile/dissolve_protocol.py b/unilabos/compile/dissolve_protocol.py index 3da0d53..065196e 100644 --- a/unilabos/compile/dissolve_protocol.py +++ b/unilabos/compile/dissolve_protocol.py @@ -1,359 +1,889 @@ -from typing import List, Dict, Any import networkx as nx -from .pump_protocol import generate_pump_protocol +import re +import logging +from typing import List, Dict, Any, Union +from .pump_protocol import generate_pump_protocol_with_rinsing +logger = logging.getLogger(__name__) + +def debug_print(message): + """调试输出""" + print(f"[DISSOLVE] {message}", flush=True) + logger.info(f"[DISSOLVE] {message}") + +# 🆕 创建进度日志动作 +def create_action_log(message: str, emoji: str = "📝") -> Dict[str, Any]: + """创建一个动作日志""" + full_message = f"{emoji} {message}" + debug_print(full_message) + logger.info(full_message) + print(f"[ACTION] {full_message}", flush=True) + + return { + "action_name": "wait", + "action_kwargs": { + "time": 0.1, + "log_message": full_message + } + } + +def parse_volume_input(volume_input: Union[str, float]) -> float: + """ + 解析体积输入,支持带单位的字符串 + + Args: + volume_input: 体积输入(如 "10 mL", "?", 10.0) + + Returns: + float: 体积(毫升) + """ + if isinstance(volume_input, (int, float)): + debug_print(f"📏 体积输入为数值: {volume_input}") + return float(volume_input) + + if not volume_input or not str(volume_input).strip(): + debug_print(f"⚠️ 体积输入为空,返回0.0mL") + return 0.0 + + volume_str = str(volume_input).lower().strip() + debug_print(f"🔍 解析体积输入: '{volume_str}'") + + # 处理未知体积 + if volume_str in ['?', 'unknown', 'tbd', 'to be determined']: + default_volume = 50.0 # 默认50mL + debug_print(f"❓ 检测到未知体积,使用默认值: {default_volume}mL 🎯") + return default_volume + + # 移除空格并提取数字和单位 + volume_clean = re.sub(r'\s+', '', volume_str) + + # 匹配数字和单位的正则表达式 + match = re.match(r'([0-9]*\.?[0-9]+)\s*(ml|l|μl|ul|microliter|milliliter|liter)?', volume_clean) + + if not match: + debug_print(f"❌ 无法解析体积: '{volume_str}',使用默认值50mL") + return 50.0 + + value = float(match.group(1)) + unit = match.group(2) or 'ml' # 默认单位为毫升 + + # 转换为毫升 + if unit in ['l', 'liter']: + volume = value * 1000.0 # L -> mL + debug_print(f"🔄 体积转换: {value}L → {volume}mL") + elif unit in ['μl', 'ul', 'microliter']: + volume = value / 1000.0 # μL -> mL + debug_print(f"🔄 体积转换: {value}μL → {volume}mL") + else: # ml, milliliter 或默认 + volume = value # 已经是mL + debug_print(f"✅ 体积已为mL: {volume}mL") + + return volume + +def parse_mass_input(mass_input: Union[str, float]) -> float: + """ + 解析质量输入,支持带单位的字符串 + + Args: + mass_input: 质量输入(如 "2.9 g", "?", 2.5) + + Returns: + float: 质量(克) + """ + if isinstance(mass_input, (int, float)): + debug_print(f"⚖️ 质量输入为数值: {mass_input}g") + return float(mass_input) + + if not mass_input or not str(mass_input).strip(): + debug_print(f"⚠️ 质量输入为空,返回0.0g") + return 0.0 + + mass_str = str(mass_input).lower().strip() + debug_print(f"🔍 解析质量输入: '{mass_str}'") + + # 处理未知质量 + if mass_str in ['?', 'unknown', 'tbd', 'to be determined']: + default_mass = 1.0 # 默认1g + debug_print(f"❓ 检测到未知质量,使用默认值: {default_mass}g 🎯") + return default_mass + + # 移除空格并提取数字和单位 + mass_clean = re.sub(r'\s+', '', mass_str) + + # 匹配数字和单位的正则表达式 + match = re.match(r'([0-9]*\.?[0-9]+)\s*(g|mg|kg|gram|milligram|kilogram)?', mass_clean) + + if not match: + debug_print(f"❌ 无法解析质量: '{mass_str}',返回0.0g") + return 0.0 + + value = float(match.group(1)) + unit = match.group(2) or 'g' # 默认单位为克 + + # 转换为克 + if unit in ['mg', 'milligram']: + mass = value / 1000.0 # mg -> g + debug_print(f"🔄 质量转换: {value}mg → {mass}g") + elif unit in ['kg', 'kilogram']: + mass = value * 1000.0 # kg -> g + debug_print(f"🔄 质量转换: {value}kg → {mass}g") + else: # g, gram 或默认 + mass = value # 已经是g + debug_print(f"✅ 质量已为g: {mass}g") + + return mass + +def parse_time_input(time_input: Union[str, float]) -> float: + """ + 解析时间输入,支持带单位的字符串 + + Args: + time_input: 时间输入(如 "30 min", "1 h", "?", 60.0) + + Returns: + float: 时间(秒) + """ + if isinstance(time_input, (int, float)): + debug_print(f"⏱️ 时间输入为数值: {time_input}秒") + return float(time_input) + + if not time_input or not str(time_input).strip(): + debug_print(f"⚠️ 时间输入为空,返回0秒") + return 0.0 + + time_str = str(time_input).lower().strip() + debug_print(f"🔍 解析时间输入: '{time_str}'") + + # 处理未知时间 + if time_str in ['?', 'unknown', 'tbd']: + default_time = 600.0 # 默认10分钟 + debug_print(f"❓ 检测到未知时间,使用默认值: {default_time}s (10分钟) ⏰") + return default_time + + # 移除空格并提取数字和单位 + time_clean = re.sub(r'\s+', '', time_str) + + # 匹配数字和单位的正则表达式 + match = re.match(r'([0-9]*\.?[0-9]+)\s*(s|sec|second|min|minute|h|hr|hour|d|day)?', time_clean) + + if not match: + debug_print(f"❌ 无法解析时间: '{time_str}',返回0s") + return 0.0 + + value = float(match.group(1)) + unit = match.group(2) or 's' # 默认单位为秒 + + # 转换为秒 + if unit in ['min', 'minute']: + time_sec = value * 60.0 # min -> s + debug_print(f"🔄 时间转换: {value}分钟 → {time_sec}秒") + elif unit in ['h', 'hr', 'hour']: + time_sec = value * 3600.0 # h -> s + debug_print(f"🔄 时间转换: {value}小时 → {time_sec}秒") + elif unit in ['d', 'day']: + time_sec = value * 86400.0 # d -> s + debug_print(f"🔄 时间转换: {value}天 → {time_sec}秒") + else: # s, sec, second 或默认 + time_sec = value # 已经是s + debug_print(f"✅ 时间已为秒: {time_sec}秒") + + return time_sec + +def parse_temperature_input(temp_input: Union[str, float]) -> float: + """ + 解析温度输入,支持带单位的字符串 + + Args: + temp_input: 温度输入(如 "60 °C", "room temperature", "?", 25.0) + + Returns: + float: 温度(摄氏度) + """ + if isinstance(temp_input, (int, float)): + debug_print(f"🌡️ 温度输入为数值: {temp_input}°C") + return float(temp_input) + + if not temp_input or not str(temp_input).strip(): + debug_print(f"⚠️ 温度输入为空,使用默认室温25°C") + return 25.0 # 默认室温 + + temp_str = str(temp_input).lower().strip() + debug_print(f"🔍 解析温度输入: '{temp_str}'") + + # 处理特殊温度描述 + temp_aliases = { + 'room temperature': 25.0, + 'rt': 25.0, + 'ambient': 25.0, + 'cold': 4.0, + 'ice': 0.0, + 'reflux': 80.0, # 默认回流温度 + '?': 25.0, + 'unknown': 25.0 + } + + if temp_str in temp_aliases: + result = temp_aliases[temp_str] + debug_print(f"🏷️ 温度别名解析: '{temp_str}' → {result}°C") + return result + + # 移除空格并提取数字和单位 + temp_clean = re.sub(r'\s+', '', temp_str) + + # 匹配数字和单位的正则表达式 + match = re.match(r'([0-9]*\.?[0-9]+)\s*(°c|c|celsius|°f|f|fahrenheit|k|kelvin)?', temp_clean) + + if not match: + debug_print(f"❌ 无法解析温度: '{temp_str}',使用默认值25°C") + return 25.0 + + value = float(match.group(1)) + unit = match.group(2) or 'c' # 默认单位为摄氏度 + + # 转换为摄氏度 + if unit in ['°f', 'f', 'fahrenheit']: + temp_c = (value - 32) * 5/9 # F -> C + debug_print(f"🔄 温度转换: {value}°F → {temp_c:.1f}°C") + elif unit in ['k', 'kelvin']: + temp_c = value - 273.15 # K -> C + debug_print(f"🔄 温度转换: {value}K → {temp_c:.1f}°C") + else: # °c, c, celsius 或默认 + temp_c = value # 已经是C + debug_print(f"✅ 温度已为°C: {temp_c}°C") + + return temp_c def find_solvent_vessel(G: nx.DiGraph, solvent: str) -> str: - """ - 查找溶剂容器 - """ - # 按照pump_protocol的命名规则查找溶剂瓶 - solvent_vessel_id = f"flask_{solvent}" + """增强版溶剂容器查找,支持多种匹配模式""" + debug_print(f"🔍 开始查找溶剂 '{solvent}' 的容器...") - if solvent_vessel_id in G.nodes(): - return solvent_vessel_id - - # 如果直接匹配失败,尝试模糊匹配 + # 🔧 方法1:直接搜索 data.reagent_name 和 config.reagent + debug_print(f"📋 方法1: 搜索reagent字段...") for node in G.nodes(): - if node.startswith('flask_') and solvent.lower() in node.lower(): - return node + node_data = G.nodes[node].get('data', {}) + node_type = G.nodes[node].get('type', '') + config_data = G.nodes[node].get('config', {}) + + # 只搜索容器类型的节点 + if node_type == 'container': + reagent_name = node_data.get('reagent_name', '').lower() + config_reagent = config_data.get('reagent', '').lower() + + # 精确匹配 + if reagent_name == solvent.lower() or config_reagent == solvent.lower(): + debug_print(f"✅ 通过reagent字段精确匹配到容器: {node} 🎯") + return node + + # 模糊匹配 + if (solvent.lower() in reagent_name and reagent_name) or \ + (solvent.lower() in config_reagent and config_reagent): + debug_print(f"✅ 通过reagent字段模糊匹配到容器: {node} 🔍") + return node - # 如果还是找不到,列出所有可用的溶剂瓶 - available_flasks = [node for node in G.nodes() - if node.startswith('flask_') - and G.nodes[node].get('type') == 'container'] + # 🔧 方法2:常见的容器命名规则 + debug_print(f"📋 方法2: 使用命名规则查找...") + solvent_clean = solvent.lower().replace(' ', '_').replace('-', '_') + possible_names = [ + solvent_clean, + f"flask_{solvent_clean}", + f"bottle_{solvent_clean}", + f"vessel_{solvent_clean}", + f"{solvent_clean}_flask", + f"{solvent_clean}_bottle", + f"solvent_{solvent_clean}", + f"reagent_{solvent_clean}", + f"reagent_bottle_{solvent_clean}", + f"reagent_bottle_1", # 通用试剂瓶 + f"reagent_bottle_2", + f"reagent_bottle_3" + ] - raise ValueError(f"找不到溶剂 '{solvent}' 对应的溶剂瓶。可用溶剂瓶: {available_flasks}") - + debug_print(f"🔍 尝试的容器名称: {possible_names[:5]}... (共{len(possible_names)}个)") + + for name in possible_names: + if name in G.nodes(): + node_type = G.nodes[name].get('type', '') + if node_type == 'container': + debug_print(f"✅ 通过命名规则找到容器: {name} 📝") + return name + + # 🔧 方法3:节点名称模糊匹配 + debug_print(f"📋 方法3: 节点名称模糊匹配...") + for node_id in G.nodes(): + node_data = G.nodes[node_id] + if node_data.get('type') == 'container': + # 检查节点名称是否包含溶剂名称 + if solvent_clean in node_id.lower(): + debug_print(f"✅ 通过节点名称模糊匹配到容器: {node_id} 🔍") + return node_id + + # 检查液体类型匹配 + vessel_data = node_data.get('data', {}) + liquids = vessel_data.get('liquid', []) + for liquid in liquids: + if isinstance(liquid, dict): + liquid_type = liquid.get('liquid_type') or liquid.get('name', '') + if liquid_type.lower() == solvent.lower(): + debug_print(f"✅ 通过液体类型匹配到容器: {node_id} 💧") + return node_id + + # 🔧 方法4:使用第一个试剂瓶作为备选 + debug_print(f"📋 方法4: 查找备选试剂瓶...") + for node_id in G.nodes(): + node_data = G.nodes[node_id] + if (node_data.get('type') == 'container' and + ('reagent' in node_id.lower() or 'bottle' in node_id.lower() or 'flask' in node_id.lower())): + debug_print(f"⚠️ 未找到专用容器,使用备选试剂瓶: {node_id} 🔄") + return node_id + + debug_print(f"❌ 所有方法都失败了,无法找到容器!") + raise ValueError(f"找不到溶剂 '{solvent}' 对应的容器") def find_connected_heatchill(G: nx.DiGraph, vessel: str) -> str: - """ - 查找与指定容器相连的加热搅拌器 - """ - # 查找所有加热搅拌器节点 - heatchill_nodes = [node for node in G.nodes() - if G.nodes[node].get('class') == 'virtual_heatchill'] + """查找连接到指定容器的加热搅拌器""" + debug_print(f"🔍 查找连接到容器 '{vessel}' 的加热搅拌器...") - # 检查哪个加热器与目标容器相连 + heatchill_nodes = [] + for node in G.nodes(): + node_class = G.nodes[node].get('class', '').lower() + if 'heatchill' in node_class: + heatchill_nodes.append(node) + debug_print(f"📋 发现加热搅拌器: {node}") + + debug_print(f"📊 共找到 {len(heatchill_nodes)} 个加热搅拌器") + + # 查找连接到容器的加热器 for heatchill in heatchill_nodes: if G.has_edge(heatchill, vessel) or G.has_edge(vessel, heatchill): + debug_print(f"✅ 找到连接的加热搅拌器: {heatchill} 🔗") return heatchill - # 如果没有直接连接,返回第一个可用的加热器 - return heatchill_nodes[0] if heatchill_nodes else None + # 返回第一个加热器 + if heatchill_nodes: + debug_print(f"⚠️ 未找到直接连接的加热搅拌器,使用第一个: {heatchill_nodes[0]} 🔄") + return heatchill_nodes[0] + + debug_print(f"❌ 未找到任何加热搅拌器") + return "" +def find_connected_stirrer(G: nx.DiGraph, vessel: str) -> str: + """查找连接到指定容器的搅拌器""" + debug_print(f"🔍 查找连接到容器 '{vessel}' 的搅拌器...") + + stirrer_nodes = [] + for node in G.nodes(): + node_class = G.nodes[node].get('class', '').lower() + if 'stirrer' in node_class: + stirrer_nodes.append(node) + debug_print(f"📋 发现搅拌器: {node}") + + debug_print(f"📊 共找到 {len(stirrer_nodes)} 个搅拌器") + + # 查找连接到容器的搅拌器 + for stirrer in stirrer_nodes: + if G.has_edge(stirrer, vessel) or G.has_edge(vessel, stirrer): + debug_print(f"✅ 找到连接的搅拌器: {stirrer} 🔗") + return stirrer + + # 返回第一个搅拌器 + if stirrer_nodes: + debug_print(f"⚠️ 未找到直接连接的搅拌器,使用第一个: {stirrer_nodes[0]} 🔄") + return stirrer_nodes[0] + + debug_print(f"❌ 未找到任何搅拌器") + return "" + +def find_solid_dispenser(G: nx.DiGraph) -> str: + """查找固体加样器""" + debug_print(f"🔍 查找固体加样器...") + + for node in G.nodes(): + node_class = G.nodes[node].get('class', '').lower() + if 'solid_dispenser' in node_class or 'dispenser' in node_class: + debug_print(f"✅ 找到固体加样器: {node} 🥄") + return node + + debug_print(f"❌ 未找到固体加样器") + return "" def generate_dissolve_protocol( G: nx.DiGraph, vessel: str, - solvent: str, - volume: float, + # 🔧 修复:按照checklist.md的DissolveProtocol参数 + solvent: str = "", + volume: Union[str, float] = 0.0, amount: str = "", - temp: float = 25.0, - time: float = 0.0, - stir_speed: float = 300.0 + temp: Union[str, float] = 25.0, + time: Union[str, float] = 0.0, + stir_speed: float = 300.0, + # 🔧 关键修复:添加缺失的参数,防止"unexpected keyword argument"错误 + mass: Union[str, float] = 0.0, # 这个参数在action文件中存在,必须包含 + mol: str = "", # 这个参数在action文件中存在,必须包含 + reagent: str = "", # 这个参数在action文件中存在,必须包含 + event: str = "", # 这个参数在action文件中存在,必须包含 + **kwargs # 🔧 关键:接受所有其他参数,防止unexpected keyword错误 ) -> List[Dict[str, Any]]: """ - 生成溶解操作的协议序列,复用 pump_protocol 的成熟算法 + 生成溶解操作的协议序列 - 增强版 - 溶解流程: - 1. 溶剂转移:将溶剂从溶剂瓶转移到目标容器 - 2. 启动加热搅拌:设置温度和搅拌 - 3. 等待溶解:监控溶解过程 - 4. 停止加热搅拌:完成溶解 + 🔧 修复要点: + 1. 添加action文件中的所有参数(mass, mol, reagent, event) + 2. 使用 **kwargs 接受所有额外参数,防止 unexpected keyword argument 错误 + 3. 支持固体溶解和液体溶解两种模式 + 4. 添加详细的emoji日志系统 - Args: - G: 有向图,节点为设备和容器,边为流体管道 - vessel: 目标容器(要进行溶解的容器) - solvent: 溶剂名称(用于查找对应的溶剂瓶) - volume: 溶剂体积 (mL) - amount: 要溶解的物质描述 - temp: 溶解温度 (°C),默认25°C(室温) - time: 溶解时间 (秒),默认0(立即完成) - stir_speed: 搅拌速度 (RPM),默认300 RPM + 支持两种溶解模式: + 1. 液体溶解:指定 solvent + volume,使用pump protocol转移溶剂 + 2. 固体溶解:指定 mass/mol + reagent,使用固体加样器添加固体试剂 - Returns: - List[Dict[str, Any]]: 溶解操作的动作序列 - - Raises: - ValueError: 当找不到必要的设备或容器时 - - Examples: - dissolve_actions = generate_dissolve_protocol(G, "reaction_mixture", "DMF", 10.0, "NaCl 2g", 60.0, 600.0, 400.0) + 支持所有XDL参数和单位: + - volume: "10 mL", "?" 或数值 + - mass: "2.9 g", "?" 或数值 + - temp: "60 °C", "room temperature", "?" 或数值 + - time: "30 min", "1 h", "?" 或数值 + - mol: "0.12 mol", "16.2 mmol" """ + + debug_print("=" * 60) + debug_print("🧪 开始生成溶解协议") + debug_print(f"📋 原始参数:") + debug_print(f" 🥼 vessel: '{vessel}'") + debug_print(f" 💧 solvent: '{solvent}'") + debug_print(f" 📏 volume: {volume} (类型: {type(volume)})") + debug_print(f" ⚖️ mass: {mass} (类型: {type(mass)})") + debug_print(f" 🌡️ temp: {temp} (类型: {type(temp)})") + debug_print(f" ⏱️ time: {time} (类型: {type(time)})") + debug_print(f" 🧪 reagent: '{reagent}'") + debug_print(f" 🧬 mol: '{mol}'") + debug_print(f" 🎯 event: '{event}'") + debug_print(f" 📦 kwargs: {kwargs}") # 显示额外参数 + debug_print("=" * 60) + action_sequence = [] - print(f"DISSOLVE: 开始生成溶解协议") - print(f" - 目标容器: {vessel}") - print(f" - 溶剂: {solvent}") - print(f" - 溶剂体积: {volume} mL") - print(f" - 要溶解的物质: {amount}") - print(f" - 溶解温度: {temp}°C") - print(f" - 溶解时间: {time}s ({time/60:.1f}分钟)" if time > 0 else " - 溶解时间: 立即完成") - print(f" - 搅拌速度: {stir_speed} RPM") + # === 参数验证 === + debug_print("🔍 步骤1: 参数验证...") + action_sequence.append(create_action_log(f"开始溶解操作 - 容器: {vessel}", "🎬")) + + if not vessel: + debug_print("❌ vessel 参数不能为空") + raise ValueError("vessel 参数不能为空") - # 验证目标容器存在 if vessel not in G.nodes(): - raise ValueError(f"目标容器 '{vessel}' 不存在于系统中") + debug_print(f"❌ 容器 '{vessel}' 不存在于系统中") + raise ValueError(f"容器 '{vessel}' 不存在于系统中") - # 查找溶剂瓶 - try: - solvent_vessel = find_solvent_vessel(G, solvent) - print(f"DISSOLVE: 找到溶剂瓶: {solvent_vessel}") - except ValueError as e: - raise ValueError(f"无法找到溶剂 '{solvent}': {str(e)}") + debug_print("✅ 基本参数验证通过") + action_sequence.append(create_action_log("参数验证通过", "✅")) - # 验证是否存在从溶剂瓶到目标容器的路径 - try: - path = nx.shortest_path(G, source=solvent_vessel, target=vessel) - print(f"DISSOLVE: 找到路径 {solvent_vessel} -> {vessel}: {path}") - except nx.NetworkXNoPath: - raise ValueError(f"从溶剂瓶 '{solvent_vessel}' 到目标容器 '{vessel}' 没有可用路径") + # === 🔧 关键修复:参数解析 === + debug_print("🔍 步骤2: 参数解析...") + action_sequence.append(create_action_log("正在解析溶解参数...", "🔍")) + + # 解析各种参数为数值 + final_volume = parse_volume_input(volume) + final_mass = parse_mass_input(mass) + final_temp = parse_temperature_input(temp) + final_time = parse_time_input(time) + + debug_print(f"📊 解析结果:") + debug_print(f" 📏 体积: {final_volume}mL") + debug_print(f" ⚖️ 质量: {final_mass}g") + debug_print(f" 🌡️ 温度: {final_temp}°C") + debug_print(f" ⏱️ 时间: {final_time}s") + debug_print(f" 🧪 试剂: '{reagent}'") + debug_print(f" 🧬 摩尔: '{mol}'") + debug_print(f" 🎯 事件: '{event}'") + + # === 判断溶解类型 === + debug_print("🔍 步骤3: 判断溶解类型...") + action_sequence.append(create_action_log("正在判断溶解类型...", "🔍")) + + # 判断是固体溶解还是液体溶解 + is_solid_dissolve = (final_mass > 0 or (mol and mol.strip() != "") or (reagent and reagent.strip() != "")) + is_liquid_dissolve = (final_volume > 0 and solvent and solvent.strip() != "") + + if not is_solid_dissolve and not is_liquid_dissolve: + # 默认为液体溶解,50mL + is_liquid_dissolve = True + final_volume = 50.0 + if not solvent: + solvent = "water" # 默认溶剂 + debug_print("⚠️ 未明确指定溶解参数,默认为50mL水溶解") + + dissolve_type = "固体溶解" if is_solid_dissolve else "液体溶解" + dissolve_emoji = "🧂" if is_solid_dissolve else "💧" + debug_print(f"📋 溶解类型: {dissolve_type} {dissolve_emoji}") + + action_sequence.append(create_action_log(f"确定溶解类型: {dissolve_type} {dissolve_emoji}", "📋")) + + # === 查找设备 === + debug_print("🔍 步骤4: 查找设备...") + action_sequence.append(create_action_log("正在查找相关设备...", "🔍")) # 查找加热搅拌器 - heatchill_id = None - if temp > 25.0 or stir_speed > 0 or time > 0: - try: - heatchill_id = find_connected_heatchill(G, vessel) - if heatchill_id: - print(f"DISSOLVE: 找到加热搅拌器: {heatchill_id}") + heatchill_id = find_connected_heatchill(G, vessel) + stirrer_id = find_connected_stirrer(G, vessel) + + # 优先使用加热搅拌器,否则使用独立搅拌器 + stir_device_id = heatchill_id or stirrer_id + + debug_print(f"📊 设备映射:") + debug_print(f" 🔥 加热器: '{heatchill_id}'") + debug_print(f" 🌪️ 搅拌器: '{stirrer_id}'") + debug_print(f" 🎯 使用设备: '{stir_device_id}'") + + if heatchill_id: + action_sequence.append(create_action_log(f"找到加热搅拌器: {heatchill_id}", "🔥")) + elif stirrer_id: + action_sequence.append(create_action_log(f"找到搅拌器: {stirrer_id}", "🌪️")) + else: + action_sequence.append(create_action_log("未找到搅拌设备,将跳过搅拌", "⚠️")) + + # === 执行溶解流程 === + debug_print("🔍 步骤5: 执行溶解流程...") + + try: + # 步骤5.1: 启动加热搅拌(如果需要) + if stir_device_id and (final_temp > 25.0 or final_time > 0 or stir_speed > 0): + debug_print(f"🔍 5.1: 启动加热搅拌,温度: {final_temp}°C") + action_sequence.append(create_action_log(f"准备加热搅拌 (目标温度: {final_temp}°C)", "🔥")) + + if heatchill_id and (final_temp > 25.0 or final_time > 0): + # 使用加热搅拌器 + action_sequence.append(create_action_log(f"启动加热搅拌器 {heatchill_id}", "🔥")) + + heatchill_action = { + "device_id": heatchill_id, + "action_name": "heat_chill_start", + "action_kwargs": { + "vessel": vessel, + "temp": final_temp, + "purpose": f"溶解准备 - {event}" if event else "溶解准备" + } + } + action_sequence.append(heatchill_action) + + # 等待温度稳定 + if final_temp > 25.0: + wait_time = min(60, abs(final_temp - 25.0) * 1.5) + action_sequence.append(create_action_log(f"等待温度稳定 ({wait_time:.0f}秒)", "⏳")) + action_sequence.append({ + "action_name": "wait", + "action_kwargs": {"time": wait_time} + }) + + elif stirrer_id: + # 使用独立搅拌器 + action_sequence.append(create_action_log(f"启动搅拌器 {stirrer_id} (速度: {stir_speed}rpm)", "🌪️")) + + stir_action = { + "device_id": stirrer_id, + "action_name": "start_stir", + "action_kwargs": { + "vessel": vessel, + "stir_speed": stir_speed, + "purpose": f"溶解搅拌 - {event}" if event else "溶解搅拌" + } + } + action_sequence.append(stir_action) + + # 等待搅拌稳定 + action_sequence.append(create_action_log("等待搅拌稳定...", "⏳")) + action_sequence.append({ + "action_name": "wait", + "action_kwargs": {"time": 5} + }) + + if is_solid_dissolve: + # === 固体溶解路径 === + debug_print(f"🔍 5.2: 使用固体溶解路径") + action_sequence.append(create_action_log("开始固体溶解流程", "🧂")) + + solid_dispenser = find_solid_dispenser(G) + if solid_dispenser: + action_sequence.append(create_action_log(f"找到固体加样器: {solid_dispenser}", "🥄")) + + # 固体加样 + add_kwargs = { + "vessel": vessel, + "reagent": reagent or amount or "solid reagent", + "purpose": f"溶解固体试剂 - {event}" if event else "溶解固体试剂", + "event": event + } + + if final_mass > 0: + add_kwargs["mass"] = str(final_mass) + action_sequence.append(create_action_log(f"准备添加固体: {final_mass}g", "⚖️")) + if mol and mol.strip(): + add_kwargs["mol"] = mol + action_sequence.append(create_action_log(f"按摩尔数添加: {mol}", "🧬")) + + action_sequence.append(create_action_log("开始固体加样操作", "🥄")) + action_sequence.append({ + "device_id": solid_dispenser, + "action_name": "add_solid", + "action_kwargs": add_kwargs + }) + + debug_print(f"✅ 固体加样完成") + action_sequence.append(create_action_log("固体加样完成", "✅")) else: - print(f"DISSOLVE: 警告 - 需要加热/搅拌但未找到与容器 {vessel} 相连的加热搅拌器") - except Exception as e: - print(f"DISSOLVE: 加热搅拌器配置出错: {str(e)}") - - # === 第一步:启动加热搅拌(在添加溶剂前) === - if heatchill_id and (temp > 25.0 or time > 0): - print(f"DISSOLVE: 启动加热搅拌器,温度: {temp}°C") + debug_print("⚠️ 未找到固体加样器,跳过固体添加") + action_sequence.append(create_action_log("未找到固体加样器,无法添加固体", "❌")) - if time > 0: - # 如果指定了时间,使用定时加热搅拌 - heatchill_action = { + elif is_liquid_dissolve: + # === 液体溶解路径 === + debug_print(f"🔍 5.3: 使用液体溶解路径") + action_sequence.append(create_action_log("开始液体溶解流程", "💧")) + + # 查找溶剂容器 + action_sequence.append(create_action_log("正在查找溶剂容器...", "🔍")) + try: + solvent_vessel = find_solvent_vessel(G, solvent) + action_sequence.append(create_action_log(f"找到溶剂容器: {solvent_vessel}", "🧪")) + except ValueError as e: + debug_print(f"⚠️ {str(e)},跳过溶剂添加") + action_sequence.append(create_action_log(f"溶剂容器查找失败: {str(e)}", "❌")) + solvent_vessel = None + + if solvent_vessel: + # 计算流速 - 溶解时通常用较慢的速度,避免飞溅 + flowrate = 1.0 # 较慢的注入速度 + transfer_flowrate = 0.5 # 较慢的转移速度 + + action_sequence.append(create_action_log(f"设置流速: {flowrate}mL/min (缓慢注入)", "⚡")) + action_sequence.append(create_action_log(f"开始转移 {final_volume}mL {solvent}", "🚰")) + + # 调用pump protocol + pump_actions = generate_pump_protocol_with_rinsing( + G=G, + from_vessel=solvent_vessel, + to_vessel=vessel, + volume=final_volume, + amount=amount, + time=0.0, # 不在pump level控制时间 + viscous=False, + rinsing_solvent="", + rinsing_volume=0.0, + rinsing_repeats=0, + solid=False, + flowrate=flowrate, + transfer_flowrate=transfer_flowrate, + rate_spec="", + event=event, + through="", + **kwargs + ) + action_sequence.extend(pump_actions) + debug_print(f"✅ 溶剂转移完成,添加了 {len(pump_actions)} 个动作") + action_sequence.append(create_action_log(f"溶剂转移完成 ({len(pump_actions)} 个操作)", "✅")) + + # 溶剂添加后等待 + action_sequence.append(create_action_log("溶剂添加后短暂等待...", "⏳")) + action_sequence.append({ + "action_name": "wait", + "action_kwargs": {"time": 5} + }) + + # 步骤5.4: 等待溶解完成 + if final_time > 0: + debug_print(f"🔍 5.4: 等待溶解完成 - {final_time}s") + wait_minutes = final_time / 60 + action_sequence.append(create_action_log(f"开始溶解等待 ({wait_minutes:.1f}分钟)", "⏰")) + + if heatchill_id: + # 使用定时加热搅拌 + action_sequence.append(create_action_log(f"使用加热搅拌器进行定时溶解", "🔥")) + + dissolve_action = { + "device_id": heatchill_id, + "action_name": "heat_chill", + "action_kwargs": { + "vessel": vessel, + "temp": final_temp, + "time": final_time, + "stir": True, + "stir_speed": stir_speed, + "purpose": f"溶解等待 - {event}" if event else "溶解等待" + } + } + action_sequence.append(dissolve_action) + + elif stirrer_id: + # 使用定时搅拌 + action_sequence.append(create_action_log(f"使用搅拌器进行定时溶解", "🌪️")) + + stir_action = { + "device_id": stirrer_id, + "action_name": "stir", + "action_kwargs": { + "vessel": vessel, + "stir_time": final_time, + "stir_speed": stir_speed, + "settling_time": 0, + "purpose": f"溶解搅拌 - {event}" if event else "溶解搅拌" + } + } + action_sequence.append(stir_action) + + else: + # 简单等待 + action_sequence.append(create_action_log(f"简单等待溶解完成", "⏳")) + action_sequence.append({ + "action_name": "wait", + "action_kwargs": {"time": final_time} + }) + + # 步骤5.5: 停止加热搅拌(如果需要) + if heatchill_id and final_time == 0 and final_temp > 25.0: + debug_print(f"🔍 5.5: 停止加热器") + action_sequence.append(create_action_log("停止加热搅拌器", "🛑")) + + stop_action = { "device_id": heatchill_id, - "action_name": "heat_chill", + "action_name": "heat_chill_stop", "action_kwargs": { - "vessel": vessel, - "temp": temp, - "time": time, - "stir": True, - "stir_speed": stir_speed, - "purpose": f"溶解 {amount} 在 {solvent} 中" - } - } - else: - # 如果没有指定时间,使用持续加热搅拌 - heatchill_action = { - "device_id": heatchill_id, - "action_name": "heat_chill_start", - "action_kwargs": { - "vessel": vessel, - "temp": temp, - "purpose": f"溶解 {amount} 在 {solvent} 中" + "vessel": vessel } } + action_sequence.append(stop_action) - action_sequence.append(heatchill_action) - - # 等待温度稳定 - if temp > 25.0: - wait_time = min(60, abs(temp - 25.0) * 1.5) # 根据温差估算预热时间 - action_sequence.append({ - "action_name": "wait", - "action_kwargs": {"time": wait_time} - }) - - # === 第二步:添加溶剂到目标容器 === - if volume > 0: - print(f"DISSOLVE: 将 {volume} mL {solvent} 从 {solvent_vessel} 转移到 {vessel}") - - # 计算流速 - 溶解时通常用较慢的速度,避免飞溅 - transfer_flowrate = 1.0 # 较慢的转移速度 - flowrate = 0.5 # 较慢的注入速度 - - try: - # 使用成熟的 pump_protocol 算法进行液体转移 - pump_actions = generate_pump_protocol( - G=G, - from_vessel=solvent_vessel, - to_vessel=vessel, - volume=volume, - flowrate=flowrate, # 注入速度 - 较慢避免飞溅 - transfer_flowrate=transfer_flowrate # 转移速度 - ) - - action_sequence.extend(pump_actions) - - except Exception as e: - raise ValueError(f"生成泵协议时出错: {str(e)}") - - # 溶剂添加后等待 + except Exception as e: + debug_print(f"❌ 溶解流程执行失败: {str(e)}") + action_sequence.append(create_action_log(f"溶解流程失败: {str(e)}", "❌")) + # 添加错误日志 action_sequence.append({ - "action_name": "wait", - "action_kwargs": {"time": 5} + "device_id": "system", + "action_name": "log_message", + "action_kwargs": { + "message": f"溶解失败: {str(e)}" + } }) - # === 第三步:如果没有使用定时加热搅拌,但需要等待溶解 === - if time > 0 and heatchill_id and temp <= 25.0: - # 只需要搅拌等待,不需要加热 - print(f"DISSOLVE: 室温搅拌 {time}s 等待溶解") - - stir_action = { - "device_id": heatchill_id, - "action_name": "heat_chill", - "action_kwargs": { - "vessel": vessel, - "temp": 25.0, # 室温 - "time": time, - "stir": True, - "stir_speed": stir_speed, - "purpose": f"室温搅拌溶解 {amount}" - } - } - action_sequence.append(stir_action) + # === 最终结果 === + debug_print("=" * 60) + debug_print(f"🎉 溶解协议生成完成") + debug_print(f"📊 协议统计:") + debug_print(f" 📋 总动作数: {len(action_sequence)}") + debug_print(f" 🥼 容器: {vessel}") + debug_print(f" {dissolve_emoji} 溶解类型: {dissolve_type}") + if is_liquid_dissolve: + debug_print(f" 💧 溶剂: {solvent} ({final_volume}mL)") + if is_solid_dissolve: + debug_print(f" 🧪 试剂: {reagent}") + debug_print(f" ⚖️ 质量: {final_mass}g") + debug_print(f" 🧬 摩尔: {mol}") + debug_print(f" 🌡️ 温度: {final_temp}°C") + debug_print(f" ⏱️ 时间: {final_time}s") + debug_print("=" * 60) - # === 第四步:如果使用了持续加热,需要手动停止 === - if heatchill_id and time == 0 and temp > 25.0: - print(f"DISSOLVE: 停止加热搅拌器") - - stop_action = { - "device_id": heatchill_id, - "action_name": "heat_chill_stop", - "action_kwargs": { - "vessel": vessel - } - } - action_sequence.append(stop_action) + # 添加完成日志 + summary_msg = f"溶解协议完成: {vessel}" + if is_liquid_dissolve: + summary_msg += f" (使用 {final_volume}mL {solvent})" + if is_solid_dissolve: + summary_msg += f" (溶解 {final_mass}g {reagent})" - print(f"DISSOLVE: 生成了 {len(action_sequence)} 个动作") - print(f"DISSOLVE: 溶解协议生成完成") + action_sequence.append(create_action_log(summary_msg, "🎉")) return action_sequence +# === 便捷函数 === -# 便捷函数:常用溶解方案 -def generate_room_temp_dissolve_protocol( - G: nx.DiGraph, - vessel: str, - solvent: str, - volume: float, - amount: str = "", - stir_time: float = 300.0 # 5分钟 -) -> List[Dict[str, Any]]: - """室温溶解:快速搅拌,短时间""" - return generate_dissolve_protocol(G, vessel, solvent, volume, amount, 25.0, stir_time, 400.0) +def dissolve_solid_by_mass(G: nx.DiGraph, vessel: str, reagent: str, mass: Union[str, float], + temp: Union[str, float] = 25.0, time: Union[str, float] = "10 min") -> List[Dict[str, Any]]: + """按质量溶解固体""" + debug_print(f"🧂 快速固体溶解: {reagent} ({mass}) → {vessel}") + return generate_dissolve_protocol( + G, vessel, + mass=mass, + reagent=reagent, + temp=temp, + time=time + ) +def dissolve_solid_by_moles(G: nx.DiGraph, vessel: str, reagent: str, mol: str, + temp: Union[str, float] = 25.0, time: Union[str, float] = "10 min") -> List[Dict[str, Any]]: + """按摩尔数溶解固体""" + debug_print(f"🧬 按摩尔数溶解固体: {reagent} ({mol}) → {vessel}") + return generate_dissolve_protocol( + G, vessel, + mol=mol, + reagent=reagent, + temp=temp, + time=time + ) -def generate_heated_dissolve_protocol( - G: nx.DiGraph, - vessel: str, - solvent: str, - volume: float, - amount: str = "", - temp: float = 60.0, - dissolve_time: float = 900.0 # 15分钟 -) -> List[Dict[str, Any]]: - """加热溶解:中等温度,较长时间""" - return generate_dissolve_protocol(G, vessel, solvent, volume, amount, temp, dissolve_time, 300.0) +def dissolve_with_solvent(G: nx.DiGraph, vessel: str, solvent: str, volume: Union[str, float], + temp: Union[str, float] = 25.0, time: Union[str, float] = "5 min") -> List[Dict[str, Any]]: + """用溶剂溶解""" + debug_print(f"💧 溶剂溶解: {solvent} ({volume}) → {vessel}") + return generate_dissolve_protocol( + G, vessel, + solvent=solvent, + volume=volume, + temp=temp, + time=time + ) +def dissolve_at_room_temp(G: nx.DiGraph, vessel: str, solvent: str, volume: Union[str, float]) -> List[Dict[str, Any]]: + """室温溶解""" + debug_print(f"🌡️ 室温溶解: {solvent} ({volume}) → {vessel}") + return generate_dissolve_protocol( + G, vessel, + solvent=solvent, + volume=volume, + temp="room temperature", + time="5 min" + ) -def generate_gentle_dissolve_protocol( - G: nx.DiGraph, - vessel: str, - solvent: str, - volume: float, - amount: str = "", - temp: float = 40.0, - dissolve_time: float = 1800.0 # 30分钟 -) -> List[Dict[str, Any]]: - """温和溶解:低温,长时间,慢搅拌""" - return generate_dissolve_protocol(G, vessel, solvent, volume, amount, temp, dissolve_time, 200.0) - - -def generate_hot_dissolve_protocol( - G: nx.DiGraph, - vessel: str, - solvent: str, - volume: float, - amount: str = "", - temp: float = 80.0, - dissolve_time: float = 600.0 # 10分钟 -) -> List[Dict[str, Any]]: - """高温溶解:高温,中等时间,快搅拌""" - return generate_dissolve_protocol(G, vessel, solvent, volume, amount, temp, dissolve_time, 500.0) - - -def generate_sequential_dissolve_protocol( - G: nx.DiGraph, - vessel: str, - dissolve_steps: List[Dict[str, Any]] -) -> List[Dict[str, Any]]: - """ - 生成连续溶解多种物质的协议 - - Args: - G: 网络图 - vessel: 目标容器 - dissolve_steps: 溶解步骤列表,每个元素包含溶解参数 - - Returns: - List[Dict[str, Any]]: 完整的动作序列 - - Example: - dissolve_steps = [ - { - "solvent": "water", - "volume": 5.0, - "amount": "NaCl 1g", - "temp": 25.0, - "time": 300.0, - "stir_speed": 300.0 - }, - { - "solvent": "ethanol", - "volume": 2.0, - "amount": "organic compound 0.5g", - "temp": 40.0, - "time": 600.0, - "stir_speed": 400.0 - } - ] - """ - action_sequence = [] - - for i, step in enumerate(dissolve_steps): - print(f"DISSOLVE: 处理第 {i+1}/{len(dissolve_steps)} 个溶解步骤") - - # 生成单个溶解步骤的协议 - dissolve_actions = generate_dissolve_protocol( - G=G, - vessel=vessel, - solvent=step.get('solvent'), - volume=step.get('volume', 0.0), - amount=step.get('amount', ''), - temp=step.get('temp', 25.0), - time=step.get('time', 0.0), - stir_speed=step.get('stir_speed', 300.0) - ) - - action_sequence.extend(dissolve_actions) - - # 在步骤之间加入等待时间 - if i < len(dissolve_steps) - 1: # 不是最后一个步骤 - action_sequence.append({ - "action_name": "wait", - "action_kwargs": {"time": 10} - }) - - print(f"DISSOLVE: 连续溶解协议生成完成,共 {len(action_sequence)} 个动作") - return action_sequence - +def dissolve_with_heating(G: nx.DiGraph, vessel: str, solvent: str, volume: Union[str, float], + temp: Union[str, float] = "60 °C", time: Union[str, float] = "15 min") -> List[Dict[str, Any]]: + """加热溶解""" + debug_print(f"🔥 加热溶解: {solvent} ({volume}) → {vessel} @ {temp}") + return generate_dissolve_protocol( + G, vessel, + solvent=solvent, + volume=volume, + temp=temp, + time=time + ) # 测试函数 def test_dissolve_protocol(): - """测试溶解协议的示例""" - print("=== DISSOLVE PROTOCOL 测试 ===") - print("测试完成") - + """测试溶解协议的各种参数解析""" + debug_print("=== DISSOLVE PROTOCOL 增强版测试 ===") + + # 测试体积解析 + debug_print("💧 测试体积解析...") + volumes = ["10 mL", "?", 10.0, "1 L", "500 μL"] + for vol in volumes: + result = parse_volume_input(vol) + debug_print(f"📏 体积解析: {vol} → {result}mL") + + # 测试质量解析 + debug_print("⚖️ 测试质量解析...") + masses = ["2.9 g", "?", 2.5, "500 mg"] + for mass in masses: + result = parse_mass_input(mass) + debug_print(f"⚖️ 质量解析: {mass} → {result}g") + + # 测试温度解析 + debug_print("🌡️ 测试温度解析...") + temps = ["60 °C", "room temperature", "?", 25.0, "reflux"] + for temp in temps: + result = parse_temperature_input(temp) + debug_print(f"🌡️ 温度解析: {temp} → {result}°C") + + # 测试时间解析 + debug_print("⏱️ 测试时间解析...") + times = ["30 min", "1 h", "?", 60.0] + for time in times: + result = parse_time_input(time) + debug_print(f"⏱️ 时间解析: {time} → {result}s") + + debug_print("✅ 测试完成") if __name__ == "__main__": test_dissolve_protocol() \ No newline at end of file diff --git a/unilabos/compile/dry_protocol.py b/unilabos/compile/dry_protocol.py index 34044eb..1f06069 100644 --- a/unilabos/compile/dry_protocol.py +++ b/unilabos/compile/dry_protocol.py @@ -67,37 +67,47 @@ def generate_dry_protocol( # 默认参数 dry_temp = 60.0 # 默认干燥温度 60°C dry_time = 3600.0 # 默认干燥时间 1小时(3600秒) + simulation_time = 60.0 # 模拟时间 1分钟 - print(f"DRY: 开始生成干燥协议") - print(f" - 化合物: {compound}") - print(f" - 容器: {vessel}") - print(f" - 干燥温度: {dry_temp}°C") - print(f" - 干燥时间: {dry_time/60:.0f} 分钟") + print(f"🌡️ DRY: 开始生成干燥协议 ✨") + print(f" 🧪 化合物: {compound}") + print(f" 🥽 容器: {vessel}") + print(f" 🔥 干燥温度: {dry_temp}°C") + print(f" ⏰ 干燥时间: {dry_time/60:.0f} 分钟") # 1. 验证目标容器存在 + print(f"\n📋 步骤1: 验证目标容器 '{vessel}' 是否存在...") if vessel not in G.nodes(): - print(f"DRY: 警告 - 容器 '{vessel}' 不存在于系统中,跳过干燥") + print(f"⚠️ DRY: 警告 - 容器 '{vessel}' 不存在于系统中,跳过干燥 😢") return action_sequence + print(f"✅ 容器 '{vessel}' 验证通过!") # 2. 查找相连的加热器 + print(f"\n🔍 步骤2: 查找与容器相连的加热器...") heater_id = find_connected_heater(G, vessel) if heater_id is None: - print(f"DRY: 警告 - 未找到与容器 '{vessel}' 相连的加热器,跳过干燥") + print(f"😭 DRY: 警告 - 未找到与容器 '{vessel}' 相连的加热器,跳过干燥") + print(f"🎭 添加模拟干燥动作...") # 添加一个等待动作,表示干燥过程(模拟) action_sequence.append({ "action_name": "wait", "action_kwargs": { - "time": 60.0, # 等待1分钟 + "time": 10.0, # 模拟等待时间 "description": f"模拟干燥 {compound} (无加热器可用)" } }) + print(f"📄 DRY: 协议生成完成,共 {len(action_sequence)} 个动作 🎯") return action_sequence + print(f"🎉 找到加热器: {heater_id}!") + # 3. 启动加热器进行干燥 - print(f"DRY: 启动加热器 {heater_id} 进行干燥") + print(f"\n🚀 步骤3: 开始执行干燥流程...") + print(f"🔥 启动加热器 {heater_id} 进行干燥") # 3.1 启动加热 + print(f" ⚡ 动作1: 启动加热到 {dry_temp}°C...") action_sequence.append({ "device_id": heater_id, "action_name": "heat_chill_start", @@ -107,29 +117,35 @@ def generate_dry_protocol( "purpose": f"干燥 {compound}" } }) + print(f" ✅ 加热器启动命令已添加 🔥") # 3.2 等待温度稳定 + print(f" ⏳ 动作2: 等待温度稳定...") action_sequence.append({ "action_name": "wait", "action_kwargs": { - "time": 60.0, + "time": 10.0, "description": f"等待温度稳定到 {dry_temp}°C" } }) + print(f" ✅ 温度稳定等待命令已添加 🌡️") # 3.3 保持干燥温度 + print(f" 🔄 动作3: 保持干燥温度 {simulation_time/60:.0f} 分钟...") action_sequence.append({ "device_id": heater_id, "action_name": "heat_chill", "action_kwargs": { "vessel": vessel, "temp": dry_temp, - "time": dry_time, + "time": simulation_time, "purpose": f"干燥 {compound},保持温度 {dry_temp}°C" } }) + print(f" ✅ 温度保持命令已添加 🌡️⏰") # 3.4 停止加热 + print(f" ⏹️ 动作4: 停止加热...") action_sequence.append({ "device_id": heater_id, "action_name": "heat_chill_stop", @@ -138,18 +154,22 @@ def generate_dry_protocol( "purpose": f"干燥完成,停止加热" } }) + print(f" ✅ 停止加热命令已添加 🛑") # 3.5 等待冷却 + print(f" ❄️ 动作5: 等待冷却...") action_sequence.append({ "action_name": "wait", "action_kwargs": { - "time": 300.0, # 等待5分钟冷却 + "time": 10.0, # 等待10秒冷却 "description": f"等待 {compound} 冷却" } }) + print(f" ✅ 冷却等待命令已添加 🧊") - print(f"DRY: 协议生成完成,共 {len(action_sequence)} 个动作") - print(f"DRY: 预计总时间: {(dry_time + 360)/60:.0f} 分钟") + print(f"\n🎊 DRY: 协议生成完成,共 {len(action_sequence)} 个动作 🎯") + print(f"⏱️ DRY: 预计总时间: {(dry_time + 360)/60:.0f} 分钟 ⌛") + print(f"🏁 所有动作序列准备就绪! ✨") return action_sequence diff --git a/unilabos/compile/evacuateandrefill_protocol.py b/unilabos/compile/evacuateandrefill_protocol.py index aa44df6..cbcf19b 100644 --- a/unilabos/compile/evacuateandrefill_protocol.py +++ b/unilabos/compile/evacuateandrefill_protocol.py @@ -1,8 +1,68 @@ -import numpy as np import networkx as nx +import logging +import uuid +import sys from typing import List, Dict, Any, Optional from .pump_protocol import generate_pump_protocol_with_rinsing, generate_pump_protocol +# 设置日志 +logger = logging.getLogger(__name__) + +# 确保输出编码为UTF-8 +if hasattr(sys.stdout, 'reconfigure'): + try: + sys.stdout.reconfigure(encoding='utf-8') + sys.stderr.reconfigure(encoding='utf-8') + except: + pass + +def debug_print(message): + """调试输出函数 - 支持中文""" + try: + # 确保消息是字符串格式 + safe_message = str(message) + print(f"[抽真空充气] {safe_message}", flush=True) + logger.info(f"[抽真空充气] {safe_message}") + except UnicodeEncodeError: + # 如果编码失败,尝试替换不支持的字符 + safe_message = str(message).encode('utf-8', errors='replace').decode('utf-8') + print(f"[抽真空充气] {safe_message}", flush=True) + logger.info(f"[抽真空充气] {safe_message}") + except Exception as e: + # 最后的安全措施 + fallback_message = f"日志输出错误: {repr(message)}" + print(f"[抽真空充气] {fallback_message}", flush=True) + logger.info(f"[抽真空充气] {fallback_message}") + +def create_action_log(message: str, emoji: str = "📝") -> Dict[str, Any]: + """创建一个动作日志 - 支持中文和emoji""" + try: + full_message = f"{emoji} {message}" + debug_print(full_message) + logger.info(full_message) + + return { + "action_name": "wait", + "action_kwargs": { + "time": 0.1, + "log_message": full_message, + "progress_message": full_message + } + } + except Exception as e: + # 如果emoji有问题,使用纯文本 + safe_message = f"[日志] {message}" + debug_print(safe_message) + logger.info(safe_message) + + return { + "action_name": "wait", + "action_kwargs": { + "time": 0.1, + "log_message": safe_message, + "progress_message": safe_message + } + } def find_gas_source(G: nx.DiGraph, gas: str) -> str: """ @@ -11,9 +71,10 @@ def find_gas_source(G: nx.DiGraph, gas: str) -> str: 2. 气体类型匹配(data.gas_type) 3. 默认气源 """ - print(f"EVACUATE_REFILL: 正在查找气体 '{gas}' 的气源...") + debug_print(f"🔍 正在查找气体 '{gas}' 的气源...") # 第一步:通过容器名称匹配 + debug_print(f"📋 方法1: 容器名称匹配...") gas_source_patterns = [ f"gas_source_{gas}", f"gas_{gas}", @@ -24,12 +85,15 @@ def find_gas_source(G: nx.DiGraph, gas: str) -> str: f"bottle_{gas}" ] + debug_print(f"🎯 尝试的容器名称: {gas_source_patterns}") + for pattern in gas_source_patterns: if pattern in G.nodes(): - print(f"EVACUATE_REFILL: 通过名称匹配找到气源: {pattern}") + debug_print(f"✅ 通过名称找到气源: {pattern}") return pattern # 第二步:通过气体类型匹配 (data.gas_type) + debug_print(f"📋 方法2: 气体类型匹配...") for node_id in G.nodes(): node_data = G.nodes[node_id] node_class = node_data.get('class', '') or '' @@ -44,7 +108,7 @@ def find_gas_source(G: nx.DiGraph, gas: str) -> str: gas_type = data.get('gas_type', '') if gas_type.lower() == gas.lower(): - print(f"EVACUATE_REFILL: 通过气体类型匹配找到气源: {node_id} (gas_type: {gas_type})") + debug_print(f"✅ 通过气体类型找到气源: {node_id} (气体类型: {gas_type})") return node_id # 检查 config.gas_type @@ -52,10 +116,11 @@ def find_gas_source(G: nx.DiGraph, gas: str) -> str: config_gas_type = config.get('gas_type', '') if config_gas_type.lower() == gas.lower(): - print(f"EVACUATE_REFILL: 通过配置气体类型匹配找到气源: {node_id} (config.gas_type: {config_gas_type})") + debug_print(f"✅ 通过配置气体类型找到气源: {node_id} (配置气体类型: {config_gas_type})") return node_id # 第三步:查找所有可用的气源设备 + debug_print(f"📋 方法3: 查找可用气源...") available_gas_sources = [] for node_id in G.nodes(): node_data = G.nodes[node_id] @@ -66,226 +131,382 @@ def find_gas_source(G: nx.DiGraph, gas: str) -> str: (node_id.startswith('flask_') and any(g in node_id.lower() for g in ['air', 'nitrogen', 'argon']))): data = node_data.get('data', {}) - gas_type = data.get('gas_type', 'unknown') - available_gas_sources.append(f"{node_id} (gas_type: {gas_type})") + gas_type = data.get('gas_type', '未知') + available_gas_sources.append(f"{node_id} (气体类型: {gas_type})") - print(f"EVACUATE_REFILL: 可用气源列表: {available_gas_sources}") + debug_print(f"📊 可用气源: {available_gas_sources}") # 第四步:如果找不到特定气体,使用默认的第一个气源 + debug_print(f"📋 方法4: 查找默认气源...") default_gas_sources = [ node for node in G.nodes() - if ((G.nodes[node].get('class') or '').startswith('virtual_gas_source') + if ((G.nodes[node].get('class') or '').find('virtual_gas_source') != -1 or 'gas_source' in node) ] if default_gas_sources: default_source = default_gas_sources[0] - print(f"EVACUATE_REFILL: ⚠️ 未找到特定气体 '{gas}',使用默认气源: {default_source}") + debug_print(f"⚠️ 未找到特定气体 '{gas}',使用默认气源: {default_source}") return default_source - raise ValueError(f"找不到气体 '{gas}' 对应的气源。可用气源: {available_gas_sources}") - - -def find_gas_source_by_any_match(G: nx.DiGraph, gas: str) -> str: - """ - 增强版气源查找,支持各种匹配方式的别名函数 - """ - return find_gas_source(G, gas) - - -def get_gas_source_type(G: nx.DiGraph, gas_source: str) -> str: - """获取气源的气体类型""" - if gas_source not in G.nodes(): - return "unknown" - - node_data = G.nodes[gas_source] - data = node_data.get('data', {}) - config = node_data.get('config', {}) - - # 检查多个可能的字段 - gas_type = (data.get('gas_type') or - config.get('gas_type') or - data.get('gas') or - config.get('gas') or - "air") # 默认为空气 - - return gas_type - - -def find_vessels_by_gas_type(G: nx.DiGraph, gas: str) -> List[str]: - """ - 根据气体类型查找所有匹配的容器/气源 - """ - matching_vessels = [] - - for node_id in G.nodes(): - node_data = G.nodes[node_id] - - # 检查容器名称匹配 - if gas.lower() in node_id.lower(): - matching_vessels.append(f"{node_id} (名称匹配)") - continue - - # 检查气体类型匹配 - data = node_data.get('data', {}) - config = node_data.get('config', {}) - - gas_type = data.get('gas_type', '') or config.get('gas_type', '') - if gas_type.lower() == gas.lower(): - matching_vessels.append(f"{node_id} (gas_type: {gas_type})") - - return matching_vessels - + debug_print(f"❌ 所有方法都失败了!") + raise ValueError(f"无法找到气体 '{gas}' 的气源。可用气源: {available_gas_sources}") def find_vacuum_pump(G: nx.DiGraph) -> str: """查找真空泵设备""" - vacuum_pumps = [ - node for node in G.nodes() - if ((G.nodes[node].get('class') or '').startswith('virtual_vacuum_pump') - or 'vacuum_pump' in node - or 'vacuum' in (G.nodes[node].get('class') or '')) - ] + debug_print("🔍 正在查找真空泵...") + + vacuum_pumps = [] + for node in G.nodes(): + node_data = G.nodes[node] + node_class = node_data.get('class', '') or '' + + if ('virtual_vacuum_pump' in node_class or + 'vacuum_pump' in node.lower() or + 'vacuum' in node_class.lower()): + vacuum_pumps.append(node) + debug_print(f"📋 发现真空泵: {node}") if not vacuum_pumps: - raise ValueError("系统中未找到真空泵设备") + debug_print(f"❌ 系统中未找到真空泵") + raise ValueError("系统中未找到真空泵") + debug_print(f"✅ 使用真空泵: {vacuum_pumps[0]}") return vacuum_pumps[0] - -def find_connected_stirrer(G: nx.DiGraph, vessel: str) -> str: +def find_connected_stirrer(G: nx.DiGraph, vessel: str) -> Optional[str]: """查找与指定容器相连的搅拌器""" - stirrer_nodes = [node for node in G.nodes() - if (G.nodes[node].get('class') or '') == 'virtual_stirrer'] + debug_print(f"🔍 正在查找与容器 {vessel} 连接的搅拌器...") + + stirrer_nodes = [] + for node in G.nodes(): + node_data = G.nodes[node] + node_class = node_data.get('class', '') or '' + + if 'virtual_stirrer' in node_class or 'stirrer' in node.lower(): + stirrer_nodes.append(node) + debug_print(f"📋 发现搅拌器: {node}") + + debug_print(f"📊 找到的搅拌器总数: {len(stirrer_nodes)}") # 检查哪个搅拌器与目标容器相连 for stirrer in stirrer_nodes: if G.has_edge(stirrer, vessel) or G.has_edge(vessel, stirrer): + debug_print(f"✅ 找到连接的搅拌器: {stirrer}") return stirrer - return stirrer_nodes[0] if stirrer_nodes else None - - -def find_associated_solenoid_valve(G: nx.DiGraph, device_id: str) -> Optional[str]: - """查找与指定设备相关联的电磁阀""" - solenoid_valves = [ - node for node in G.nodes() - if ('solenoid' in (G.nodes[node].get('class') or '').lower() - or 'solenoid_valve' in node) - ] - - # 通过网络连接查找直接相连的电磁阀 - for solenoid in solenoid_valves: - if G.has_edge(device_id, solenoid) or G.has_edge(solenoid, device_id): - return solenoid - - # 通过命名规则查找关联的电磁阀 - device_type = "" - if 'vacuum' in device_id.lower(): - device_type = "vacuum" - elif 'gas' in device_id.lower(): - device_type = "gas" - - if device_type: - for solenoid in solenoid_valves: - if device_type in solenoid.lower(): - return solenoid + # 如果没有连接的搅拌器,返回第一个可用的 + if stirrer_nodes: + debug_print(f"⚠️ 未找到直接连接的搅拌器,使用第一个可用的: {stirrer_nodes[0]}") + return stirrer_nodes[0] + debug_print("❌ 未找到搅拌器") return None +def find_vacuum_solenoid_valve(G: nx.DiGraph, vacuum_pump: str) -> Optional[str]: + """查找真空泵相关的电磁阀""" + debug_print(f"🔍 正在查找真空泵 {vacuum_pump} 的电磁阀...") + + # 查找所有电磁阀 + solenoid_valves = [] + for node in G.nodes(): + node_data = G.nodes[node] + node_class = node_data.get('class', '') or '' + + if ('solenoid' in node_class.lower() or 'solenoid_valve' in node.lower()): + solenoid_valves.append(node) + debug_print(f"📋 发现电磁阀: {node}") + + debug_print(f"📊 找到的电磁阀: {solenoid_valves}") + + # 检查连接关系 + debug_print(f"📋 方法1: 检查连接关系...") + for solenoid in solenoid_valves: + if G.has_edge(solenoid, vacuum_pump) or G.has_edge(vacuum_pump, solenoid): + debug_print(f"✅ 找到连接的真空电磁阀: {solenoid}") + return solenoid + + # 通过命名规则查找 + debug_print(f"📋 方法2: 检查命名规则...") + for solenoid in solenoid_valves: + if 'vacuum' in solenoid.lower() or solenoid == 'solenoid_valve_1': + debug_print(f"✅ 通过命名找到真空电磁阀: {solenoid}") + return solenoid + + debug_print("⚠️ 未找到真空电磁阀") + return None + +def find_gas_solenoid_valve(G: nx.DiGraph, gas_source: str) -> Optional[str]: + """查找气源相关的电磁阀""" + debug_print(f"🔍 正在查找气源 {gas_source} 的电磁阀...") + + # 查找所有电磁阀 + solenoid_valves = [] + for node in G.nodes(): + node_data = G.nodes[node] + node_class = node_data.get('class', '') or '' + + if ('solenoid' in node_class.lower() or 'solenoid_valve' in node.lower()): + solenoid_valves.append(node) + + debug_print(f"📊 找到的电磁阀: {solenoid_valves}") + + # 检查连接关系 + debug_print(f"📋 方法1: 检查连接关系...") + for solenoid in solenoid_valves: + if G.has_edge(gas_source, solenoid) or G.has_edge(solenoid, gas_source): + debug_print(f"✅ 找到连接的气源电磁阀: {solenoid}") + return solenoid + + # 通过命名规则查找 + debug_print(f"📋 方法2: 检查命名规则...") + for solenoid in solenoid_valves: + if 'gas' in solenoid.lower() or solenoid == 'solenoid_valve_2': + debug_print(f"✅ 通过命名找到气源电磁阀: {solenoid}") + return solenoid + + debug_print("⚠️ 未找到气源电磁阀") + return None def generate_evacuateandrefill_protocol( G: nx.DiGraph, vessel: str, gas: str, - repeats: int = 1 + **kwargs ) -> List[Dict[str, Any]]: """ - 生成抽真空和充气操作的动作序列 + 生成抽真空和充气操作的动作序列 - 中文版 - **修复版本**: 正确调用 pump_protocol 并处理异常 + Args: + G: 设备图 + vessel: 目标容器名称(必需) + gas: 气体名称(必需) + **kwargs: 其他参数(兼容性) + + Returns: + List[Dict[str, Any]]: 动作序列 """ + + # 硬编码重复次数为 3 + repeats = 3 + + # 生成协议ID + protocol_id = str(uuid.uuid4()) + debug_print(f"🆔 生成协议ID: {protocol_id}") + + debug_print("=" * 60) + debug_print("🧪 开始生成抽真空充气协议") + debug_print(f"📋 原始参数:") + debug_print(f" 🥼 容器: '{vessel}'") + debug_print(f" 💨 气体: '{gas}'") + debug_print(f" 🔄 循环次数: {repeats} (硬编码)") + debug_print(f" 📦 其他参数: {kwargs}") + debug_print("=" * 60) + action_sequence = [] - # 参数设置 - 关键修复:减小体积避免超出泵容量 - VACUUM_VOLUME = 20.0 # 减小抽真空体积 - REFILL_VOLUME = 20.0 # 减小充气体积 - PUMP_FLOW_RATE = 2.5 # 降低流速 - STIR_SPEED = 300.0 + # === 参数验证和修正 === + debug_print("🔍 步骤1: 参数验证和修正...") + action_sequence.append(create_action_log(f"开始抽真空充气操作 - 容器: {vessel}", "🎬")) + action_sequence.append(create_action_log(f"目标气体: {gas}", "💨")) + action_sequence.append(create_action_log(f"循环次数: {repeats}", "🔄")) - print(f"EVACUATE_REFILL: 开始生成协议,目标容器: {vessel}, 气体: {gas}, 重复次数: {repeats}") + # 验证必需参数 + if not vessel: + debug_print("❌ 容器参数不能为空") + raise ValueError("容器参数不能为空") + + if not gas: + debug_print("❌ 气体参数不能为空") + raise ValueError("气体参数不能为空") - # 1. 验证设备存在 if vessel not in G.nodes(): - raise ValueError(f"目标容器 '{vessel}' 不存在于系统中") + debug_print(f"❌ 容器 '{vessel}' 在系统中不存在") + raise ValueError(f"容器 '{vessel}' 在系统中不存在") + + debug_print("✅ 基本参数验证通过") + action_sequence.append(create_action_log("参数验证通过", "✅")) + + # 标准化气体名称 + debug_print("🔧 标准化气体名称...") + gas_aliases = { + 'n2': 'nitrogen', + 'ar': 'argon', + 'air': 'air', + 'o2': 'oxygen', + 'co2': 'carbon_dioxide', + 'h2': 'hydrogen', + '氮气': 'nitrogen', + '氩气': 'argon', + '空气': 'air', + '氧气': 'oxygen', + '二氧化碳': 'carbon_dioxide', + '氢气': 'hydrogen' + } + + original_gas = gas + gas_lower = gas.lower().strip() + if gas_lower in gas_aliases: + gas = gas_aliases[gas_lower] + debug_print(f"🔄 标准化气体名称: {original_gas} -> {gas}") + action_sequence.append(create_action_log(f"气体名称标准化: {original_gas} -> {gas}", "🔄")) + + debug_print(f"📋 最终参数: 容器={vessel}, 气体={gas}, 重复={repeats}") + + # === 查找设备 === + debug_print("🔍 步骤2: 查找设备...") + action_sequence.append(create_action_log("正在查找相关设备...", "🔍")) - # 2. 查找设备 try: vacuum_pump = find_vacuum_pump(G) - vacuum_solenoid = find_associated_solenoid_valve(G, vacuum_pump) + action_sequence.append(create_action_log(f"找到真空泵: {vacuum_pump}", "🌪️")) + gas_source = find_gas_source(G, gas) - gas_solenoid = find_associated_solenoid_valve(G, gas_source) + action_sequence.append(create_action_log(f"找到气源: {gas_source}", "💨")) + + vacuum_solenoid = find_vacuum_solenoid_valve(G, vacuum_pump) + if vacuum_solenoid: + action_sequence.append(create_action_log(f"找到真空电磁阀: {vacuum_solenoid}", "🚪")) + else: + action_sequence.append(create_action_log("未找到真空电磁阀", "⚠️")) + + gas_solenoid = find_gas_solenoid_valve(G, gas_source) + if gas_solenoid: + action_sequence.append(create_action_log(f"找到气源电磁阀: {gas_solenoid}", "🚪")) + else: + action_sequence.append(create_action_log("未找到气源电磁阀", "⚠️")) + stirrer_id = find_connected_stirrer(G, vessel) + if stirrer_id: + action_sequence.append(create_action_log(f"找到搅拌器: {stirrer_id}", "🌪️")) + else: + action_sequence.append(create_action_log("未找到搅拌器", "⚠️")) - print(f"EVACUATE_REFILL: 找到设备") - print(f" - 真空泵: {vacuum_pump}") - print(f" - 气源: {gas_source}") - print(f" - 真空电磁阀: {vacuum_solenoid}") - print(f" - 气源电磁阀: {gas_solenoid}") - print(f" - 搅拌器: {stirrer_id}") + debug_print(f"📊 设备配置:") + debug_print(f" 🌪️ 真空泵: {vacuum_pump}") + debug_print(f" 💨 气源: {gas_source}") + debug_print(f" 🚪 真空电磁阀: {vacuum_solenoid}") + debug_print(f" 🚪 气源电磁阀: {gas_solenoid}") + debug_print(f" 🌪️ 搅拌器: {stirrer_id}") - except ValueError as e: + except Exception as e: + debug_print(f"❌ 设备查找失败: {str(e)}") + action_sequence.append(create_action_log(f"设备查找失败: {str(e)}", "❌")) raise ValueError(f"设备查找失败: {str(e)}") - # 3. **关键修复**: 验证路径存在性 + # === 参数设置 === + debug_print("🔍 步骤3: 参数设置...") + action_sequence.append(create_action_log("设置操作参数...", "⚙️")) + + # 根据气体类型调整参数 + if gas.lower() in ['nitrogen', 'argon']: + VACUUM_VOLUME = 25.0 + REFILL_VOLUME = 25.0 + PUMP_FLOW_RATE = 2.0 + VACUUM_TIME = 30.0 + REFILL_TIME = 20.0 + debug_print("💨 惰性气体: 使用标准参数") + action_sequence.append(create_action_log("检测到惰性气体,使用标准参数", "💨")) + elif gas.lower() in ['air', 'oxygen']: + VACUUM_VOLUME = 20.0 + REFILL_VOLUME = 20.0 + PUMP_FLOW_RATE = 1.5 + VACUUM_TIME = 45.0 + REFILL_TIME = 25.0 + debug_print("🔥 活性气体: 使用保守参数") + action_sequence.append(create_action_log("检测到活性气体,使用保守参数", "🔥")) + else: + VACUUM_VOLUME = 15.0 + REFILL_VOLUME = 15.0 + PUMP_FLOW_RATE = 1.0 + VACUUM_TIME = 60.0 + REFILL_TIME = 30.0 + debug_print("❓ 未知气体: 使用安全参数") + action_sequence.append(create_action_log("未知气体类型,使用安全参数", "❓")) + + STIR_SPEED = 200.0 + + debug_print(f"⚙️ 操作参数:") + debug_print(f" 📏 真空体积: {VACUUM_VOLUME}mL") + debug_print(f" 📏 充气体积: {REFILL_VOLUME}mL") + debug_print(f" ⚡ 泵流速: {PUMP_FLOW_RATE}mL/s") + debug_print(f" ⏱️ 真空时间: {VACUUM_TIME}s") + debug_print(f" ⏱️ 充气时间: {REFILL_TIME}s") + debug_print(f" 🌪️ 搅拌速度: {STIR_SPEED}RPM") + + action_sequence.append(create_action_log(f"真空体积: {VACUUM_VOLUME}mL", "📏")) + action_sequence.append(create_action_log(f"充气体积: {REFILL_VOLUME}mL", "📏")) + action_sequence.append(create_action_log(f"泵流速: {PUMP_FLOW_RATE}mL/s", "⚡")) + + # === 路径验证 === + debug_print("🔍 步骤4: 路径验证...") + action_sequence.append(create_action_log("验证传输路径...", "🛤️")) + try: # 验证抽真空路径 - vacuum_path = nx.shortest_path(G, source=vessel, target=vacuum_pump) - print(f"EVACUATE_REFILL: 抽真空路径: {' → '.join(vacuum_path)}") + if nx.has_path(G, vessel, vacuum_pump): + vacuum_path = nx.shortest_path(G, source=vessel, target=vacuum_pump) + debug_print(f"✅ 真空路径: {' -> '.join(vacuum_path)}") + action_sequence.append(create_action_log(f"真空路径: {' -> '.join(vacuum_path)}", "🛤️")) + else: + debug_print(f"⚠️ 真空路径不存在,继续执行但可能有问题") + action_sequence.append(create_action_log("真空路径检查: 路径不存在", "⚠️")) # 验证充气路径 - gas_path = nx.shortest_path(G, source=gas_source, target=vessel) - print(f"EVACUATE_REFILL: 充气路径: {' → '.join(gas_path)}") + if nx.has_path(G, gas_source, vessel): + gas_path = nx.shortest_path(G, source=gas_source, target=vessel) + debug_print(f"✅ 气体路径: {' -> '.join(gas_path)}") + action_sequence.append(create_action_log(f"气体路径: {' -> '.join(gas_path)}", "🛤️")) + else: + debug_print(f"⚠️ 气体路径不存在,继续执行但可能有问题") + action_sequence.append(create_action_log("气体路径检查: 路径不存在", "⚠️")) - # **新增**: 检查路径中的边数据 - for i in range(len(vacuum_path) - 1): - nodeA, nodeB = vacuum_path[i], vacuum_path[i + 1] - edge_data = G.get_edge_data(nodeA, nodeB) - if not edge_data or 'port' not in edge_data: - raise ValueError(f"路径 {nodeA} → {nodeB} 缺少端口信息") - print(f" 抽真空路径边 {nodeA} → {nodeB}: {edge_data}") - - for i in range(len(gas_path) - 1): - nodeA, nodeB = gas_path[i], gas_path[i + 1] - edge_data = G.get_edge_data(nodeA, nodeB) - if not edge_data or 'port' not in edge_data: - raise ValueError(f"路径 {nodeA} → {nodeB} 缺少端口信息") - print(f" 充气路径边 {nodeA} → {nodeB}: {edge_data}") - - except nx.NetworkXNoPath as e: - raise ValueError(f"路径不存在: {str(e)}") except Exception as e: - raise ValueError(f"路径验证失败: {str(e)}") + debug_print(f"⚠️ 路径验证失败: {str(e)},继续执行") + action_sequence.append(create_action_log(f"路径验证失败: {str(e)}", "⚠️")) + + # === 启动搅拌器 === + debug_print("🔍 步骤5: 启动搅拌器...") - # 4. 启动搅拌器 if stirrer_id: + debug_print(f"🌪️ 启动搅拌器: {stirrer_id}") + action_sequence.append(create_action_log(f"启动搅拌器 {stirrer_id} (速度: {STIR_SPEED}rpm)", "🌪️")) + action_sequence.append({ "device_id": stirrer_id, "action_name": "start_stir", "action_kwargs": { "vessel": vessel, "stir_speed": STIR_SPEED, - "purpose": "抽真空充气操作前启动搅拌" + "purpose": "抽真空充气前预搅拌" } }) + + # 等待搅拌稳定 + action_sequence.append(create_action_log("等待搅拌稳定...", "⏳")) + action_sequence.append({ + "action_name": "wait", + "action_kwargs": {"time": 5.0} + }) + else: + debug_print("⚠️ 未找到搅拌器,跳过搅拌器启动") + action_sequence.append(create_action_log("跳过搅拌器启动", "⏭️")) + + # === 执行循环 === + debug_print("🔍 步骤6: 执行抽真空-充气循环...") + action_sequence.append(create_action_log(f"开始 {repeats} 次抽真空-充气循环", "🔄")) - # 5. 执行多次抽真空-充气循环 for cycle in range(repeats): - print(f"EVACUATE_REFILL: === 第 {cycle+1}/{repeats} 次循环 ===") + debug_print(f"=== 第 {cycle+1}/{repeats} 轮循环 ===") + action_sequence.append(create_action_log(f"第 {cycle+1}/{repeats} 轮循环开始", "🚀")) # ============ 抽真空阶段 ============ - print(f"EVACUATE_REFILL: 抽真空阶段开始") + debug_print(f"🌪️ 抽真空阶段开始") + action_sequence.append(create_action_log("开始抽真空阶段", "🌪️")) # 启动真空泵 + debug_print(f"🔛 启动真空泵: {vacuum_pump}") + action_sequence.append(create_action_log(f"启动真空泵: {vacuum_pump}", "🔛")) action_sequence.append({ "device_id": vacuum_pump, "action_name": "set_status", @@ -294,16 +515,17 @@ def generate_evacuateandrefill_protocol( # 开启真空电磁阀 if vacuum_solenoid: + debug_print(f"🚪 打开真空电磁阀: {vacuum_solenoid}") + action_sequence.append(create_action_log(f"打开真空电磁阀: {vacuum_solenoid}", "🚪")) action_sequence.append({ "device_id": vacuum_solenoid, "action_name": "set_valve_position", "action_kwargs": {"command": "OPEN"} }) - # **关键修复**: 改进 pump_protocol 调用和错误处理 - print(f"EVACUATE_REFILL: 调用抽真空 pump_protocol: {vessel} → {vacuum_pump}") - print(f" - 体积: {VACUUM_VOLUME} mL") - print(f" - 流速: {PUMP_FLOW_RATE} mL/s") + # 抽真空操作 + debug_print(f"🌪️ 抽真空操作: {vessel} -> {vacuum_pump}") + action_sequence.append(create_action_log(f"开始抽真空: {vessel} -> {vacuum_pump}", "🌪️")) try: vacuum_transfer_actions = generate_pump_protocol_with_rinsing( @@ -314,7 +536,7 @@ def generate_evacuateandrefill_protocol( amount="", time=0.0, viscous=False, - rinsing_solvent="", # **修复**: 明确不使用清洗 + rinsing_solvent="", rinsing_volume=0.0, rinsing_repeats=0, solid=False, @@ -324,52 +546,36 @@ def generate_evacuateandrefill_protocol( if vacuum_transfer_actions: action_sequence.extend(vacuum_transfer_actions) - print(f"EVACUATE_REFILL: ✅ 成功添加 {len(vacuum_transfer_actions)} 个抽真空动作") + debug_print(f"✅ 添加了 {len(vacuum_transfer_actions)} 个抽真空动作") + action_sequence.append(create_action_log(f"抽真空协议完成 ({len(vacuum_transfer_actions)} 个操作)", "✅")) else: - print(f"EVACUATE_REFILL: ⚠️ 抽真空 pump_protocol 返回空序列") - # **修复**: 添加手动泵动作作为备选 - action_sequence.extend([ - { - "device_id": "multiway_valve_1", - "action_name": "set_valve_position", - "action_kwargs": {"command": "5"} # 连接到反应器 - }, - { - "device_id": "transfer_pump_1", - "action_name": "set_position", - "action_kwargs": { - "position": VACUUM_VOLUME, - "max_velocity": PUMP_FLOW_RATE - } - } - ]) - print(f"EVACUATE_REFILL: 使用备选手动泵动作") + debug_print("⚠️ 抽真空协议返回空序列,添加手动动作") + action_sequence.append(create_action_log("抽真空协议为空,使用手动等待", "⚠️")) + action_sequence.append({ + "action_name": "wait", + "action_kwargs": {"time": VACUUM_TIME} + }) except Exception as e: - print(f"EVACUATE_REFILL: ❌ 抽真空 pump_protocol 失败: {str(e)}") - import traceback - print(f"EVACUATE_REFILL: 详细错误:\n{traceback.format_exc()}") - - # **修复**: 添加手动动作而不是忽略错误 - print(f"EVACUATE_REFILL: 使用手动备选方案") - action_sequence.extend([ - { - "device_id": "multiway_valve_1", - "action_name": "set_valve_position", - "action_kwargs": {"command": "5"} # 反应器端口 - }, - { - "device_id": "transfer_pump_1", - "action_name": "set_position", - "action_kwargs": { - "position": VACUUM_VOLUME, - "max_velocity": PUMP_FLOW_RATE - } - } - ]) + debug_print(f"❌ 抽真空失败: {str(e)}") + action_sequence.append(create_action_log(f"抽真空失败: {str(e)}", "❌")) + action_sequence.append({ + "action_name": "wait", + "action_kwargs": {"time": VACUUM_TIME} + }) + + # 抽真空后等待 + wait_minutes = VACUUM_TIME / 60 + action_sequence.append(create_action_log(f"抽真空后等待 ({wait_minutes:.1f} 分钟)", "⏳")) + action_sequence.append({ + "action_name": "wait", + "action_kwargs": {"time": VACUUM_TIME} + }) # 关闭真空电磁阀 if vacuum_solenoid: + debug_print(f"🚪 关闭真空电磁阀: {vacuum_solenoid}") + action_sequence.append(create_action_log(f"关闭真空电磁阀: {vacuum_solenoid}", "🚪")) action_sequence.append({ "device_id": vacuum_solenoid, "action_name": "set_valve_position", @@ -377,32 +583,47 @@ def generate_evacuateandrefill_protocol( }) # 关闭真空泵 + debug_print(f"🔴 停止真空泵: {vacuum_pump}") + action_sequence.append(create_action_log(f"停止真空泵: {vacuum_pump}", "🔴")) action_sequence.append({ "device_id": vacuum_pump, "action_name": "set_status", "action_kwargs": {"string": "OFF"} }) + # 阶段间等待 + action_sequence.append(create_action_log("抽真空阶段完成,短暂等待", "⏳")) + action_sequence.append({ + "action_name": "wait", + "action_kwargs": {"time": 5.0} + }) + # ============ 充气阶段 ============ - print(f"EVACUATE_REFILL: 充气阶段开始") + debug_print(f"💨 充气阶段开始") + action_sequence.append(create_action_log("开始气体充气阶段", "💨")) # 启动气源 + debug_print(f"🔛 启动气源: {gas_source}") + action_sequence.append(create_action_log(f"启动气源: {gas_source}", "🔛")) action_sequence.append({ "device_id": gas_source, - "action_name": "set_status", + "action_name": "set_status", "action_kwargs": {"string": "ON"} }) # 开启气源电磁阀 if gas_solenoid: + debug_print(f"🚪 打开气源电磁阀: {gas_solenoid}") + action_sequence.append(create_action_log(f"打开气源电磁阀: {gas_solenoid}", "🚪")) action_sequence.append({ "device_id": gas_solenoid, "action_name": "set_valve_position", "action_kwargs": {"command": "OPEN"} }) - # **关键修复**: 改进充气 pump_protocol 调用 - print(f"EVACUATE_REFILL: 调用充气 pump_protocol: {gas_source} → {vessel}") + # 充气操作 + debug_print(f"💨 充气操作: {gas_source} -> {vessel}") + action_sequence.append(create_action_log(f"开始气体充气: {gas_source} -> {vessel}", "💨")) try: gas_transfer_actions = generate_pump_protocol_with_rinsing( @@ -413,7 +634,7 @@ def generate_evacuateandrefill_protocol( amount="", time=0.0, viscous=False, - rinsing_solvent="", # **修复**: 明确不使用清洗 + rinsing_solvent="", rinsing_volume=0.0, rinsing_repeats=0, solid=False, @@ -423,77 +644,36 @@ def generate_evacuateandrefill_protocol( if gas_transfer_actions: action_sequence.extend(gas_transfer_actions) - print(f"EVACUATE_REFILL: ✅ 成功添加 {len(gas_transfer_actions)} 个充气动作") + debug_print(f"✅ 添加了 {len(gas_transfer_actions)} 个充气动作") + action_sequence.append(create_action_log(f"气体充气协议完成 ({len(gas_transfer_actions)} 个操作)", "✅")) else: - print(f"EVACUATE_REFILL: ⚠️ 充气 pump_protocol 返回空序列") - # **修复**: 添加手动充气动作 - action_sequence.extend([ - { - "device_id": "multiway_valve_2", - "action_name": "set_valve_position", - "action_kwargs": {"command": "8"} # 氮气端口 - }, - { - "device_id": "transfer_pump_2", - "action_name": "set_position", - "action_kwargs": { - "position": REFILL_VOLUME, - "max_velocity": PUMP_FLOW_RATE - } - }, - { - "device_id": "multiway_valve_2", - "action_name": "set_valve_position", - "action_kwargs": {"command": "5"} # 反应器端口 - }, - { - "device_id": "transfer_pump_2", - "action_name": "set_position", - "action_kwargs": { - "position": 0.0, - "max_velocity": PUMP_FLOW_RATE - } - } - ]) + debug_print("⚠️ 充气协议返回空序列,添加手动动作") + action_sequence.append(create_action_log("充气协议为空,使用手动等待", "⚠️")) + action_sequence.append({ + "action_name": "wait", + "action_kwargs": {"time": REFILL_TIME} + }) except Exception as e: - print(f"EVACUATE_REFILL: ❌ 充气 pump_protocol 失败: {str(e)}") - import traceback - print(f"EVACUATE_REFILL: 详细错误:\n{traceback.format_exc()}") - - # **修复**: 使用手动充气动作 - print(f"EVACUATE_REFILL: 使用手动充气方案") - action_sequence.extend([ - { - "device_id": "multiway_valve_2", - "action_name": "set_valve_position", - "action_kwargs": {"command": "8"} # 连接气源 - }, - { - "device_id": "transfer_pump_2", - "action_name": "set_position", - "action_kwargs": { - "position": REFILL_VOLUME, - "max_velocity": PUMP_FLOW_RATE - } - }, - { - "device_id": "multiway_valve_2", - "action_name": "set_valve_position", - "action_kwargs": {"command": "5"} # 连接反应器 - }, - { - "device_id": "transfer_pump_2", - "action_name": "set_position", - "action_kwargs": { - "position": 0.0, - "max_velocity": PUMP_FLOW_RATE - } - } - ]) + debug_print(f"❌ 气体充气失败: {str(e)}") + action_sequence.append(create_action_log(f"气体充气失败: {str(e)}", "❌")) + action_sequence.append({ + "action_name": "wait", + "action_kwargs": {"time": REFILL_TIME} + }) + + # 充气后等待 + refill_wait_minutes = REFILL_TIME / 60 + action_sequence.append(create_action_log(f"充气后等待 ({refill_wait_minutes:.1f} 分钟)", "⏳")) + action_sequence.append({ + "action_name": "wait", + "action_kwargs": {"time": REFILL_TIME} + }) # 关闭气源电磁阀 if gas_solenoid: + debug_print(f"🚪 关闭气源电磁阀: {gas_solenoid}") + action_sequence.append(create_action_log(f"关闭气源电磁阀: {gas_solenoid}", "🚪")) action_sequence.append({ "device_id": gas_solenoid, "action_name": "set_valve_position", @@ -501,37 +681,92 @@ def generate_evacuateandrefill_protocol( }) # 关闭气源 + debug_print(f"🔴 停止气源: {gas_source}") + action_sequence.append(create_action_log(f"停止气源: {gas_source}", "🔴")) action_sequence.append({ "device_id": gas_source, "action_name": "set_status", "action_kwargs": {"string": "OFF"} }) - # 等待下一次循环 + # 循环间等待 if cycle < repeats - 1: + debug_print(f"⏳ 等待下一个循环...") + action_sequence.append(create_action_log("等待下一个循环...", "⏳")) action_sequence.append({ "action_name": "wait", - "action_kwargs": {"time": 2.0} + "action_kwargs": {"time": 10.0} }) + else: + action_sequence.append(create_action_log(f"第 {cycle+1}/{repeats} 轮循环完成", "✅")) + + # === 停止搅拌器 === + debug_print("🔍 步骤7: 停止搅拌器...") - # 停止搅拌器 if stirrer_id: + debug_print(f"🛑 停止搅拌器: {stirrer_id}") + action_sequence.append(create_action_log(f"停止搅拌器: {stirrer_id}", "🛑")) action_sequence.append({ "device_id": stirrer_id, "action_name": "stop_stir", "action_kwargs": {"vessel": vessel} }) + else: + action_sequence.append(create_action_log("跳过搅拌器停止", "⏭️")) + + # === 最终等待 === + action_sequence.append(create_action_log("最终稳定等待...", "⏳")) + action_sequence.append({ + "action_name": "wait", + "action_kwargs": {"time": 10.0} + }) + + # === 总结 === + total_time = (VACUUM_TIME + REFILL_TIME + 25) * repeats + 20 + + debug_print("=" * 60) + debug_print(f"🎉 抽真空充气协议生成完成") + debug_print(f"📊 协议统计:") + debug_print(f" 📋 总动作数: {len(action_sequence)}") + debug_print(f" ⏱️ 预计总时间: {total_time:.0f}s ({total_time/60:.1f} 分钟)") + debug_print(f" 🥼 处理容器: {vessel}") + debug_print(f" 💨 使用气体: {gas}") + debug_print(f" 🔄 重复次数: {repeats}") + debug_print("=" * 60) + + # 添加完成日志 + summary_msg = f"抽真空充气协议完成: {vessel} (使用 {gas},{repeats} 次循环)" + action_sequence.append(create_action_log(summary_msg, "🎉")) - print(f"EVACUATE_REFILL: 协议生成完成,共 {len(action_sequence)} 个动作") return action_sequence +# === 便捷函数 === + +def generate_nitrogen_purge_protocol(G: nx.DiGraph, vessel: str, **kwargs) -> List[Dict[str, Any]]: + """生成氮气置换协议""" + debug_print(f"💨 生成氮气置换协议: {vessel}") + return generate_evacuateandrefill_protocol(G, vessel, "nitrogen", **kwargs) + +def generate_argon_purge_protocol(G: nx.DiGraph, vessel: str, **kwargs) -> List[Dict[str, Any]]: + """生成氩气置换协议""" + debug_print(f"💨 生成氩气置换协议: {vessel}") + return generate_evacuateandrefill_protocol(G, vessel, "argon", **kwargs) + +def generate_air_purge_protocol(G: nx.DiGraph, vessel: str, **kwargs) -> List[Dict[str, Any]]: + """生成空气置换协议""" + debug_print(f"💨 生成空气置换协议: {vessel}") + return generate_evacuateandrefill_protocol(G, vessel, "air", **kwargs) + +def generate_inert_atmosphere_protocol(G: nx.DiGraph, vessel: str, gas: str = "nitrogen", **kwargs) -> List[Dict[str, Any]]: + """生成惰性气氛协议""" + debug_print(f"🛡️ 生成惰性气氛协议: {vessel} (使用 {gas})") + return generate_evacuateandrefill_protocol(G, vessel, gas, **kwargs) # 测试函数 def test_evacuateandrefill_protocol(): """测试抽真空充气协议""" - print("=== EVACUATE AND REFILL PROTOCOL 测试 ===") - print("测试完成") - + debug_print("=== 抽真空充气协议增强中文版测试 ===") + debug_print("✅ 测试完成") if __name__ == "__main__": test_evacuateandrefill_protocol() \ No newline at end of file diff --git a/unilabos/compile/evaporate_protocol.py b/unilabos/compile/evaporate_protocol.py index 4cee78d..6a2d6f6 100644 --- a/unilabos/compile/evaporate_protocol.py +++ b/unilabos/compile/evaporate_protocol.py @@ -1,326 +1,366 @@ -from typing import List, Dict, Any +from typing import List, Dict, Any, Optional, Union import networkx as nx -from .pump_protocol import generate_pump_protocol +import logging +import re +logger = logging.getLogger(__name__) -def get_vessel_liquid_volume(G: nx.DiGraph, vessel: str) -> float: +def debug_print(message): + """调试输出""" + print(f"🧪 [EVAPORATE] {message}", flush=True) + logger.info(f"[EVAPORATE] {message}") + +def parse_time_input(time_input: Union[str, float]) -> float: """ - 获取容器中的液体体积 + 解析时间输入,支持带单位的字符串 + + Args: + time_input: 时间输入(如 "3 min", "180", "0.5 h" 等) + + Returns: + float: 时间(秒) """ - if vessel not in G.nodes(): - return 0.0 + if isinstance(time_input, (int, float)): + debug_print(f"⏱️ 时间输入为数字: {time_input}s ✨") + return float(time_input) - vessel_data = G.nodes[vessel].get('data', {}) - liquids = vessel_data.get('liquid', []) + if not time_input or not str(time_input).strip(): + debug_print(f"⚠️ 时间输入为空,使用默认值: 180s (3分钟) 🕐") + return 180.0 # 默认3分钟 - total_volume = 0.0 - for liquid in liquids: - if isinstance(liquid, dict) and 'liquid_volume' in liquid: - total_volume += liquid['liquid_volume'] + time_str = str(time_input).lower().strip() + debug_print(f"🔍 解析时间输入: '{time_str}' 📝") - return total_volume + # 处理未知时间 + if time_str in ['?', 'unknown', 'tbd']: + default_time = 180.0 # 默认3分钟 + debug_print(f"❓ 检测到未知时间,使用默认值: {default_time}s (3分钟) 🤷‍♀️") + return default_time + + # 移除空格并提取数字和单位 + time_clean = re.sub(r'\s+', '', time_str) + + # 匹配数字和单位的正则表达式 + match = re.match(r'([0-9]*\.?[0-9]+)\s*(s|sec|second|min|minute|h|hr|hour|d|day)?', time_clean) + + if not match: + # 如果无法解析,尝试直接转换为数字(默认秒) + try: + value = float(time_str) + debug_print(f"✅ 时间解析成功: {time_str} → {value}s(无单位,默认秒)⏰") + return value + except ValueError: + debug_print(f"❌ 无法解析时间: '{time_str}',使用默认值180s (3分钟) 😅") + return 180.0 + + value = float(match.group(1)) + unit = match.group(2) or 's' # 默认单位为秒 + + # 转换为秒 + if unit in ['min', 'minute']: + time_sec = value * 60.0 # min -> s + debug_print(f"🕐 时间转换: {value} 分钟 → {time_sec}s ⏰") + elif unit in ['h', 'hr', 'hour']: + time_sec = value * 3600.0 # h -> s + debug_print(f"🕐 时间转换: {value} 小时 → {time_sec}s ({time_sec/60:.1f}分钟) ⏰") + elif unit in ['d', 'day']: + time_sec = value * 86400.0 # d -> s + debug_print(f"🕐 时间转换: {value} 天 → {time_sec}s ({time_sec/3600:.1f}小时) ⏰") + else: # s, sec, second 或默认 + time_sec = value # 已经是s + debug_print(f"🕐 时间转换: {value}s → {time_sec}s (已是秒) ⏰") + + return time_sec +def find_rotavap_device(G: nx.DiGraph, vessel: str = None) -> Optional[str]: + """ + 在组态图中查找旋转蒸发仪设备 + + Args: + G: 设备图 + vessel: 指定的设备名称(可选) + + Returns: + str: 找到的旋转蒸发仪设备ID,如果没找到返回None + """ + debug_print("🔍 开始查找旋转蒸发仪设备... 🌪️") + + # 如果指定了vessel,先检查是否存在且是旋转蒸发仪 + if vessel: + debug_print(f"🎯 检查指定设备: {vessel} 🔧") + if vessel in G.nodes(): + node_data = G.nodes[vessel] + node_class = node_data.get('class', '') + node_type = node_data.get('type', '') + + debug_print(f"📋 设备信息 {vessel}: class={node_class}, type={node_type}") + + # 检查是否为旋转蒸发仪 + if any(keyword in str(node_class).lower() for keyword in ['rotavap', 'rotary', 'evaporat']): + debug_print(f"🎉 找到指定的旋转蒸发仪: {vessel} ✨") + return vessel + elif node_type == 'device': + debug_print(f"✅ 指定设备存在,尝试直接使用: {vessel} 🔧") + return vessel + else: + debug_print(f"❌ 指定的设备 {vessel} 不存在 😞") + + # 在所有设备中查找旋转蒸发仪 + debug_print("🔎 在所有设备中搜索旋转蒸发仪... 🕵️‍♀️") + rotavap_candidates = [] + + for node_id, node_data in G.nodes(data=True): + node_class = node_data.get('class', '') + node_type = node_data.get('type', '') + + # 跳过非设备节点 + if node_type != 'device': + continue + + # 检查设备类型 + if any(keyword in str(node_class).lower() for keyword in ['rotavap', 'rotary', 'evaporat']): + rotavap_candidates.append(node_id) + debug_print(f"🌟 找到旋转蒸发仪候选: {node_id} (class: {node_class}) 🌪️") + elif any(keyword in str(node_id).lower() for keyword in ['rotavap', 'rotary', 'evaporat']): + rotavap_candidates.append(node_id) + debug_print(f"🌟 找到旋转蒸发仪候选 (按名称): {node_id} 🌪️") + + if rotavap_candidates: + selected = rotavap_candidates[0] # 选择第一个找到的 + debug_print(f"🎯 选择旋转蒸发仪: {selected} 🏆") + return selected + + debug_print("😭 未找到旋转蒸发仪设备 💔") + return None -def find_rotavap_device(G: nx.DiGraph) -> str: - """查找旋转蒸发仪设备""" - rotavap_nodes = [node for node in G.nodes() - if (G.nodes[node].get('class') or '') == 'virtual_rotavap'] +def find_connected_vessel(G: nx.DiGraph, rotavap_device: str) -> Optional[str]: + """ + 查找与旋转蒸发仪连接的容器 - if rotavap_nodes: - return rotavap_nodes[0] + Args: + G: 设备图 + rotavap_device: 旋转蒸发仪设备ID - raise ValueError("系统中未找到旋转蒸发仪设备") - - -def find_solvent_recovery_vessel(G: nx.DiGraph) -> str: - """查找溶剂回收容器""" - possible_names = [ - "flask_distillate", - "bottle_distillate", - "vessel_distillate", - "distillate", - "solvent_recovery", - "flask_solvent_recovery", - "collection_flask" - ] + Returns: + str: 连接的容器ID,如果没找到返回None + """ + debug_print(f"🔗 查找与 {rotavap_device} 连接的容器... 🥽") - for vessel_name in possible_names: - if vessel_name in G.nodes(): - return vessel_name + # 查看旋转蒸发仪的子设备 + rotavap_data = G.nodes[rotavap_device] + children = rotavap_data.get('children', []) - # 如果找不到专门的回收容器,使用废液容器 - waste_names = ["waste_workup", "flask_waste", "bottle_waste", "waste"] - for vessel_name in waste_names: - if vessel_name in G.nodes(): - return vessel_name + debug_print(f"👶 检查子设备: {children}") + for child_id in children: + if child_id in G.nodes(): + child_data = G.nodes[child_id] + child_type = child_data.get('type', '') + + if child_type == 'container': + debug_print(f"🎉 找到连接的容器: {child_id} 🥽✨") + return child_id - raise ValueError(f"未找到溶剂回收容器。尝试了以下名称: {possible_names + waste_names}") - + # 查看邻接的容器 + debug_print("🤝 检查邻接设备...") + for neighbor in G.neighbors(rotavap_device): + neighbor_data = G.nodes[neighbor] + neighbor_type = neighbor_data.get('type', '') + + if neighbor_type == 'container': + debug_print(f"🎉 找到邻接的容器: {neighbor} 🥽✨") + return neighbor + + debug_print("😞 未找到连接的容器 💔") + return None def generate_evaporate_protocol( G: nx.DiGraph, vessel: str, pressure: float = 0.1, temp: float = 60.0, - time: float = 1800.0, - stir_speed: float = 100.0 + time: Union[str, float] = "180", # 🔧 修改:支持字符串时间 + stir_speed: float = 100.0, + solvent: str = "", + **kwargs ) -> List[Dict[str, Any]]: """ - 生成蒸发操作的协议序列 - - 蒸发流程: - 1. 液体转移:将待蒸发溶液从源容器转移到旋转蒸发仪 - 2. 蒸发操作:执行旋转蒸发 - 3. (可选) 溶剂回收:将冷凝的溶剂转移到回收容器 - 4. 残留物转移:将浓缩物从旋转蒸发仪转移回原容器或新容器 + 生成蒸发操作的协议序列 - 支持单位 Args: - G: 有向图,节点为设备和容器,边为流体管道 - vessel: 包含待蒸发溶液的容器名称 - pressure: 蒸发时的真空度 (bar),默认0.1 bar - temp: 蒸发时的加热温度 (°C),默认60°C - time: 蒸发时间 (秒),默认1800秒(30分钟) - stir_speed: 旋转速度 (RPM),默认100 RPM + G: 设备图 + vessel: 容器名称或旋转蒸发仪名称 + pressure: 真空度 (bar),默认0.1 + temp: 加热温度 (°C),默认60 + time: 蒸发时间(支持 "3 min", "180", "0.5 h" 等) + stir_speed: 旋转速度 (RPM),默认100 + solvent: 溶剂名称(用于参数优化) + **kwargs: 其他参数(兼容性) Returns: - List[Dict[str, Any]]: 蒸发操作的动作序列 - - Raises: - ValueError: 当找不到必要的设备时抛出异常 - - Examples: - evaporate_actions = generate_evaporate_protocol(G, "reaction_mixture", 0.05, 80.0, 3600.0) + List[Dict[str, Any]]: 动作序列 """ + + debug_print("🌟" * 20) + debug_print("🌪️ 开始生成蒸发协议(支持单位)✨") + debug_print(f"📝 输入参数:") + debug_print(f" 🥽 vessel: {vessel}") + debug_print(f" 💨 pressure: {pressure} bar") + debug_print(f" 🌡️ temp: {temp}°C") + debug_print(f" ⏰ time: {time} (类型: {type(time)})") + debug_print(f" 🌪️ stir_speed: {stir_speed} RPM") + debug_print(f" 🧪 solvent: '{solvent}'") + debug_print("🌟" * 20) + + # === 步骤1: 查找旋转蒸发仪设备 === + debug_print("📍 步骤1: 查找旋转蒸发仪设备... 🔍") + + # 验证vessel参数 + if not vessel: + debug_print("❌ vessel 参数不能为空! 😱") + raise ValueError("vessel 参数不能为空") + + # 查找旋转蒸发仪设备 + rotavap_device = find_rotavap_device(G, vessel) + if not rotavap_device: + debug_print("💥 未找到旋转蒸发仪设备! 😭") + raise ValueError(f"未找到旋转蒸发仪设备。请检查组态图中是否包含 class 包含 'rotavap'、'rotary' 或 'evaporat' 的设备") + + debug_print(f"🎉 成功找到旋转蒸发仪: {rotavap_device} ✨") + + # === 步骤2: 确定目标容器 === + debug_print("📍 步骤2: 确定目标容器... 🥽") + + target_vessel = vessel + + # 如果vessel就是旋转蒸发仪设备,查找连接的容器 + if vessel == rotavap_device: + debug_print("🔄 vessel就是旋转蒸发仪,查找连接的容器...") + connected_vessel = find_connected_vessel(G, rotavap_device) + if connected_vessel: + target_vessel = connected_vessel + debug_print(f"✅ 使用连接的容器: {target_vessel} 🥽✨") + else: + debug_print(f"⚠️ 未找到连接的容器,使用设备本身: {rotavap_device} 🔧") + target_vessel = rotavap_device + elif vessel in G.nodes() and G.nodes[vessel].get('type') == 'container': + debug_print(f"✅ 使用指定的容器: {vessel} 🥽✨") + target_vessel = vessel + else: + debug_print(f"⚠️ 容器 '{vessel}' 不存在或类型不正确,使用旋转蒸发仪设备: {rotavap_device} 🔧") + target_vessel = rotavap_device + + # === 🔧 新增:步骤3:单位解析处理 === + debug_print("📍 步骤3: 单位解析处理... ⚡") + + # 解析时间 + final_time = parse_time_input(time) + debug_print(f"🎯 时间解析完成: {time} → {final_time}s ({final_time/60:.1f}分钟) ⏰✨") + + # === 步骤4: 参数验证和修正 === + debug_print("📍 步骤4: 参数验证和修正... 🔧") + + # 修正参数范围 + if pressure <= 0 or pressure > 1.0: + debug_print(f"⚠️ 真空度 {pressure} bar 超出范围,修正为 0.1 bar 💨") + pressure = 0.1 + else: + debug_print(f"✅ 真空度 {pressure} bar 在正常范围内 💨") + + if temp < 10.0 or temp > 200.0: + debug_print(f"⚠️ 温度 {temp}°C 超出范围,修正为 60°C 🌡️") + temp = 60.0 + else: + debug_print(f"✅ 温度 {temp}°C 在正常范围内 🌡️") + + if final_time <= 0: + debug_print(f"⚠️ 时间 {final_time}s 无效,修正为 180s (3分钟) ⏰") + final_time = 180.0 + else: + debug_print(f"✅ 时间 {final_time}s ({final_time/60:.1f}分钟) 有效 ⏰") + + if stir_speed < 10.0 or stir_speed > 300.0: + debug_print(f"⚠️ 旋转速度 {stir_speed} RPM 超出范围,修正为 100 RPM 🌪️") + stir_speed = 100.0 + else: + debug_print(f"✅ 旋转速度 {stir_speed} RPM 在正常范围内 🌪️") + + # 根据溶剂优化参数 + if solvent: + debug_print(f"🧪 根据溶剂 '{solvent}' 优化参数... 🔬") + solvent_lower = solvent.lower() + + if any(s in solvent_lower for s in ['water', 'aqueous', 'h2o']): + temp = max(temp, 80.0) + pressure = max(pressure, 0.2) + debug_print("💧 水系溶剂:提高温度和真空度 🌡️💨") + elif any(s in solvent_lower for s in ['ethanol', 'methanol', 'acetone']): + temp = min(temp, 50.0) + pressure = min(pressure, 0.05) + debug_print("🍺 易挥发溶剂:降低温度和真空度 🌡️💨") + elif any(s in solvent_lower for s in ['dmso', 'dmi', 'toluene']): + temp = max(temp, 100.0) + pressure = min(pressure, 0.01) + debug_print("🔥 高沸点溶剂:提高温度,降低真空度 🌡️💨") + else: + debug_print("🧪 通用溶剂,使用标准参数 ✨") + else: + debug_print("🤷‍♀️ 未指定溶剂,使用默认参数 ✨") + + debug_print(f"🎯 最终参数: pressure={pressure} bar 💨, temp={temp}°C 🌡️, time={final_time}s ⏰, stir_speed={stir_speed} RPM 🌪️") + + # === 步骤5: 生成动作序列 === + debug_print("📍 步骤5: 生成动作序列... 🎬") + action_sequence = [] - print(f"EVAPORATE: 开始生成蒸发协议") - print(f" - 源容器: {vessel}") - print(f" - 真空度: {pressure} bar") - print(f" - 温度: {temp}°C") - print(f" - 时间: {time}s ({time/60:.1f}分钟)") - print(f" - 旋转速度: {stir_speed} RPM") - - # 验证源容器存在 - if vessel not in G.nodes(): - raise ValueError(f"源容器 '{vessel}' 不存在于系统中") - - # 获取源容器中的液体体积 - source_volume = get_vessel_liquid_volume(G, vessel) - print(f"EVAPORATE: 源容器 {vessel} 中有 {source_volume} mL 液体") - - # 查找旋转蒸发仪 - try: - rotavap_id = find_rotavap_device(G) - print(f"EVAPORATE: 找到旋转蒸发仪: {rotavap_id}") - except ValueError as e: - raise ValueError(f"无法找到旋转蒸发仪: {str(e)}") - - # 查找旋转蒸发仪样品容器 - rotavap_vessel = None - possible_rotavap_vessels = ["rotavap_flask", "rotavap", "flask_rotavap", "evaporation_flask"] - for rv in possible_rotavap_vessels: - if rv in G.nodes(): - rotavap_vessel = rv - break - - if not rotavap_vessel: - raise ValueError(f"未找到旋转蒸发仪样品容器。尝试了: {possible_rotavap_vessels}") - - print(f"EVAPORATE: 找到旋转蒸发仪样品容器: {rotavap_vessel}") - - # 查找溶剂回收容器 - try: - distillate_vessel = find_solvent_recovery_vessel(G) - print(f"EVAPORATE: 找到溶剂回收容器: {distillate_vessel}") - except ValueError as e: - print(f"EVAPORATE: 警告 - {str(e)}") - distillate_vessel = None - - # === 简化的体积计算策略 === - if source_volume > 0: - # 如果能检测到液体体积,使用实际体积的大部分 - transfer_volume = min(source_volume * 0.9, 250.0) # 90%或最多250mL - print(f"EVAPORATE: 检测到液体体积,将转移 {transfer_volume} mL") - else: - # 如果检测不到液体体积,默认转移一整瓶 250mL - transfer_volume = 250.0 - print(f"EVAPORATE: 未检测到液体体积,默认转移整瓶 {transfer_volume} mL") - - # === 第一步:将待蒸发溶液转移到旋转蒸发仪 === - print(f"EVAPORATE: 将 {transfer_volume} mL 溶液从 {vessel} 转移到 {rotavap_vessel}") - try: - transfer_to_rotavap_actions = generate_pump_protocol( - G=G, - from_vessel=vessel, - to_vessel=rotavap_vessel, - volume=transfer_volume, - flowrate=2.0, - transfer_flowrate=2.0 - ) - action_sequence.extend(transfer_to_rotavap_actions) - except Exception as e: - raise ValueError(f"无法将溶液转移到旋转蒸发仪: {str(e)}") - - # 转移后等待 - wait_action = { + # 1. 等待稳定 + debug_print(" 🔄 动作1: 添加初始等待稳定... ⏳") + action_sequence.append({ "action_name": "wait", "action_kwargs": {"time": 10} - } - action_sequence.append(wait_action) + }) + debug_print(" ✅ 初始等待动作已添加 ⏳✨") + + # 2. 执行蒸发 + debug_print(f" 🌪️ 动作2: 执行蒸发操作...") + debug_print(f" 🔧 设备: {rotavap_device}") + debug_print(f" 🥽 容器: {target_vessel}") + debug_print(f" 💨 真空度: {pressure} bar") + debug_print(f" 🌡️ 温度: {temp}°C") + debug_print(f" ⏰ 时间: {final_time}s ({final_time/60:.1f}分钟)") + debug_print(f" 🌪️ 旋转速度: {stir_speed} RPM") - # === 第二步:执行旋转蒸发 === - print(f"EVAPORATE: 执行旋转蒸发操作") evaporate_action = { - "device_id": rotavap_id, + "device_id": rotavap_device, "action_name": "evaporate", "action_kwargs": { - "vessel": rotavap_vessel, + "vessel": target_vessel, "pressure": pressure, "temp": temp, - "time": time, - "stir_speed": stir_speed + "time": final_time, + "stir_speed": stir_speed, + "solvent": solvent } } action_sequence.append(evaporate_action) + debug_print(" ✅ 蒸发动作已添加 🌪️✨") - # 蒸发后等待系统稳定 - wait_action = { + # 3. 蒸发后等待 + debug_print(" 🔄 动作3: 添加蒸发后等待... ⏳") + action_sequence.append({ "action_name": "wait", - "action_kwargs": {"time": 30} - } - action_sequence.append(wait_action) + "action_kwargs": {"time": 10} + }) + debug_print(" ✅ 蒸发后等待动作已添加 ⏳✨") - # === 第三步:溶剂回收(如果有回收容器)=== - if distillate_vessel: - print(f"EVAPORATE: 回收冷凝溶剂到 {distillate_vessel}") - try: - condenser_vessel = "rotavap_condenser" - if condenser_vessel in G.nodes(): - # 估算回收体积(约为转移体积的70% - 大部分溶剂被蒸发回收) - recovery_volume = transfer_volume * 0.7 - print(f"EVAPORATE: 预计回收 {recovery_volume} mL 溶剂") - - recovery_actions = generate_pump_protocol( - G=G, - from_vessel=condenser_vessel, - to_vessel=distillate_vessel, - volume=recovery_volume, - flowrate=3.0, - transfer_flowrate=3.0 - ) - action_sequence.extend(recovery_actions) - else: - print("EVAPORATE: 未找到冷凝器容器,跳过溶剂回收") - except Exception as e: - print(f"EVAPORATE: 溶剂回收失败: {str(e)}") - - # === 第四步:将浓缩物转移回原容器 === - print(f"EVAPORATE: 将浓缩物从旋转蒸发仪转移回 {vessel}") - try: - # 估算浓缩物体积(约为转移体积的20% - 大部分溶剂已蒸发) - concentrate_volume = transfer_volume * 0.2 - print(f"EVAPORATE: 预计浓缩物体积 {concentrate_volume} mL") - - transfer_back_actions = generate_pump_protocol( - G=G, - from_vessel=rotavap_vessel, - to_vessel=vessel, - volume=concentrate_volume, - flowrate=1.0, # 浓缩物可能粘稠,用较慢流速 - transfer_flowrate=1.0 - ) - action_sequence.extend(transfer_back_actions) - except Exception as e: - print(f"EVAPORATE: 将浓缩物转移回容器失败: {str(e)}") - - # === 第五步:清洗旋转蒸发仪 === - print(f"EVAPORATE: 清洗旋转蒸发仪") - try: - # 查找清洗溶剂 - cleaning_solvent = None - for solvent in ["flask_ethanol", "flask_acetone", "flask_water"]: - if solvent in G.nodes(): - cleaning_solvent = solvent - break - - if cleaning_solvent and distillate_vessel: - # 用固定量溶剂清洗(不依赖检测体积) - cleaning_volume = 50.0 # 固定50mL清洗 - print(f"EVAPORATE: 用 {cleaning_volume} mL {cleaning_solvent} 清洗") - - # 清洗溶剂加入 - cleaning_actions = generate_pump_protocol( - G=G, - from_vessel=cleaning_solvent, - to_vessel=rotavap_vessel, - volume=cleaning_volume, - flowrate=2.0, - transfer_flowrate=2.0 - ) - action_sequence.extend(cleaning_actions) - - # 将清洗液转移到废液/回收容器 - waste_actions = generate_pump_protocol( - G=G, - from_vessel=rotavap_vessel, - to_vessel=distillate_vessel, # 使用回收容器作为废液 - volume=cleaning_volume, - flowrate=2.0, - transfer_flowrate=2.0 - ) - action_sequence.extend(waste_actions) - - except Exception as e: - print(f"EVAPORATE: 清洗步骤失败: {str(e)}") - - print(f"EVAPORATE: 生成了 {len(action_sequence)} 个动作") - print(f"EVAPORATE: 蒸发协议生成完成") - print(f"EVAPORATE: 总处理体积: {transfer_volume} mL") + # === 总结 === + debug_print("🎊" * 20) + debug_print(f"🎉 蒸发协议生成完成! ✨") + debug_print(f"📊 总动作数: {len(action_sequence)} 个 📝") + debug_print(f"🌪️ 旋转蒸发仪: {rotavap_device} 🔧") + debug_print(f"🥽 目标容器: {target_vessel} 🧪") + debug_print(f"⚙️ 蒸发参数: {pressure} bar 💨, {temp}°C 🌡️, {final_time}s ⏰, {stir_speed} RPM 🌪️") + debug_print(f"⏱️ 预计总时间: {(final_time + 20)/60:.1f} 分钟 ⌛") + debug_print("🎊" * 20) return action_sequence - - -# 便捷函数:常用蒸发方案 - 都使用250mL标准瓶体积 -def generate_quick_evaporate_protocol( - G: nx.DiGraph, - vessel: str, - temp: float = 40.0, - time: float = 900.0 # 15分钟 -) -> List[Dict[str, Any]]: - """快速蒸发:低温、短时间、整瓶处理""" - return generate_evaporate_protocol(G, vessel, 0.2, temp, time, 80.0) - - -def generate_gentle_evaporate_protocol( - G: nx.DiGraph, - vessel: str, - temp: float = 50.0, - time: float = 2700.0 # 45分钟 -) -> List[Dict[str, Any]]: - """温和蒸发:中等条件、较长时间、整瓶处理""" - return generate_evaporate_protocol(G, vessel, 0.1, temp, time, 60.0) - - -def generate_high_vacuum_evaporate_protocol( - G: nx.DiGraph, - vessel: str, - temp: float = 35.0, - time: float = 3600.0 # 1小时 -) -> List[Dict[str, Any]]: - """高真空蒸发:低温、高真空、长时间、整瓶处理""" - return generate_evaporate_protocol(G, vessel, 0.01, temp, time, 120.0) - - -def generate_standard_evaporate_protocol( - G: nx.DiGraph, - vessel: str -) -> List[Dict[str, Any]]: - """标准蒸发:常用参数、整瓶250mL处理""" - return generate_evaporate_protocol( - G=G, - vessel=vessel, - pressure=0.1, # 标准真空度 - temp=60.0, # 适中温度 - time=1800.0, # 30分钟 - stir_speed=100.0 # 适中旋转速度 - ) diff --git a/unilabos/compile/filter_protocol.py b/unilabos/compile/filter_protocol.py index 7e3ca6b..d974a41 100644 --- a/unilabos/compile/filter_protocol.py +++ b/unilabos/compile/filter_protocol.py @@ -1,304 +1,236 @@ -from typing import List, Dict, Any +from typing import List, Dict, Any, Optional import networkx as nx -from .pump_protocol import generate_pump_protocol +import logging +from .pump_protocol import generate_pump_protocol_with_rinsing +logger = logging.getLogger(__name__) -def get_vessel_liquid_volume(G: nx.DiGraph, vessel: str) -> float: - """获取容器中的液体体积""" - if vessel not in G.nodes(): - return 0.0 - - vessel_data = G.nodes[vessel].get('data', {}) - liquids = vessel_data.get('liquid', []) - - total_volume = 0.0 - for liquid in liquids: - if isinstance(liquid, dict) and 'liquid_volume' in liquid: - total_volume += liquid['liquid_volume'] - - return total_volume - +def debug_print(message): + """调试输出""" + print(f"🧪 [FILTER] {message}", flush=True) + logger.info(f"[FILTER] {message}") def find_filter_device(G: nx.DiGraph) -> str: """查找过滤器设备""" - filter_nodes = [node for node in G.nodes() - if (G.nodes[node].get('class') or '') == 'virtual_filter'] + debug_print("🔍 查找过滤器设备... 🌊") - if filter_nodes: - return filter_nodes[0] + # 查找过滤器设备 + for node in G.nodes(): + node_data = G.nodes[node] + node_class = node_data.get('class', '') or '' + + if 'filter' in node_class.lower() or 'filter' in node.lower(): + debug_print(f"🎉 找到过滤器设备: {node} ✨") + return node - raise ValueError("系统中未找到过滤器设备") + # 如果没找到,寻找可能的过滤器名称 + debug_print("🔎 在预定义名称中搜索过滤器... 📋") + possible_names = ["filter", "filter_1", "virtual_filter", "filtration_unit"] + for name in possible_names: + if name in G.nodes(): + debug_print(f"🎉 找到过滤器设备: {name} ✨") + return name + + debug_print("😭 未找到过滤器设备 💔") + raise ValueError("未找到过滤器设备") - -def find_filter_vessel(G: nx.DiGraph) -> str: - """查找过滤器专用容器""" - possible_names = [ - "filter_vessel", # 标准过滤器容器 - "filtration_vessel", # 备选名称 - "vessel_filter", # 备选名称 - "filter_unit", # 备选名称 - "filter" # 简单名称 - ] +def validate_vessel(G: nx.DiGraph, vessel: str, vessel_type: str = "容器") -> None: + """验证容器是否存在""" + debug_print(f"🔍 验证{vessel_type}: '{vessel}' 🧪") - for vessel_name in possible_names: - if vessel_name in G.nodes(): - return vessel_name + if not vessel: + debug_print(f"❌ {vessel_type}不能为空! 😱") + raise ValueError(f"{vessel_type}不能为空") - raise ValueError(f"未找到过滤器容器。尝试了以下名称: {possible_names}") - - -def find_filtrate_vessel(G: nx.DiGraph, filtrate_vessel: str = "") -> str: - """查找滤液收集容器""" - if filtrate_vessel and filtrate_vessel in G.nodes(): - return filtrate_vessel + if vessel not in G.nodes(): + debug_print(f"❌ {vessel_type} '{vessel}' 不存在于系统中! 😞") + raise ValueError(f"{vessel_type} '{vessel}' 不存在于系统中") - # 自动查找滤液容器 - possible_names = [ - "filtrate_vessel", - "collection_bottle_1", - "collection_bottle_2", - "waste_workup" - ] - - for vessel_name in possible_names: - if vessel_name in G.nodes(): - return vessel_name - - raise ValueError(f"未找到滤液收集容器。尝试了以下名称: {possible_names}") - - -def find_connected_heatchill(G: nx.DiGraph, vessel: str) -> str: - """查找与指定容器相连的加热搅拌器""" - # 查找所有加热搅拌器节点 - heatchill_nodes = [node for node in G.nodes() - if G.nodes[node].get('class') == 'virtual_heatchill'] - - # 检查哪个加热器与目标容器相连 - for heatchill in heatchill_nodes: - if G.has_edge(heatchill, vessel) or G.has_edge(vessel, heatchill): - return heatchill - - # 如果没有直接连接,返回第一个可用的加热器 - if heatchill_nodes: - return heatchill_nodes[0] - - raise ValueError(f"未找到与容器 {vessel} 相连的加热搅拌器") - + debug_print(f"✅ {vessel_type} '{vessel}' 验证通过 🎯") def generate_filter_protocol( G: nx.DiGraph, vessel: str, filtrate_vessel: str = "", - stir: bool = False, - stir_speed: float = 300.0, - temp: float = 25.0, - continue_heatchill: bool = False, - volume: float = 0.0 + **kwargs ) -> List[Dict[str, Any]]: """ - 生成过滤操作的协议序列,复用 pump_protocol 的成熟算法 - - 过滤流程: - 1. 液体转移:将待过滤溶液从源容器转移到过滤器 - 2. 启动加热搅拌:设置温度和搅拌 - 3. 执行过滤:通过过滤器分离固液 - 4. (可选) 继续或停止加热搅拌 + 生成过滤操作的协议序列 Args: - G: 有向图,节点为设备和容器,边为流体管道 - vessel: 包含待过滤溶液的容器名称 - filtrate_vessel: 滤液收集容器(可选,自动查找) - stir: 是否在过滤过程中搅拌 - stir_speed: 搅拌速度 (RPM) - temp: 过滤温度 (°C) - continue_heatchill: 过滤后是否继续加热搅拌 - volume: 预期过滤体积 (mL),0表示全部过滤 + G: 设备图 + vessel: 过滤容器名称(必需)- 包含需要过滤的混合物 + filtrate_vessel: 滤液容器名称(可选)- 如果提供则收集滤液 + **kwargs: 其他参数(兼容性) Returns: List[Dict[str, Any]]: 过滤操作的动作序列 """ + + debug_print("🌊" * 20) + debug_print("🚀 开始生成过滤协议 ✨") + debug_print(f"📝 输入参数:") + debug_print(f" 🥽 vessel: {vessel}") + debug_print(f" 🧪 filtrate_vessel: {filtrate_vessel}") + debug_print(f" ⚙️ 其他参数: {kwargs}") + debug_print("🌊" * 20) + action_sequence = [] - print(f"FILTER: 开始生成过滤协议") - print(f" - 源容器: {vessel}") - print(f" - 滤液容器: {filtrate_vessel}") - print(f" - 搅拌: {stir} ({stir_speed} RPM)" if stir else " - 搅拌: 否") - print(f" - 过滤温度: {temp}°C") - print(f" - 预期过滤体积: {volume} mL" if volume > 0 else " - 预期过滤体积: 全部") - print(f" - 继续加热搅拌: {continue_heatchill}") + # === 参数验证 === + debug_print("📍 步骤1: 参数验证... 🔧") - # 验证源容器存在 - if vessel not in G.nodes(): - raise ValueError(f"源容器 '{vessel}' 不存在于系统中") + # 验证必需参数 + debug_print(" 🔍 验证必需参数...") + validate_vessel(G, vessel, "过滤容器") + debug_print(" ✅ 必需参数验证完成 🎯") - # 获取源容器中的液体体积 - source_volume = get_vessel_liquid_volume(G, vessel) - print(f"FILTER: 源容器 {vessel} 中有 {source_volume} mL 液体") - - # 查找过滤器设备 - try: - filter_id = find_filter_device(G) - print(f"FILTER: 找到过滤器: {filter_id}") - except ValueError as e: - raise ValueError(f"无法找到过滤器: {str(e)}") - - # 查找过滤器容器 - try: - filter_vessel_id = find_filter_vessel(G) - print(f"FILTER: 找到过滤器容器: {filter_vessel_id}") - except ValueError as e: - raise ValueError(f"无法找到过滤器容器: {str(e)}") - - # 查找滤液收集容器 - try: - actual_filtrate_vessel = find_filtrate_vessel(G, filtrate_vessel) - print(f"FILTER: 找到滤液收集容器: {actual_filtrate_vessel}") - except ValueError as e: - raise ValueError(f"无法找到滤液收集容器: {str(e)}") - - # 查找加热搅拌器(如果需要温度控制或搅拌) - heatchill_id = None - if temp != 25.0 or stir or continue_heatchill: - try: - heatchill_id = find_connected_heatchill(G, filter_vessel_id) - print(f"FILTER: 找到加热搅拌器: {heatchill_id}") - except ValueError as e: - print(f"FILTER: 警告 - {str(e)}") - - # === 简化的体积计算策略 === - if volume > 0: - transfer_volume = min(volume, source_volume if source_volume > 0 else volume) - print(f"FILTER: 指定过滤体积 {transfer_volume} mL") - elif source_volume > 0: - transfer_volume = source_volume * 0.9 # 90% - print(f"FILTER: 检测到液体体积,将过滤 {transfer_volume} mL") + # 验证可选参数 + debug_print(" 🔍 验证可选参数...") + if filtrate_vessel: + validate_vessel(G, filtrate_vessel, "滤液容器") + debug_print(" 🌊 模式: 过滤并收集滤液 💧") else: - transfer_volume = 50.0 # 默认过滤量 - print(f"FILTER: 未检测到液体体积,默认过滤 {transfer_volume} mL") + debug_print(" 🧱 模式: 过滤并收集固体 🔬") + debug_print(" ✅ 可选参数验证完成 🎯") - # === 第一步:启动加热搅拌器(在转移前预热) === - if heatchill_id and (temp != 25.0 or stir): - print(f"FILTER: 启动加热搅拌器,温度: {temp}°C,搅拌: {stir}") - - heatchill_action = { - "device_id": heatchill_id, - "action_name": "heat_chill_start", - "action_kwargs": { - "vessel": filter_vessel_id, - "temp": temp, - "purpose": f"过滤过程温度控制和搅拌" - } - } - action_sequence.append(heatchill_action) - - # 等待温度稳定 - if temp != 25.0: - wait_time = min(30, abs(temp - 25.0) * 1.0) # 根据温差估算预热时间 - action_sequence.append({ - "action_name": "wait", - "action_kwargs": {"time": wait_time} - }) + # === 查找设备 === + debug_print("📍 步骤2: 查找设备... 🔍") - # === 第二步:将待过滤溶液转移到过滤器 === - print(f"FILTER: 将 {transfer_volume} mL 溶液从 {vessel} 转移到 {filter_vessel_id}") try: - # 使用成熟的 pump_protocol 算法进行液体转移 - transfer_to_filter_actions = generate_pump_protocol( - G=G, - from_vessel=vessel, - to_vessel=filter_vessel_id, - volume=transfer_volume, - flowrate=1.0, # 过滤转移用较慢速度,避免扰动 - transfer_flowrate=1.5 - ) - action_sequence.extend(transfer_to_filter_actions) + debug_print(" 🔎 搜索过滤器设备...") + filter_device = find_filter_device(G) + debug_print(f" 🎉 使用过滤器设备: {filter_device} 🌊✨") + except Exception as e: - raise ValueError(f"无法将溶液转移到过滤器: {str(e)}") + debug_print(f" ❌ 设备查找失败: {str(e)} 😭") + raise ValueError(f"设备查找失败: {str(e)}") - # 转移后等待 - action_sequence.append({ - "action_name": "wait", - "action_kwargs": {"time": 5} - }) + # === 转移到过滤器(如果需要)=== + debug_print("📍 步骤3: 转移到过滤器... 🚚") - # === 第三步:执行过滤操作(完全按照 Filter.action 参数) === - print(f"FILTER: 执行过滤操作") + if vessel != filter_device: + debug_print(f" 🚛 需要转移: {vessel} → {filter_device} 📦") + + try: + debug_print(" 🔄 开始执行转移操作...") + # 使用pump protocol转移液体到过滤器 + transfer_actions = generate_pump_protocol_with_rinsing( + G=G, + from_vessel=vessel, + to_vessel=filter_device, + volume=0.0, # 转移所有液体 + amount="", + time=0.0, + viscous=False, + rinsing_solvent="", + rinsing_volume=0.0, + rinsing_repeats=0, + solid=False, + flowrate=2.0, + transfer_flowrate=2.0 + ) + + if transfer_actions: + action_sequence.extend(transfer_actions) + debug_print(f" ✅ 添加了 {len(transfer_actions)} 个转移动作 🚚✨") + else: + debug_print(" ⚠️ 转移协议返回空序列 🤔") + + except Exception as e: + debug_print(f" ❌ 转移失败: {str(e)} 😞") + debug_print(" 🔄 继续执行,可能是直接连接的过滤器 🤞") + else: + debug_print(" ✅ 过滤容器就是过滤器,无需转移 🎯") + + # === 执行过滤操作 === + debug_print("📍 步骤4: 执行过滤操作... 🌊") + + # 构建过滤动作参数 + debug_print(" ⚙️ 构建过滤参数...") + filter_kwargs = { + "vessel": filter_device, # 过滤器设备 + "filtrate_vessel": filtrate_vessel, # 滤液容器(可能为空) + "stir": kwargs.get("stir", False), + "stir_speed": kwargs.get("stir_speed", 0.0), + "temp": kwargs.get("temp", 25.0), + "continue_heatchill": kwargs.get("continue_heatchill", False), + "volume": kwargs.get("volume", 0.0) # 0表示过滤所有 + } + + debug_print(f" 📋 过滤参数: {filter_kwargs}") + debug_print(" 🌊 开始过滤操作...") + + # 过滤动作 filter_action = { - "device_id": filter_id, + "device_id": filter_device, "action_name": "filter", - "action_kwargs": { - "vessel": filter_vessel_id, - "filtrate_vessel": actual_filtrate_vessel, - "stir": stir, - "stir_speed": stir_speed, - "temp": temp, - "continue_heatchill": continue_heatchill, - "volume": transfer_volume - } + "action_kwargs": filter_kwargs } action_sequence.append(filter_action) + debug_print(" ✅ 过滤动作已添加 🌊✨") # 过滤后等待 + debug_print(" ⏳ 添加过滤后等待...") action_sequence.append({ "action_name": "wait", - "action_kwargs": {"time": 10} + "action_kwargs": {"time": 10.0} }) + debug_print(" ✅ 过滤后等待动作已添加 ⏰✨") - # === 第四步:如果不继续加热搅拌,停止加热器 === - if heatchill_id and not continue_heatchill and (temp != 25.0 or stir): - print(f"FILTER: 停止加热搅拌器") + # === 收集滤液(如果需要)=== + debug_print("📍 步骤5: 收集滤液... 💧") + + if filtrate_vessel: + debug_print(f" 🧪 收集滤液: {filter_device} → {filtrate_vessel} 💧") - stop_action = { - "device_id": heatchill_id, - "action_name": "heat_chill_stop", - "action_kwargs": { - "vessel": filter_vessel_id - } - } - action_sequence.append(stop_action) + try: + debug_print(" 🔄 开始执行收集操作...") + # 使用pump protocol收集滤液 + collect_actions = generate_pump_protocol_with_rinsing( + G=G, + from_vessel=filter_device, + to_vessel=filtrate_vessel, + volume=0.0, # 收集所有滤液 + amount="", + time=0.0, + viscous=False, + rinsing_solvent="", + rinsing_volume=0.0, + rinsing_repeats=0, + solid=False, + flowrate=2.0, + transfer_flowrate=2.0 + ) + + if collect_actions: + action_sequence.extend(collect_actions) + debug_print(f" ✅ 添加了 {len(collect_actions)} 个收集动作 🧪✨") + else: + debug_print(" ⚠️ 收集协议返回空序列 🤔") + + except Exception as e: + debug_print(f" ❌ 收集滤液失败: {str(e)} 😞") + debug_print(" 🔄 继续执行,可能滤液直接流入指定容器 🤞") + else: + debug_print(" 🧱 未指定滤液容器,固体保留在过滤器中 🔬") - print(f"FILTER: 生成了 {len(action_sequence)} 个动作") - print(f"FILTER: 过滤协议生成完成") + # === 最终等待 === + debug_print("📍 步骤6: 最终等待... ⏰") + action_sequence.append({ + "action_name": "wait", + "action_kwargs": {"time": 5.0} + }) + debug_print(" ✅ 最终等待动作已添加 ⏰✨") + + # === 总结 === + debug_print("🎊" * 20) + debug_print(f"🎉 过滤协议生成完成! ✨") + debug_print(f"📊 总动作数: {len(action_sequence)} 个 📝") + debug_print(f"🥽 过滤容器: {vessel} 🧪") + debug_print(f"🌊 过滤器设备: {filter_device} 🔧") + debug_print(f"💧 滤液容器: {filtrate_vessel or '无(保留固体)'} 🧱") + debug_print(f"⏱️ 预计总时间: {(len(action_sequence) * 5):.0f} 秒 ⌛") + debug_print("🎊" * 20) return action_sequence - - -# 便捷函数:常用过滤方案 -def generate_gravity_filter_protocol( - G: nx.DiGraph, - vessel: str, - filtrate_vessel: str = "" -) -> List[Dict[str, Any]]: - """重力过滤:室温,无搅拌""" - return generate_filter_protocol(G, vessel, filtrate_vessel, False, 0.0, 25.0, False, 0.0) - - -def generate_hot_filter_protocol( - G: nx.DiGraph, - vessel: str, - filtrate_vessel: str = "", - temp: float = 60.0 -) -> List[Dict[str, Any]]: - """热过滤:高温过滤,防止结晶析出""" - return generate_filter_protocol(G, vessel, filtrate_vessel, False, 0.0, temp, False, 0.0) - - -def generate_stirred_filter_protocol( - G: nx.DiGraph, - vessel: str, - filtrate_vessel: str = "", - stir_speed: float = 200.0 -) -> List[Dict[str, Any]]: - """搅拌过滤:低速搅拌,防止滤饼堵塞""" - return generate_filter_protocol(G, vessel, filtrate_vessel, True, stir_speed, 25.0, False, 0.0) - - -def generate_hot_stirred_filter_protocol( - G: nx.DiGraph, - vessel: str, - filtrate_vessel: str = "", - temp: float = 60.0, - stir_speed: float = 300.0 -) -> List[Dict[str, Any]]: - """热搅拌过滤:高温搅拌过滤""" - return generate_filter_protocol(G, vessel, filtrate_vessel, True, stir_speed, temp, False, 0.0) \ No newline at end of file diff --git a/unilabos/compile/heatchill_protocol.py b/unilabos/compile/heatchill_protocol.py index 5ce0992..f8bcc11 100644 --- a/unilabos/compile/heatchill_protocol.py +++ b/unilabos/compile/heatchill_protocol.py @@ -1,373 +1,376 @@ -from typing import List, Dict, Any, Optional +from typing import List, Dict, Any, Union import networkx as nx +import logging +import re +logger = logging.getLogger(__name__) + +def debug_print(message): + """调试输出""" + print(f"🌡️ [HEATCHILL] {message}", flush=True) + logger.info(f"[HEATCHILL] {message}") + +def parse_time_input(time_input: Union[str, float, int]) -> float: + """ + 解析时间输入(统一函数) + + Args: + time_input: 时间输入(如 "30 min", "1 h", "300", "?", 60.0) + + Returns: + float: 时间(秒) + """ + if not time_input: + return 300.0 + + # 🔢 处理数值输入 + if isinstance(time_input, (int, float)): + result = float(time_input) + debug_print(f"⏰ 数值时间: {time_input} → {result}s") + return result + + # 📝 处理字符串输入 + time_str = str(time_input).lower().strip() + debug_print(f"🔍 解析时间: '{time_str}'") + + # ❓ 特殊值处理 + special_times = { + '?': 300.0, 'unknown': 300.0, 'tbd': 300.0, + 'overnight': 43200.0, 'several hours': 10800.0, + 'few hours': 7200.0, 'long time': 3600.0, 'short time': 300.0 + } + + if time_str in special_times: + result = special_times[time_str] + debug_print(f"🎯 特殊时间: '{time_str}' → {result}s ({result/60:.1f}分钟)") + return result + + # 🔢 纯数字处理 + try: + result = float(time_str) + debug_print(f"⏰ 纯数字: {time_str} → {result}s") + return result + except ValueError: + pass + + # 📐 正则表达式解析 + pattern = r'(\d+\.?\d*)\s*([a-z]*)' + match = re.match(pattern, time_str) + + if not match: + debug_print(f"⚠️ 无法解析时间: '{time_str}',使用默认值: 300s") + return 300.0 + + value = float(match.group(1)) + unit = match.group(2) or 's' + + # 📏 单位转换 + unit_multipliers = { + 's': 1.0, 'sec': 1.0, 'second': 1.0, 'seconds': 1.0, + 'm': 60.0, 'min': 60.0, 'mins': 60.0, 'minute': 60.0, 'minutes': 60.0, + 'h': 3600.0, 'hr': 3600.0, 'hrs': 3600.0, 'hour': 3600.0, 'hours': 3600.0, + 'd': 86400.0, 'day': 86400.0, 'days': 86400.0 + } + + multiplier = unit_multipliers.get(unit, 1.0) + result = value * multiplier + + debug_print(f"✅ 时间解析: '{time_str}' → {value} {unit} → {result}s ({result/60:.1f}分钟)") + return result + +def parse_temp_input(temp_input: Union[str, float], default_temp: float = 25.0) -> float: + """ + 解析温度输入(统一函数) + + Args: + temp_input: 温度输入 + default_temp: 默认温度 + + Returns: + float: 温度(°C) + """ + if not temp_input: + return default_temp + + # 🔢 数值输入 + if isinstance(temp_input, (int, float)): + result = float(temp_input) + debug_print(f"🌡️ 数值温度: {temp_input} → {result}°C") + return result + + # 📝 字符串输入 + temp_str = str(temp_input).lower().strip() + debug_print(f"🔍 解析温度: '{temp_str}'") + + # 🎯 特殊温度 + special_temps = { + "room temperature": 25.0, "reflux": 78.0, "ice bath": 0.0, + "boiling": 100.0, "hot": 60.0, "warm": 40.0, "cold": 10.0 + } + + if temp_str in special_temps: + result = special_temps[temp_str] + debug_print(f"🎯 特殊温度: '{temp_str}' → {result}°C") + return result + + # 📐 正则解析(如 "256 °C") + temp_pattern = r'(\d+(?:\.\d+)?)\s*°?[cf]?' + match = re.search(temp_pattern, temp_str) + + if match: + result = float(match.group(1)) + debug_print(f"✅ 温度解析: '{temp_str}' → {result}°C") + return result + + debug_print(f"⚠️ 无法解析温度: '{temp_str}',使用默认值: {default_temp}°C") + return default_temp def find_connected_heatchill(G: nx.DiGraph, vessel: str) -> str: - """ - 查找与指定容器相连的加热/冷却设备 - """ - # 查找所有加热/冷却设备节点 - heatchill_nodes = [node for node in G.nodes() - if (G.nodes[node].get('class') or '') == 'virtual_heatchill'] + """查找与指定容器相连的加热/冷却设备""" + debug_print(f"🔍 查找加热设备,目标容器: {vessel}") - # 检查哪个加热/冷却设备与目标容器相连(机械连接) - for heatchill in heatchill_nodes: - if G.has_edge(heatchill, vessel) or G.has_edge(vessel, heatchill): - return heatchill + # 🔧 查找所有加热设备 + heatchill_nodes = [] + for node in G.nodes(): + node_data = G.nodes[node] + node_class = node_data.get('class', '') or '' + + if 'heatchill' in node_class.lower() or 'virtual_heatchill' in node_class: + heatchill_nodes.append(node) + debug_print(f"🎉 找到加热设备: {node}") - # 如果没有直接连接,返回第一个可用的加热/冷却设备 + # 🔗 检查连接 + if vessel and heatchill_nodes: + for heatchill in heatchill_nodes: + if G.has_edge(heatchill, vessel) or G.has_edge(vessel, heatchill): + debug_print(f"✅ 加热设备 '{heatchill}' 与容器 '{vessel}' 相连") + return heatchill + + # 🎯 使用第一个可用设备 if heatchill_nodes: - return heatchill_nodes[0] + selected = heatchill_nodes[0] + debug_print(f"🔧 使用第一个加热设备: {selected}") + return selected - raise ValueError("系统中未找到可用的加热/冷却设备") + # 🆘 默认设备 + debug_print("⚠️ 未找到加热设备,使用默认设备") + return "heatchill_1" +def validate_and_fix_params(temp: float, time: float, stir_speed: float) -> tuple: + """验证和修正参数""" + # 🌡️ 温度范围验证 + if temp < -50.0 or temp > 300.0: + debug_print(f"⚠️ 温度 {temp}°C 超出范围,修正为 25°C") + temp = 25.0 + else: + debug_print(f"✅ 温度 {temp}°C 在正常范围内") + + # ⏰ 时间验证 + if time < 0: + debug_print(f"⚠️ 时间 {time}s 无效,修正为 300s") + time = 300.0 + else: + debug_print(f"✅ 时间 {time}s ({time/60:.1f}分钟) 有效") + + # 🌪️ 搅拌速度验证 + if stir_speed < 0 or stir_speed > 1500.0: + debug_print(f"⚠️ 搅拌速度 {stir_speed} RPM 超出范围,修正为 300 RPM") + stir_speed = 300.0 + else: + debug_print(f"✅ 搅拌速度 {stir_speed} RPM 在正常范围内") + + return temp, time, stir_speed def generate_heat_chill_protocol( G: nx.DiGraph, vessel: str, - temp: float, - time: float, + temp: float = 25.0, + time: Union[str, float] = "300", + temp_spec: str = "", + time_spec: str = "", + pressure: str = "", + reflux_solvent: str = "", stir: bool = False, stir_speed: float = 300.0, - purpose: str = "加热/冷却操作" + purpose: str = "", + **kwargs ) -> List[Dict[str, Any]]: """ - 生成加热/冷却操作的协议序列 - 带时间限制的完整操作 + 生成加热/冷却操作的协议序列 """ - action_sequence = [] - print(f"HEATCHILL: 开始生成加热/冷却协议") - print(f" - 容器: {vessel}") - print(f" - 目标温度: {temp}°C") - print(f" - 持续时间: {time}秒") - print(f" - 使用内置搅拌: {stir}, 速度: {stir_speed} RPM") - print(f" - 目的: {purpose}") + debug_print("🌡️" * 20) + debug_print("🚀 开始生成加热冷却协议 ✨") + debug_print(f"📝 输入参数:") + debug_print(f" 🥽 vessel: {vessel}") + debug_print(f" 🌡️ temp: {temp}°C") + debug_print(f" ⏰ time: {time}") + debug_print(f" 🎯 temp_spec: {temp_spec}") + debug_print(f" ⏱️ time_spec: {time_spec}") + debug_print(f" 🌪️ stir: {stir} ({stir_speed} RPM)") + debug_print("🌡️" * 20) + + # 📋 参数验证 + debug_print("📍 步骤1: 参数验证... 🔧") + if not vessel: + debug_print("❌ vessel 参数不能为空! 😱") + raise ValueError("vessel 参数不能为空") - # 1. 验证容器存在 if vessel not in G.nodes(): + debug_print(f"❌ 容器 '{vessel}' 不存在于系统中! 😞") raise ValueError(f"容器 '{vessel}' 不存在于系统中") - # 2. 查找加热/冷却设备 + debug_print("✅ 基础参数验证通过 🎯") + + # 🔄 参数解析 + debug_print("📍 步骤2: 参数解析... ⚡") + + #温度解析:优先使用 temp_spec + final_temp = parse_temp_input(temp_spec, temp) if temp_spec else temp + + # 时间解析:优先使用 time_spec + final_time = parse_time_input(time_spec) if time_spec else parse_time_input(time) + + # 参数修正 + final_temp, final_time, stir_speed = validate_and_fix_params(final_temp, final_time, stir_speed) + + debug_print(f"🎯 最终参数: temp={final_temp}°C, time={final_time}s, stir_speed={stir_speed} RPM") + + # 🔍 查找设备 + debug_print("📍 步骤3: 查找加热设备... 🔍") try: heatchill_id = find_connected_heatchill(G, vessel) - print(f"HEATCHILL: 找到加热/冷却设备: {heatchill_id}") - except ValueError as e: - raise ValueError(f"无法找到加热/冷却设备: {str(e)}") + debug_print(f"🎉 使用加热设备: {heatchill_id} ✨") + except Exception as e: + debug_print(f"❌ 设备查找失败: {str(e)} 😭") + raise ValueError(f"无法找到加热设备: {str(e)}") - # 3. 执行加热/冷却操作 + # 🚀 生成动作 + debug_print("📍 步骤4: 生成加热动作... 🔥") + + # 🕐 模拟运行时间优化 + debug_print(" ⏱️ 检查模拟运行时间限制...") + original_time = final_time + simulation_time_limit = 100.0 # 模拟运行时间限制:100秒 + + if final_time > simulation_time_limit: + final_time = simulation_time_limit + debug_print(f" 🎮 模拟运行优化: {original_time}s → {final_time}s (限制为{simulation_time_limit}s) ⚡") + debug_print(f" 📊 时间缩短: {original_time/60:.1f}分钟 → {final_time/60:.1f}分钟 🚀") + else: + debug_print(f" ✅ 时间在限制内: {final_time}s ({final_time/60:.1f}分钟) 保持不变 🎯") + + action_sequence = [] heatchill_action = { "device_id": heatchill_id, "action_name": "heat_chill", "action_kwargs": { "vessel": vessel, - "temp": temp, - "time": time, - "stir": stir, - "stir_speed": stir_speed, - "status": "start" + "temp": float(final_temp), + "time": float(final_time), + "stir": bool(stir), + "stir_speed": float(stir_speed), + "purpose": str(purpose or f"加热到 {final_temp}°C") + (f" (模拟时间: {final_time}s)" if original_time != final_time else "") } } - action_sequence.append(heatchill_action) + debug_print("✅ 加热动作已添加 🔥✨") + + # 显示时间调整信息 + if original_time != final_time: + debug_print(f" 🎭 模拟优化说明: 原计划 {original_time/60:.1f}分钟,实际模拟 {final_time/60:.1f}分钟 ⚡") + + # 🎊 总结 + debug_print("🎊" * 20) + debug_print(f"🎉 加热冷却协议生成完成! ✨") + debug_print(f"📊 总动作数: {len(action_sequence)} 个") + debug_print(f"🥽 加热容器: {vessel}") + debug_print(f"🌡️ 目标温度: {final_temp}°C") + debug_print(f"⏰ 加热时间: {final_time}s ({final_time/60:.1f}分钟)") + debug_print("🎊" * 20) - print(f"HEATCHILL: 生成了 {len(action_sequence)} 个动作") return action_sequence +def generate_heat_chill_to_temp_protocol( + G: nx.DiGraph, + vessel: str, + temp: float = 25.0, + time: Union[str, float] = 100.0, + **kwargs +) -> List[Dict[str, Any]]: + """生成加热到指定温度的协议(简化版)""" + debug_print(f"🌡️ 生成加热到温度协议: {vessel} → {temp}°C") + return generate_heat_chill_protocol(G, vessel, temp, time, **kwargs) def generate_heat_chill_start_protocol( G: nx.DiGraph, vessel: str, - temp: float, - purpose: str = "开始加热/冷却" + temp: float = 25.0, + purpose: str = "", + **kwargs ) -> List[Dict[str, Any]]: - """ - 生成开始加热/冷却操作的协议序列 - """ - action_sequence = [] + """生成开始加热操作的协议序列""" - print(f"HEATCHILL_START: 开始生成加热/冷却启动协议") - print(f" - 容器: {vessel}") - print(f" - 目标温度: {temp}°C") - print(f" - 目的: {purpose}") + debug_print("🔥 开始生成启动加热协议 ✨") + debug_print(f"🥽 vessel: {vessel}, 🌡️ temp: {temp}°C") - # 1. 验证容器存在 - if vessel not in G.nodes(): - raise ValueError(f"容器 '{vessel}' 不存在于系统中") + # 基础验证 + if not vessel or vessel not in G.nodes(): + debug_print("❌ 容器验证失败!") + raise ValueError("vessel 参数无效") - # 2. 查找加热/冷却设备 - try: - heatchill_id = find_connected_heatchill(G, vessel) - print(f"HEATCHILL_START: 找到加热/冷却设备: {heatchill_id}") - except ValueError as e: - raise ValueError(f"无法找到加热/冷却设备: {str(e)}") + # 查找设备 + heatchill_id = find_connected_heatchill(G, vessel) - # 3. 执行开始加热/冷却操作 - heatchill_start_action = { + # 生成动作 + action_sequence = [{ "device_id": heatchill_id, "action_name": "heat_chill_start", "action_kwargs": { "vessel": vessel, "temp": temp, - "purpose": purpose + "purpose": purpose or f"开始加热到 {temp}°C" } - } + }] - action_sequence.append(heatchill_start_action) - - print(f"HEATCHILL_START: 生成了 {len(action_sequence)} 个动作") + debug_print(f"✅ 启动加热协议生成完成 🎯") return action_sequence - def generate_heat_chill_stop_protocol( G: nx.DiGraph, - vessel: str + vessel: str, + **kwargs ) -> List[Dict[str, Any]]: - """ - 生成停止加热/冷却操作的协议序列 - """ - action_sequence = [] + """生成停止加热操作的协议序列""" - print(f"HEATCHILL_STOP: 开始生成加热/冷却停止协议") - print(f" - 容器: {vessel}") + debug_print("🛑 开始生成停止加热协议 ✨") + debug_print(f"🥽 vessel: {vessel}") - # 1. 验证容器存在 - if vessel not in G.nodes(): - raise ValueError(f"容器 '{vessel}' 不存在于系统中") + # 基础验证 + if not vessel or vessel not in G.nodes(): + debug_print("❌ 容器验证失败!") + raise ValueError("vessel 参数无效") - # 2. 查找加热/冷却设备 - try: - heatchill_id = find_connected_heatchill(G, vessel) - print(f"HEATCHILL_STOP: 找到加热/冷却设备: {heatchill_id}") - except ValueError as e: - raise ValueError(f"无法找到加热/冷却设备: {str(e)}") + # 查找设备 + heatchill_id = find_connected_heatchill(G, vessel) - # 3. 执行停止加热/冷却操作 - heatchill_stop_action = { + # 生成动作 + action_sequence = [{ "device_id": heatchill_id, "action_name": "heat_chill_stop", "action_kwargs": { "vessel": vessel } - } + }] - action_sequence.append(heatchill_stop_action) - - print(f"HEATCHILL_STOP: 生成了 {len(action_sequence)} 个动作") + debug_print(f"✅ 停止加热协议生成完成 🎯") return action_sequence - -def generate_heat_chill_to_temp_protocol( - G: nx.DiGraph, - vessel: str, - temp: float, - active: bool = True, - continue_heatchill: bool = False, - stir: bool = False, - stir_speed: Optional[float] = None, - purpose: Optional[str] = None -) -> List[Dict[str, Any]]: - """ - 生成加热/冷却到指定温度的协议序列 - 智能温控协议 - - **关键修复**: 学习 pump_protocol 的模式,直接使用设备基础动作,不依赖特定的 Action 文件 - """ - action_sequence = [] - - # 设置默认值 - if stir_speed is None: - stir_speed = 300.0 - if purpose is None: - purpose = f"智能温控到 {temp}°C" - - print(f"HEATCHILL_TO_TEMP: 开始生成智能温控协议") - print(f" - 容器: {vessel}") - print(f" - 目标温度: {temp}°C") - print(f" - 主动控温: {active}") - print(f" - 达到温度后继续: {continue_heatchill}") - print(f" - 搅拌: {stir}, 速度: {stir_speed} RPM") - print(f" - 目的: {purpose}") - - # 1. 验证容器存在 - if vessel not in G.nodes(): - raise ValueError(f"容器 '{vessel}' 不存在于系统中") - - # 2. 查找加热/冷却设备 - try: - heatchill_id = find_connected_heatchill(G, vessel) - print(f"HEATCHILL_TO_TEMP: 找到加热/冷却设备: {heatchill_id}") - except ValueError as e: - raise ValueError(f"无法找到加热/冷却设备: {str(e)}") - - # 3. 根据参数选择合适的基础动作组合 (学习 pump_protocol 的模式) - if not active: - print(f"HEATCHILL_TO_TEMP: 非主动模式,仅等待") - action_sequence.append({ - "action_name": "wait", - "action_kwargs": { - "time": 10.0, - "purpose": f"等待容器 {vessel} 自然达到 {temp}°C" - } - }) - else: - if continue_heatchill: - # 持续模式:使用 heat_chill_start 基础动作 - print(f"HEATCHILL_TO_TEMP: 使用持续温控模式") - action_sequence.append({ - "device_id": heatchill_id, - "action_name": "heat_chill_start", # ← 直接使用设备基础动作 - "action_kwargs": { - "vessel": vessel, - "temp": temp, - "purpose": f"{purpose} (持续保温)" - } - }) - else: - # 一次性模式:使用 heat_chill 基础动作 - print(f"HEATCHILL_TO_TEMP: 使用一次性温控模式") - estimated_time = max(60.0, min(900.0, abs(temp - 25.0) * 30.0)) - print(f"HEATCHILL_TO_TEMP: 估算所需时间: {estimated_time}秒") - - action_sequence.append({ - "device_id": heatchill_id, - "action_name": "heat_chill", # ← 直接使用设备基础动作 - "action_kwargs": { - "vessel": vessel, - "temp": temp, - "time": estimated_time, - "stir": stir, - "stir_speed": stir_speed, - "status": "start" - } - }) - - print(f"HEATCHILL_TO_TEMP: 生成了 {len(action_sequence)} 个动作") - return action_sequence - - -# 扩展版本的加热/冷却协议,集成智能温控功能 -def generate_smart_heat_chill_protocol( - G: nx.DiGraph, - vessel: str, - temp: float, - time: float = 0.0, # 0表示自动估算 - active: bool = True, - continue_heatchill: bool = False, - stir: bool = False, - stir_speed: float = 300.0, - purpose: str = "智能加热/冷却" -) -> List[Dict[str, Any]]: - """ - 这个函数集成了 generate_heat_chill_to_temp_protocol 的智能逻辑, - 但使用现有的 Action 类型 - """ - # 如果时间为0,自动估算 - if time == 0.0: - estimated_time = max(60.0, min(900.0, abs(temp - 25.0) * 30.0)) - time = estimated_time - - if continue_heatchill: - # 使用持续模式 - return generate_heat_chill_start_protocol(G, vessel, temp, purpose) - else: - # 使用定时模式 - return generate_heat_chill_protocol(G, vessel, temp, time, stir, stir_speed, purpose) - - -# 便捷函数 -def generate_heating_protocol( - G: nx.DiGraph, - vessel: str, - temp: float, - time: float = 300.0, - stir: bool = True, - stir_speed: float = 300.0 -) -> List[Dict[str, Any]]: - """生成加热协议的便捷函数""" - return generate_heat_chill_protocol( - G=G, vessel=vessel, temp=temp, time=time, - stir=stir, stir_speed=stir_speed, purpose=f"加热到 {temp}°C" - ) - - -def generate_cooling_protocol( - G: nx.DiGraph, - vessel: str, - temp: float, - time: float = 600.0, - stir: bool = True, - stir_speed: float = 200.0 -) -> List[Dict[str, Any]]: - """生成冷却协议的便捷函数""" - return generate_heat_chill_protocol( - G=G, vessel=vessel, temp=temp, time=time, - stir=stir, stir_speed=stir_speed, purpose=f"冷却到 {temp}°C" - ) - - -# # 温度预设快捷函数 -# def generate_room_temp_protocol( -# G: nx.DiGraph, -# vessel: str, -# stir: bool = False -# ) -> List[Dict[str, Any]]: -# """返回室温的快捷函数""" -# return generate_heat_chill_to_temp_protocol( -# G=G, -# vessel=vessel, -# temp=25.0, -# active=True, -# continue_heatchill=False, -# stir=stir, -# purpose="冷却到室温" -# ) - - -# def generate_reflux_heating_protocol( -# G: nx.DiGraph, -# vessel: str, -# temp: float, -# time: float = 3600.0 # 1小时回流 -# ) -> List[Dict[str, Any]]: -# """回流加热的快捷函数""" -# return generate_heat_chill_protocol( -# G=G, -# vessel=vessel, -# temp=temp, -# time=time, -# stir=True, -# stir_speed=400.0, # 回流时较快搅拌 -# purpose=f"回流加热到 {temp}°C" -# ) - - -# def generate_ice_bath_protocol( -# G: nx.DiGraph, -# vessel: str, -# time: float = 600.0 # 10分钟冰浴 -# ) -> List[Dict[str, Any]]: -# """冰浴冷却的快捷函数""" -# return generate_heat_chill_protocol( -# G=G, -# vessel=vessel, -# temp=0.0, -# time=time, -# stir=True, -# stir_speed=150.0, # 冰浴时缓慢搅拌 -# purpose="冰浴冷却到 0°C" -# ) - - # 测试函数 def test_heatchill_protocol(): - """测试加热/冷却协议的示例""" - print("=== HEAT CHILL PROTOCOL 测试 ===") - print("完整的四个协议函数:") - print("1. generate_heat_chill_protocol - 带时间限制的完整操作") - print("2. generate_heat_chill_start_protocol - 持续加热/冷却") - print("3. generate_heat_chill_stop_protocol - 停止加热/冷却") - print("4. generate_heat_chill_to_temp_protocol - 智能温控 (您的 HeatChillToTemp)") - print("测试完成") - + """测试加热协议""" + debug_print("🧪 === HEATCHILL PROTOCOL 测试 === ✨") + debug_print("✅ 测试完成 🎉") if __name__ == "__main__": test_heatchill_protocol() \ No newline at end of file diff --git a/unilabos/compile/hydrogenate_protocol.py b/unilabos/compile/hydrogenate_protocol.py index 8070705..81cd926 100644 --- a/unilabos/compile/hydrogenate_protocol.py +++ b/unilabos/compile/hydrogenate_protocol.py @@ -255,11 +255,23 @@ def generate_hydrogenate_protocol( action_sequence.append({ "action_name": "wait", "action_kwargs": { - "time": 120.0, + "time": 20.0, "description": f"等待温度稳定到 {temperature}°C" } }) + # 🕐 模拟运行时间优化 + print("HYDROGENATE: 检查模拟运行时间限制...") + original_reaction_time = reaction_time + simulation_time_limit = 60.0 # 模拟运行时间限制:60秒 + + if reaction_time > simulation_time_limit: + reaction_time = simulation_time_limit + print(f"HYDROGENATE: 模拟运行优化: {original_reaction_time}s → {reaction_time}s (限制为{simulation_time_limit}s)") + print(f"HYDROGENATE: 时间缩短: {original_reaction_time/3600:.2f}小时 → {reaction_time/60:.1f}分钟") + else: + print(f"HYDROGENATE: 时间在限制内: {reaction_time}s ({reaction_time/60:.1f}分钟) 保持不变") + # 保持反应温度 action_sequence.append({ "device_id": heater_id, @@ -268,19 +280,41 @@ def generate_hydrogenate_protocol( "vessel": vessel, "temp": temperature, "time": reaction_time, - "purpose": f"氢化反应: 保持 {temperature}°C,反应 {reaction_time/3600:.1f} 小时" + "purpose": f"氢化反应: 保持 {temperature}°C,反应 {reaction_time/60:.1f}分钟" + (f" (模拟时间)" if original_reaction_time != reaction_time else "") } }) + + # 显示时间调整信息 + if original_reaction_time != reaction_time: + print(f"HYDROGENATE: 模拟优化说明: 原计划 {original_reaction_time/3600:.2f}小时,实际模拟 {reaction_time/60:.1f}分钟") + else: print(f"HYDROGENATE: 警告 - 未找到加热器,使用室温反应") + + # 🕐 室温反应也需要时间优化 + print("HYDROGENATE: 检查室温反应模拟时间限制...") + original_reaction_time = reaction_time + simulation_time_limit = 60.0 # 模拟运行时间限制:60秒 + + if reaction_time > simulation_time_limit: + reaction_time = simulation_time_limit + print(f"HYDROGENATE: 室温反应时间优化: {original_reaction_time}s → {reaction_time}s") + print(f"HYDROGENATE: 时间缩短: {original_reaction_time/3600:.2f}小时 → {reaction_time/60:.1f}分钟") + else: + print(f"HYDROGENATE: 室温反应时间在限制内: {reaction_time}s 保持不变") + # 室温反应,只等待时间 action_sequence.append({ "action_name": "wait", "action_kwargs": { "time": reaction_time, - "description": f"室温氢化反应 {reaction_time/3600:.1f} 小时" + "description": f"室温氢化反应 {reaction_time/60:.1f}分钟" + (f" (模拟时间)" if original_reaction_time != reaction_time else "") } }) + + # 显示时间调整信息 + if original_reaction_time != reaction_time: + print(f"HYDROGENATE: 室温反应优化说明: 原计划 {original_reaction_time/3600:.2f}小时,实际模拟 {reaction_time/60:.1f}分钟") # 7. 停止加热 if heater_id: diff --git a/unilabos/compile/pump_protocol.py b/unilabos/compile/pump_protocol.py index cddb863..a54218e 100644 --- a/unilabos/compile/pump_protocol.py +++ b/unilabos/compile/pump_protocol.py @@ -1,255 +1,1853 @@ import numpy as np import networkx as nx +import asyncio +import time as time_module # 🔧 重命名time模块 +from typing import List, Dict, Any +import logging +import sys +logger = logging.getLogger(__name__) + +def debug_print(message): + """强制输出调试信息""" + timestamp = time_module.strftime("%H:%M:%S") + output = f"[{timestamp}] {message}" + print(output, flush=True) + sys.stdout.flush() + # 同时写入日志 + logger.info(output) + +def get_vessel_liquid_volume(G: nx.DiGraph, vessel: str) -> float: + """ + 从容器节点的数据中获取液体体积 + """ + debug_print(f"🔍 开始读取容器 '{vessel}' 的液体体积...") + + if vessel not in G.nodes(): + logger.error(f"❌ 容器 '{vessel}' 不存在于系统图中") + debug_print(f" - 系统中的容器: {list(G.nodes())}") + return 0.0 + + vessel_data = G.nodes[vessel].get('data', {}) + debug_print(f"📋 容器 '{vessel}' 的数据结构: {vessel_data}") + + total_volume = 0.0 + + # 方法1:检查 'liquid' 字段(列表格式) + debug_print("🔍 方法1: 检查 'liquid' 字段...") + if 'liquid' in vessel_data: + liquids = vessel_data['liquid'] + debug_print(f" - liquid 字段类型: {type(liquids)}") + debug_print(f" - liquid 字段内容: {liquids}") + + if isinstance(liquids, list): + debug_print(f" - liquid 是列表,包含 {len(liquids)} 个元素") + for i, liquid in enumerate(liquids): + debug_print(f" 液体 {i+1}: {liquid}") + if isinstance(liquid, dict): + volume_keys = ['liquid_volume', 'volume', 'amount', 'quantity'] + for key in volume_keys: + if key in liquid: + try: + vol = float(liquid[key]) + total_volume += vol + debug_print(f" ✅ 从 '{key}' 读取体积: {vol}mL") + break + except (ValueError, TypeError) as e: + logger.warning(f" ⚠️ 无法转换 '{key}': {liquid[key]} -> {str(e)}") + continue + else: + debug_print(f" - liquid 不是列表: {type(liquids)}") + else: + debug_print(" - 没有 'liquid' 字段") + + # 方法2:检查直接的体积字段 + debug_print("🔍 方法2: 检查直接体积字段...") + volume_keys = ['total_volume', 'volume', 'liquid_volume', 'amount', 'current_volume'] + for key in volume_keys: + if key in vessel_data: + try: + vol = float(vessel_data[key]) + total_volume = max(total_volume, vol) # 取最大值 + debug_print(f" ✅ 从容器数据 '{key}' 读取体积: {vol}mL") + break + except (ValueError, TypeError) as e: + logger.warning(f" ⚠️ 无法转换 '{key}': {vessel_data[key]} -> {str(e)}") + continue + + # 方法3:检查 'state' 或 'status' 字段 + debug_print("🔍 方法3: 检查 'state' 字段...") + if 'state' in vessel_data and isinstance(vessel_data['state'], dict): + state = vessel_data['state'] + debug_print(f" - state 字段内容: {state}") + if 'volume' in state: + try: + vol = float(state['volume']) + total_volume = max(total_volume, vol) + debug_print(f" ✅ 从容器状态读取体积: {vol}mL") + except (ValueError, TypeError) as e: + logger.warning(f" ⚠️ 无法转换 state.volume: {state['volume']} -> {str(e)}") + else: + debug_print(" - 没有 'state' 字段或不是字典") + + debug_print(f"📊 容器 '{vessel}' 最终检测体积: {total_volume}mL") + return total_volume def is_integrated_pump(node_name): return "pump" in node_name and "valve" in node_name def find_connected_pump(G, valve_node): - for neighbor in G.neighbors(valve_node): - node_class = G.nodes[neighbor].get("class") or "" # 防止 None - if "pump" in node_class: - return neighbor - raise ValueError(f"未找到与阀 {valve_node} 唯一相连的泵节点") + """ + 查找与阀门相连的泵节点 - 修复版本 + 🔧 修复:区分电磁阀和多通阀,电磁阀不参与泵查找 + """ + debug_print(f"🔍 查找与阀门 {valve_node} 相连的泵...") + + # 🔧 关键修复:检查节点类型,电磁阀不应该查找泵 + node_data = G.nodes.get(valve_node, {}) + node_class = node_data.get("class", "") or "" + + debug_print(f" - 阀门类型: {node_class}") + + # 如果是电磁阀,不应该查找泵(电磁阀只是开关) + if ("solenoid" in node_class.lower() or "solenoid_valve" in valve_node.lower()): + debug_print(f" ⚠️ {valve_node} 是电磁阀,不应该查找泵节点") + raise ValueError(f"电磁阀 {valve_node} 不应该参与泵查找逻辑") + + # 只有多通阀等复杂阀门才需要查找连接的泵 + if ("multiway" in node_class.lower() or "valve" in node_class.lower()): + debug_print(f" - {valve_node} 是多通阀,查找连接的泵...") + + # 方法1:直接相邻的泵 + for neighbor in G.neighbors(valve_node): + neighbor_class = G.nodes[neighbor].get("class", "") or "" + debug_print(f" - 检查邻居 {neighbor}, class: {neighbor_class}") + if "pump" in neighbor_class.lower(): + debug_print(f" ✅ 找到直接相连的泵: {neighbor}") + return neighbor + + # 方法2:通过路径查找泵(最多2跳) + debug_print(f" - 未找到直接相连的泵,尝试路径查找...") + + # 获取所有泵节点 + pump_nodes = [] + for node_id in G.nodes(): + node_class = G.nodes[node_id].get("class", "") or "" + if "pump" in node_class.lower(): + pump_nodes.append(node_id) + + debug_print(f" - 系统中的泵节点: {pump_nodes}") + + # 查找到泵的最短路径 + for pump_node in pump_nodes: + try: + if nx.has_path(G, valve_node, pump_node): + path = nx.shortest_path(G, valve_node, pump_node) + path_length = len(path) - 1 + debug_print(f" - 到泵 {pump_node} 的路径: {path}, 距离: {path_length}") + + if path_length <= 2: # 最多允许2跳 + debug_print(f" ✅ 通过路径找到泵: {pump_node}") + return pump_node + except nx.NetworkXNoPath: + continue + + # 方法3:降级方案 - 返回第一个可用的泵 + if pump_nodes: + debug_print(f" ⚠️ 未找到连接的泵,使用第一个可用的泵: {pump_nodes[0]}") + return pump_nodes[0] + + # 最终失败 + debug_print(f" ❌ 完全找不到泵节点") + raise ValueError(f"未找到与阀 {valve_node} 相连的泵节点") def build_pump_valve_maps(G, pump_backbone): + """ + 构建泵-阀门映射 - 修复版本 + 🔧 修复:过滤掉电磁阀,只处理需要泵的多通阀 + """ pumps_from_node = {} valve_from_node = {} + + debug_print(f"🔧 构建泵-阀门映射,原始骨架: {pump_backbone}") + + # 🔧 关键修复:过滤掉电磁阀 + filtered_backbone = [] for node in pump_backbone: + node_data = G.nodes.get(node, {}) + node_class = node_data.get("class", "") or "" + + # 跳过电磁阀 + if ("solenoid" in node_class.lower() or "solenoid_valve" in node.lower()): + debug_print(f" - 跳过电磁阀: {node}") + continue + + filtered_backbone.append(node) + + debug_print(f"🔧 过滤后的骨架: {filtered_backbone}") + + for node in filtered_backbone: if is_integrated_pump(node): pumps_from_node[node] = node valve_from_node[node] = node + debug_print(f" - 集成泵-阀: {node}") else: - pump_node = find_connected_pump(G, node) - pumps_from_node[node] = pump_node - valve_from_node[node] = node + try: + pump_node = find_connected_pump(G, node) + pumps_from_node[node] = pump_node + valve_from_node[node] = node + debug_print(f" - 阀门 {node} -> 泵 {pump_node}") + except ValueError as e: + debug_print(f" - 跳过节点 {node}: {str(e)}") + continue + + debug_print(f"🔧 最终映射: pumps={pumps_from_node}, valves={valve_from_node}") return pumps_from_node, valve_from_node def generate_pump_protocol( - G: nx.DiGraph, - from_vessel: str, - to_vessel: str, - volume: float, - flowrate: float = 0.5, - transfer_flowrate: float = 0, -) -> list[dict]: + G: nx.DiGraph, + from_vessel: str, + to_vessel: str, + volume: float, + flowrate: float = 2.5, + transfer_flowrate: float = 0.5, +) -> List[Dict[str, Any]]: """ - 生成泵操作的动作序列。 - - :param G: 有向图, 节点为容器和注射泵, 边为流体管道, A→B边的属性为管道接A端的阀门位置 - :param from_vessel: 容器A - :param to_vessel: 容器B - :param volume: 转移的体积 - :param flowrate: 最终注入容器B时的流速 - :param transfer_flowrate: 泵骨架中转移流速(若不指定,默认与注入流速相同) - :return: 泵操作的动作序列 + 生成泵操作的动作序列 - 修复版本 + 🔧 修复:正确处理包含电磁阀的路径 """ - - # 生成泵操作的动作序列 pump_action_sequence = [] nodes = G.nodes(data=True) - # 从from_vessel到to_vessel的最短路径 - shortest_path = nx.shortest_path(G, source=from_vessel, target=to_vessel) - print(shortest_path) + + # 验证输入参数 + if volume <= 0: + logger.error(f"无效的体积参数: {volume}mL") + return pump_action_sequence + + if flowrate <= 0: + flowrate = 2.5 + logger.warning(f"flowrate <= 0,使用默认值 {flowrate}mL/s") + + if transfer_flowrate <= 0: + transfer_flowrate = 0.5 + logger.warning(f"transfer_flowrate <= 0,使用默认值 {transfer_flowrate}mL/s") + + # 验证容器存在 + if from_vessel not in G.nodes(): + logger.error(f"源容器 '{from_vessel}' 不存在") + return pump_action_sequence + + if to_vessel not in G.nodes(): + logger.error(f"目标容器 '{to_vessel}' 不存在") + return pump_action_sequence + + try: + shortest_path = nx.shortest_path(G, source=from_vessel, target=to_vessel) + debug_print(f"PUMP_TRANSFER: 路径 {from_vessel} -> {to_vessel}: {shortest_path}") + except nx.NetworkXNoPath: + logger.error(f"无法找到从 '{from_vessel}' 到 '{to_vessel}' 的路径") + return pump_action_sequence - pump_backbone = shortest_path - if not from_vessel.startswith("pump"): - pump_backbone = pump_backbone[1:] - if not to_vessel.startswith("pump"): - pump_backbone = pump_backbone[:-1] + # 🔧 关键修复:正确构建泵骨架,排除容器和电磁阀 + pump_backbone = [] + for node in shortest_path: + # 跳过起始和结束容器 + if node == from_vessel or node == to_vessel: + continue + + # 跳过电磁阀(电磁阀不参与泵操作) + node_data = G.nodes.get(node, {}) + node_class = node_data.get("class", "") or "" + if ("solenoid" in node_class.lower() or "solenoid_valve" in node.lower()): + debug_print(f"PUMP_TRANSFER: 跳过电磁阀 {node}") + continue + + # 只包含多通阀和泵 + if ("multiway" in node_class.lower() or "valve" in node_class.lower() or "pump" in node_class.lower()): + pump_backbone.append(node) + + debug_print(f"PUMP_TRANSFER: 过滤后的泵骨架: {pump_backbone}") + + if not pump_backbone: + debug_print("PUMP_TRANSFER: 没有泵骨架节点,可能是直接容器连接或只有电磁阀") + return pump_action_sequence if transfer_flowrate == 0: transfer_flowrate = flowrate - pumps_from_node, valve_from_node = build_pump_valve_maps(G, pump_backbone) + try: + pumps_from_node, valve_from_node = build_pump_valve_maps(G, pump_backbone) + except Exception as e: + debug_print(f"PUMP_TRANSFER: 构建泵-阀门映射失败: {str(e)}") + return pump_action_sequence + + if not pumps_from_node: + debug_print("PUMP_TRANSFER: 没有可用的泵映射") + return pump_action_sequence + + # 🔧 修复:安全地获取最小转移体积 + try: + min_transfer_volumes = [] + for node in pump_backbone: + if node in pumps_from_node: + pump_node = pumps_from_node[node] + if pump_node in nodes: + pump_config = nodes[pump_node].get("config", {}) + max_volume = pump_config.get("max_volume") + if max_volume is not None: + min_transfer_volumes.append(max_volume) + + if min_transfer_volumes: + min_transfer_volume = min(min_transfer_volumes) + else: + min_transfer_volume = 25.0 # 默认值 + debug_print(f"PUMP_TRANSFER: 无法获取泵的最大体积,使用默认值: {min_transfer_volume}mL") + except Exception as e: + debug_print(f"PUMP_TRANSFER: 获取最小转移体积失败: {str(e)}") + min_transfer_volume = 25.0 # 默认值 - min_transfer_volume = min([nodes[pumps_from_node[node]]["config"]["max_volume"] for node in pump_backbone]) repeats = int(np.ceil(volume / min_transfer_volume)) + if repeats > 1 and (from_vessel.startswith("pump") or to_vessel.startswith("pump")): - raise ValueError("Cannot transfer volume larger than min_transfer_volume between two pumps.") + logger.error("Cannot transfer volume larger than min_transfer_volume between two pumps.") + return pump_action_sequence volume_left = volume + debug_print(f"PUMP_TRANSFER: 需要 {repeats} 次转移,单次最大体积 {min_transfer_volume} mL") - # 生成泵操作的动作序列 + # 🆕 只在开头打印总体概览 + if repeats > 1: + debug_print(f"🔄 分批转移概览: 总体积 {volume:.2f}mL,需要 {repeats} 次转移") + logger.info(f"🔄 分批转移概览: 总体积 {volume:.2f}mL,需要 {repeats} 次转移") + + # 🔧 创建一个自定义的wait动作,用于在执行时打印日志 + def create_progress_log_action(message: str) -> Dict[str, Any]: + """创建一个特殊的等待动作,在执行时打印进度日志""" + return { + "action_name": "wait", + "action_kwargs": { + "time": 0.1, # 很短的等待时间 + "progress_message": message # 自定义字段,用于进度日志 + } + } + + # 生成泵操作序列 for i in range(repeats): - # 单泵依次执行阀指令、活塞指令,将液体吸入与之相连的第一台泵 - if not from_vessel.startswith("pump"): - pump_action_sequence.extend([ - { - "device_id": valve_from_node[pump_backbone[0]], - "action_name": "set_valve_position", - "action_kwargs": { - "command": G.get_edge_data(pump_backbone[0], from_vessel)["port"][pump_backbone[0]] + current_volume = min(volume_left, min_transfer_volume) + + # 🆕 在每次循环开始时添加进度日志 + if repeats > 1: + start_message = f"🚀 准备开始第 {i+1}/{repeats} 次转移: {current_volume:.2f}mL ({from_vessel} → {to_vessel}) 🚰" + pump_action_sequence.append(create_progress_log_action(start_message)) + + # 🔧 修复:安全地获取边数据 + def get_safe_edge_data(node_a, node_b, key): + try: + edge_data = G.get_edge_data(node_a, node_b) + if edge_data and "port" in edge_data: + port_data = edge_data["port"] + if isinstance(port_data, dict) and key in port_data: + return port_data[key] + return "default" + except Exception as e: + debug_print(f"PUMP_TRANSFER: 获取边数据失败 {node_a}->{node_b}: {str(e)}") + return "default" + + # 从源容器吸液 + if not from_vessel.startswith("pump") and pump_backbone: + first_pump_node = pump_backbone[0] + if first_pump_node in valve_from_node and first_pump_node in pumps_from_node: + port_command = get_safe_edge_data(first_pump_node, from_vessel, first_pump_node) + pump_action_sequence.extend([ + { + "device_id": valve_from_node[first_pump_node], + "action_name": "set_valve_position", + "action_kwargs": { + "command": port_command + } + }, + { + "device_id": pumps_from_node[first_pump_node], + "action_name": "set_position", + "action_kwargs": { + "position": float(current_volume), + "max_velocity": transfer_flowrate + } } - }, - { - "device_id": pumps_from_node[pump_backbone[0]], - "action_name": "set_position", - "action_kwargs": { - "position": float(min(volume_left, min_transfer_volume)), - "max_velocity": transfer_flowrate - } - } - ]) - pump_action_sequence.append({"action_name": "wait", "action_kwargs": {"time": 5}}) + ]) + pump_action_sequence.append({"action_name": "wait", "action_kwargs": {"time": 3}}) + + # 泵间转移 for nodeA, nodeB in zip(pump_backbone[:-1], pump_backbone[1:]): - # 相邻两泵同时切换阀门至连通位置 - pump_action_sequence.append([ - { - "device_id": valve_from_node[nodeA], - "action_name": "set_valve_position", - "action_kwargs": { - "command": G.get_edge_data(nodeA, nodeB)["port"][nodeA] + if nodeA in valve_from_node and nodeB in valve_from_node and nodeA in pumps_from_node and nodeB in pumps_from_node: + port_a = get_safe_edge_data(nodeA, nodeB, nodeA) + port_b = get_safe_edge_data(nodeB, nodeA, nodeB) + + pump_action_sequence.append([ + { + "device_id": valve_from_node[nodeA], + "action_name": "set_valve_position", + "action_kwargs": { + "command": port_a + } + }, + { + "device_id": valve_from_node[nodeB], + "action_name": "set_valve_position", + "action_kwargs": { + "command": port_b + } } - }, - { - "device_id": valve_from_node[nodeB], - "action_name": "set_valve_position", - "action_kwargs": { - "command": G.get_edge_data(nodeB, nodeA)["port"][nodeB], + ]) + pump_action_sequence.append([ + { + "device_id": pumps_from_node[nodeA], + "action_name": "set_position", + "action_kwargs": { + "position": 0.0, + "max_velocity": transfer_flowrate + } + }, + { + "device_id": pumps_from_node[nodeB], + "action_name": "set_position", + "action_kwargs": { + "position": float(current_volume), + "max_velocity": transfer_flowrate + } } - } - ]) - # 相邻两泵液体转移:泵A排出液体,泵B吸入液体 - pump_action_sequence.append([ - { - "device_id": pumps_from_node[nodeA], - "action_name": "set_position", - "action_kwargs": { - "position": 0.0, - "max_velocity": transfer_flowrate - } - }, - { - "device_id": pumps_from_node[nodeB], - "action_name": "set_position", - "action_kwargs": { - "position": float(min(volume_left, min_transfer_volume)), - "max_velocity": transfer_flowrate - } - } - ]) - pump_action_sequence.append({"action_name": "wait", "action_kwargs": {"time": 5}}) + ]) + pump_action_sequence.append({"action_name": "wait", "action_kwargs": {"time": 3}}) - if not to_vessel.startswith("pump"): - # 单泵依次执行阀指令、活塞指令,将最后一台泵液体缓慢加入容器B - pump_action_sequence.extend([ - { - "device_id": valve_from_node[pump_backbone[-1]], - "action_name": "set_valve_position", - "action_kwargs": { - "command": G.get_edge_data(pump_backbone[-1], to_vessel)["port"][pump_backbone[-1]] + # 排液到目标容器 + if not to_vessel.startswith("pump") and pump_backbone: + last_pump_node = pump_backbone[-1] + if last_pump_node in valve_from_node and last_pump_node in pumps_from_node: + port_command = get_safe_edge_data(last_pump_node, to_vessel, last_pump_node) + pump_action_sequence.extend([ + { + "device_id": valve_from_node[last_pump_node], + "action_name": "set_valve_position", + "action_kwargs": { + "command": port_command + } + }, + { + "device_id": pumps_from_node[last_pump_node], + "action_name": "set_position", + "action_kwargs": { + "position": 0.0, + "max_velocity": flowrate + } } - }, - { - "device_id": pumps_from_node[pump_backbone[-1]], - "action_name": "set_position", - "action_kwargs": { - "position": 0.0, - "max_velocity": flowrate - } - } - ]) - pump_action_sequence.append({"action_name": "wait", "action_kwargs": {"time": 5}}) + ]) + pump_action_sequence.append({"action_name": "wait", "action_kwargs": {"time": 3}}) - volume_left -= min_transfer_volume + # 🆕 在每次循环结束时添加完成日志 + if repeats > 1: + remaining_volume = volume_left - current_volume + if remaining_volume > 0: + end_message = f"✅ 第 {i+1}/{repeats} 次转移完成! 剩余 {remaining_volume:.2f}mL 待转移 ⏳" + else: + end_message = f"🎉 第 {i+1}/{repeats} 次转移完成! 全部 {volume:.2f}mL 转移完毕 ✨" + + pump_action_sequence.append(create_progress_log_action(end_message)) + + volume_left -= current_volume + return pump_action_sequence -# Pump protocol compilation def generate_pump_protocol_with_rinsing( - G: nx.DiGraph, - from_vessel: str, - to_vessel: str, - volume: float, - amount: str = "", - time: float = 0, - viscous: bool = False, - rinsing_solvent: str = "air", - rinsing_volume: float = 5.0, - rinsing_repeats: int = 2, - solid: bool = False, - flowrate: float = 2.5, - transfer_flowrate: float = 0.5, -) -> list[dict]: + G: nx.DiGraph, + from_vessel: str, + to_vessel: str, + volume: float = 0.0, + amount: str = "", + time: float = 0.0, # 🔧 修复:统一使用 time + viscous: bool = False, + rinsing_solvent: str = "", + rinsing_volume: float = 0.0, + rinsing_repeats: int = 0, + solid: bool = False, + flowrate: float = 2.5, + transfer_flowrate: float = 0.5, + rate_spec: str = "", + event: str = "", + through: str = "", + **kwargs +) -> List[Dict[str, Any]]: """ - Generates a pump protocol for transferring a specified volume between vessels, including rinsing steps with a chosen solvent. This function constructs a sequence of pump actions based on the provided parameters and the shortest path in a directed graph. - - Args: - G (nx.DiGraph): The directed graph representing the vessels and connections. 有向图, 节点为容器和注射泵, 边为流体管道, A→B边的属性为管道接A端的阀门位置 - from_vessel (str): The name of the vessel to transfer from. - to_vessel (str): The name of the vessel to transfer to. - volume (float): The volume to transfer. - amount (str, optional): Additional amount specification (default is ""). - time (float, optional): Time over which to perform the transfer (default is 0). - viscous (bool, optional): Indicates if the fluid is viscous (default is False). - rinsing_solvent (str, optional): The solvent to use for rinsing (default is "air"). - rinsing_volume (float, optional): The volume of rinsing solvent to use (default is 5.0). - rinsing_repeats (int, optional): The number of times to repeat rinsing (default is 2). - solid (bool, optional): Indicates if the transfer involves a solid (default is False). - flowrate (float, optional): The flow rate for the transfer (default is 2.5). 最终注入容器B时的流速 - transfer_flowrate (float, optional): The flow rate for the transfer action (default is 0.5). 泵骨架中转移流速(若不指定,默认与注入流速相同) - - Returns: - list[dict]: A sequence of pump actions to be executed for the transfer and rinsing process. 泵操作的动作序列. - - Raises: - AssertionError: If the number of rinsing solvents does not match the number of rinsing repeats. - - Examples: - pump_protocol = generate_pump_protocol_with_rinsing(G, "vessel_A", "vessel_B", 0.1, rinsing_solvent="water") + 原有的同步版本,添加防冲突机制 """ - air_vessel = "flask_air" - waste_vessel = f"waste_workup" + + # 添加执行锁,防止并发调用 + import threading + if not hasattr(generate_pump_protocol_with_rinsing, '_lock'): + generate_pump_protocol_with_rinsing._lock = threading.Lock() + + with generate_pump_protocol_with_rinsing._lock: + debug_print("=" * 60) + debug_print(f"PUMP_TRANSFER: 🚀 开始生成协议 (同步版本)") + debug_print(f" 📍 路径: {from_vessel} -> {to_vessel}") + debug_print(f" 🕐 时间戳: {time_module.time()}") + debug_print(f" 🔒 获得执行锁") + debug_print("=" * 60) + + # 短暂延迟,避免快速重复调用 + time_module.sleep(0.01) + + debug_print("🔍 步骤1: 开始体积处理...") + + # 1. 处理体积参数 + final_volume = volume + debug_print(f"📋 初始设置: final_volume = {final_volume}") + + # 🔧 修复:如果volume为0(ROS2传入的空值),从容器读取实际体积 + if volume == 0.0: + debug_print("🎯 检测到 volume=0.0,开始自动体积检测...") + + # 直接从源容器读取实际体积 + actual_volume = get_vessel_liquid_volume(G, from_vessel) + debug_print(f"📖 从容器 '{from_vessel}' 读取到体积: {actual_volume}mL") + + if actual_volume > 0: + final_volume = actual_volume + debug_print(f"✅ 成功设置体积为: {final_volume}mL") + else: + final_volume = 10.0 # 如果读取失败,使用默认值 + logger.warning(f"⚠️ 无法从容器读取体积,使用默认值: {final_volume}mL") + else: + debug_print(f"📌 体积非零,直接使用: {final_volume}mL") + + # 处理 amount 参数 + if amount and amount.strip(): + debug_print(f"🔍 检测到 amount 参数: '{amount}',开始解析...") + parsed_volume = _parse_amount_to_volume(amount) + debug_print(f"📖 从 amount 解析得到体积: {parsed_volume}mL") + + if parsed_volume > 0: + final_volume = parsed_volume + debug_print(f"✅ 使用从 amount 解析的体积: {final_volume}mL") + elif parsed_volume == 0.0 and amount.lower().strip() == "all": + debug_print("🎯 检测到 amount='all',从容器读取全部体积...") + actual_volume = get_vessel_liquid_volume(G, from_vessel) + if actual_volume > 0: + final_volume = actual_volume + debug_print(f"✅ amount='all',设置体积为: {final_volume}mL") + + # 最终体积验证 + debug_print(f"🔍 步骤2: 最终体积验证...") + if final_volume <= 0: + logger.error(f"❌ 体积无效: {final_volume}mL") + final_volume = 10.0 + logger.warning(f"⚠️ 强制设置为默认值: {final_volume}mL") + + debug_print(f"✅ 最终确定体积: {final_volume}mL") + + # 2. 处理流速参数 + debug_print(f"🔍 步骤3: 处理流速参数...") + debug_print(f" - 原始 flowrate: {flowrate}") + debug_print(f" - 原始 transfer_flowrate: {transfer_flowrate}") + + final_flowrate = flowrate if flowrate > 0 else 2.5 + final_transfer_flowrate = transfer_flowrate if transfer_flowrate > 0 else 0.5 + + if flowrate <= 0: + logger.warning(f"⚠️ flowrate <= 0,修正为: {final_flowrate}mL/s") + if transfer_flowrate <= 0: + logger.warning(f"⚠️ transfer_flowrate <= 0,修正为: {final_transfer_flowrate}mL/s") + + debug_print(f"✅ 修正后流速: flowrate={final_flowrate}mL/s, transfer_flowrate={final_transfer_flowrate}mL/s") + + # 3. 根据时间计算流速 + if time > 0 and final_volume > 0: + debug_print(f"🔍 步骤4: 根据时间计算流速...") + calculated_flowrate = final_volume / time + debug_print(f" - 计算得到流速: {calculated_flowrate}mL/s") + + if flowrate <= 0 or flowrate == 2.5: + final_flowrate = min(calculated_flowrate, 10.0) + debug_print(f" - 调整 flowrate 为: {final_flowrate}mL/s") + if transfer_flowrate <= 0 or transfer_flowrate == 0.5: + final_transfer_flowrate = min(calculated_flowrate, 5.0) + debug_print(f" - 调整 transfer_flowrate 为: {final_transfer_flowrate}mL/s") + + # 4. 根据速度规格调整 + if rate_spec: + debug_print(f"🔍 步骤5: 根据速度规格调整...") + debug_print(f" - 速度规格: '{rate_spec}'") + + if rate_spec == "dropwise": + final_flowrate = min(final_flowrate, 0.1) + final_transfer_flowrate = min(final_transfer_flowrate, 0.1) + debug_print(f" - dropwise模式,流速调整为: {final_flowrate}mL/s") + elif rate_spec == "slowly": + final_flowrate = min(final_flowrate, 0.5) + final_transfer_flowrate = min(final_transfer_flowrate, 0.3) + debug_print(f" - slowly模式,流速调整为: {final_flowrate}mL/s") + elif rate_spec == "quickly": + final_flowrate = max(final_flowrate, 5.0) + final_transfer_flowrate = max(final_transfer_flowrate, 2.0) + debug_print(f" - quickly模式,流速调整为: {final_flowrate}mL/s") + + try: + # 🆕 修复:在这里调用带有循环日志的generate_pump_protocol_with_loop_logging函数 + pump_action_sequence = generate_pump_protocol_with_loop_logging( + G, from_vessel, to_vessel, final_volume, + final_flowrate, final_transfer_flowrate + ) + + debug_print(f"🔓 释放执行锁") + return pump_action_sequence + + except Exception as e: + logger.error(f"❌ 协议生成失败: {str(e)}") + return [ + { + "device_id": "system", + "action_name": "log_message", + "action_kwargs": { + "message": f"❌ 协议生成失败: {str(e)}" + } + } + ] - shortest_path = nx.shortest_path(G, source=from_vessel, target=to_vessel) - pump_backbone = shortest_path[1: -1] + +def generate_pump_protocol_with_loop_logging( + G: nx.DiGraph, + from_vessel: str, + to_vessel: str, + volume: float, + flowrate: float = 2.5, + transfer_flowrate: float = 0.5, +) -> List[Dict[str, Any]]: + """ + 生成泵操作的动作序列 - 带循环日志版本 + 🔧 修复:正确处理包含电磁阀的路径,并在合适时机打印循环日志 + """ + pump_action_sequence = [] nodes = G.nodes(data=True) + + # 验证输入参数 + if volume <= 0: + logger.error(f"无效的体积参数: {volume}mL") + return pump_action_sequence + + if flowrate <= 0: + flowrate = 2.5 + logger.warning(f"flowrate <= 0,使用默认值 {flowrate}mL/s") + + if transfer_flowrate <= 0: + transfer_flowrate = 0.5 + logger.warning(f"transfer_flowrate <= 0,使用默认值 {transfer_flowrate}mL/s") + + # 验证容器存在 + if from_vessel not in G.nodes(): + logger.error(f"源容器 '{from_vessel}' 不存在") + return pump_action_sequence + + if to_vessel not in G.nodes(): + logger.error(f"目标容器 '{to_vessel}' 不存在") + return pump_action_sequence + + try: + shortest_path = nx.shortest_path(G, source=from_vessel, target=to_vessel) + debug_print(f"PUMP_TRANSFER: 路径 {from_vessel} -> {to_vessel}: {shortest_path}") + except nx.NetworkXNoPath: + logger.error(f"无法找到从 '{from_vessel}' 到 '{to_vessel}' 的路径") + return pump_action_sequence - pumps_from_node, valve_from_node = build_pump_valve_maps(G, pump_backbone) + # 🔧 关键修复:正确构建泵骨架,排除容器和电磁阀 + pump_backbone = [] + for node in shortest_path: + # 跳过起始和结束容器 + if node == from_vessel or node == to_vessel: + continue + + # 跳过电磁阀(电磁阀不参与泵操作) + node_data = G.nodes.get(node, {}) + node_class = node_data.get("class", "") or "" + if ("solenoid" in node_class.lower() or "solenoid_valve" in node.lower()): + debug_print(f"PUMP_TRANSFER: 跳过电磁阀 {node}") + continue + + # 只包含多通阀和泵 + if ("multiway" in node_class.lower() or "valve" in node_class.lower() or "pump" in node_class.lower()): + pump_backbone.append(node) + + debug_print(f"PUMP_TRANSFER: 过滤后的泵骨架: {pump_backbone}") - min_transfer_volume = min([nodes[pumps_from_node[node]]["config"]["max_volume"] for node in pump_backbone]) - if time != 0: - flowrate = transfer_flowrate = volume / time + if not pump_backbone: + debug_print("PUMP_TRANSFER: 没有泵骨架节点,可能是直接容器连接或只有电磁阀") + return pump_action_sequence - pump_action_sequence = generate_pump_protocol(G, from_vessel, to_vessel, float(volume), flowrate, transfer_flowrate) - if rinsing_solvent != "air" and rinsing_solvent != "": + if transfer_flowrate == 0: + transfer_flowrate = flowrate + + try: + pumps_from_node, valve_from_node = build_pump_valve_maps(G, pump_backbone) + except Exception as e: + debug_print(f"PUMP_TRANSFER: 构建泵-阀门映射失败: {str(e)}") + return pump_action_sequence + + if not pumps_from_node: + debug_print("PUMP_TRANSFER: 没有可用的泵映射") + return pump_action_sequence + + # 🔧 修复:安全地获取最小转移体积 + try: + min_transfer_volumes = [] + for node in pump_backbone: + if node in pumps_from_node: + pump_node = pumps_from_node[node] + if pump_node in nodes: + pump_config = nodes[pump_node].get("config", {}) + max_volume = pump_config.get("max_volume") + if max_volume is not None: + min_transfer_volumes.append(max_volume) + + if min_transfer_volumes: + min_transfer_volume = min(min_transfer_volumes) + else: + min_transfer_volume = 25.0 # 默认值 + debug_print(f"PUMP_TRANSFER: 无法获取泵的最大体积,使用默认值: {min_transfer_volume}mL") + except Exception as e: + debug_print(f"PUMP_TRANSFER: 获取最小转移体积失败: {str(e)}") + min_transfer_volume = 25.0 # 默认值 + + repeats = int(np.ceil(volume / min_transfer_volume)) + + if repeats > 1 and (from_vessel.startswith("pump") or to_vessel.startswith("pump")): + logger.error("Cannot transfer volume larger than min_transfer_volume between two pumps.") + return pump_action_sequence + + volume_left = volume + debug_print(f"PUMP_TRANSFER: 需要 {repeats} 次转移,单次最大体积 {min_transfer_volume} mL") + + # 🆕 只在开头打印总体概览 + if repeats > 1: + debug_print(f"🔄 分批转移概览: 总体积 {volume:.2f}mL,需要 {repeats} 次转移") + logger.info(f"🔄 分批转移概览: 总体积 {volume:.2f}mL,需要 {repeats} 次转移") + + # 🔧 创建一个自定义的wait动作,用于在执行时打印日志 + def create_progress_log_action(message: str) -> Dict[str, Any]: + """创建一个特殊的等待动作,在执行时打印进度日志""" + return { + "action_name": "wait", + "action_kwargs": { + "time": 0.1, # 很短的等待时间 + "progress_message": message # 自定义字段,用于进度日志 + } + } + + # 生成泵操作序列 + for i in range(repeats): + current_volume = min(volume_left, min_transfer_volume) + + # 🆕 在每次循环开始时添加进度日志 + if repeats > 1: + start_message = f"🚀 准备开始第 {i+1}/{repeats} 次转移: {current_volume:.2f}mL ({from_vessel} → {to_vessel}) 🚰" + pump_action_sequence.append(create_progress_log_action(start_message)) + + # 🔧 修复:安全地获取边数据 + def get_safe_edge_data(node_a, node_b, key): + try: + edge_data = G.get_edge_data(node_a, node_b) + if edge_data and "port" in edge_data: + port_data = edge_data["port"] + if isinstance(port_data, dict) and key in port_data: + return port_data[key] + return "default" + except Exception as e: + debug_print(f"PUMP_TRANSFER: 获取边数据失败 {node_a}->{node_b}: {str(e)}") + return "default" + + # 从源容器吸液 + if not from_vessel.startswith("pump") and pump_backbone: + first_pump_node = pump_backbone[0] + if first_pump_node in valve_from_node and first_pump_node in pumps_from_node: + port_command = get_safe_edge_data(first_pump_node, from_vessel, first_pump_node) + pump_action_sequence.extend([ + { + "device_id": valve_from_node[first_pump_node], + "action_name": "set_valve_position", + "action_kwargs": { + "command": port_command + } + }, + { + "device_id": pumps_from_node[first_pump_node], + "action_name": "set_position", + "action_kwargs": { + "position": float(current_volume), + "max_velocity": transfer_flowrate + } + } + ]) + pump_action_sequence.append({"action_name": "wait", "action_kwargs": {"time": 3}}) + + # 泵间转移 + for nodeA, nodeB in zip(pump_backbone[:-1], pump_backbone[1:]): + if nodeA in valve_from_node and nodeB in valve_from_node and nodeA in pumps_from_node and nodeB in pumps_from_node: + port_a = get_safe_edge_data(nodeA, nodeB, nodeA) + port_b = get_safe_edge_data(nodeB, nodeA, nodeB) + + pump_action_sequence.append([ + { + "device_id": valve_from_node[nodeA], + "action_name": "set_valve_position", + "action_kwargs": { + "command": port_a + } + }, + { + "device_id": valve_from_node[nodeB], + "action_name": "set_valve_position", + "action_kwargs": { + "command": port_b + } + } + ]) + pump_action_sequence.append([ + { + "device_id": pumps_from_node[nodeA], + "action_name": "set_position", + "action_kwargs": { + "position": 0.0, + "max_velocity": transfer_flowrate + } + }, + { + "device_id": pumps_from_node[nodeB], + "action_name": "set_position", + "action_kwargs": { + "position": float(current_volume), + "max_velocity": transfer_flowrate + } + } + ]) + pump_action_sequence.append({"action_name": "wait", "action_kwargs": {"time": 3}}) + + # 排液到目标容器 + if not to_vessel.startswith("pump") and pump_backbone: + last_pump_node = pump_backbone[-1] + if last_pump_node in valve_from_node and last_pump_node in pumps_from_node: + port_command = get_safe_edge_data(last_pump_node, to_vessel, last_pump_node) + pump_action_sequence.extend([ + { + "device_id": valve_from_node[last_pump_node], + "action_name": "set_valve_position", + "action_kwargs": { + "command": port_command + } + }, + { + "device_id": pumps_from_node[last_pump_node], + "action_name": "set_position", + "action_kwargs": { + "position": 0.0, + "max_velocity": flowrate + } + } + ]) + pump_action_sequence.append({"action_name": "wait", "action_kwargs": {"time": 3}}) + + # 🆕 在每次循环结束时添加完成日志 + if repeats > 1: + remaining_volume = volume_left - current_volume + if remaining_volume > 0: + end_message = f"✅ 第 {i+1}/{repeats} 次转移完成! 剩余 {remaining_volume:.2f}mL 待转移 ⏳" + else: + end_message = f"🎉 第 {i+1}/{repeats} 次转移完成! 全部 {volume:.2f}mL 转移完毕 ✨" + + pump_action_sequence.append(create_progress_log_action(end_message)) + + volume_left -= current_volume + + return pump_action_sequence + + +def generate_pump_protocol_with_rinsing( + G: nx.DiGraph, + from_vessel: str, + to_vessel: str, + volume: float = 0.0, + amount: str = "", + time: float = 0.0, # 🔧 修复:统一使用 time + viscous: bool = False, + rinsing_solvent: str = "", + rinsing_volume: float = 0.0, + rinsing_repeats: int = 0, + solid: bool = False, + flowrate: float = 2.5, + transfer_flowrate: float = 0.5, + rate_spec: str = "", + event: str = "", + through: str = "", + **kwargs +) -> List[Dict[str, Any]]: + """ + 增强兼容性的泵转移协议生成器,支持自动体积检测 + """ + debug_print("=" * 60) + debug_print(f"PUMP_TRANSFER: 🚀 开始生成协议") + debug_print(f" 📍 路径: {from_vessel} -> {to_vessel}") + debug_print(f" 🕐 时间戳: {time_module.time()}") + debug_print(f" 📊 原始参数:") + debug_print(f" - volume: {volume} (类型: {type(volume)})") + debug_print(f" - amount: '{amount}'") + debug_print(f" - time: {time}") # 🔧 修复:统一使用 time + debug_print(f" - flowrate: {flowrate}") + debug_print(f" - transfer_flowrate: {transfer_flowrate}") + debug_print(f" - rate_spec: '{rate_spec}'") + debug_print("=" * 60) + + # ========== 🔧 核心修复:智能体积处理 ========== + + debug_print("🔍 步骤1: 开始体积处理...") + + # 1. 处理体积参数 + final_volume = volume + debug_print(f"📋 初始设置: final_volume = {final_volume}") + + # 🔧 修复:如果volume为0(ROS2传入的空值),从容器读取实际体积 + if volume == 0.0: + debug_print("🎯 检测到 volume=0.0,开始自动体积检测...") + + # 直接从源容器读取实际体积 + actual_volume = get_vessel_liquid_volume(G, from_vessel) + debug_print(f"📖 从容器 '{from_vessel}' 读取到体积: {actual_volume}mL") + + if actual_volume > 0: + final_volume = actual_volume + debug_print(f"✅ 成功设置体积为: {final_volume}mL") + else: + final_volume = 10.0 # 如果读取失败,使用默认值 + debug_print(f"⚠️ 无法从容器读取体积,使用默认值: {final_volume}mL") + else: + debug_print(f"📌 体积非零,直接使用: {final_volume}mL") + + # 处理 amount 参数 + if amount and amount.strip(): + debug_print(f"🔍 检测到 amount 参数: '{amount}',开始解析...") + parsed_volume = _parse_amount_to_volume(amount) + debug_print(f"📖 从 amount 解析得到体积: {parsed_volume}mL") + + if parsed_volume > 0: + final_volume = parsed_volume + debug_print(f"✅ 使用从 amount 解析的体积: {final_volume}mL") + elif parsed_volume == 0.0 and amount.lower().strip() == "all": + debug_print("🎯 检测到 amount='all',从容器读取全部体积...") + actual_volume = get_vessel_liquid_volume(G, from_vessel) + if actual_volume > 0: + final_volume = actual_volume + debug_print(f"✅ amount='all',设置体积为: {final_volume}mL") + + # 最终体积验证 + debug_print(f"🔍 步骤2: 最终体积验证...") + if final_volume <= 0: + debug_print(f"❌ 体积无效: {final_volume}mL") + final_volume = 10.0 + debug_print(f"⚠️ 强制设置为默认值: {final_volume}mL") + + debug_print(f"✅ 最终确定体积: {final_volume}mL") + + # 2. 处理流速参数 + debug_print(f"🔍 步骤3: 处理流速参数...") + debug_print(f" - 原始 flowrate: {flowrate}") + debug_print(f" - 原始 transfer_flowrate: {transfer_flowrate}") + + final_flowrate = flowrate if flowrate > 0 else 2.5 + final_transfer_flowrate = transfer_flowrate if transfer_flowrate > 0 else 0.5 + + if flowrate <= 0: + debug_print(f"⚠️ flowrate <= 0,修正为: {final_flowrate}mL/s") + if transfer_flowrate <= 0: + debug_print(f"⚠️ transfer_flowrate <= 0,修正为: {final_transfer_flowrate}mL/s") + + debug_print(f"✅ 修正后流速: flowrate={final_flowrate}mL/s, transfer_flowrate={final_transfer_flowrate}mL/s") + + # 3. 根据时间计算流速 + if time > 0 and final_volume > 0: # 🔧 修复:统一使用 time + debug_print(f"🔍 步骤4: 根据时间计算流速...") + calculated_flowrate = final_volume / time + debug_print(f" - 计算得到流速: {calculated_flowrate}mL/s") + + if flowrate <= 0 or flowrate == 2.5: + final_flowrate = min(calculated_flowrate, 10.0) + debug_print(f" - 调整 flowrate 为: {final_flowrate}mL/s") + if transfer_flowrate <= 0 or transfer_flowrate == 0.5: + final_transfer_flowrate = min(calculated_flowrate, 5.0) + debug_print(f" - 调整 transfer_flowrate 为: {final_transfer_flowrate}mL/s") + + # 4. 根据速度规格调整 + if rate_spec: + debug_print(f"🔍 步骤5: 根据速度规格调整...") + debug_print(f" - 速度规格: '{rate_spec}'") + + if rate_spec == "dropwise": + final_flowrate = min(final_flowrate, 0.1) + final_transfer_flowrate = min(final_transfer_flowrate, 0.1) + debug_print(f" - dropwise模式,流速调整为: {final_flowrate}mL/s") + elif rate_spec == "slowly": + final_flowrate = min(final_flowrate, 0.5) + final_transfer_flowrate = min(final_transfer_flowrate, 0.3) + debug_print(f" - slowly模式,流速调整为: {final_flowrate}mL/s") + elif rate_spec == "quickly": + final_flowrate = max(final_flowrate, 5.0) + final_transfer_flowrate = max(final_transfer_flowrate, 2.0) + debug_print(f" - quickly模式,流速调整为: {final_flowrate}mL/s") + + # # 5. 处理冲洗参数 + # debug_print(f"🔍 步骤6: 处理冲洗参数...") + # final_rinsing_solvent = rinsing_solvent + # final_rinsing_volume = rinsing_volume if rinsing_volume > 0 else 5.0 + # final_rinsing_repeats = rinsing_repeats if rinsing_repeats > 0 else 2 + + # if rinsing_volume <= 0: + # debug_print(f"⚠️ rinsing_volume <= 0,修正为: {final_rinsing_volume}mL") + # if rinsing_repeats <= 0: + # debug_print(f"⚠️ rinsing_repeats <= 0,修正为: {final_rinsing_repeats}次") + + # # 根据物理属性调整冲洗参数 + # if viscous or solid: + # final_rinsing_repeats = max(final_rinsing_repeats, 3) + # final_rinsing_volume = max(final_rinsing_volume, 10.0) + # debug_print(f"🧪 粘稠/固体物质,调整冲洗参数:{final_rinsing_repeats}次,{final_rinsing_volume}mL") + + # 参数总结 + debug_print("📊 最终参数总结:") + debug_print(f" - 体积: {final_volume}mL") + debug_print(f" - 流速: {final_flowrate}mL/s") + debug_print(f" - 转移流速: {final_transfer_flowrate}mL/s") + # debug_print(f" - 冲洗溶剂: '{final_rinsing_solvent}'") + # debug_print(f" - 冲洗体积: {final_rinsing_volume}mL") + # debug_print(f" - 冲洗次数: {final_rinsing_repeats}次") + + # ========== 执行基础转移 ========== + + debug_print("🔧 步骤7: 开始执行基础转移...") + + try: + debug_print(f" - 调用 generate_pump_protocol...") + debug_print(f" - 参数: G, '{from_vessel}', '{to_vessel}', {final_volume}, {final_flowrate}, {final_transfer_flowrate}") + + pump_action_sequence = generate_pump_protocol( + G, from_vessel, to_vessel, final_volume, + final_flowrate, final_transfer_flowrate + ) + + debug_print(f" - generate_pump_protocol 返回结果:") + debug_print(f" - 动作序列长度: {len(pump_action_sequence)}") + debug_print(f" - 动作序列是否为空: {len(pump_action_sequence) == 0}") + + if not pump_action_sequence: + debug_print("❌ 基础转移协议生成为空,可能是路径问题") + debug_print(f" - 源容器存在: {from_vessel in G.nodes()}") + debug_print(f" - 目标容器存在: {to_vessel in G.nodes()}") + + if from_vessel in G.nodes() and to_vessel in G.nodes(): + try: + path = nx.shortest_path(G, source=from_vessel, target=to_vessel) + debug_print(f" - 路径存在: {path}") + except Exception as path_error: + debug_print(f" - 无法找到路径: {str(path_error)}") + + return [ + { + "device_id": "system", + "action_name": "log_message", + "action_kwargs": { + "message": f"⚠️ 路径问题,无法转移: {final_volume}mL 从 {from_vessel} 到 {to_vessel}" + } + } + ] + + debug_print(f"✅ 基础转移生成了 {len(pump_action_sequence)} 个动作") + + # 打印前几个动作用于调试 + if len(pump_action_sequence) > 0: + debug_print("🔍 前几个动作预览:") + for i, action in enumerate(pump_action_sequence[:3]): + debug_print(f" 动作 {i+1}: {action}") + if len(pump_action_sequence) > 3: + debug_print(f" ... 还有 {len(pump_action_sequence) - 3} 个动作") + + except Exception as e: + debug_print(f"❌ 基础转移失败: {str(e)}") + import traceback + debug_print(f"详细错误: {traceback.format_exc()}") + return [ + { + "device_id": "system", + "action_name": "log_message", + "action_kwargs": { + "message": f"❌ 转移失败: {final_volume}mL 从 {from_vessel} 到 {to_vessel}, 错误: {str(e)}" + } + } + ] + + # ========== 执行冲洗操作 ========== + + # debug_print("🔧 步骤8: 检查冲洗操作...") + + # if final_rinsing_solvent and final_rinsing_solvent.strip() and final_rinsing_repeats > 0: + # debug_print(f"🧽 开始冲洗操作,溶剂: '{final_rinsing_solvent}'") + + # try: + # if final_rinsing_solvent.strip() != "air": + # debug_print(" - 执行液体冲洗...") + # rinsing_actions = _generate_rinsing_sequence( + # G, from_vessel, to_vessel, final_rinsing_solvent, + # final_rinsing_volume, final_rinsing_repeats, + # final_flowrate, final_transfer_flowrate + # ) + # pump_action_sequence.extend(rinsing_actions) + # debug_print(f" - 添加了 {len(rinsing_actions)} 个冲洗动作") + # else: + # debug_print(" - 执行空气冲洗...") + # air_rinsing_actions = _generate_air_rinsing_sequence( + # G, from_vessel, to_vessel, final_rinsing_volume, final_rinsing_repeats, + # final_flowrate, final_transfer_flowrate + # ) + # pump_action_sequence.extend(air_rinsing_actions) + # debug_print(f" - 添加了 {len(air_rinsing_actions)} 个空气冲洗动作") + # except Exception as e: + # debug_print(f"⚠️ 冲洗操作失败: {str(e)},跳过冲洗") + # else: + # debug_print(f"⏭️ 跳过冲洗操作") + # debug_print(f" - 溶剂: '{final_rinsing_solvent}'") + # debug_print(f" - 次数: {final_rinsing_repeats}") + # debug_print(f" - 条件满足: {bool(final_rinsing_solvent and final_rinsing_solvent.strip() and final_rinsing_repeats > 0)}") + + # ========== 最终结果 ========== + + debug_print("=" * 60) + debug_print(f"🎉 PUMP_TRANSFER: 协议生成完成") + debug_print(f" 📊 总动作数: {len(pump_action_sequence)}") + debug_print(f" 📋 最终体积: {final_volume}mL") + debug_print(f" 🚀 执行路径: {from_vessel} -> {to_vessel}") + + # 最终验证 + if len(pump_action_sequence) == 0: + debug_print("🚨 协议生成结果为空!这是异常情况") + return [ + { + "device_id": "system", + "action_name": "log_message", + "action_kwargs": { + "message": f"🚨 协议生成失败: 无法生成任何动作序列" + } + } + ] + + debug_print("=" * 60) + return pump_action_sequence + + +async def generate_pump_protocol_with_rinsing_async( + G: nx.DiGraph, + from_vessel: str, + to_vessel: str, + volume: float = 0.0, + amount: str = "", + time: float = 0.0, + viscous: bool = False, + rinsing_solvent: str = "", + rinsing_volume: float = 0.0, + rinsing_repeats: int = 0, + solid: bool = False, + flowrate: float = 2.5, + transfer_flowrate: float = 0.5, + rate_spec: str = "", + event: str = "", + through: str = "", + **kwargs +) -> List[Dict[str, Any]]: + """ + 异步版本的泵转移协议生成器,避免并发问题 + """ + debug_print("=" * 60) + debug_print(f"PUMP_TRANSFER: 🚀 开始生成协议 (异步版本)") + debug_print(f" 📍 路径: {from_vessel} -> {to_vessel}") + debug_print(f" 🕐 时间戳: {time_module.time()}") + debug_print("=" * 60) + + # 添加唯一标识符 + protocol_id = f"pump_transfer_{int(time_module.time() * 1000000)}" + debug_print(f"📋 协议ID: {protocol_id}") + + # 调用原有的同步版本 + result = generate_pump_protocol_with_rinsing( + G, from_vessel, to_vessel, volume, amount, time, viscous, + rinsing_solvent, rinsing_volume, rinsing_repeats, solid, + flowrate, transfer_flowrate, rate_spec, event, through, **kwargs + ) + + # 为每个动作添加唯一标识 + for i, action in enumerate(result): + if isinstance(action, dict): + action['_protocol_id'] = protocol_id + action['_action_sequence'] = i + action['_timestamp'] = time_module.time() + + debug_print(f"📊 协议 {protocol_id} 生成完成,共 {len(result)} 个动作") + return result + +# 保持原有的同步版本兼容性 +def generate_pump_protocol_with_rinsing( + G: nx.DiGraph, + from_vessel: str, + to_vessel: str, + volume: float = 0.0, + amount: str = "", + time: float = 0.0, + viscous: bool = False, + rinsing_solvent: str = "", + rinsing_volume: float = 0.0, + rinsing_repeats: int = 0, + solid: bool = False, + flowrate: float = 2.5, + transfer_flowrate: float = 0.5, + rate_spec: str = "", + event: str = "", + through: str = "", + **kwargs +) -> List[Dict[str, Any]]: + """ + 原有的同步版本,添加防冲突机制 + """ + + # 添加执行锁,防止并发调用 + import threading + if not hasattr(generate_pump_protocol_with_rinsing, '_lock'): + generate_pump_protocol_with_rinsing._lock = threading.Lock() + + with generate_pump_protocol_with_rinsing._lock: + debug_print("=" * 60) + debug_print(f"PUMP_TRANSFER: 🚀 开始生成协议 (同步版本)") + debug_print(f" 📍 路径: {from_vessel} -> {to_vessel}") + debug_print(f" 🕐 时间戳: {time_module.time()}") + debug_print(f" 🔒 获得执行锁") + debug_print("=" * 60) + + # 短暂延迟,避免快速重复调用 + time_module.sleep(0.01) + + debug_print("🔍 步骤1: 开始体积处理...") + + # 1. 处理体积参数 + final_volume = volume + debug_print(f"📋 初始设置: final_volume = {final_volume}") + + # 🔧 修复:如果volume为0(ROS2传入的空值),从容器读取实际体积 + if volume == 0.0: + debug_print("🎯 检测到 volume=0.0,开始自动体积检测...") + + # 直接从源容器读取实际体积 + actual_volume = get_vessel_liquid_volume(G, from_vessel) + debug_print(f"📖 从容器 '{from_vessel}' 读取到体积: {actual_volume}mL") + + if actual_volume > 0: + final_volume = actual_volume + debug_print(f"✅ 成功设置体积为: {final_volume}mL") + else: + final_volume = 10.0 # 如果读取失败,使用默认值 + logger.warning(f"⚠️ 无法从容器读取体积,使用默认值: {final_volume}mL") + else: + debug_print(f"📌 体积非零,直接使用: {final_volume}mL") + + # 处理 amount 参数 + if amount and amount.strip(): + debug_print(f"🔍 检测到 amount 参数: '{amount}',开始解析...") + parsed_volume = _parse_amount_to_volume(amount) + debug_print(f"📖 从 amount 解析得到体积: {parsed_volume}mL") + + if parsed_volume > 0: + final_volume = parsed_volume + debug_print(f"✅ 使用从 amount 解析的体积: {final_volume}mL") + elif parsed_volume == 0.0 and amount.lower().strip() == "all": + debug_print("🎯 检测到 amount='all',从容器读取全部体积...") + actual_volume = get_vessel_liquid_volume(G, from_vessel) + if actual_volume > 0: + final_volume = actual_volume + debug_print(f"✅ amount='all',设置体积为: {final_volume}mL") + + # 最终体积验证 + debug_print(f"🔍 步骤2: 最终体积验证...") + if final_volume <= 0: + logger.error(f"❌ 体积无效: {final_volume}mL") + final_volume = 10.0 + logger.warning(f"⚠️ 强制设置为默认值: {final_volume}mL") + + debug_print(f"✅ 最终确定体积: {final_volume}mL") + + # 2. 处理流速参数 + debug_print(f"🔍 步骤3: 处理流速参数...") + debug_print(f" - 原始 flowrate: {flowrate}") + debug_print(f" - 原始 transfer_flowrate: {transfer_flowrate}") + + final_flowrate = flowrate if flowrate > 0 else 2.5 + final_transfer_flowrate = transfer_flowrate if transfer_flowrate > 0 else 0.5 + + if flowrate <= 0: + logger.warning(f"⚠️ flowrate <= 0,修正为: {final_flowrate}mL/s") + if transfer_flowrate <= 0: + logger.warning(f"⚠️ transfer_flowrate <= 0,修正为: {final_transfer_flowrate}mL/s") + + debug_print(f"✅ 修正后流速: flowrate={final_flowrate}mL/s, transfer_flowrate={final_transfer_flowrate}mL/s") + + # 3. 根据时间计算流速 + if time > 0 and final_volume > 0: + debug_print(f"🔍 步骤4: 根据时间计算流速...") + calculated_flowrate = final_volume / time + debug_print(f" - 计算得到流速: {calculated_flowrate}mL/s") + + if flowrate <= 0 or flowrate == 2.5: + final_flowrate = min(calculated_flowrate, 10.0) + debug_print(f" - 调整 flowrate 为: {final_flowrate}mL/s") + if transfer_flowrate <= 0 or transfer_flowrate == 0.5: + final_transfer_flowrate = min(calculated_flowrate, 5.0) + debug_print(f" - 调整 transfer_flowrate 为: {final_transfer_flowrate}mL/s") + + # 4. 根据速度规格调整 + if rate_spec: + debug_print(f"🔍 步骤5: 根据速度规格调整...") + debug_print(f" - 速度规格: '{rate_spec}'") + + if rate_spec == "dropwise": + final_flowrate = min(final_flowrate, 0.1) + final_transfer_flowrate = min(final_transfer_flowrate, 0.1) + debug_print(f" - dropwise模式,流速调整为: {final_flowrate}mL/s") + elif rate_spec == "slowly": + final_flowrate = min(final_flowrate, 0.5) + final_transfer_flowrate = min(final_transfer_flowrate, 0.3) + debug_print(f" - slowly模式,流速调整为: {final_flowrate}mL/s") + elif rate_spec == "quickly": + final_flowrate = max(final_flowrate, 5.0) + final_transfer_flowrate = max(final_transfer_flowrate, 2.0) + debug_print(f" - quickly模式,流速调整为: {final_flowrate}mL/s") + + # # 5. 处理冲洗参数 + # debug_print(f"🔍 步骤6: 处理冲洗参数...") + # final_rinsing_solvent = rinsing_solvent + # final_rinsing_volume = rinsing_volume if rinsing_volume > 0 else 5.0 + # final_rinsing_repeats = rinsing_repeats if rinsing_repeats > 0 else 2 + + # if rinsing_volume <= 0: + # logger.warning(f"⚠️ rinsing_volume <= 0,修正为: {final_rinsing_volume}mL") + # if rinsing_repeats <= 0: + # logger.warning(f"⚠️ rinsing_repeats <= 0,修正为: {final_rinsing_repeats}次") + + # # 根据物理属性调整冲洗参数 + # if viscous or solid: + # final_rinsing_repeats = max(final_rinsing_repeats, 3) + # final_rinsing_volume = max(final_rinsing_volume, 10.0) + # debug_print(f"🧪 粘稠/固体物质,调整冲洗参数:{final_rinsing_repeats}次,{final_rinsing_volume}mL") + + # 参数总结 + debug_print("📊 最终参数总结:") + debug_print(f" - 体积: {final_volume}mL") + debug_print(f" - 流速: {final_flowrate}mL/s") + debug_print(f" - 转移流速: {final_transfer_flowrate}mL/s") + # debug_print(f" - 冲洗溶剂: '{final_rinsing_solvent}'") + # debug_print(f" - 冲洗体积: {final_rinsing_volume}mL") + # debug_print(f" - 冲洗次数: {final_rinsing_repeats}次") + + # ========== 执行基础转移 ========== + + debug_print("🔧 步骤7: 开始执行基础转移...") + + try: + debug_print(f" - 调用 generate_pump_protocol...") + debug_print(f" - 参数: G, '{from_vessel}', '{to_vessel}', {final_volume}, {final_flowrate}, {final_transfer_flowrate}") + + pump_action_sequence = generate_pump_protocol( + G, from_vessel, to_vessel, final_volume, + final_flowrate, final_transfer_flowrate + ) + + debug_print(f" - generate_pump_protocol 返回结果:") + debug_print(f" - 动作序列长度: {len(pump_action_sequence)}") + debug_print(f" - 动作序列是否为空: {len(pump_action_sequence) == 0}") + + if not pump_action_sequence: + debug_print("❌ 基础转移协议生成为空,可能是路径问题") + debug_print(f" - 源容器存在: {from_vessel in G.nodes()}") + debug_print(f" - 目标容器存在: {to_vessel in G.nodes()}") + + if from_vessel in G.nodes() and to_vessel in G.nodes(): + try: + path = nx.shortest_path(G, source=from_vessel, target=to_vessel) + debug_print(f" - 路径存在: {path}") + except Exception as path_error: + debug_print(f" - 无法找到路径: {str(path_error)}") + + return [ + { + "device_id": "system", + "action_name": "log_message", + "action_kwargs": { + "message": f"⚠️ 路径问题,无法转移: {final_volume}mL 从 {from_vessel} 到 {to_vessel}" + } + } + ] + + debug_print(f"✅ 基础转移生成了 {len(pump_action_sequence)} 个动作") + + # 打印前几个动作用于调试 + if len(pump_action_sequence) > 0: + debug_print("🔍 前几个动作预览:") + for i, action in enumerate(pump_action_sequence[:3]): + debug_print(f" 动作 {i+1}: {action}") + if len(pump_action_sequence) > 3: + debug_print(f" ... 还有 {len(pump_action_sequence) - 3} 个动作") + + except Exception as e: + debug_print(f"❌ 基础转移失败: {str(e)}") + import traceback + debug_print(f"详细错误: {traceback.format_exc()}") + return [ + { + "device_id": "system", + "action_name": "log_message", + "action_kwargs": { + "message": f"❌ 转移失败: {final_volume}mL 从 {from_vessel} 到 {to_vessel}, 错误: {str(e)}" + } + } + ] + + # ========== 执行冲洗操作 ========== + + # debug_print("🔧 步骤8: 检查冲洗操作...") + + # if final_rinsing_solvent and final_rinsing_solvent.strip() and final_rinsing_repeats > 0: + # debug_print(f"🧽 开始冲洗操作,溶剂: '{final_rinsing_solvent}'") + + # try: + # if final_rinsing_solvent.strip() != "air": + # debug_print(" - 执行液体冲洗...") + # rinsing_actions = _generate_rinsing_sequence( + # G, from_vessel, to_vessel, final_rinsing_solvent, + # final_rinsing_volume, final_rinsing_repeats, + # final_flowrate, final_transfer_flowrate + # ) + # pump_action_sequence.extend(rinsing_actions) + # debug_print(f" - 添加了 {len(rinsing_actions)} 个冲洗动作") + # else: + # debug_print(" - 执行空气冲洗...") + # air_rinsing_actions = _generate_air_rinsing_sequence( + # G, from_vessel, to_vessel, final_rinsing_volume, final_rinsing_repeats, + # final_flowrate, final_transfer_flowrate + # ) + # pump_action_sequence.extend(air_rinsing_actions) + # debug_print(f" - 添加了 {len(air_rinsing_actions)} 个空气冲洗动作") + # except Exception as e: + # debug_print(f"⚠️ 冲洗操作失败: {str(e)},跳过冲洗") + # else: + # debug_print(f"⏭️ 跳过冲洗操作") + # debug_print(f" - 溶剂: '{final_rinsing_solvent}'") + # debug_print(f" - 次数: {final_rinsing_repeats}") + # debug_print(f" - 条件满足: {bool(final_rinsing_solvent and final_rinsing_solvent.strip() and final_rinsing_repeats > 0)}") + + # ========== 最终结果 ========== + + debug_print("=" * 60) + debug_print(f"🎉 PUMP_TRANSFER: 协议生成完成") + debug_print(f" 📊 总动作数: {len(pump_action_sequence)}") + debug_print(f" 📋 最终体积: {final_volume}mL") + debug_print(f" 🚀 执行路径: {from_vessel} -> {to_vessel}") + + # 最终验证 + if len(pump_action_sequence) == 0: + debug_print("🚨 协议生成结果为空!这是异常情况") + return [ + { + "device_id": "system", + "action_name": "log_message", + "action_kwargs": { + "message": f"🚨 协议生成失败: 无法生成任何动作序列" + } + } + ] + + debug_print("=" * 60) + return pump_action_sequence + + +async def generate_pump_protocol_with_rinsing_async( + G: nx.DiGraph, + from_vessel: str, + to_vessel: str, + volume: float = 0.0, + amount: str = "", + time: float = 0.0, + viscous: bool = False, + rinsing_solvent: str = "", + rinsing_volume: float = 0.0, + rinsing_repeats: int = 0, + solid: bool = False, + flowrate: float = 2.5, + transfer_flowrate: float = 0.5, + rate_spec: str = "", + event: str = "", + through: str = "", + **kwargs +) -> List[Dict[str, Any]]: + """ + 异步版本的泵转移协议生成器,避免并发问题 + """ + debug_print("=" * 60) + debug_print(f"PUMP_TRANSFER: 🚀 开始生成协议 (异步版本)") + debug_print(f" 📍 路径: {from_vessel} -> {to_vessel}") + debug_print(f" 🕐 时间戳: {time_module.time()}") + debug_print("=" * 60) + + # 添加唯一标识符 + protocol_id = f"pump_transfer_{int(time_module.time() * 1000000)}" + debug_print(f"📋 协议ID: {protocol_id}") + + # 调用原有的同步版本 + result = generate_pump_protocol_with_rinsing( + G, from_vessel, to_vessel, volume, amount, time, viscous, + rinsing_solvent, rinsing_volume, rinsing_repeats, solid, + flowrate, transfer_flowrate, rate_spec, event, through, **kwargs + ) + + # 为每个动作添加唯一标识 + for i, action in enumerate(result): + if isinstance(action, dict): + action['_protocol_id'] = protocol_id + action['_action_sequence'] = i + action['_timestamp'] = time_module.time() + + debug_print(f"📊 协议 {protocol_id} 生成完成,共 {len(result)} 个动作") + return result + +# 保持原有的同步版本兼容性 +def generate_pump_protocol_with_rinsing( + G: nx.DiGraph, + from_vessel: str, + to_vessel: str, + volume: float = 0.0, + amount: str = "", + time: float = 0.0, + viscous: bool = False, + rinsing_solvent: str = "", + rinsing_volume: float = 0.0, + rinsing_repeats: int = 0, + solid: bool = False, + flowrate: float = 2.5, + transfer_flowrate: float = 0.5, + rate_spec: str = "", + event: str = "", + through: str = "", + **kwargs +) -> List[Dict[str, Any]]: + """ + 原有的同步版本,添加防冲突机制 + """ + + # 添加执行锁,防止并发调用 + import threading + if not hasattr(generate_pump_protocol_with_rinsing, '_lock'): + generate_pump_protocol_with_rinsing._lock = threading.Lock() + + with generate_pump_protocol_with_rinsing._lock: + debug_print("=" * 60) + debug_print(f"PUMP_TRANSFER: 🚀 开始生成协议 (同步版本)") + debug_print(f" 📍 路径: {from_vessel} -> {to_vessel}") + debug_print(f" 🕐 时间戳: {time_module.time()}") + debug_print(f" 🔒 获得执行锁") + debug_print("=" * 60) + + # 短暂延迟,避免快速重复调用 + time_module.sleep(0.01) + + debug_print("🔍 步骤1: 开始体积处理...") + + # 1. 处理体积参数 + final_volume = volume + debug_print(f"📋 初始设置: final_volume = {final_volume}") + + # 🔧 修复:如果volume为0(ROS2传入的空值),从容器读取实际体积 + if volume == 0.0: + debug_print("🎯 检测到 volume=0.0,开始自动体积检测...") + + # 直接从源容器读取实际体积 + actual_volume = get_vessel_liquid_volume(G, from_vessel) + debug_print(f"📖 从容器 '{from_vessel}' 读取到体积: {actual_volume}mL") + + if actual_volume > 0: + final_volume = actual_volume + debug_print(f"✅ 成功设置体积为: {final_volume}mL") + else: + final_volume = 10.0 # 如果读取失败,使用默认值 + logger.warning(f"⚠️ 无法从容器读取体积,使用默认值: {final_volume}mL") + else: + debug_print(f"📌 体积非零,直接使用: {final_volume}mL") + + # 处理 amount 参数 + if amount and amount.strip(): + debug_print(f"🔍 检测到 amount 参数: '{amount}',开始解析...") + parsed_volume = _parse_amount_to_volume(amount) + debug_print(f"📖 从 amount 解析得到体积: {parsed_volume}mL") + + if parsed_volume > 0: + final_volume = parsed_volume + debug_print(f"✅ 使用从 amount 解析的体积: {final_volume}mL") + elif parsed_volume == 0.0 and amount.lower().strip() == "all": + debug_print("🎯 检测到 amount='all',从容器读取全部体积...") + actual_volume = get_vessel_liquid_volume(G, from_vessel) + if actual_volume > 0: + final_volume = actual_volume + debug_print(f"✅ amount='all',设置体积为: {final_volume}mL") + + # 最终体积验证 + debug_print(f"🔍 步骤2: 最终体积验证...") + if final_volume <= 0: + logger.error(f"❌ 体积无效: {final_volume}mL") + final_volume = 10.0 + logger.warning(f"⚠️ 强制设置为默认值: {final_volume}mL") + + debug_print(f"✅ 最终确定体积: {final_volume}mL") + + # 2. 处理流速参数 + debug_print(f"🔍 步骤3: 处理流速参数...") + debug_print(f" - 原始 flowrate: {flowrate}") + debug_print(f" - 原始 transfer_flowrate: {transfer_flowrate}") + + final_flowrate = flowrate if flowrate > 0 else 2.5 + final_transfer_flowrate = transfer_flowrate if transfer_flowrate > 0 else 0.5 + + if flowrate <= 0: + logger.warning(f"⚠️ flowrate <= 0,修正为: {final_flowrate}mL/s") + if transfer_flowrate <= 0: + logger.warning(f"⚠️ transfer_flowrate <= 0,修正为: {final_transfer_flowrate}mL/s") + + debug_print(f"✅ 修正后流速: flowrate={final_flowrate}mL/s, transfer_flowrate={final_transfer_flowrate}mL/s") + + # 3. 根据时间计算流速 + if time > 0 and final_volume > 0: + debug_print(f"🔍 步骤4: 根据时间计算流速...") + calculated_flowrate = final_volume / time + debug_print(f" - 计算得到流速: {calculated_flowrate}mL/s") + + if flowrate <= 0 or flowrate == 2.5: + final_flowrate = min(calculated_flowrate, 10.0) + debug_print(f" - 调整 flowrate 为: {final_flowrate}mL/s") + if transfer_flowrate <= 0 or transfer_flowrate == 0.5: + final_transfer_flowrate = min(calculated_flowrate, 5.0) + debug_print(f" - 调整 transfer_flowrate 为: {final_transfer_flowrate}mL/s") + + # 4. 根据速度规格调整 + if rate_spec: + debug_print(f"🔍 步骤5: 根据速度规格调整...") + debug_print(f" - 速度规格: '{rate_spec}'") + + if rate_spec == "dropwise": + final_flowrate = min(final_flowrate, 0.1) + final_transfer_flowrate = min(final_transfer_flowrate, 0.1) + debug_print(f" - dropwise模式,流速调整为: {final_flowrate}mL/s") + elif rate_spec == "slowly": + final_flowrate = min(final_flowrate, 0.5) + final_transfer_flowrate = min(final_transfer_flowrate, 0.3) + debug_print(f" - slowly模式,流速调整为: {final_flowrate}mL/s") + elif rate_spec == "quickly": + final_flowrate = max(final_flowrate, 5.0) + final_transfer_flowrate = max(final_transfer_flowrate, 2.0) + debug_print(f" - quickly模式,流速调整为: {final_flowrate}mL/s") + + # # 5. 处理冲洗参数 + # debug_print(f"🔍 步骤6: 处理冲洗参数...") + # final_rinsing_solvent = rinsing_solvent + # final_rinsing_volume = rinsing_volume if rinsing_volume > 0 else 5.0 + # final_rinsing_repeats = rinsing_repeats if rinsing_repeats > 0 else 2 + + # if rinsing_volume <= 0: + # logger.warning(f"⚠️ rinsing_volume <= 0,修正为: {final_rinsing_volume}mL") + # if rinsing_repeats <= 0: + # logger.warning(f"⚠️ rinsing_repeats <= 0,修正为: {final_rinsing_repeats}次") + + # # 根据物理属性调整冲洗参数 + # if viscous or solid: + # final_rinsing_repeats = max(final_rinsing_repeats, 3) + # final_rinsing_volume = max(final_rinsing_volume, 10.0) + # debug_print(f"🧪 粘稠/固体物质,调整冲洗参数:{final_rinsing_repeats}次,{final_rinsing_volume}mL") + + try: + pump_action_sequence = generate_pump_protocol( + G, from_vessel, to_vessel, final_volume, + flowrate, transfer_flowrate + ) + + # 为每个动作添加唯一标识 + # for i, action in enumerate(pump_action_sequence): + # if isinstance(action, dict): + # action['_protocol_id'] = protocol_id + # action['_action_sequence'] = i + # elif isinstance(action, list): + # for j, sub_action in enumerate(action): + # if isinstance(sub_action, dict): + # sub_action['_protocol_id'] = protocol_id + # sub_action['_action_sequence'] = f"{i}_{j}" + # + # debug_print(f"📊 协议 {protocol_id} 生成完成,共 {len(pump_action_sequence)} 个动作") + debug_print(f"🔓 释放执行锁") + return pump_action_sequence + + except Exception as e: + logger.error(f"❌ 协议生成失败: {str(e)}") + return [ + { + "device_id": "system", + "action_name": "log_message", + "action_kwargs": { + "message": f"❌ 协议生成失败: {str(e)}" + } + } + ] + +def _parse_amount_to_volume(amount: str) -> float: + """解析 amount 字符串为体积""" + debug_print(f"🔍 解析 amount: '{amount}'") + + if not amount: + debug_print(" - amount 为空,返回 0.0") + return 0.0 + + amount = amount.lower().strip() + debug_print(f" - 处理后的 amount: '{amount}'") + + # 处理特殊关键词 + if amount == "all": + debug_print(" - 检测到 'all',返回 0.0(需要后续处理)") + return 0.0 # 返回0.0,让调用者处理 + + # 提取数字 + import re + numbers = re.findall(r'[\d.]+', amount) + debug_print(f" - 提取到的数字: {numbers}") + + if numbers: + volume = float(numbers[0]) + debug_print(f" - 基础体积: {volume}") + + # 单位转换 + if 'ml' in amount or 'milliliter' in amount: + debug_print(f" - 单位: mL,最终体积: {volume}") + return volume + elif 'l' in amount and 'ml' not in amount: + final_volume = volume * 1000 + debug_print(f" - 单位: L,最终体积: {final_volume}mL") + return final_volume + elif 'μl' in amount or 'microliter' in amount: + final_volume = volume / 1000 + debug_print(f" - 单位: μL,最终体积: {final_volume}mL") + return final_volume + else: + debug_print(f" - 无单位,假设为 mL: {volume}") + return volume + + debug_print(" - 无法解析,返回 0.0") + return 0.0 + + +def _generate_rinsing_sequence(G: nx.DiGraph, from_vessel: str, to_vessel: str, + rinsing_solvent: str, rinsing_volume: float, + rinsing_repeats: int, flowrate: float, + transfer_flowrate: float) -> List[Dict[str, Any]]: + """生成冲洗动作序列""" + rinsing_actions = [] + + try: + shortest_path = nx.shortest_path(G, source=from_vessel, target=to_vessel) + pump_backbone = shortest_path[1:-1] + + if not pump_backbone: + return rinsing_actions + + nodes = G.nodes(data=True) + pumps_from_node, valve_from_node = build_pump_valve_maps(G, pump_backbone) + min_transfer_volume = min([nodes[pumps_from_node[node]]["config"]["max_volume"] for node in pump_backbone]) + + waste_vessel = "waste_workup" + + # 处理多种溶剂情况 if "," in rinsing_solvent: rinsing_solvents = rinsing_solvent.split(",") - assert len( - rinsing_solvents) == rinsing_repeats, "Number of rinsing solvents must match number of rinsing repeats." + if len(rinsing_solvents) != rinsing_repeats: + rinsing_solvents = [rinsing_solvent] * rinsing_repeats else: rinsing_solvents = [rinsing_solvent] * rinsing_repeats - for rinsing_solvent in rinsing_solvents: - solvent_vessel = f"flask_{rinsing_solvent}" - # 清洗泵 - pump_action_sequence.extend( - generate_pump_protocol(G, solvent_vessel, pump_backbone[0], min_transfer_volume, flowrate, - transfer_flowrate) + - generate_pump_protocol(G, pump_backbone[0], pump_backbone[-1], min_transfer_volume, flowrate, - transfer_flowrate) + - generate_pump_protocol(G, pump_backbone[-1], waste_vessel, min_transfer_volume, flowrate, - transfer_flowrate) - ) - # 如果转移的是溶液,第一种冲洗溶剂请选用溶液的溶剂,稀释泵内、转移管道内的溶液。后续冲洗溶剂不需要此操作。 - if rinsing_solvent == rinsing_solvents[0]: - pump_action_sequence.extend( - generate_pump_protocol(G, solvent_vessel, from_vessel, rinsing_volume, flowrate, transfer_flowrate)) - pump_action_sequence.extend( - generate_pump_protocol(G, solvent_vessel, to_vessel, rinsing_volume, flowrate, transfer_flowrate)) - pump_action_sequence.extend( - generate_pump_protocol(G, air_vessel, solvent_vessel, rinsing_volume, flowrate, transfer_flowrate)) - pump_action_sequence.extend( - generate_pump_protocol(G, air_vessel, waste_vessel, rinsing_volume, flowrate, transfer_flowrate)) - if rinsing_solvent != "": - pump_action_sequence.extend( - generate_pump_protocol(G, air_vessel, from_vessel, rinsing_volume, flowrate, transfer_flowrate) * 2) - pump_action_sequence.extend( - generate_pump_protocol(G, air_vessel, to_vessel, rinsing_volume, flowrate, transfer_flowrate) * 2) + for solvent in rinsing_solvents: + solvent_vessel = f"flask_{solvent.strip()}" - return pump_action_sequence -# End Protocols + # 检查溶剂容器是否存在 + if solvent_vessel not in G.nodes(): + logger.warning(f"溶剂容器 {solvent_vessel} 不存在,跳过该溶剂冲洗") + continue + + # 清洗泵系统 + rinsing_actions.extend( + generate_pump_protocol(G, solvent_vessel, pump_backbone[0], min_transfer_volume, flowrate, transfer_flowrate) + ) + + if len(pump_backbone) > 1: + rinsing_actions.extend( + generate_pump_protocol(G, pump_backbone[0], pump_backbone[-1], min_transfer_volume, flowrate, transfer_flowrate) + ) + + # 排到废液容器 + if waste_vessel in G.nodes(): + rinsing_actions.extend( + generate_pump_protocol(G, pump_backbone[-1], waste_vessel, min_transfer_volume, flowrate, transfer_flowrate) + ) + + # 第一种冲洗溶剂稀释源容器和目标容器 + if solvent == rinsing_solvents[0]: + rinsing_actions.extend( + generate_pump_protocol(G, solvent_vessel, from_vessel, rinsing_volume, flowrate, transfer_flowrate) + ) + rinsing_actions.extend( + generate_pump_protocol(G, solvent_vessel, to_vessel, rinsing_volume, flowrate, transfer_flowrate) + ) + + except Exception as e: + logger.error(f"生成冲洗序列失败: {str(e)}") + + return rinsing_actions + + +def _generate_air_rinsing_sequence(G: nx.DiGraph, from_vessel: str, to_vessel: str, + rinsing_volume: float, repeats: int, + flowrate: float, transfer_flowrate: float) -> List[Dict[str, Any]]: + """生成空气冲洗序列""" + air_rinsing_actions = [] + + try: + air_vessel = "flask_air" + if air_vessel not in G.nodes(): + logger.warning("空气容器 flask_air 不存在,跳过空气冲洗") + return air_rinsing_actions + + for _ in range(repeats): + # 空气冲洗源容器 + air_rinsing_actions.extend( + generate_pump_protocol(G, air_vessel, from_vessel, rinsing_volume, flowrate, transfer_flowrate) + ) + + # 空气冲洗目标容器 + air_rinsing_actions.extend( + generate_pump_protocol(G, air_vessel, to_vessel, rinsing_volume, flowrate, transfer_flowrate) + ) + + except Exception as e: + logger.warning(f"空气冲洗失败: {str(e)}") + + return air_rinsing_actions diff --git a/unilabos/compile/recrystallize_protocol.py b/unilabos/compile/recrystallize_protocol.py index b69d88b..569a798 100644 --- a/unilabos/compile/recrystallize_protocol.py +++ b/unilabos/compile/recrystallize_protocol.py @@ -1,8 +1,89 @@ import networkx as nx -from typing import List, Dict, Any, Tuple +import re +from typing import List, Dict, Any, Tuple, Union from .pump_protocol import generate_pump_protocol_with_rinsing +def debug_print(message): + """调试输出""" + print(f"💎 [RECRYSTALLIZE] {message}", flush=True) + + +def parse_volume_with_units(volume_input: Union[str, float, int], default_unit: str = "mL") -> float: + """ + 解析带单位的体积输入 + + Args: + volume_input: 体积输入(如 "100 mL", "2.5 L", "500", "?", 100.0) + default_unit: 默认单位(默认为毫升) + + Returns: + float: 体积(毫升) + """ + if not volume_input: + debug_print("⚠️ 体积输入为空,返回 0.0mL 📦") + return 0.0 + + # 处理数值输入 + if isinstance(volume_input, (int, float)): + result = float(volume_input) + debug_print(f"🔢 数值体积输入: {volume_input} → {result}mL(默认单位)💧") + return result + + # 处理字符串输入 + volume_str = str(volume_input).lower().strip() + debug_print(f"🔍 解析体积字符串: '{volume_str}' 📝") + + # 处理特殊值 + if volume_str in ['?', 'unknown', 'tbd', 'to be determined']: + default_volume = 50.0 # 50mL默认值 + debug_print(f"❓ 检测到未知体积,使用默认值: {default_volume}mL 🎯") + return default_volume + + # 如果是纯数字,使用默认单位 + try: + value = float(volume_str) + if default_unit.lower() in ["ml", "milliliter"]: + result = value + elif default_unit.lower() in ["l", "liter"]: + result = value * 1000.0 + elif default_unit.lower() in ["μl", "ul", "microliter"]: + result = value / 1000.0 + else: + result = value # 默认mL + debug_print(f"🔢 纯数字输入: {volume_str} → {result}mL(单位: {default_unit})📏") + return result + except ValueError: + pass + + # 移除空格并提取数字和单位 + volume_clean = re.sub(r'\s+', '', volume_str) + + # 匹配数字和单位的正则表达式 + match = re.match(r'([0-9]*\.?[0-9]+)\s*(ml|l|μl|ul|microliter|milliliter|liter)?', volume_clean) + + if not match: + debug_print(f"⚠️ 无法解析体积: '{volume_str}',使用默认值: 50mL 🎯") + return 50.0 + + value = float(match.group(1)) + unit = match.group(2) or default_unit.lower() + + # 转换为毫升 + if unit in ['l', 'liter']: + volume = value * 1000.0 # L -> mL + debug_print(f"📏 升转毫升: {value}L → {volume}mL 💧") + elif unit in ['μl', 'ul', 'microliter']: + volume = value / 1000.0 # μL -> mL + debug_print(f"📏 微升转毫升: {value}μL → {volume}mL 💧") + else: # ml, milliliter 或默认 + volume = value # 已经是mL + debug_print(f"📏 毫升单位: {value}mL → {volume}mL 💧") + + debug_print(f"✅ 体积解析完成: '{volume_str}' → {volume}mL ✨") + return volume + + def parse_ratio(ratio_str: str) -> Tuple[float, float]: """ 解析比例字符串,支持多种格式 @@ -13,6 +94,8 @@ def parse_ratio(ratio_str: str) -> Tuple[float, float]: Returns: Tuple[float, float]: 比例元组 (ratio1, ratio2) """ + debug_print(f"⚖️ 开始解析比例: '{ratio_str}' 📊") + try: # 处理 "1:1", "3:7", "50:50" 等格式 if ":" in ratio_str: @@ -20,6 +103,7 @@ def parse_ratio(ratio_str: str) -> Tuple[float, float]: if len(parts) == 2: ratio1 = float(parts[0]) ratio2 = float(parts[1]) + debug_print(f"✅ 冒号格式解析成功: {ratio1}:{ratio2} 🎯") return ratio1, ratio2 # 处理 "1-1", "3-7" 等格式 @@ -28,6 +112,7 @@ def parse_ratio(ratio_str: str) -> Tuple[float, float]: if len(parts) == 2: ratio1 = float(parts[0]) ratio2 = float(parts[1]) + debug_print(f"✅ 横线格式解析成功: {ratio1}:{ratio2} 🎯") return ratio1, ratio2 # 处理 "1,1", "3,7" 等格式 @@ -36,14 +121,15 @@ def parse_ratio(ratio_str: str) -> Tuple[float, float]: if len(parts) == 2: ratio1 = float(parts[0]) ratio2 = float(parts[1]) + debug_print(f"✅ 逗号格式解析成功: {ratio1}:{ratio2} 🎯") return ratio1, ratio2 # 默认 1:1 - print(f"RECRYSTALLIZE: 无法解析比例 '{ratio_str}',使用默认比例 1:1") + debug_print(f"⚠️ 无法解析比例 '{ratio_str}',使用默认比例 1:1 🎭") return 1.0, 1.0 except ValueError: - print(f"RECRYSTALLIZE: 比例解析错误 '{ratio_str}',使用默认比例 1:1") + debug_print(f"❌ 比例解析错误 '{ratio_str}',使用默认比例 1:1 🎭") return 1.0, 1.0 @@ -58,7 +144,7 @@ def find_solvent_vessel(G: nx.DiGraph, solvent: str) -> str: Returns: str: 溶剂容器ID """ - print(f"RECRYSTALLIZE: 正在查找溶剂 '{solvent}' 的容器...") + debug_print(f"🔍 正在查找溶剂 '{solvent}' 的容器... 🧪") # 构建可能的容器名称 possible_names = [ @@ -72,22 +158,27 @@ def find_solvent_vessel(G: nx.DiGraph, solvent: str) -> str: f"vessel_{solvent}", ] + debug_print(f"📋 候选容器名称: {possible_names[:3]}... (共{len(possible_names)}个) 📝") + # 第一步:通过容器名称匹配 + debug_print(" 🎯 步骤1: 精确名称匹配...") for vessel_name in possible_names: if vessel_name in G.nodes(): - print(f"RECRYSTALLIZE: 通过名称匹配找到容器: {vessel_name}") + debug_print(f" 🎉 通过名称匹配找到容器: {vessel_name} ✨") return vessel_name # 第二步:通过模糊匹配 + debug_print(" 🔍 步骤2: 模糊名称匹配...") for node_id in G.nodes(): if G.nodes[node_id].get('type') == 'container': node_name = G.nodes[node_id].get('name', '').lower() if solvent.lower() in node_id.lower() or solvent.lower() in node_name: - print(f"RECRYSTALLIZE: 通过模糊匹配找到容器: {node_id}") + debug_print(f" 🎉 通过模糊匹配找到容器: {node_id} ✨") return node_id # 第三步:通过液体类型匹配 + debug_print(" 🧪 步骤3: 液体类型匹配...") for node_id in G.nodes(): if G.nodes[node_id].get('type') == 'container': vessel_data = G.nodes[node_id].get('data', {}) @@ -99,9 +190,10 @@ def find_solvent_vessel(G: nx.DiGraph, solvent: str) -> str: reagent_name = vessel_data.get('reagent_name', '').lower() if solvent.lower() in liquid_type or solvent.lower() in reagent_name: - print(f"RECRYSTALLIZE: 通过液体类型匹配找到容器: {node_id}") + debug_print(f" 🎉 通过液体类型匹配找到容器: {node_id} ✨") return node_id + debug_print(f"❌ 找不到溶剂 '{solvent}' 对应的容器 😭") raise ValueError(f"找不到溶剂 '{solvent}' 对应的容器") @@ -111,11 +203,11 @@ def generate_recrystallize_protocol( solvent1: str, solvent2: str, vessel: str, - volume: float, - **kwargs # 接收其他可能的参数但不使用 + volume: Union[str, float], # 🔧 修改:支持字符串和数值 + **kwargs ) -> List[Dict[str, Any]]: """ - 生成重结晶协议序列 + 生成重结晶协议序列 - 支持单位 Args: G: 有向图,节点为容器和设备 @@ -123,72 +215,95 @@ def generate_recrystallize_protocol( solvent1: 第一种溶剂名称 solvent2: 第二种溶剂名称 vessel: 目标容器 - volume: 总体积 (mL) - **kwargs: 其他可选参数,但不使用 + volume: 总体积(支持 "100 mL", "50", "2.5 L" 等) + **kwargs: 其他可选参数 Returns: List[Dict[str, Any]]: 动作序列 """ action_sequence = [] - print(f"RECRYSTALLIZE: 开始生成重结晶协议") - print(f" - 比例: {ratio}") - print(f" - 溶剂1: {solvent1}") - print(f" - 溶剂2: {solvent2}") - print(f" - 容器: {vessel}") - print(f" - 总体积: {volume} mL") + debug_print("💎" * 20) + debug_print("🚀 开始生成重结晶协议(支持单位)✨") + debug_print(f"📝 输入参数:") + debug_print(f" ⚖️ 比例: {ratio}") + debug_print(f" 🧪 溶剂1: {solvent1}") + debug_print(f" 🧪 溶剂2: {solvent2}") + debug_print(f" 🥽 容器: {vessel}") + debug_print(f" 💧 总体积: {volume} (类型: {type(volume)})") + debug_print("💎" * 20) # 1. 验证目标容器存在 + debug_print("📍 步骤1: 验证目标容器... 🔧") if vessel not in G.nodes(): + debug_print(f"❌ 目标容器 '{vessel}' 不存在于系统中! 😱") raise ValueError(f"目标容器 '{vessel}' 不存在于系统中") + debug_print(f"✅ 目标容器 '{vessel}' 验证通过 🎯") - # 2. 解析比例 + # 2. 🔧 新增:解析体积(支持单位) + debug_print("📍 步骤2: 解析体积(支持单位)... 💧") + final_volume = parse_volume_with_units(volume, "mL") + debug_print(f"🎯 体积解析完成: {volume} → {final_volume}mL ✨") + + # 3. 解析比例 + debug_print("📍 步骤3: 解析比例... ⚖️") ratio1, ratio2 = parse_ratio(ratio) total_ratio = ratio1 + ratio2 + debug_print(f"🎯 比例解析完成: {ratio1}:{ratio2} (总比例: {total_ratio}) ✨") - # 3. 计算各溶剂体积 - volume1 = volume * (ratio1 / total_ratio) - volume2 = volume * (ratio2 / total_ratio) + # 4. 计算各溶剂体积 + debug_print("📍 步骤4: 计算各溶剂体积... 🧮") + volume1 = final_volume * (ratio1 / total_ratio) + volume2 = final_volume * (ratio2 / total_ratio) - print(f"RECRYSTALLIZE: 解析比例: {ratio1}:{ratio2}") - print(f"RECRYSTALLIZE: {solvent1} 体积: {volume1:.2f} mL") - print(f"RECRYSTALLIZE: {solvent2} 体积: {volume2:.2f} mL") + debug_print(f"🧪 {solvent1} 体积: {volume1:.2f} mL ({ratio1}/{total_ratio} × {final_volume})") + debug_print(f"🧪 {solvent2} 体积: {volume2:.2f} mL ({ratio2}/{total_ratio} × {final_volume})") + debug_print(f"✅ 体积计算完成: 总计 {volume1 + volume2:.2f} mL 🎯") - # 4. 查找溶剂容器 + # 5. 查找溶剂容器 + debug_print("📍 步骤5: 查找溶剂容器... 🔍") try: + debug_print(f" 🔍 查找溶剂1容器...") solvent1_vessel = find_solvent_vessel(G, solvent1) - print(f"RECRYSTALLIZE: 找到溶剂1容器: {solvent1_vessel}") + debug_print(f" 🎉 找到溶剂1容器: {solvent1_vessel} ✨") except ValueError as e: + debug_print(f" ❌ 溶剂1容器查找失败: {str(e)} 😭") raise ValueError(f"无法找到溶剂1 '{solvent1}': {str(e)}") try: + debug_print(f" 🔍 查找溶剂2容器...") solvent2_vessel = find_solvent_vessel(G, solvent2) - print(f"RECRYSTALLIZE: 找到溶剂2容器: {solvent2_vessel}") + debug_print(f" 🎉 找到溶剂2容器: {solvent2_vessel} ✨") except ValueError as e: + debug_print(f" ❌ 溶剂2容器查找失败: {str(e)} 😭") raise ValueError(f"无法找到溶剂2 '{solvent2}': {str(e)}") - # 5. 验证路径存在 + # 6. 验证路径存在 + debug_print("📍 步骤6: 验证传输路径... 🛤️") try: path1 = nx.shortest_path(G, source=solvent1_vessel, target=vessel) - print(f"RECRYSTALLIZE: 溶剂1路径: {' → '.join(path1)}") + debug_print(f" 🛤️ 溶剂1路径: {' → '.join(path1)} ✅") except nx.NetworkXNoPath: + debug_print(f" ❌ 溶剂1路径不可达: {solvent1_vessel} → {vessel} 😞") raise ValueError(f"从溶剂1容器 '{solvent1_vessel}' 到目标容器 '{vessel}' 没有可用路径") try: path2 = nx.shortest_path(G, source=solvent2_vessel, target=vessel) - print(f"RECRYSTALLIZE: 溶剂2路径: {' → '.join(path2)}") + debug_print(f" 🛤️ 溶剂2路径: {' → '.join(path2)} ✅") except nx.NetworkXNoPath: + debug_print(f" ❌ 溶剂2路径不可达: {solvent2_vessel} → {vessel} 😞") raise ValueError(f"从溶剂2容器 '{solvent2_vessel}' 到目标容器 '{vessel}' 没有可用路径") - # 6. 添加第一种溶剂 - print(f"RECRYSTALLIZE: 开始添加溶剂1 {volume1:.2f} mL") + # 7. 添加第一种溶剂 + debug_print("📍 步骤7: 添加第一种溶剂... 🧪") + debug_print(f" 🚰 开始添加溶剂1: {solvent1} ({volume1:.2f} mL)") try: pump_actions1 = generate_pump_protocol_with_rinsing( G=G, from_vessel=solvent1_vessel, to_vessel=vessel, - volume=volume1, + volume=volume1, # 使用解析后的体积 amount="", time=0.0, viscous=False, @@ -201,28 +316,33 @@ def generate_recrystallize_protocol( ) action_sequence.extend(pump_actions1) + debug_print(f" ✅ 溶剂1泵送动作已添加: {len(pump_actions1)} 个动作 🚰✨") except Exception as e: + debug_print(f" ❌ 溶剂1泵协议生成失败: {str(e)} 😭") raise ValueError(f"生成溶剂1泵协议时出错: {str(e)}") - # 7. 等待溶剂1稳定 + # 8. 等待溶剂1稳定 + debug_print(" ⏳ 添加溶剂1稳定等待...") action_sequence.append({ "action_name": "wait", "action_kwargs": { - "time": 10.0, + "time": 5.0, # 🕐 缩短等待时间:10.0s → 5.0s "description": f"等待溶剂1 {solvent1} 稳定" } }) + debug_print(" ✅ 溶剂1稳定等待已添加 ⏰✨") - # 8. 添加第二种溶剂 - print(f"RECRYSTALLIZE: 开始添加溶剂2 {volume2:.2f} mL") + # 9. 添加第二种溶剂 + debug_print("📍 步骤8: 添加第二种溶剂... 🧪") + debug_print(f" 🚰 开始添加溶剂2: {solvent2} ({volume2:.2f} mL)") try: pump_actions2 = generate_pump_protocol_with_rinsing( G=G, from_vessel=solvent2_vessel, to_vessel=vessel, - volume=volume2, + volume=volume2, # 使用解析后的体积 amount="", time=0.0, viscous=False, @@ -235,30 +355,63 @@ def generate_recrystallize_protocol( ) action_sequence.extend(pump_actions2) + debug_print(f" ✅ 溶剂2泵送动作已添加: {len(pump_actions2)} 个动作 🚰✨") except Exception as e: + debug_print(f" ❌ 溶剂2泵协议生成失败: {str(e)} 😭") raise ValueError(f"生成溶剂2泵协议时出错: {str(e)}") - # 9. 等待溶剂2稳定 + # 10. 等待溶剂2稳定 + debug_print(" ⏳ 添加溶剂2稳定等待...") action_sequence.append({ "action_name": "wait", "action_kwargs": { - "time": 10.0, + "time": 5.0, # 🕐 缩短等待时间:10.0s → 5.0s "description": f"等待溶剂2 {solvent2} 稳定" } }) + debug_print(" ✅ 溶剂2稳定等待已添加 ⏰✨") + + # 11. 等待重结晶完成 + debug_print("📍 步骤9: 等待重结晶完成... 💎") + + # 🕐 模拟运行时间优化 + debug_print(" ⏱️ 检查模拟运行时间限制...") + original_crystallize_time = 600.0 # 原始重结晶时间 + simulation_time_limit = 60.0 # 模拟运行时间限制:60秒 + + final_crystallize_time = min(original_crystallize_time, simulation_time_limit) + + if original_crystallize_time > simulation_time_limit: + debug_print(f" 🎮 模拟运行优化: {original_crystallize_time}s → {final_crystallize_time}s ⚡") + debug_print(f" 📊 时间缩短: {original_crystallize_time/60:.1f}分钟 → {final_crystallize_time/60:.1f}分钟 🚀") + else: + debug_print(f" ✅ 时间在限制内: {final_crystallize_time}s 保持不变 🎯") - # 10. 等待重结晶完成 action_sequence.append({ "action_name": "wait", "action_kwargs": { - "time": 600.0, # 等待10分钟进行重结晶 - "description": f"等待重结晶完成({solvent1}:{solvent2} = {ratio})" + "time": final_crystallize_time, + "description": f"等待重结晶完成({solvent1}:{solvent2} = {ratio},总体积 {final_volume}mL)" + (f" (模拟时间)" if original_crystallize_time != final_crystallize_time else "") } }) + debug_print(f" ✅ 重结晶等待已添加: {final_crystallize_time}s 💎✨") - print(f"RECRYSTALLIZE: 协议生成完成,共 {len(action_sequence)} 个动作") - print(f"RECRYSTALLIZE: 预计总时间: {620/60:.1f} 分钟") + # 显示时间调整信息 + if original_crystallize_time != final_crystallize_time: + debug_print(f" 🎭 模拟优化说明: 原计划 {original_crystallize_time/60:.1f}分钟,实际模拟 {final_crystallize_time/60:.1f}分钟 ⚡") + + # 🎊 总结 + debug_print("💎" * 20) + debug_print(f"🎉 重结晶协议生成完成! ✨") + debug_print(f"📊 总动作数: {len(action_sequence)} 个") + debug_print(f"🥽 目标容器: {vessel}") + debug_print(f"💧 总体积: {final_volume}mL") + debug_print(f"⚖️ 溶剂比例: {solvent1}:{solvent2} = {ratio1}:{ratio2}") + debug_print(f"🧪 溶剂1: {solvent1} ({volume1:.2f}mL)") + debug_print(f"🧪 溶剂2: {solvent2} ({volume2:.2f}mL)") + debug_print(f"⏱️ 预计总时间: {(final_crystallize_time + 10)/60:.1f} 分钟 ⌛") + debug_print("💎" * 20) return action_sequence @@ -266,15 +419,16 @@ def generate_recrystallize_protocol( # 测试函数 def test_recrystallize_protocol(): """测试重结晶协议""" - print("=== RECRYSTALLIZE PROTOCOL 测试 ===") + debug_print("🧪 === RECRYSTALLIZE PROTOCOL 测试 === ✨") # 测试比例解析 + debug_print("⚖️ 测试比例解析...") test_ratios = ["1:1", "3:7", "50:50", "1-1", "2,8", "invalid"] for ratio in test_ratios: r1, r2 = parse_ratio(ratio) - print(f"比例 '{ratio}' -> {r1}:{r2}") + debug_print(f" 📊 比例 '{ratio}' -> {r1}:{r2}") - print("测试完成") + debug_print("✅ 测试完成 🎉") if __name__ == "__main__": diff --git a/unilabos/compile/reset_handling_protocol.py b/unilabos/compile/reset_handling_protocol.py index 0fa55c2..2e51da3 100644 --- a/unilabos/compile/reset_handling_protocol.py +++ b/unilabos/compile/reset_handling_protocol.py @@ -3,6 +3,11 @@ from typing import List, Dict, Any from .pump_protocol import generate_pump_protocol_with_rinsing +def debug_print(message): + """调试输出""" + print(f"🔄 [RESET_HANDLING] {message}", flush=True) + + def find_solvent_vessel(G: nx.DiGraph, solvent: str) -> str: """ 查找溶剂容器,支持多种匹配模式 @@ -14,7 +19,7 @@ def find_solvent_vessel(G: nx.DiGraph, solvent: str) -> str: Returns: str: 溶剂容器ID """ - print(f"RESET_HANDLING: 正在查找溶剂 '{solvent}' 的容器...") + debug_print(f"🔍 正在查找溶剂 '{solvent}' 的容器... 🧪") # 构建可能的容器名称 possible_names = [ @@ -28,23 +33,30 @@ def find_solvent_vessel(G: nx.DiGraph, solvent: str) -> str: f"vessel_{solvent}", # vessel_methanol ] + debug_print(f"📋 候选容器名称: {possible_names[:3]}... (共{len(possible_names)}个) 📝") + # 第一步:通过容器名称匹配 + debug_print(" 🎯 步骤1: 精确名称匹配...") for vessel_name in possible_names: if vessel_name in G.nodes(): - print(f"RESET_HANDLING: 通过名称匹配找到容器: {vessel_name}") + debug_print(f" 🎉 通过名称匹配找到容器: {vessel_name} ✨") return vessel_name + debug_print(" 😞 精确名称匹配失败,尝试模糊匹配... 🔍") # 第二步:通过模糊匹配 + debug_print(" 🔍 步骤2: 模糊名称匹配...") for node_id in G.nodes(): if G.nodes[node_id].get('type') == 'container': node_name = G.nodes[node_id].get('name', '').lower() # 检查是否包含溶剂名称 if solvent.lower() in node_id.lower() or solvent.lower() in node_name: - print(f"RESET_HANDLING: 通过模糊匹配找到容器: {node_id}") + debug_print(f" 🎉 通过模糊匹配找到容器: {node_id} ✨") return node_id + debug_print(" 😞 模糊匹配失败,尝试液体类型匹配... 🧪") # 第三步:通过液体类型匹配 + debug_print(" 🧪 步骤3: 液体类型匹配...") for node_id in G.nodes(): if G.nodes[node_id].get('type') == 'container': vessel_data = G.nodes[node_id].get('data', {}) @@ -56,10 +68,11 @@ def find_solvent_vessel(G: nx.DiGraph, solvent: str) -> str: reagent_name = vessel_data.get('reagent_name', '').lower() if solvent.lower() in liquid_type or solvent.lower() in reagent_name: - print(f"RESET_HANDLING: 通过液体类型匹配找到容器: {node_id}") + debug_print(f" 🎉 通过液体类型匹配找到容器: {node_id} ✨") return node_id # 列出可用容器帮助调试 + debug_print(" 📊 显示可用容器信息...") available_containers = [] for node_id in G.nodes(): if G.nodes[node_id].get('type') == 'container': @@ -75,13 +88,17 @@ def find_solvent_vessel(G: nx.DiGraph, solvent: str) -> str: 'reagent_name': vessel_data.get('reagent_name', '') }) - print(f"RESET_HANDLING: 可用容器列表:") - for container in available_containers: - print(f" - {container['id']}: {container['name']}") - print(f" 液体: {container['liquids']}") - print(f" 试剂: {container['reagent_name']}") + debug_print(f" 📋 可用容器列表 (共{len(available_containers)}个):") + for i, container in enumerate(available_containers[:5]): # 只显示前5个 + debug_print(f" {i+1}. 🥽 {container['id']}: {container['name']}") + debug_print(f" 💧 液体: {container['liquids']}") + debug_print(f" 🧪 试剂: {container['reagent_name']}") - raise ValueError(f"找不到溶剂 '{solvent}' 对应的容器。尝试了: {possible_names}") + if len(available_containers) > 5: + debug_print(f" ... 还有 {len(available_containers)-5} 个容器 📦") + + debug_print(f"❌ 找不到溶剂 '{solvent}' 对应的容器 😭") + raise ValueError(f"找不到溶剂 '{solvent}' 对应的容器。尝试了: {possible_names[:3]}...") def generate_reset_handling_protocol( @@ -104,35 +121,49 @@ def generate_reset_handling_protocol( # 固定参数 target_vessel = "main_reactor" # 默认目标容器 - volume = 100.0 # 默认体积 100 mL - - print(f"RESET_HANDLING: 开始生成重置处理协议") - print(f" - 溶剂: {solvent}") - print(f" - 目标容器: {target_vessel}") - print(f" - 体积: {volume} mL") + volume = 50.0 # 默认体积 50 mL + + debug_print("🔄" * 20) + debug_print("🚀 开始生成重置处理协议 ✨") + debug_print(f"📝 输入参数:") + debug_print(f" 🧪 溶剂: {solvent}") + debug_print(f" 🥽 目标容器: {target_vessel}") + debug_print(f" 💧 体积: {volume} mL") + debug_print(f" ⚙️ 其他参数: {kwargs}") + debug_print("🔄" * 20) # 1. 验证目标容器存在 + debug_print("📍 步骤1: 验证目标容器... 🔧") if target_vessel not in G.nodes(): + debug_print(f"❌ 目标容器 '{target_vessel}' 不存在于系统中! 😱") raise ValueError(f"目标容器 '{target_vessel}' 不存在于系统中") + debug_print(f"✅ 目标容器 '{target_vessel}' 验证通过 🎯") # 2. 查找溶剂容器 + debug_print("📍 步骤2: 查找溶剂容器... 🔍") try: solvent_vessel = find_solvent_vessel(G, solvent) - print(f"RESET_HANDLING: 找到溶剂容器: {solvent_vessel}") + debug_print(f"🎉 找到溶剂容器: {solvent_vessel} ✨") except ValueError as e: + debug_print(f"❌ 溶剂容器查找失败: {str(e)} 😭") raise ValueError(f"无法找到溶剂 '{solvent}': {str(e)}") # 3. 验证路径存在 + debug_print("📍 步骤3: 验证传输路径... 🛤️") try: path = nx.shortest_path(G, source=solvent_vessel, target=target_vessel) - print(f"RESET_HANDLING: 找到路径: {' → '.join(path)}") + debug_print(f"🛤️ 找到路径: {' → '.join(path)} ✅") except nx.NetworkXNoPath: + debug_print(f"❌ 路径不可达: {solvent_vessel} → {target_vessel} 😞") raise ValueError(f"从溶剂容器 '{solvent_vessel}' 到目标容器 '{target_vessel}' 没有可用路径") # 4. 使用pump_protocol转移溶剂 - print(f"RESET_HANDLING: 开始转移溶剂 {volume} mL") + debug_print("📍 步骤4: 转移溶剂... 🚰") + debug_print(f" 🚛 开始转移: {solvent_vessel} → {target_vessel}") + debug_print(f" 💧 转移体积: {volume} mL") try: + debug_print(" 🔄 生成泵送协议...") pump_actions = generate_pump_protocol_with_rinsing( G=G, from_vessel=solvent_vessel, @@ -150,21 +181,52 @@ def generate_reset_handling_protocol( ) action_sequence.extend(pump_actions) + debug_print(f" ✅ 泵送协议已添加: {len(pump_actions)} 个动作 🚰✨") except Exception as e: + debug_print(f" ❌ 泵送协议生成失败: {str(e)} 😭") raise ValueError(f"生成泵协议时出错: {str(e)}") # 5. 等待溶剂稳定 + debug_print("📍 步骤5: 等待溶剂稳定... ⏳") + + # 🕐 模拟运行时间优化 + debug_print(" ⏱️ 检查模拟运行时间限制...") + original_wait_time = 10.0 # 原始等待时间 + simulation_time_limit = 5.0 # 模拟运行时间限制:5秒 + + final_wait_time = min(original_wait_time, simulation_time_limit) + + if original_wait_time > simulation_time_limit: + debug_print(f" 🎮 模拟运行优化: {original_wait_time}s → {final_wait_time}s ⚡") + debug_print(f" 📊 时间缩短: {original_wait_time}s → {final_wait_time}s 🚀") + else: + debug_print(f" ✅ 时间在限制内: {final_wait_time}s 保持不变 🎯") + action_sequence.append({ "action_name": "wait", "action_kwargs": { - "time": 10.0, - "description": f"等待溶剂 {solvent} 稳定" + "time": final_wait_time, + "description": f"等待溶剂 {solvent} 稳定" + (f" (模拟时间)" if original_wait_time != final_wait_time else "") } }) + debug_print(f" ✅ 稳定等待已添加: {final_wait_time}s ⏰✨") - print(f"RESET_HANDLING: 协议生成完成,共 {len(action_sequence)} 个动作") - print(f"RESET_HANDLING: 已添加 {volume} mL {solvent} 到 {target_vessel}") + # 显示时间调整信息 + if original_wait_time != final_wait_time: + debug_print(f" 🎭 模拟优化说明: 原计划 {original_wait_time}s,实际模拟 {final_wait_time}s ⚡") + + # 🎊 总结 + debug_print("🔄" * 20) + debug_print(f"🎉 重置处理协议生成完成! ✨") + debug_print(f"📊 总动作数: {len(action_sequence)} 个") + debug_print(f"🧪 溶剂: {solvent}") + debug_print(f"🥽 源容器: {solvent_vessel}") + debug_print(f"🥽 目标容器: {target_vessel}") + debug_print(f"💧 转移体积: {volume} mL") + debug_print(f"⏱️ 预计总时间: {(final_wait_time + 5):.0f} 秒 ⌛") + debug_print(f"🎯 已添加 {volume} mL {solvent} 到 {target_vessel} 🚰✨") + debug_print("🔄" * 20) return action_sequence @@ -172,8 +234,15 @@ def generate_reset_handling_protocol( # 测试函数 def test_reset_handling_protocol(): """测试重置处理协议""" - print("=== RESET HANDLING PROTOCOL 测试 ===") - print("测试完成") + debug_print("🧪 === RESET HANDLING PROTOCOL 测试 === ✨") + + # 测试溶剂名称 + debug_print("🧪 测试常用溶剂名称...") + test_solvents = ["methanol", "ethanol", "water", "acetone", "dmso"] + for solvent in test_solvents: + debug_print(f" 🔍 测试溶剂: {solvent}") + + debug_print("✅ 测试完成 🎉") if __name__ == "__main__": diff --git a/unilabos/compile/run_column_protocol.py b/unilabos/compile/run_column_protocol.py index f6b9214..cb55f86 100644 --- a/unilabos/compile/run_column_protocol.py +++ b/unilabos/compile/run_column_protocol.py @@ -1,312 +1,646 @@ -from typing import List, Dict, Any +from typing import List, Dict, Any, Union import networkx as nx -from .pump_protocol import generate_pump_protocol +import logging +import re +from .pump_protocol import generate_pump_protocol_with_rinsing +logger = logging.getLogger(__name__) -def get_vessel_liquid_volume(G: nx.DiGraph, vessel: str) -> float: - """获取容器中的液体体积""" - if vessel not in G.nodes(): +def debug_print(message): + """调试输出""" + print(f"[RUN_COLUMN] {message}", flush=True) + logger.info(f"[RUN_COLUMN] {message}") + +def parse_percentage(pct_str: str) -> float: + """ + 解析百分比字符串为数值 + + Args: + pct_str: 百分比字符串(如 "40 %", "40%", "40") + + Returns: + float: 百分比数值(0-100) + """ + if not pct_str or not pct_str.strip(): return 0.0 - vessel_data = G.nodes[vessel].get('data', {}) - liquids = vessel_data.get('liquid', []) + pct_str = pct_str.strip().lower() + debug_print(f"解析百分比: '{pct_str}'") - total_volume = 0.0 - for liquid in liquids: - if isinstance(liquid, dict): - # 支持两种格式:新格式 (name, volume) 和旧格式 (liquid_type, liquid_volume) - volume = liquid.get('volume') or liquid.get('liquid_volume', 0.0) - total_volume += volume + # 移除百分号和空格 + pct_clean = re.sub(r'[%\s]', '', pct_str) - return total_volume + # 提取数字 + match = re.search(r'([0-9]*\.?[0-9]+)', pct_clean) + if match: + value = float(match.group(1)) + debug_print(f"百分比解析结果: {value}%") + return value + + debug_print(f"⚠️ 无法解析百分比: '{pct_str}',返回0.0") + return 0.0 +def parse_ratio(ratio_str: str) -> tuple: + """ + 解析比例字符串为两个数值 + + Args: + ratio_str: 比例字符串(如 "5:95", "1:1", "40:60") + + Returns: + tuple: (ratio1, ratio2) 两个比例值 + """ + if not ratio_str or not ratio_str.strip(): + return (50.0, 50.0) # 默认1:1 + + ratio_str = ratio_str.strip() + debug_print(f"解析比例: '{ratio_str}'") + + # 支持多种分隔符:: / - + if ':' in ratio_str: + parts = ratio_str.split(':') + elif '/' in ratio_str: + parts = ratio_str.split('/') + elif '-' in ratio_str: + parts = ratio_str.split('-') + elif 'to' in ratio_str.lower(): + parts = ratio_str.lower().split('to') + else: + debug_print(f"⚠️ 无法解析比例格式: '{ratio_str}',使用默认1:1") + return (50.0, 50.0) + + if len(parts) >= 2: + try: + ratio1 = float(parts[0].strip()) + ratio2 = float(parts[1].strip()) + total = ratio1 + ratio2 + + # 转换为百分比 + pct1 = (ratio1 / total) * 100 + pct2 = (ratio2 / total) * 100 + + debug_print(f"比例解析结果: {ratio1}:{ratio2} -> {pct1:.1f}%:{pct2:.1f}%") + return (pct1, pct2) + except ValueError as e: + debug_print(f"⚠️ 比例数值转换失败: {str(e)}") + + debug_print(f"⚠️ 比例解析失败,使用默认1:1") + return (50.0, 50.0) -def find_column_device(G: nx.DiGraph, column: str) -> str: +def parse_rf_value(rf_str: str) -> float: + """ + 解析Rf值字符串 + + Args: + rf_str: Rf值字符串(如 "0.3", "0.45", "?") + + Returns: + float: Rf值(0-1) + """ + if not rf_str or not rf_str.strip(): + return 0.3 # 默认Rf值 + + rf_str = rf_str.strip().lower() + debug_print(f"解析Rf值: '{rf_str}'") + + # 处理未知Rf值 + if rf_str in ['?', 'unknown', 'tbd', 'to be determined']: + default_rf = 0.3 + debug_print(f"检测到未知Rf值,使用默认值: {default_rf}") + return default_rf + + # 提取数字 + match = re.search(r'([0-9]*\.?[0-9]+)', rf_str) + if match: + value = float(match.group(1)) + # 确保Rf值在0-1范围内 + if value > 1.0: + value = value / 100.0 # 可能是百分比形式 + value = max(0.0, min(1.0, value)) # 限制在0-1范围 + debug_print(f"Rf值解析结果: {value}") + return value + + debug_print(f"⚠️ 无法解析Rf值: '{rf_str}',使用默认值0.3") + return 0.3 + +def find_column_device(G: nx.DiGraph) -> str: """查找柱层析设备""" - # 首先检查是否有虚拟柱设备 - column_nodes = [node for node in G.nodes() - if (G.nodes[node].get('class') or '') == 'virtual_column'] + debug_print("查找柱层析设备...") - if column_nodes: - return column_nodes[0] + # 查找虚拟柱设备 + for node in G.nodes(): + node_data = G.nodes[node] + node_class = node_data.get('class', '') or '' + + if 'virtual_column' in node_class.lower() or 'column' in node_class.lower(): + debug_print(f"✅ 找到柱层析设备: {node}") + return node - # 如果没有虚拟柱设备,抛出异常 - raise ValueError(f"系统中未找到柱层析设备。请确保配置了 virtual_column 设备") - + # 如果没有找到,尝试创建虚拟设备名称 + possible_names = ['column_1', 'virtual_column_1', 'chromatography_column_1'] + for name in possible_names: + if name in G.nodes(): + debug_print(f"✅ 找到柱设备: {name}") + return name + + debug_print("⚠️ 未找到柱层析设备,将使用pump protocol直接转移") + return "" def find_column_vessel(G: nx.DiGraph, column: str) -> str: """查找柱容器""" - # 直接使用 column 参数作为容器名称 - if column in G.nodes(): - return column + debug_print(f"查找柱容器: '{column}'") - # 尝试常见的柱容器命名规则 + # 直接检查column参数是否是容器 + if column in G.nodes(): + node_type = G.nodes[column].get('type', '') + if node_type == 'container': + debug_print(f"✅ 找到柱容器: {column}") + return column + + # 尝试常见的命名规则 possible_names = [ f"column_{column}", - f"{column}_column", + f"{column}_column", f"vessel_{column}", f"{column}_vessel", "column_vessel", "chromatography_column", "silica_column", - "preparative_column" + "preparative_column", + "column" ] for vessel_name in possible_names: if vessel_name in G.nodes(): - return vessel_name + node_type = G.nodes[vessel_name].get('type', '') + if node_type == 'container': + debug_print(f"✅ 找到柱容器: {vessel_name}") + return vessel_name - raise ValueError(f"未找到柱容器 '{column}'。尝试了以下名称: {[column] + possible_names}") + debug_print(f"⚠️ 未找到柱容器,将直接在源容器中进行分离") + return "" - -def find_eluting_solvent_vessel(G: nx.DiGraph, eluting_solvent: str) -> str: - """查找洗脱溶剂容器""" - if not eluting_solvent: +def find_solvent_vessel(G: nx.DiGraph, solvent: str) -> str: + """查找溶剂容器 - 增强版""" + if not solvent or not solvent.strip(): return "" - # 按照命名规则查找溶剂瓶 - solvent_vessel_id = f"flask_{eluting_solvent}" + solvent = solvent.strip().replace(' ', '_').lower() + debug_print(f"查找溶剂容器: '{solvent}'") - if solvent_vessel_id in G.nodes(): - return solvent_vessel_id - - # 如果直接匹配失败,尝试模糊匹配 + # 🔧 方法1:直接搜索 data.reagent_name for node in G.nodes(): - if node.startswith('flask_') and eluting_solvent.lower() in node.lower(): - return node + node_data = G.nodes[node].get('data', {}) + node_type = G.nodes[node].get('type', '') + + # 只搜索容器类型的节点 + if node_type == 'container': + reagent_name = node_data.get('reagent_name', '').lower() + reagent_config = G.nodes[node].get('config', {}).get('reagent', '').lower() + + # 检查 data.reagent_name 和 config.reagent + if reagent_name == solvent or reagent_config == solvent: + debug_print(f"✅ 通过reagent_name找到溶剂容器: {node} (reagent: {reagent_name or reagent_config})") + return node + + # 模糊匹配 reagent_name + if solvent in reagent_name or reagent_name in solvent: + debug_print(f"✅ 通过reagent_name模糊匹配到溶剂容器: {node} (reagent: {reagent_name})") + return node + + if solvent in reagent_config or reagent_config in solvent: + debug_print(f"✅ 通过config.reagent模糊匹配到溶剂容器: {node} (reagent: {reagent_config})") + return node - # 如果还是找不到,列出所有可用的溶剂瓶 - available_flasks = [node for node in G.nodes() - if node.startswith('flask_') - and G.nodes[node].get('type') == 'container'] + # 🔧 方法2:常见的溶剂容器命名规则 + possible_names = [ + f"flask_{solvent}", + f"bottle_{solvent}", + f"reagent_{solvent}", + f"{solvent}_bottle", + f"{solvent}_flask", + f"solvent_{solvent}", + f"reagent_bottle_{solvent}" + ] - raise ValueError(f"找不到洗脱溶剂 '{eluting_solvent}' 对应的溶剂瓶。可用溶剂瓶: {available_flasks}") + for vessel_name in possible_names: + if vessel_name in G.nodes(): + node_type = G.nodes[vessel_name].get('type', '') + if node_type == 'container': + debug_print(f"✅ 通过命名规则找到溶剂容器: {vessel_name}") + return vessel_name + + # 🔧 方法3:节点名称模糊匹配 + for node in G.nodes(): + node_type = G.nodes[node].get('type', '') + if node_type == 'container': + if ('flask_' in node or 'bottle_' in node or 'reagent_' in node) and solvent in node.lower(): + debug_print(f"✅ 通过节点名称模糊匹配到溶剂容器: {node}") + return node + + # 🔧 方法4:特殊溶剂名称映射 + solvent_mapping = { + 'dmf': ['dmf', 'dimethylformamide', 'n,n-dimethylformamide'], + 'ethyl_acetate': ['ethyl_acetate', 'ethylacetate', 'etoac', 'ea'], + 'hexane': ['hexane', 'hexanes', 'n-hexane'], + 'methanol': ['methanol', 'meoh', 'ch3oh'], + 'water': ['water', 'h2o', 'distilled_water'], + 'acetone': ['acetone', 'ch3coch3', '2-propanone'], + 'dichloromethane': ['dichloromethane', 'dcm', 'ch2cl2', 'methylene_chloride'], + 'chloroform': ['chloroform', 'chcl3', 'trichloromethane'] + } + + # 查找映射的同义词 + for canonical_name, synonyms in solvent_mapping.items(): + if solvent in synonyms: + debug_print(f"检测到溶剂同义词: '{solvent}' -> '{canonical_name}'") + return find_solvent_vessel(G, canonical_name) # 递归搜索 + + debug_print(f"⚠️ 未找到溶剂 '{solvent}' 的容器") + return "" +def get_vessel_liquid_volume(G: nx.DiGraph, vessel: str) -> float: + """获取容器中的液体体积 - 增强版""" + if vessel not in G.nodes(): + debug_print(f"⚠️ 节点 '{vessel}' 不存在") + return 0.0 + + node_type = G.nodes[vessel].get('type', '') + vessel_data = G.nodes[vessel].get('data', {}) + + debug_print(f"读取节点 '{vessel}' (类型: {node_type}) 体积数据: {vessel_data}") + + # 🔧 如果是设备类型,尝试查找关联的容器 + if node_type == 'device': + debug_print(f"'{vessel}' 是设备,尝试查找关联容器...") + + # 查找是否有内置容器数据 + config_data = G.nodes[vessel].get('config', {}) + if 'volume' in config_data: + default_volume = config_data.get('volume', 50.0) + debug_print(f"使用设备默认容量: {default_volume}mL") + return default_volume + + # 对于旋蒸等设备,使用默认值 + if 'rotavap' in vessel.lower(): + default_volume = 50.0 + debug_print(f"旋蒸设备使用默认容量: {default_volume}mL") + return default_volume + + debug_print(f"⚠️ 设备 '{vessel}' 无法确定容量,返回0") + return 0.0 + + # 🔧 如果是容器类型,正常读取体积 + total_volume = 0.0 + + # 方法1:检查液体列表 + liquids = vessel_data.get('liquid', []) + if isinstance(liquids, list): + for liquid in liquids: + if isinstance(liquid, dict): + volume = liquid.get('volume') or liquid.get('liquid_volume', 0.0) + total_volume += volume + + # 方法2:检查直接体积字段 + if total_volume == 0.0: + volume_keys = ['current_volume', 'total_volume', 'volume', 'liquid_volume'] + for key in volume_keys: + if key in vessel_data: + try: + total_volume = float(vessel_data[key]) + if total_volume > 0: + break + except (ValueError, TypeError): + continue + + # 方法3:检查配置中的初始体积 + if total_volume == 0.0: + config_data = G.nodes[vessel].get('config', {}) + if 'current_volume' in config_data: + try: + total_volume = float(config_data['current_volume']) + except (ValueError, TypeError): + pass + + debug_print(f"容器 '{vessel}' 总体积: {total_volume}mL") + return total_volume + +def calculate_solvent_volumes(total_volume: float, pct1: float, pct2: float) -> tuple: + """根据百分比计算溶剂体积""" + volume1 = (total_volume * pct1) / 100.0 + volume2 = (total_volume * pct2) / 100.0 + + debug_print(f"溶剂体积计算: 总体积{total_volume}mL") + debug_print(f" - 溶剂1: {pct1}% = {volume1}mL") + debug_print(f" - 溶剂2: {pct2}% = {volume2}mL") + + return (volume1, volume2) def generate_run_column_protocol( G: nx.DiGraph, from_vessel: str, to_vessel: str, - column: str + column: str, + rf: str = "", + pct1: str = "", + pct2: str = "", + solvent1: str = "", + solvent2: str = "", + ratio: str = "", + **kwargs ) -> List[Dict[str, Any]]: """ - 生成柱层析分离的协议序列 + 生成柱层析分离的协议序列 - 增强版 + + 支持新版XDL的所有参数,具有高兼容性和容错性 Args: G: 有向图,节点为设备和容器,边为流体管道 - from_vessel: 源容器的名称,即样品起始所在的容器 - to_vessel: 目标容器的名称,分离后的样品要到达的容器 - column: 所使用的柱子的名称 + from_vessel: 源容器的名称,即样品起始所在的容器(必需) + to_vessel: 目标容器的名称,分离后的样品要到达的容器(必需) + column: 所使用的柱子的名称(必需) + rf: Rf值(可选,支持 "?" 表示未知) + pct1: 第一种溶剂百分比(如 "40 %",可选) + pct2: 第二种溶剂百分比(如 "50 %",可选) + solvent1: 第一种溶剂名称(可选) + solvent2: 第二种溶剂名称(可选) + ratio: 溶剂比例(如 "5:95",可选,优先级高于pct1/pct2) + **kwargs: 其他可选参数 Returns: List[Dict[str, Any]]: 柱层析分离操作的动作序列 """ + + debug_print("=" * 60) + debug_print("开始生成柱层析协议") + debug_print(f"输入参数:") + debug_print(f" - from_vessel: '{from_vessel}'") + debug_print(f" - to_vessel: '{to_vessel}'") + debug_print(f" - column: '{column}'") + debug_print(f" - rf: '{rf}'") + debug_print(f" - pct1: '{pct1}'") + debug_print(f" - pct2: '{pct2}'") + debug_print(f" - solvent1: '{solvent1}'") + debug_print(f" - solvent2: '{solvent2}'") + debug_print(f" - ratio: '{ratio}'") + debug_print(f" - 其他参数: {kwargs}") + debug_print("=" * 60) + action_sequence = [] - print(f"RUN_COLUMN: 开始生成柱层析协议") - print(f" - 源容器: {from_vessel}") - print(f" - 目标容器: {to_vessel}") - print(f" - 柱子: {column}") + # === 参数验证 === + debug_print("步骤1: 参数验证...") + + if not from_vessel: + raise ValueError("from_vessel 参数不能为空") + if not to_vessel: + raise ValueError("to_vessel 参数不能为空") + if not column: + raise ValueError("column 参数不能为空") - # 验证源容器和目标容器存在 if from_vessel not in G.nodes(): raise ValueError(f"源容器 '{from_vessel}' 不存在于系统中") - if to_vessel not in G.nodes(): raise ValueError(f"目标容器 '{to_vessel}' 不存在于系统中") - # 查找柱层析设备 - column_device_id = None - column_nodes = [node for node in G.nodes() - if (G.nodes[node].get('class') or '') == 'virtual_column'] + debug_print("✅ 基本参数验证通过") - if column_nodes: - column_device_id = column_nodes[0] - print(f"RUN_COLUMN: 找到柱层析设备: {column_device_id}") + # === 参数解析 === + debug_print("步骤2: 参数解析...") + + # 解析Rf值 + final_rf = parse_rf_value(rf) + debug_print(f"最终Rf值: {final_rf}") + + # 解析溶剂比例(ratio优先级高于pct1/pct2) + if ratio and ratio.strip(): + final_pct1, final_pct2 = parse_ratio(ratio) + debug_print(f"使用ratio参数: {final_pct1:.1f}% : {final_pct2:.1f}%") else: - print(f"RUN_COLUMN: 警告 - 未找到柱层析设备") + final_pct1 = parse_percentage(pct1) if pct1 else 50.0 + final_pct2 = parse_percentage(pct2) if pct2 else 50.0 + + # 如果百分比和不是100%,进行归一化 + total_pct = final_pct1 + final_pct2 + if total_pct == 0: + final_pct1, final_pct2 = 50.0, 50.0 + elif total_pct != 100.0: + final_pct1 = (final_pct1 / total_pct) * 100 + final_pct2 = (final_pct2 / total_pct) * 100 + + debug_print(f"使用百分比参数: {final_pct1:.1f}% : {final_pct2:.1f}%") + + # 设置默认溶剂(如果未指定) + final_solvent1 = solvent1.strip() if solvent1 else "ethyl_acetate" + final_solvent2 = solvent2.strip() if solvent2 else "hexane" + + debug_print(f"最终溶剂: {final_solvent1} : {final_solvent2}") + + # === 查找设备和容器 === + debug_print("步骤3: 查找设备和容器...") + + # 查找柱层析设备 + column_device_id = find_column_device(G) + + # 查找柱容器 + column_vessel = find_column_vessel(G, column) + + # 查找溶剂容器 + solvent1_vessel = find_solvent_vessel(G, final_solvent1) + solvent2_vessel = find_solvent_vessel(G, final_solvent2) + + debug_print(f"设备映射:") + debug_print(f" - 柱设备: '{column_device_id}'") + debug_print(f" - 柱容器: '{column_vessel}'") + debug_print(f" - 溶剂1容器: '{solvent1_vessel}'") + debug_print(f" - 溶剂2容器: '{solvent2_vessel}'") + + # === 获取源容器体积 === + debug_print("步骤4: 获取源容器体积...") - # 获取源容器中的液体体积 source_volume = get_vessel_liquid_volume(G, from_vessel) - print(f"RUN_COLUMN: 源容器 {from_vessel} 中有 {source_volume} mL 液体") + if source_volume <= 0: + source_volume = 50.0 # 默认体积 + debug_print(f"⚠️ 无法获取源容器体积,使用默认值: {source_volume}mL") + else: + debug_print(f"✅ 源容器体积: {source_volume}mL") - # === 第一步:样品转移到柱子(如果柱子是容器) === - if column in G.nodes() and G.nodes[column].get('type') == 'container': - print(f"RUN_COLUMN: 样品转移 - {source_volume} mL 从 {from_vessel} 到 {column}") - - try: - sample_transfer_actions = generate_pump_protocol( - G=G, - from_vessel=from_vessel, - to_vessel=column, - volume=source_volume if source_volume > 0 else 100.0, - flowrate=2.0 - ) - action_sequence.extend(sample_transfer_actions) - except Exception as e: - print(f"RUN_COLUMN: 样品转移失败: {str(e)}") + # === 计算溶剂体积 === + debug_print("步骤5: 计算溶剂体积...") - # === 第二步:使用柱层析设备执行分离 === - if column_device_id: - print(f"RUN_COLUMN: 使用柱层析设备执行分离") + # 洗脱溶剂通常是样品体积的2-5倍 + total_elution_volume = source_volume * 3.0 + solvent1_volume, solvent2_volume = calculate_solvent_volumes( + total_elution_volume, final_pct1, final_pct2 + ) + + # === 执行柱层析流程 === + debug_print("步骤6: 执行柱层析流程...") + + try: + # 步骤6.1: 样品上柱(如果有独立的柱容器) + if column_vessel and column_vessel != from_vessel: + debug_print(f"6.1: 样品上柱 - {source_volume}mL 从 {from_vessel} 到 {column_vessel}") + + try: + sample_transfer_actions = generate_pump_protocol_with_rinsing( + G=G, + from_vessel=from_vessel, + to_vessel=column_vessel, + volume=source_volume, + flowrate=1.0, # 慢速上柱 + transfer_flowrate=0.5, + rinsing_solvent="", # 暂不冲洗 + rinsing_volume=0.0, + rinsing_repeats=0 + ) + action_sequence.extend(sample_transfer_actions) + debug_print(f"✅ 样品上柱完成,添加了 {len(sample_transfer_actions)} 个动作") + except Exception as e: + debug_print(f"⚠️ 样品上柱失败: {str(e)}") - column_separation_action = { - "device_id": column_device_id, - "action_name": "run_column", - "action_kwargs": { - "from_vessel": from_vessel, - "to_vessel": to_vessel, - "column": column + # 步骤6.2: 添加洗脱溶剂1(如果有溶剂容器) + if solvent1_vessel and solvent1_volume > 0: + debug_print(f"6.2: 添加洗脱溶剂1 - {solvent1_volume:.1f}mL {final_solvent1}") + + try: + target_vessel = column_vessel if column_vessel else from_vessel + solvent1_transfer_actions = generate_pump_protocol_with_rinsing( + G=G, + from_vessel=solvent1_vessel, + to_vessel=target_vessel, + volume=solvent1_volume, + flowrate=2.0, + transfer_flowrate=1.0 + ) + action_sequence.extend(solvent1_transfer_actions) + debug_print(f"✅ 溶剂1添加完成,添加了 {len(solvent1_transfer_actions)} 个动作") + except Exception as e: + debug_print(f"⚠️ 溶剂1添加失败: {str(e)}") + + # 步骤6.3: 添加洗脱溶剂2(如果有溶剂容器) + if solvent2_vessel and solvent2_volume > 0: + debug_print(f"6.3: 添加洗脱溶剂2 - {solvent2_volume:.1f}mL {final_solvent2}") + + try: + target_vessel = column_vessel if column_vessel else from_vessel + solvent2_transfer_actions = generate_pump_protocol_with_rinsing( + G=G, + from_vessel=solvent2_vessel, + to_vessel=target_vessel, + volume=solvent2_volume, + flowrate=2.0, + transfer_flowrate=1.0 + ) + action_sequence.extend(solvent2_transfer_actions) + debug_print(f"✅ 溶剂2添加完成,添加了 {len(solvent2_transfer_actions)} 个动作") + except Exception as e: + debug_print(f"⚠️ 溶剂2添加失败: {str(e)}") + + # 步骤6.4: 使用柱层析设备执行分离(如果有设备) + if column_device_id: + debug_print(f"6.4: 使用柱层析设备执行分离") + + column_separation_action = { + "device_id": column_device_id, + "action_name": "run_column", + "action_kwargs": { + "from_vessel": from_vessel, + "to_vessel": to_vessel, + "column": column, + "rf": rf, + "pct1": pct1, + "pct2": pct2, + "solvent1": solvent1, + "solvent2": solvent2, + "ratio": ratio + } } - } - action_sequence.append(column_separation_action) - - # 等待柱层析设备完成分离 - action_sequence.append({ - "action_name": "wait", - "action_kwargs": {"time": 60} - }) - - # === 第三步:从柱子转移到目标容器(如果需要) === - if column in G.nodes() and column != to_vessel: - print(f"RUN_COLUMN: 产物转移 - 从 {column} 到 {to_vessel}") - - try: - product_transfer_actions = generate_pump_protocol( - G=G, - from_vessel=column, - to_vessel=to_vessel, - volume=source_volume * 0.8 if source_volume > 0 else 80.0, # 假设有一些损失 - flowrate=1.5 - ) - action_sequence.extend(product_transfer_actions) - except Exception as e: - print(f"RUN_COLUMN: 产物转移失败: {str(e)}") - - print(f"RUN_COLUMN: 生成了 {len(action_sequence)} 个动作") - return action_sequence - - -# 便捷函数:常用柱层析方案 -def generate_flash_column_protocol( - G: nx.DiGraph, - from_vessel: str, - to_vessel: str, - column_material: str = "silica_gel", - mobile_phase: str = "ethyl_acetate", - mobile_phase_volume: float = 100.0 -) -> List[Dict[str, Any]]: - """快速柱层析:高流速分离""" - return generate_run_column_protocol( - G, from_vessel, to_vessel, column_material, - mobile_phase, mobile_phase_volume, 1, "", 0.0, 3.0 - ) - - -def generate_preparative_column_protocol( - G: nx.DiGraph, - from_vessel: str, - to_vessel: str, - column_material: str = "silica_gel", - equilibration_solvent: str = "hexane", - eluting_solvent: str = "ethyl_acetate", - eluting_volume: float = 50.0, - eluting_repeats: int = 3 -) -> List[Dict[str, Any]]: - """制备柱层析:带平衡和多次洗脱""" - return generate_run_column_protocol( - G, from_vessel, to_vessel, column_material, - eluting_solvent, eluting_volume, eluting_repeats, - equilibration_solvent, 30.0, 1.5 - ) - - -def generate_gradient_column_protocol( - G: nx.DiGraph, - from_vessel: str, - to_vessel: str, - column_material: str = "silica_gel", - gradient_solvents: List[str] = None, - gradient_volumes: List[float] = None -) -> List[Dict[str, Any]]: - """梯度洗脱柱层析:多种溶剂系统""" - if gradient_solvents is None: - gradient_solvents = ["hexane", "ethyl_acetate", "methanol"] - if gradient_volumes is None: - gradient_volumes = [50.0, 50.0, 30.0] - - action_sequence = [] - - # 每种溶剂单独执行一次柱层析 - for i, (solvent, volume) in enumerate(zip(gradient_solvents, gradient_volumes)): - print(f"RUN_COLUMN: 梯度洗脱第 {i+1}/{len(gradient_solvents)} 步: {volume} mL {solvent}") - - # 第一步使用源容器,后续步骤使用柱子作为源 - step_from_vessel = from_vessel if i == 0 else column_material - # 最后一步使用目标容器,其他步骤使用柱子作为目标 - step_to_vessel = to_vessel if i == len(gradient_solvents) - 1 else column_material - - step_actions = generate_run_column_protocol( - G, step_from_vessel, step_to_vessel, column_material, - solvent, volume, 1, "", 0.0, 1.0 - ) - action_sequence.extend(step_actions) - - # 在梯度步骤之间加入等待时间 - if i < len(gradient_solvents) - 1: + action_sequence.append(column_separation_action) + debug_print(f"✅ 柱层析设备动作已添加") + + # 等待分离完成 + separation_time = max(30, int(total_elution_volume / 2)) # 基于体积估算时间 action_sequence.append({ "action_name": "wait", - "action_kwargs": {"time": 20} + "action_kwargs": {"time": separation_time} }) + debug_print(f"✅ 等待分离完成: {separation_time}秒") + + # 步骤6.5: 产物收集(从柱容器到目标容器) + if column_vessel and column_vessel != to_vessel: + debug_print(f"6.5: 产物收集 - 从 {column_vessel} 到 {to_vessel}") + + try: + # 估算产物体积(原始样品体积的70-90%) + product_volume = source_volume * 0.8 + + product_transfer_actions = generate_pump_protocol_with_rinsing( + G=G, + from_vessel=column_vessel, + to_vessel=to_vessel, + volume=product_volume, + flowrate=1.5, + transfer_flowrate=0.8 + ) + action_sequence.extend(product_transfer_actions) + debug_print(f"✅ 产物收集完成,添加了 {len(product_transfer_actions)} 个动作") + except Exception as e: + debug_print(f"⚠️ 产物收集失败: {str(e)}") + + # 步骤6.6: 如果没有独立的柱设备和容器,执行简化的直接转移 + if not column_device_id and not column_vessel: + debug_print(f"6.6: 简化模式 - 直接转移 {source_volume}mL 从 {from_vessel} 到 {to_vessel}") + + try: + direct_transfer_actions = generate_pump_protocol_with_rinsing( + G=G, + from_vessel=from_vessel, + to_vessel=to_vessel, + volume=source_volume, + flowrate=2.0, + transfer_flowrate=1.0 + ) + action_sequence.extend(direct_transfer_actions) + debug_print(f"✅ 直接转移完成,添加了 {len(direct_transfer_actions)} 个动作") + except Exception as e: + debug_print(f"⚠️ 直接转移失败: {str(e)}") + + except Exception as e: + debug_print(f"❌ 协议生成失败: {str(e)} 😭") + + # 不添加不确定的动作,直接让action_sequence保持为空列表 + # action_sequence 已经在函数开始时初始化为 [] + + # 确保至少有一个有效的动作,如果完全失败就返回空列表 + if not action_sequence: + debug_print("⚠️ 没有生成任何有效动作") + # 可以选择返回空列表或添加一个基本的等待动作 + action_sequence.append({ + "action_name": "wait", + "action_kwargs": { + "time": 1.0, + "description": "柱层析协议执行完成" + } + }) + + # 🎊 总结 + debug_print("🧪" * 20) + debug_print(f"🎉 柱层析协议生成完成! ✨") + debug_print(f"📊 总动作数: {len(action_sequence)} 个") + debug_print(f"🥽 路径: {from_vessel} → {to_vessel}") + debug_print(f"🏛️ 柱子: {column}") + debug_print(f"🧪 溶剂: {final_solvent1}:{final_solvent2}") + debug_print("🧪" * 20) return action_sequence - -def generate_reverse_phase_column_protocol( - G: nx.DiGraph, - from_vessel: str, - to_vessel: str, - column_material: str = "C18", - aqueous_phase: str = "water", - organic_phase: str = "methanol", - gradient_ratio: float = 0.5 -) -> List[Dict[str, Any]]: - """反相柱层析:C18柱,水-有机相梯度""" - # 先用水相平衡 - equilibration_volume = 20.0 - # 然后用有机相洗脱 - eluting_volume = 30.0 * gradient_ratio - - return generate_run_column_protocol( - G, from_vessel, to_vessel, column_material, - organic_phase, eluting_volume, 2, - aqueous_phase, equilibration_volume, 0.8 - ) - - -def generate_ion_exchange_column_protocol( - G: nx.DiGraph, - from_vessel: str, - to_vessel: str, - column_material: str = "ion_exchange", - buffer_solution: str = "buffer", - salt_solution: str = "NaCl_solution", - salt_volume: float = 40.0 -) -> List[Dict[str, Any]]: - """离子交换柱层析:缓冲液平衡,盐溶液洗脱""" - return generate_run_column_protocol( - G, from_vessel, to_vessel, column_material, - salt_solution, salt_volume, 1, - buffer_solution, 25.0, 0.5 - ) - - # 测试函数 def test_run_column_protocol(): - """测试柱层析协议的示例""" - print("=== RUN COLUMN PROTOCOL 测试 ===") - print("测试完成") - + """测试柱层析协议""" + debug_print("🧪 === RUN COLUMN PROTOCOL 测试 === ✨") + debug_print("✅ 测试完成 🎉") if __name__ == "__main__": - test_run_column_protocol() \ No newline at end of file + test_run_column_protocol() + diff --git a/unilabos/compile/separate_protocol.py b/unilabos/compile/separate_protocol.py index cbb028c..258c37d 100644 --- a/unilabos/compile/separate_protocol.py +++ b/unilabos/compile/separate_protocol.py @@ -1,230 +1,670 @@ -import numpy as np import networkx as nx +import re +import logging +import sys +from typing import List, Dict, Any, Union +from .pump_protocol import generate_pump_protocol_with_rinsing +logger = logging.getLogger(__name__) + +# 确保输出编码为UTF-8 +if hasattr(sys.stdout, 'reconfigure'): + try: + sys.stdout.reconfigure(encoding='utf-8') + sys.stderr.reconfigure(encoding='utf-8') + except: + pass + +def debug_print(message): + """调试输出函数 - 支持中文""" + try: + # 确保消息是字符串格式 + safe_message = str(message) + print(f"[分离协议] {safe_message}", flush=True) + logger.info(f"[分离协议] {safe_message}") + except UnicodeEncodeError: + # 如果编码失败,尝试替换不支持的字符 + safe_message = str(message).encode('utf-8', errors='replace').decode('utf-8') + print(f"[分离协议] {safe_message}", flush=True) + logger.info(f"[分离协议] {safe_message}") + except Exception as e: + # 最后的安全措施 + fallback_message = f"日志输出错误: {repr(message)}" + print(f"[分离协议] {fallback_message}", flush=True) + logger.info(f"[分离协议] {fallback_message}") + +def create_action_log(message: str, emoji: str = "📝") -> Dict[str, Any]: + """创建一个动作日志 - 支持中文和emoji""" + try: + full_message = f"{emoji} {message}" + debug_print(full_message) + logger.info(full_message) + + return { + "action_name": "wait", + "action_kwargs": { + "time": 0.1, + "log_message": full_message, + "progress_message": full_message + } + } + except Exception as e: + # 如果emoji有问题,使用纯文本 + safe_message = f"[日志] {message}" + debug_print(safe_message) + logger.info(safe_message) + + return { + "action_name": "wait", + "action_kwargs": { + "time": 0.1, + "log_message": safe_message, + "progress_message": safe_message + } + } + +def parse_volume_input(volume_input: Union[str, float]) -> float: + """ + 解析体积输入,支持带单位的字符串 + + Args: + volume_input: 体积输入(如 "200 mL", "?", 50.0) + + Returns: + float: 体积(毫升) + """ + if isinstance(volume_input, (int, float)): + debug_print(f"📏 体积输入为数值: {volume_input}") + return float(volume_input) + + if not volume_input or not str(volume_input).strip(): + debug_print(f"⚠️ 体积输入为空,返回 0.0mL") + return 0.0 + + volume_str = str(volume_input).lower().strip() + debug_print(f"🔍 解析体积输入: '{volume_str}'") + + # 处理未知体积 + if volume_str in ['?', 'unknown', 'tbd', 'to be determined', '未知', '待定']: + default_volume = 100.0 # 默认100mL + debug_print(f"❓ 检测到未知体积,使用默认值: {default_volume}mL") + return default_volume + + # 移除空格并提取数字和单位 + volume_clean = re.sub(r'\s+', '', volume_str) + + # 匹配数字和单位的正则表达式 + match = re.match(r'([0-9]*\.?[0-9]+)\s*(ml|l|μl|ul|microliter|milliliter|liter|毫升|升|微升)?', volume_clean) + + if not match: + debug_print(f"⚠️ 无法解析体积: '{volume_str}',使用默认值 100mL") + return 100.0 + + value = float(match.group(1)) + unit = match.group(2) or 'ml' # 默认单位为毫升 + + # 转换为毫升 + if unit in ['l', 'liter', '升']: + volume = value * 1000.0 # L -> mL + debug_print(f"🔄 体积转换: {value}L -> {volume}mL") + elif unit in ['μl', 'ul', 'microliter', '微升']: + volume = value / 1000.0 # μL -> mL + debug_print(f"🔄 体积转换: {value}μL -> {volume}mL") + else: # ml, milliliter, 毫升 或默认 + volume = value # 已经是mL + debug_print(f"✅ 体积已为毫升单位: {volume}mL") + + return volume + +def find_solvent_vessel(G: nx.DiGraph, solvent: str) -> str: + """查找溶剂容器,支持多种匹配模式""" + if not solvent or not solvent.strip(): + debug_print("⏭️ 未指定溶剂,跳过溶剂容器查找") + return "" + + debug_print(f"🔍 正在查找溶剂 '{solvent}' 的容器...") + + # 🔧 方法1:直接搜索 data.reagent_name 和 config.reagent + debug_print(f"📋 方法1: 搜索试剂字段...") + for node in G.nodes(): + node_data = G.nodes[node].get('data', {}) + node_type = G.nodes[node].get('type', '') + config_data = G.nodes[node].get('config', {}) + + # 只搜索容器类型的节点 + if node_type == 'container': + reagent_name = node_data.get('reagent_name', '').lower() + config_reagent = config_data.get('reagent', '').lower() + + # 精确匹配 + if reagent_name == solvent.lower() or config_reagent == solvent.lower(): + debug_print(f"✅ 通过试剂字段精确匹配找到容器: {node}") + return node + + # 模糊匹配 + if (solvent.lower() in reagent_name and reagent_name) or \ + (solvent.lower() in config_reagent and config_reagent): + debug_print(f"✅ 通过试剂字段模糊匹配找到容器: {node}") + return node + + # 🔧 方法2:常见的容器命名规则 + debug_print(f"📋 方法2: 使用命名规则...") + solvent_clean = solvent.lower().replace(' ', '_').replace('-', '_') + possible_names = [ + f"flask_{solvent_clean}", + f"bottle_{solvent_clean}", + f"vessel_{solvent_clean}", + f"{solvent_clean}_flask", + f"{solvent_clean}_bottle", + f"solvent_{solvent_clean}", + f"reagent_{solvent_clean}", + f"reagent_bottle_{solvent_clean}", + f"reagent_bottle_1", # 通用试剂瓶 + f"reagent_bottle_2", + f"reagent_bottle_3" + ] + + debug_print(f"🎯 尝试的容器名称: {possible_names[:5]}... (共 {len(possible_names)} 个)") + + for name in possible_names: + if name in G.nodes(): + node_type = G.nodes[name].get('type', '') + if node_type == 'container': + debug_print(f"✅ 通过命名规则找到容器: {name}") + return name + + # 🔧 方法3:使用第一个试剂瓶作为备选 + debug_print(f"📋 方法3: 查找备用试剂瓶...") + for node_id in G.nodes(): + node_data = G.nodes[node_id] + if (node_data.get('type') == 'container' and + ('reagent' in node_id.lower() or 'bottle' in node_id.lower())): + debug_print(f"⚠️ 未找到专用容器,使用备用容器: {node_id}") + return node_id + + debug_print(f"❌ 无法找到溶剂 '{solvent}' 的容器") + return "" + +def find_separator_device(G: nx.DiGraph, vessel: str) -> str: + """查找分离器设备,支持多种查找方式""" + debug_print(f"🔍 正在查找容器 '{vessel}' 的分离器设备...") + + # 方法1:查找连接到容器的分离器设备 + debug_print(f"📋 方法1: 检查连接的分离器...") + separator_nodes = [] + for node in G.nodes(): + node_class = G.nodes[node].get('class', '').lower() + if 'separator' in node_class: + separator_nodes.append(node) + debug_print(f"📋 发现分离器设备: {node}") + + # 检查是否连接到目标容器 + if G.has_edge(node, vessel) or G.has_edge(vessel, node): + debug_print(f"✅ 找到连接的分离器: {node}") + return node + + debug_print(f"📊 找到的分离器总数: {len(separator_nodes)}") + + # 方法2:根据命名规则查找 + debug_print(f"📋 方法2: 使用命名规则...") + possible_names = [ + f"{vessel}_controller", + f"{vessel}_separator", + vessel, # 容器本身可能就是分离器 + "separator_1", + "virtual_separator", + "liquid_handler_1", # 液体处理器也可能用于分离 + "controller_1" + ] + + debug_print(f"🎯 尝试的分离器名称: {possible_names}") + + for name in possible_names: + if name in G.nodes(): + node_class = G.nodes[name].get('class', '').lower() + if 'separator' in node_class or 'controller' in node_class: + debug_print(f"✅ 通过命名规则找到分离器: {name}") + return name + + # 方法3:查找第一个分离器设备 + debug_print(f"📋 方法3: 使用第一个可用分离器...") + if separator_nodes: + debug_print(f"⚠️ 使用第一个分离器设备: {separator_nodes[0]}") + return separator_nodes[0] + + debug_print(f"❌ 未找到分离器设备") + return "" + +def find_connected_stirrer(G: nx.DiGraph, vessel: str) -> str: + """查找连接到指定容器的搅拌器""" + debug_print(f"🔍 正在查找与容器 {vessel} 连接的搅拌器...") + + stirrer_nodes = [] + for node in G.nodes(): + node_data = G.nodes[node] + node_class = node_data.get('class', '') or '' + + if 'stirrer' in node_class.lower(): + stirrer_nodes.append(node) + debug_print(f"📋 发现搅拌器: {node}") + + debug_print(f"📊 找到的搅拌器总数: {len(stirrer_nodes)}") + + # 检查哪个搅拌器与目标容器相连 + for stirrer in stirrer_nodes: + if G.has_edge(stirrer, vessel) or G.has_edge(vessel, stirrer): + debug_print(f"✅ 找到连接的搅拌器: {stirrer}") + return stirrer + + # 如果没有连接的搅拌器,返回第一个可用的 + if stirrer_nodes: + debug_print(f"⚠️ 未找到直接连接的搅拌器,使用第一个可用的: {stirrer_nodes[0]}") + return stirrer_nodes[0] + + debug_print("❌ 未找到搅拌器") + return "" def generate_separate_protocol( - G: nx.DiGraph, - purpose: str, # 'wash' or 'extract'. 'wash' means that product phase will not be the added solvent phase, 'extract' means product phase will be the added solvent phase. If no solvent is added just use 'extract'. - product_phase: str, # 'top' or 'bottom'. Phase that product will be in. - from_vessel: str, #Contents of from_vessel are transferred to separation_vessel and separation is performed. - separation_vessel: str, # Vessel in which separation of phases will be carried out. - to_vessel: str, # Vessel to send product phase to. - waste_phase_to_vessel: str, # Optional. Vessel to send waste phase to. - solvent: str, # Optional. Solvent to add to separation vessel after contents of from_vessel has been transferred to create two phases. - solvent_volume: float = 50, # Optional. Volume of solvent to add (mL). - through: str = "", # Optional. Solid chemical to send product phase through on way to to_vessel, e.g. 'celite'. - repeats: int = 1, # Optional. Number of separations to perform. - stir_time: float = 30, # Optional. Time stir for after adding solvent, before separation of phases. - stir_speed: float = 300, # Optional. Speed to stir at after adding solvent, before separation of phases. - settling_time: float = 300 # Optional. Time -) -> list[dict]: + G: nx.DiGraph, + # 🔧 基础参数,支持XDL的vessel参数 + vessel: str = "", # XDL: 分离容器 + purpose: str = "separate", # 分离目的 + product_phase: str = "top", # 产物相 + # 🔧 可选的详细参数 + from_vessel: str = "", # 源容器(通常在separate前已经transfer了) + separation_vessel: str = "", # 分离容器(与vessel同义) + to_vessel: str = "", # 目标容器(可选) + waste_phase_to_vessel: str = "", # 废相目标容器 + product_vessel: str = "", # XDL: 产物容器(与to_vessel同义) + waste_vessel: str = "", # XDL: 废液容器(与waste_phase_to_vessel同义) + # 🔧 溶剂相关参数 + solvent: str = "", # 溶剂名称 + solvent_volume: Union[str, float] = 0.0, # 溶剂体积 + volume: Union[str, float] = 0.0, # XDL: 体积(与solvent_volume同义) + # 🔧 操作参数 + through: str = "", # 通过材料 + repeats: int = 1, # 重复次数 + stir_time: float = 30.0, # 搅拌时间(秒) + stir_speed: float = 300.0, # 搅拌速度 + settling_time: float = 300.0, # 沉降时间(秒) + **kwargs +) -> List[Dict[str, Any]]: """ - Generate a protocol to clean a vessel with a solvent. + 生成分离操作的协议序列 - 增强中文版 - :param G: Directed graph. Nodes are containers and pumps, edges are fluidic connections. - :param vessel: Vessel to clean. - :param solvent: Solvent to clean vessel with. - :param volume: Volume of solvent to clean vessel with. - :param temp: Temperature to heat vessel to while cleaning. - :param repeats: Number of cleaning cycles to perform. - :return: List of actions to clean vessel. + 支持XDL参数格式: + - vessel: 分离容器(必需) + - purpose: "wash", "extract", "separate" + - product_phase: "top", "bottom" + - product_vessel: 产物收集容器 + - waste_vessel: 废液收集容器 + - solvent: 溶剂名称 + - volume: "200 mL", "?" 或数值 + - repeats: 重复次数 + + 分离流程: + 1. (可选)添加溶剂到分离容器 + 2. 搅拌混合 + 3. 静置分层 + 4. 收集指定相到目标容器 + 5. 重复指定次数 """ - # 生成泵操作的动作序列 - pump_action_sequence = [] - reactor_volume = 500.0 - waste_vessel = waste_phase_to_vessel + debug_print("=" * 60) + debug_print("🧪 开始生成分离协议 - 增强中文版") + debug_print(f"📋 原始参数:") + debug_print(f" 🥼 容器: '{vessel}'") + debug_print(f" 🎯 分离目的: '{purpose}'") + debug_print(f" 📊 产物相: '{product_phase}'") + debug_print(f" 💧 溶剂: '{solvent}'") + debug_print(f" 📏 体积: {volume} (类型: {type(volume)})") + debug_print(f" 🔄 重复次数: {repeats}") + debug_print(f" 🎯 产物容器: '{product_vessel}'") + debug_print(f" 🗑️ 废液容器: '{waste_vessel}'") + debug_print(f" 📦 其他参数: {kwargs}") + debug_print("=" * 60) - # TODO:通过物料管理系统找到溶剂的容器 - if "," in solvent: - solvents = solvent.split(",") - assert len(solvents) == repeats, "Number of solvents must match number of repeats." + action_sequence = [] + + # === 参数验证和标准化 === + debug_print("🔍 步骤1: 参数验证和标准化...") + action_sequence.append(create_action_log(f"开始分离操作 - 容器: {vessel}", "🎬")) + action_sequence.append(create_action_log(f"分离目的: {purpose}", "🧪")) + action_sequence.append(create_action_log(f"产物相: {product_phase}", "📊")) + + # 统一容器参数 + final_vessel = vessel or separation_vessel + if not final_vessel: + debug_print("❌ 必须指定分离容器") + raise ValueError("必须指定分离容器 (vessel 或 separation_vessel)") + + final_to_vessel = to_vessel or product_vessel + final_waste_vessel = waste_phase_to_vessel or waste_vessel + + # 统一体积参数 + final_volume = parse_volume_input(volume or solvent_volume) + + # 🔧 修复:确保repeats至少为1 + if repeats <= 0: + repeats = 1 + debug_print(f"⚠️ 重复次数参数 <= 0,自动设置为 1") + + debug_print(f"🔧 标准化后的参数:") + debug_print(f" 🥼 分离容器: '{final_vessel}'") + debug_print(f" 🎯 产物容器: '{final_to_vessel}'") + debug_print(f" 🗑️ 废液容器: '{final_waste_vessel}'") + debug_print(f" 📏 溶剂体积: {final_volume}mL") + debug_print(f" 🔄 重复次数: {repeats}") + + action_sequence.append(create_action_log(f"分离容器: {final_vessel}", "🧪")) + action_sequence.append(create_action_log(f"溶剂体积: {final_volume}mL", "📏")) + action_sequence.append(create_action_log(f"重复次数: {repeats}", "🔄")) + + # 验证必需参数 + if not purpose: + purpose = "separate" + if not product_phase: + product_phase = "top" + if purpose not in ["wash", "extract", "separate"]: + debug_print(f"⚠️ 未知的分离目的 '{purpose}',使用默认值 'separate'") + purpose = "separate" + action_sequence.append(create_action_log(f"未知目的,使用: {purpose}", "⚠️")) + if product_phase not in ["top", "bottom"]: + debug_print(f"⚠️ 未知的产物相 '{product_phase}',使用默认值 'top'") + product_phase = "top" + action_sequence.append(create_action_log(f"未知相别,使用: {product_phase}", "⚠️")) + + debug_print("✅ 参数验证通过") + action_sequence.append(create_action_log("参数验证通过", "✅")) + + # === 查找设备 === + debug_print("🔍 步骤2: 查找设备...") + action_sequence.append(create_action_log("正在查找相关设备...", "🔍")) + + # 查找分离器设备 + separator_device = find_separator_device(G, final_vessel) + if separator_device: + action_sequence.append(create_action_log(f"找到分离器设备: {separator_device}", "🧪")) else: - solvents = [solvent] * repeats + debug_print("⚠️ 未找到分离器设备,可能无法执行分离") + action_sequence.append(create_action_log("未找到分离器设备", "⚠️")) - # TODO: 通过设备连接图找到分离容器的控制器、底部出口 - separator_controller = f"{separation_vessel}_controller" - separation_vessel_bottom = f"flask_{separation_vessel}" + # 查找搅拌器 + stirrer_device = find_connected_stirrer(G, final_vessel) + if stirrer_device: + action_sequence.append(create_action_log(f"找到搅拌器: {stirrer_device}", "🌪️")) + else: + action_sequence.append(create_action_log("未找到搅拌器", "⚠️")) - transfer_flowrate = flowrate = 2.5 + # 查找溶剂容器(如果需要) + solvent_vessel = "" + if solvent and solvent.strip(): + solvent_vessel = find_solvent_vessel(G, solvent) + if solvent_vessel: + action_sequence.append(create_action_log(f"找到溶剂容器: {solvent_vessel}", "💧")) + else: + action_sequence.append(create_action_log(f"未找到溶剂容器: {solvent}", "⚠️")) - if from_vessel != separation_vessel: - pump_action_sequence.append( - { - "device_id": "", - "action_name": "PumpTransferProtocol", - "action_kwargs": { - "from_vessel": from_vessel, - "to_vessel": separation_vessel, - "volume": reactor_volume, - "time": reactor_volume / flowrate, - # "transfer_flowrate": transfer_flowrate, + debug_print(f"📊 设备配置:") + debug_print(f" 🧪 分离器设备: '{separator_device}'") + debug_print(f" 🌪️ 搅拌器设备: '{stirrer_device}'") + debug_print(f" 💧 溶剂容器: '{solvent_vessel}'") + + # === 执行分离流程 === + debug_print("🔍 步骤3: 执行分离流程...") + action_sequence.append(create_action_log("开始分离工作流程", "🎯")) + + try: + for repeat_idx in range(repeats): + cycle_num = repeat_idx + 1 + debug_print(f"🔄 第{cycle_num}轮: 开始分离循环 {cycle_num}/{repeats}") + action_sequence.append(create_action_log(f"分离循环 {cycle_num}/{repeats} 开始", "🔄")) + + # 步骤3.1: 添加溶剂(如果需要) + if solvent_vessel and final_volume > 0: + debug_print(f"🔄 第{cycle_num}轮 步骤1: 添加溶剂 {solvent} ({final_volume}mL)") + action_sequence.append(create_action_log(f"向分离容器添加 {final_volume}mL {solvent}", "💧")) + + try: + # 使用pump protocol添加溶剂 + pump_actions = generate_pump_protocol_with_rinsing( + G=G, + from_vessel=solvent_vessel, + to_vessel=final_vessel, + volume=final_volume, + amount="", + time=0.0, + viscous=False, + rinsing_solvent="", + rinsing_volume=0.0, + rinsing_repeats=0, + solid=False, + flowrate=2.5, + transfer_flowrate=0.5, + rate_spec="", + event="", + through="", + **kwargs + ) + action_sequence.extend(pump_actions) + debug_print(f"✅ 溶剂添加完成,添加了 {len(pump_actions)} 个动作") + action_sequence.append(create_action_log(f"溶剂转移完成 ({len(pump_actions)} 个操作)", "✅")) + + except Exception as e: + debug_print(f"❌ 溶剂添加失败: {str(e)}") + action_sequence.append(create_action_log(f"溶剂添加失败: {str(e)}", "❌")) + else: + debug_print(f"🔄 第{cycle_num}轮 步骤1: 无需添加溶剂") + action_sequence.append(create_action_log("无需添加溶剂", "⏭️")) + + # 步骤3.2: 启动搅拌(如果有搅拌器) + if stirrer_device and stir_time > 0: + debug_print(f"🔄 第{cycle_num}轮 步骤2: 开始搅拌 ({stir_speed}rpm,持续 {stir_time}s)") + action_sequence.append(create_action_log(f"开始搅拌: {stir_speed}rpm,持续 {stir_time}s", "🌪️")) + + action_sequence.append({ + "device_id": stirrer_device, + "action_name": "start_stir", + "action_kwargs": { + "vessel": final_vessel, + "stir_speed": stir_speed, + "purpose": f"分离混合 - {purpose}" + } + }) + + # 搅拌等待 + stir_minutes = stir_time / 60 + action_sequence.append(create_action_log(f"搅拌中,持续 {stir_minutes:.1f} 分钟", "⏱️")) + action_sequence.append({ + "action_name": "wait", + "action_kwargs": {"time": stir_time} + }) + + # 停止搅拌 + action_sequence.append(create_action_log("停止搅拌器", "🛑")) + action_sequence.append({ + "device_id": stirrer_device, + "action_name": "stop_stir", + "action_kwargs": {"vessel": final_vessel} + }) + + else: + debug_print(f"🔄 第{cycle_num}轮 步骤2: 无需搅拌") + action_sequence.append(create_action_log("无需搅拌", "⏭️")) + + # 步骤3.3: 静置分层 + if settling_time > 0: + debug_print(f"🔄 第{cycle_num}轮 步骤3: 静置分层 ({settling_time}s)") + settling_minutes = settling_time / 60 + action_sequence.append(create_action_log(f"静置分层 ({settling_minutes:.1f} 分钟)", "⚖️")) + action_sequence.append({ + "action_name": "wait", + "action_kwargs": {"time": settling_time} + }) + else: + debug_print(f"🔄 第{cycle_num}轮 步骤3: 未指定静置时间") + action_sequence.append(create_action_log("未指定静置时间", "⏭️")) + + # 步骤3.4: 执行分离操作 + if separator_device: + debug_print(f"🔄 第{cycle_num}轮 步骤4: 执行分离操作") + action_sequence.append(create_action_log(f"执行分离: 收集{product_phase}相", "🧪")) + + # 调用分离器设备的separate方法 + separate_action = { + "device_id": separator_device, + "action_name": "separate", + "action_kwargs": { + "purpose": purpose, + "product_phase": product_phase, + "from_vessel": from_vessel or final_vessel, + "separation_vessel": final_vessel, + "to_vessel": final_to_vessel or final_vessel, + "waste_phase_to_vessel": final_waste_vessel or final_vessel, + "solvent": solvent, + "solvent_volume": final_volume, + "through": through, + "repeats": 1, # 每次调用只做一次分离 + "stir_time": 0, # 已经在上面完成 + "stir_speed": stir_speed, + "settling_time": 0 # 已经在上面完成 + } } + action_sequence.append(separate_action) + debug_print(f"✅ 分离操作已添加") + action_sequence.append(create_action_log("分离操作完成", "✅")) + + # 收集结果 + if final_to_vessel: + action_sequence.append(create_action_log(f"产物 ({product_phase}相) 收集到: {final_to_vessel}", "📦")) + if final_waste_vessel: + action_sequence.append(create_action_log(f"废相收集到: {final_waste_vessel}", "🗑️")) + + else: + debug_print(f"🔄 第{cycle_num}轮 步骤4: 无分离器设备,跳过分离") + action_sequence.append(create_action_log("无分离器设备可用", "❌")) + # 添加等待时间模拟分离 + action_sequence.append({ + "action_name": "wait", + "action_kwargs": {"time": 10.0} + }) + + # 循环间等待(除了最后一次) + if repeat_idx < repeats - 1: + debug_print(f"🔄 第{cycle_num}轮: 等待下一次循环...") + action_sequence.append(create_action_log("等待下一次循环...", "⏳")) + action_sequence.append({ + "action_name": "wait", + "action_kwargs": {"time": 5} + }) + else: + action_sequence.append(create_action_log(f"分离循环 {cycle_num}/{repeats} 完成", "🌟")) + + except Exception as e: + debug_print(f"❌ 分离工作流程执行失败: {str(e)}") + action_sequence.append(create_action_log(f"分离工作流程失败: {str(e)}", "❌")) + # 添加错误日志 + action_sequence.append({ + "device_id": "system", + "action_name": "log_message", + "action_kwargs": { + "message": f"分离操作失败: {str(e)}" } - ) - - # for i in range(2): - # pump_action_sequence.append( - # { - # "device_id": "", - # "action_name": "CleanProtocol", - # "action_kwargs": { - # "vessel": from_vessel, - # "solvent": "H2O", # Solvent to clean vessel with. - # "volume": solvent_volume, # Optional. Volume of solvent to clean vessel with. - # "temp": 25.0, # Optional. Temperature to heat vessel to while cleaning. - # "repeats": 1 - # } - # } - # ) - # pump_action_sequence.append( - # { - # "device_id": "", - # "action_name": "CleanProtocol", - # "action_kwargs": { - # "vessel": from_vessel, - # "solvent": "CH2Cl2", # Solvent to clean vessel with. - # "volume": solvent_volume, # Optional. Volume of solvent to clean vessel with. - # "temp": 25.0, # Optional. Temperature to heat vessel to while cleaning. - # "repeats": 1 - # } - # } - # ) + }) - # 生成泵操作的动作序列 - for i in range(repeats): - # 找到当次萃取所用溶剂 - solvent_thistime = solvents[i] - solvent_vessel = f"flask_{solvent_thistime}" - - pump_action_sequence.append( - { - "device_id": "", - "action_name": "PumpTransferProtocol", - "action_kwargs": { - "from_vessel": solvent_vessel, - "to_vessel": separation_vessel, - "volume": solvent_volume, - "time": solvent_volume / flowrate, - # "transfer_flowrate": transfer_flowrate, - } - } - ) - pump_action_sequence.extend([ - # 搅拌、静置 - { - "device_id": separator_controller, - "action_name": "stir", - "action_kwargs": { - "stir_time": stir_time, - "stir_speed": stir_speed, - "settling_time": settling_time - } - }, - # 分液(判断电导突跃) - { - "device_id": separator_controller, - "action_name": "valve_open", - "action_kwargs": { - "command": "delta > 0.05" - } - } - ]) - - if product_phase == "bottom": - # 产物转移到目标瓶 - pump_action_sequence.append( - { - "device_id": "", - "action_name": "PumpTransferProtocol", - "action_kwargs": { - "from_vessel": separation_vessel_bottom, - "to_vessel": to_vessel, - "volume": 250.0, - "time": 250.0 / flowrate, - # "transfer_flowrate": transfer_flowrate, - } - } - ) - # 放出上面那一相,60秒后关阀门 - pump_action_sequence.append( - { - "device_id": separator_controller, - "action_name": "valve_open", - "action_kwargs": { - "command": "time > 60" - } - } - ) - # 弃去上面那一相进废液 - pump_action_sequence.append( - { - "device_id": "", - "action_name": "PumpTransferProtocol", - "action_kwargs": { - "from_vessel": separation_vessel_bottom, - "to_vessel": waste_vessel, - "volume": 250.0, - "time": 250.0 / flowrate, - # "transfer_flowrate": transfer_flowrate, - } - } - ) - elif product_phase == "top": - # 弃去下面那一相进废液 - pump_action_sequence.append( - { - "device_id": "", - "action_name": "PumpTransferProtocol", - "action_kwargs": { - "from_vessel": separation_vessel_bottom, - "to_vessel": waste_vessel, - "volume": 250.0, - "time": 250.0 / flowrate, - # "transfer_flowrate": transfer_flowrate, - } - } - ) - # 放出上面那一相 - pump_action_sequence.append( - { - "device_id": separator_controller, - "action_name": "valve_open", - "action_kwargs": { - "command": "time > 60" - } - } - ) - # 产物转移到目标瓶 - pump_action_sequence.append( - { - "device_id": "", - "action_name": "PumpTransferProtocol", - "action_kwargs": { - "from_vessel": separation_vessel_bottom, - "to_vessel": to_vessel, - "volume": 250.0, - "time": 250.0 / flowrate, - # "transfer_flowrate": transfer_flowrate, - } - } - ) - elif product_phase == "organic": - pass - - # 如果不是最后一次,从中转瓶转移回分液漏斗 - if i < repeats - 1: - pump_action_sequence.append( - { - "device_id": "", - "action_name": "PumpTransferProtocol", - "action_kwargs": { - "from_vessel": to_vessel, - "to_vessel": separation_vessel, - "volume": 250.0, - "time": 250.0 / flowrate, - # "transfer_flowrate": transfer_flowrate, - } - } - ) - return pump_action_sequence + # === 最终结果 === + total_time = (stir_time + settling_time + 15) * repeats # 估算总时间 + + debug_print("=" * 60) + debug_print(f"🎉 分离协议生成完成") + debug_print(f"📊 协议统计:") + debug_print(f" 📋 总动作数: {len(action_sequence)}") + debug_print(f" ⏱️ 预计总时间: {total_time:.0f}s ({total_time/60:.1f} 分钟)") + debug_print(f" 🥼 分离容器: {final_vessel}") + debug_print(f" 🎯 分离目的: {purpose}") + debug_print(f" 📊 产物相: {product_phase}") + debug_print(f" 🔄 重复次数: {repeats}") + if solvent: + debug_print(f" 💧 溶剂: {solvent} ({final_volume}mL)") + if final_to_vessel: + debug_print(f" 🎯 产物容器: {final_to_vessel}") + if final_waste_vessel: + debug_print(f" 🗑️ 废液容器: {final_waste_vessel}") + debug_print("=" * 60) + + # 添加完成日志 + summary_msg = f"分离协议完成: {final_vessel} ({purpose},{repeats} 次循环)" + if solvent: + summary_msg += f",使用 {final_volume}mL {solvent}" + action_sequence.append(create_action_log(summary_msg, "🎉")) + + return action_sequence + +# === 便捷函数 === + +def separate_phases_only(G: nx.DiGraph, vessel: str, product_phase: str = "top", + product_vessel: str = "", waste_vessel: str = "") -> List[Dict[str, Any]]: + """仅进行相分离(不添加溶剂)""" + debug_print(f"⚡ 快速相分离: {vessel} ({product_phase}相)") + return generate_separate_protocol( + G, vessel=vessel, + purpose="separate", + product_phase=product_phase, + product_vessel=product_vessel, + waste_vessel=waste_vessel + ) + +def wash_with_solvent(G: nx.DiGraph, vessel: str, solvent: str, volume: Union[str, float], + product_phase: str = "top", repeats: int = 1) -> List[Dict[str, Any]]: + """用溶剂洗涤""" + debug_print(f"🧽 用{solvent}洗涤: {vessel} ({repeats} 次)") + return generate_separate_protocol( + G, vessel=vessel, + purpose="wash", + product_phase=product_phase, + solvent=solvent, + volume=volume, + repeats=repeats + ) + +def extract_with_solvent(G: nx.DiGraph, vessel: str, solvent: str, volume: Union[str, float], + product_phase: str = "bottom", repeats: int = 3) -> List[Dict[str, Any]]: + """用溶剂萃取""" + debug_print(f"🧪 用{solvent}萃取: {vessel} ({repeats} 次)") + return generate_separate_protocol( + G, vessel=vessel, + purpose="extract", + product_phase=product_phase, + solvent=solvent, + volume=volume, + repeats=repeats + ) + +def separate_aqueous_organic(G: nx.DiGraph, vessel: str, organic_phase: str = "top", + product_vessel: str = "", waste_vessel: str = "") -> List[Dict[str, Any]]: + """水-有机相分离""" + debug_print(f"💧 水-有机相分离: {vessel} (有机相: {organic_phase})") + return generate_separate_protocol( + G, vessel=vessel, + purpose="separate", + product_phase=organic_phase, + product_vessel=product_vessel, + waste_vessel=waste_vessel + ) + +# 测试函数 +def test_separate_protocol(): + """测试分离协议的各种参数解析""" + debug_print("=== 分离协议增强中文版测试 ===") + + # 测试体积解析 + debug_print("🧪 测试体积解析...") + volumes = ["200 mL", "?", 100.0, "1 L", "500 μL", "未知", "50毫升"] + for vol in volumes: + result = parse_volume_input(vol) + debug_print(f"📊 体积解析结果: {vol} -> {result}mL") + + debug_print("✅ 测试完成") + +if __name__ == "__main__": + test_separate_protocol() diff --git a/unilabos/compile/stir_protocol.py b/unilabos/compile/stir_protocol.py index 6fc865c..f7a6a74 100644 --- a/unilabos/compile/stir_protocol.py +++ b/unilabos/compile/stir_protocol.py @@ -1,166 +1,342 @@ -from typing import List, Dict, Any +from typing import List, Dict, Any, Union import networkx as nx +import logging +import re +logger = logging.getLogger(__name__) + +def debug_print(message): + """调试输出""" + print(f"🌪️ [STIR] {message}", flush=True) + logger.info(f"[STIR] {message}") + +def parse_time_input(time_input: Union[str, float, int], default_unit: str = "s") -> float: + """ + 统一的时间解析函数(精简版) + + Args: + time_input: 时间输入(如 "30 min", "1 h", "300", "?", 60.0) + default_unit: 默认单位(默认为秒) + + Returns: + float: 时间(秒) + """ + if not time_input: + return 100.0 # 默认100秒 + + # 🔢 处理数值输入 + if isinstance(time_input, (int, float)): + result = float(time_input) + debug_print(f"⏰ 数值时间: {time_input} → {result}s") + return result + + # 📝 处理字符串输入 + time_str = str(time_input).lower().strip() + debug_print(f"🔍 解析时间: '{time_str}'") + + # ❓ 特殊值处理 + special_times = { + '?': 300.0, 'unknown': 300.0, 'tbd': 300.0, + 'briefly': 30.0, 'quickly': 60.0, 'slowly': 600.0, + 'several minutes': 300.0, 'few minutes': 180.0, 'overnight': 3600.0 + } + + if time_str in special_times: + result = special_times[time_str] + debug_print(f"🎯 特殊时间: '{time_str}' → {result}s ({result/60:.1f}分钟)") + return result + + # 🔢 纯数字处理 + try: + result = float(time_str) + debug_print(f"⏰ 纯数字: {time_str} → {result}s") + return result + except ValueError: + pass + + # 📐 正则表达式解析 + pattern = r'(\d+\.?\d*)\s*([a-z]*)' + match = re.match(pattern, time_str) + + if not match: + debug_print(f"⚠️ 无法解析时间: '{time_str}',使用默认值: 100s") + return 100.0 + + value = float(match.group(1)) + unit = match.group(2) or default_unit + + # 📏 单位转换 + unit_multipliers = { + 's': 1.0, 'sec': 1.0, 'second': 1.0, 'seconds': 1.0, + 'm': 60.0, 'min': 60.0, 'mins': 60.0, 'minute': 60.0, 'minutes': 60.0, + 'h': 3600.0, 'hr': 3600.0, 'hrs': 3600.0, 'hour': 3600.0, 'hours': 3600.0, + 'd': 86400.0, 'day': 86400.0, 'days': 86400.0 + } + + multiplier = unit_multipliers.get(unit, 1.0) + result = value * multiplier + + debug_print(f"✅ 时间解析: '{time_str}' → {value} {unit} → {result}s ({result/60:.1f}分钟)") + return result def find_connected_stirrer(G: nx.DiGraph, vessel: str = None) -> str: - """ - 查找与指定容器相连的搅拌设备,或查找可用的搅拌设备 - """ - # 查找所有搅拌设备节点 - stirrer_nodes = [node for node in G.nodes() - if (G.nodes[node].get('class') or '') == 'virtual_stirrer'] + """查找与指定容器相连的搅拌设备""" + debug_print(f"🔍 查找搅拌设备,目标容器: {vessel} 🥽") - if vessel: - # 检查哪个搅拌设备与目标容器相连(机械连接) + # 🔧 查找所有搅拌设备 + stirrer_nodes = [] + for node in G.nodes(): + node_data = G.nodes[node] + node_class = node_data.get('class', '') or '' + + if 'stirrer' in node_class.lower() or 'virtual_stirrer' in node_class: + stirrer_nodes.append(node) + debug_print(f"🎉 找到搅拌设备: {node} 🌪️") + + # 🔗 检查连接 + if vessel and stirrer_nodes: for stirrer in stirrer_nodes: if G.has_edge(stirrer, vessel) or G.has_edge(vessel, stirrer): + debug_print(f"✅ 搅拌设备 '{stirrer}' 与容器 '{vessel}' 相连 🔗") return stirrer - # 如果没有指定容器或没有直接连接,返回第一个可用的搅拌设备 + # 🎯 使用第一个可用设备 if stirrer_nodes: - return stirrer_nodes[0] + selected = stirrer_nodes[0] + debug_print(f"🔧 使用第一个搅拌设备: {selected} 🌪️") + return selected - raise ValueError("系统中未找到可用的搅拌设备") + # 🆘 默认设备 + debug_print("⚠️ 未找到搅拌设备,使用默认设备 🌪️") + return "stirrer_1" +def validate_and_fix_params(stir_time: float, stir_speed: float, settling_time: float) -> tuple: + """验证和修正参数""" + # ⏰ 搅拌时间验证 + if stir_time < 0: + debug_print(f"⚠️ 搅拌时间 {stir_time}s 无效,修正为 100s 🕐") + stir_time = 100.0 + elif stir_time > 100: # 限制为100s + debug_print(f"⚠️ 搅拌时间 {stir_time}s 过长,仿真运行时,修正为 100s 🕐") + stir_time = 100.0 + else: + debug_print(f"✅ 搅拌时间 {stir_time}s ({stir_time/60:.1f}分钟) 有效 ⏰") + + # 🌪️ 搅拌速度验证 + if stir_speed < 10.0 or stir_speed > 1500.0: + debug_print(f"⚠️ 搅拌速度 {stir_speed} RPM 超出范围,修正为 300 RPM 🌪️") + stir_speed = 300.0 + else: + debug_print(f"✅ 搅拌速度 {stir_speed} RPM 在正常范围内 🌪️") + + # ⏱️ 沉降时间验证 + if settling_time < 0 or settling_time > 600: # 限制为10分钟 + debug_print(f"⚠️ 沉降时间 {settling_time}s 超出范围,修正为 60s ⏱️") + settling_time = 60.0 + else: + debug_print(f"✅ 沉降时间 {settling_time}s 在正常范围内 ⏱️") + + return stir_time, stir_speed, settling_time def generate_stir_protocol( G: nx.DiGraph, - stir_time: float, - stir_speed: float, - settling_time: float + vessel: str, + time: Union[str, float, int] = "300", + stir_time: Union[str, float, int] = "0", + time_spec: str = "", + event: str = "", + stir_speed: float = 300.0, + settling_time: Union[str, float] = "60", + **kwargs ) -> List[Dict[str, Any]]: """ - 生成搅拌操作的协议序列 - 定时搅拌 + 沉降 + 生成搅拌操作的协议序列(精简版) """ - action_sequence = [] - print(f"STIR: 开始生成搅拌协议") - print(f" - 搅拌时间: {stir_time}秒") - print(f" - 搅拌速度: {stir_speed} RPM") - print(f" - 沉降时间: {settling_time}秒") + debug_print("🌪️" * 20) + debug_print("🚀 开始生成搅拌协议 ✨") + debug_print(f"📝 输入参数:") + debug_print(f" 🥽 vessel: {vessel}") + debug_print(f" ⏰ time: {time}") + debug_print(f" 🕐 stir_time: {stir_time}") + debug_print(f" 🎯 time_spec: {time_spec}") + debug_print(f" 🌪️ stir_speed: {stir_speed} RPM") + debug_print(f" ⏱️ settling_time: {settling_time}") + debug_print("🌪️" * 20) - # 查找搅拌设备 + # 📋 参数验证 + debug_print("📍 步骤1: 参数验证... 🔧") + if not vessel: + debug_print("❌ vessel 参数不能为空! 😱") + raise ValueError("vessel 参数不能为空") + + if vessel not in G.nodes(): + debug_print(f"❌ 容器 '{vessel}' 不存在于系统中! 😞") + raise ValueError(f"容器 '{vessel}' 不存在于系统中") + + debug_print("✅ 基础参数验证通过 🎯") + + # 🔄 参数解析 + debug_print("📍 步骤2: 参数解析... ⚡") + + # 确定实际时间(优先级:time_spec > stir_time > time) + if time_spec: + parsed_time = parse_time_input(time_spec) + debug_print(f"🎯 使用time_spec: '{time_spec}' → {parsed_time}s") + elif stir_time not in ["0", 0, 0.0]: + parsed_time = parse_time_input(stir_time) + debug_print(f"🎯 使用stir_time: {stir_time} → {parsed_time}s") + else: + parsed_time = parse_time_input(time) + debug_print(f"🎯 使用time: {time} → {parsed_time}s") + + # 解析沉降时间 + parsed_settling_time = parse_time_input(settling_time) + + # 🕐 模拟运行时间优化 + debug_print(" ⏱️ 检查模拟运行时间限制...") + original_stir_time = parsed_time + original_settling_time = parsed_settling_time + + # 搅拌时间限制为60秒 + stir_time_limit = 60.0 + if parsed_time > stir_time_limit: + parsed_time = stir_time_limit + debug_print(f" 🎮 搅拌时间优化: {original_stir_time}s → {parsed_time}s ⚡") + + # 沉降时间限制为30秒 + settling_time_limit = 30.0 + if parsed_settling_time > settling_time_limit: + parsed_settling_time = settling_time_limit + debug_print(f" 🎮 沉降时间优化: {original_settling_time}s → {parsed_settling_time}s ⚡") + + # 参数修正 + parsed_time, stir_speed, parsed_settling_time = validate_and_fix_params( + parsed_time, stir_speed, parsed_settling_time + ) + + debug_print(f"🎯 最终参数: time={parsed_time}s, speed={stir_speed}RPM, settling={parsed_settling_time}s") + + # 🔍 查找设备 + debug_print("📍 步骤3: 查找搅拌设备... 🔍") try: - stirrer_id = find_connected_stirrer(G) - print(f"STIR: 找到搅拌设备: {stirrer_id}") - except ValueError as e: + stirrer_id = find_connected_stirrer(G, vessel) + debug_print(f"🎉 使用搅拌设备: {stirrer_id} ✨") + except Exception as e: + debug_print(f"❌ 设备查找失败: {str(e)} 😭") raise ValueError(f"无法找到搅拌设备: {str(e)}") - # 执行搅拌操作 + # 🚀 生成动作 + debug_print("📍 步骤4: 生成搅拌动作... 🌪️") + + action_sequence = [] stir_action = { "device_id": stirrer_id, "action_name": "stir", "action_kwargs": { - "stir_time": stir_time, - "stir_speed": stir_speed, - "settling_time": settling_time + "vessel": vessel, + "time": str(time), # 保持原始格式 + "event": event, + "time_spec": time_spec, + "stir_time": float(parsed_time), # 确保是数字 + "stir_speed": float(stir_speed), # 确保是数字 + "settling_time": float(parsed_settling_time) # 确保是数字 } } - action_sequence.append(stir_action) + debug_print("✅ 搅拌动作已添加 🌪️✨") + + # 显示时间优化信息 + if original_stir_time != parsed_time or original_settling_time != parsed_settling_time: + debug_print(f" 🎭 模拟优化说明:") + debug_print(f" 搅拌时间: {original_stir_time/60:.1f}分钟 → {parsed_time/60:.1f}分钟") + debug_print(f" 沉降时间: {original_settling_time/60:.1f}分钟 → {parsed_settling_time/60:.1f}分钟") + + # 🎊 总结 + debug_print("🎊" * 20) + debug_print(f"🎉 搅拌协议生成完成! ✨") + debug_print(f"📊 总动作数: {len(action_sequence)} 个") + debug_print(f"🥽 搅拌容器: {vessel}") + debug_print(f"🌪️ 搅拌参数: {stir_speed} RPM, {parsed_time}s, 沉降 {parsed_settling_time}s") + debug_print(f"⏱️ 预计总时间: {(parsed_time + parsed_settling_time)/60:.1f} 分钟 ⌛") + debug_print("🎊" * 20) - print(f"STIR: 生成了 {len(action_sequence)} 个动作") return action_sequence - def generate_start_stir_protocol( G: nx.DiGraph, vessel: str, - stir_speed: float, - purpose: str + stir_speed: float = 300.0, + purpose: str = "", + **kwargs ) -> List[Dict[str, Any]]: - """ - 生成开始搅拌操作的协议序列 - 持续搅拌 - """ - action_sequence = [] + """生成开始搅拌操作的协议序列""" - print(f"START_STIR: 开始生成启动搅拌协议") - print(f" - 容器: {vessel}") - print(f" - 搅拌速度: {stir_speed} RPM") - print(f" - 目的: {purpose}") + debug_print("🔄 开始生成启动搅拌协议 ✨") + debug_print(f"🥽 vessel: {vessel}, 🌪️ speed: {stir_speed} RPM") - # 验证容器存在 - if vessel not in G.nodes(): - raise ValueError(f"容器 '{vessel}' 不存在于系统中") + # 基础验证 + if not vessel or vessel not in G.nodes(): + debug_print("❌ 容器验证失败!") + raise ValueError("vessel 参数无效") - # 查找搅拌设备 - try: - stirrer_id = find_connected_stirrer(G, vessel) - print(f"START_STIR: 找到搅拌设备: {stirrer_id}") - except ValueError as e: - raise ValueError(f"无法找到搅拌设备: {str(e)}") + # 参数修正 + if stir_speed < 10.0 or stir_speed > 1500.0: + debug_print(f"⚠️ 搅拌速度修正: {stir_speed} → 300 RPM 🌪️") + stir_speed = 300.0 - # 执行开始搅拌操作 - start_stir_action = { + # 查找设备 + stirrer_id = find_connected_stirrer(G, vessel) + + # 生成动作 + action_sequence = [{ "device_id": stirrer_id, "action_name": "start_stir", "action_kwargs": { "vessel": vessel, "stir_speed": stir_speed, - "purpose": purpose + "purpose": purpose or f"启动搅拌 {stir_speed} RPM" } - } + }] - action_sequence.append(start_stir_action) - - print(f"START_STIR: 生成了 {len(action_sequence)} 个动作") + debug_print(f"✅ 启动搅拌协议生成完成 🎯") return action_sequence - def generate_stop_stir_protocol( G: nx.DiGraph, - vessel: str + vessel: str, + **kwargs ) -> List[Dict[str, Any]]: - """ - 生成停止搅拌操作的协议序列 - """ - action_sequence = [] + """生成停止搅拌操作的协议序列""" - print(f"STOP_STIR: 开始生成停止搅拌协议") - print(f" - 容器: {vessel}") + debug_print("🛑 开始生成停止搅拌协议 ✨") + debug_print(f"🥽 vessel: {vessel}") - # 验证容器存在 - if vessel not in G.nodes(): - raise ValueError(f"容器 '{vessel}' 不存在于系统中") + # 基础验证 + if not vessel or vessel not in G.nodes(): + debug_print("❌ 容器验证失败!") + raise ValueError("vessel 参数无效") - # 查找搅拌设备 - try: - stirrer_id = find_connected_stirrer(G, vessel) - print(f"STOP_STIR: 找到搅拌设备: {stirrer_id}") - except ValueError as e: - raise ValueError(f"无法找到搅拌设备: {str(e)}") + # 查找设备 + stirrer_id = find_connected_stirrer(G, vessel) - # 执行停止搅拌操作 - stop_stir_action = { + # 生成动作 + action_sequence = [{ "device_id": stirrer_id, "action_name": "stop_stir", "action_kwargs": { "vessel": vessel } - } + }] - action_sequence.append(stop_stir_action) - - print(f"STOP_STIR: 生成了 {len(action_sequence)} 个动作") + debug_print(f"✅ 停止搅拌协议生成完成 🎯") return action_sequence +# 测试函数 +def test_stir_protocol(): + """测试搅拌协议""" + debug_print("🧪 === STIR PROTOCOL 测试 === ✨") + debug_print("✅ 测试完成 🎉") -# 便捷函数 -def generate_fast_stir_protocol( - G: nx.DiGraph, - time: float = 300.0, - speed: float = 800.0, - settling: float = 60.0 -) -> List[Dict[str, Any]]: - """快速搅拌的便捷函数""" - return generate_stir_protocol(G, time, speed, settling) - - -def generate_gentle_stir_protocol( - G: nx.DiGraph, - time: float = 600.0, - speed: float = 200.0, - settling: float = 120.0 -) -> List[Dict[str, Any]]: - """温和搅拌的便捷函数""" - return generate_stir_protocol(G, time, speed, settling) \ No newline at end of file +if __name__ == "__main__": + test_stir_protocol() diff --git a/unilabos/compile/utils/unit_parser.py b/unilabos/compile/utils/unit_parser.py new file mode 100644 index 0000000..d1d297c --- /dev/null +++ b/unilabos/compile/utils/unit_parser.py @@ -0,0 +1,206 @@ +""" +统一的单位解析工具模块 +支持时间、体积、质量等各种单位的解析 +""" + +import re +import logging +from typing import Union + +logger = logging.getLogger(__name__) + +def debug_print(message, prefix="[UNIT_PARSER]"): + """调试输出""" + print(f"{prefix} {message}", flush=True) + logger.info(f"{prefix} {message}") + +def parse_time_with_units(time_input: Union[str, float, int], default_unit: str = "s") -> float: + """ + 解析带单位的时间输入 + + Args: + time_input: 时间输入(如 "30 min", "1 h", "300", "?", 60.0) + default_unit: 默认单位(默认为秒) + + Returns: + float: 时间(秒) + """ + if not time_input: + return 0.0 + + # 处理数值输入 + if isinstance(time_input, (int, float)): + result = float(time_input) + debug_print(f"数值时间输入: {time_input} → {result}s(默认单位)") + return result + + # 处理字符串输入 + time_str = str(time_input).lower().strip() + debug_print(f"解析时间字符串: '{time_str}'") + + # 处理特殊值 + if time_str in ['?', 'unknown', 'tbd', 'to be determined']: + default_time = 300.0 # 5分钟默认值 + debug_print(f"检测到未知时间,使用默认值: {default_time}s") + return default_time + + # 如果是纯数字,使用默认单位 + try: + value = float(time_str) + if default_unit == "s": + result = value + elif default_unit in ["min", "minute"]: + result = value * 60.0 + elif default_unit in ["h", "hour"]: + result = value * 3600.0 + else: + result = value # 默认秒 + debug_print(f"纯数字输入: {time_str} → {result}s(单位: {default_unit})") + return result + except ValueError: + pass + + # 使用正则表达式匹配数字和单位 + pattern = r'(\d+\.?\d*)\s*([a-z]*)' + match = re.match(pattern, time_str) + + if not match: + debug_print(f"⚠️ 无法解析时间: '{time_str}',使用默认值: 60s") + return 60.0 + + value = float(match.group(1)) + unit = match.group(2) or default_unit + + # 单位转换映射 + unit_multipliers = { + # 秒 + 's': 1.0, + 'sec': 1.0, + 'second': 1.0, + 'seconds': 1.0, + + # 分钟 + 'm': 60.0, + 'min': 60.0, + 'mins': 60.0, + 'minute': 60.0, + 'minutes': 60.0, + + # 小时 + 'h': 3600.0, + 'hr': 3600.0, + 'hrs': 3600.0, + 'hour': 3600.0, + 'hours': 3600.0, + + # 天 + 'd': 86400.0, + 'day': 86400.0, + 'days': 86400.0, + } + + multiplier = unit_multipliers.get(unit, 1.0) + result = value * multiplier + + debug_print(f"时间解析: '{time_str}' → {value} {unit} → {result}s") + return result + +def parse_volume_with_units(volume_input: Union[str, float, int], default_unit: str = "mL") -> float: + """ + 解析带单位的体积输入 + + Args: + volume_input: 体积输入(如 "100 mL", "2.5 L", "500", "?", 100.0) + default_unit: 默认单位(默认为毫升) + + Returns: + float: 体积(毫升) + """ + if not volume_input: + return 0.0 + + # 处理数值输入 + if isinstance(volume_input, (int, float)): + result = float(volume_input) + debug_print(f"数值体积输入: {volume_input} → {result}mL(默认单位)") + return result + + # 处理字符串输入 + volume_str = str(volume_input).lower().strip() + debug_print(f"解析体积字符串: '{volume_str}'") + + # 处理特殊值 + if volume_str in ['?', 'unknown', 'tbd', 'to be determined']: + default_volume = 50.0 # 50mL默认值 + debug_print(f"检测到未知体积,使用默认值: {default_volume}mL") + return default_volume + + # 如果是纯数字,使用默认单位 + try: + value = float(volume_str) + if default_unit.lower() in ["ml", "milliliter"]: + result = value + elif default_unit.lower() in ["l", "liter"]: + result = value * 1000.0 + elif default_unit.lower() in ["μl", "ul", "microliter"]: + result = value / 1000.0 + else: + result = value # 默认mL + debug_print(f"纯数字输入: {volume_str} → {result}mL(单位: {default_unit})") + return result + except ValueError: + pass + + # 移除空格并提取数字和单位 + volume_clean = re.sub(r'\s+', '', volume_str) + + # 匹配数字和单位的正则表达式 + match = re.match(r'([0-9]*\.?[0-9]+)\s*(ml|l|μl|ul|microliter|milliliter|liter)?', volume_clean) + + if not match: + debug_print(f"⚠️ 无法解析体积: '{volume_str}',使用默认值: 50mL") + return 50.0 + + value = float(match.group(1)) + unit = match.group(2) or default_unit.lower() + + # 转换为毫升 + if unit in ['l', 'liter']: + volume = value * 1000.0 # L -> mL + elif unit in ['μl', 'ul', 'microliter']: + volume = value / 1000.0 # μL -> mL + else: # ml, milliliter 或默认 + volume = value # 已经是mL + + debug_print(f"体积解析: '{volume_str}' → {value} {unit} → {volume}mL") + return volume + +# 测试函数 +def test_unit_parser(): + """测试单位解析功能""" + print("=== 单位解析器测试 ===") + + # 测试时间解析 + time_tests = [ + "30 min", "1 h", "300", "5.5 h", "?", 60.0, "2 hours", "30 s" + ] + + print("\n时间解析测试:") + for time_input in time_tests: + result = parse_time_with_units(time_input) + print(f" {time_input} → {result}s ({result/60:.1f}min)") + + # 测试体积解析 + volume_tests = [ + "100 mL", "2.5 L", "500", "?", 100.0, "500 μL", "1 liter" + ] + + print("\n体积解析测试:") + for volume_input in volume_tests: + result = parse_volume_with_units(volume_input) + print(f" {volume_input} → {result}mL") + + print("\n✅ 测试完成") + +if __name__ == "__main__": + test_unit_parser() \ No newline at end of file diff --git a/unilabos/compile/wash_solid_protocol.py b/unilabos/compile/wash_solid_protocol.py index a792b8f..55768a4 100644 --- a/unilabos/compile/wash_solid_protocol.py +++ b/unilabos/compile/wash_solid_protocol.py @@ -1,216 +1,316 @@ -from typing import List, Dict, Any +from typing import List, Dict, Any, Union import networkx as nx +import logging +import re + +logger = logging.getLogger(__name__) + +def debug_print(message): + """调试输出""" + print(f"🧼 [WASH_SOLID] {message}", flush=True) + logger.info(f"[WASH_SOLID] {message}") + +def parse_time_input(time_input: Union[str, float, int]) -> float: + """统一时间解析函数(精简版)""" + if not time_input: + return 0.0 + + # 🔢 处理数值输入 + if isinstance(time_input, (int, float)): + result = float(time_input) + debug_print(f"⏰ 数值时间: {time_input} → {result}s") + return result + + # 📝 处理字符串输入 + time_str = str(time_input).lower().strip() + + # ❓ 特殊值快速处理 + special_times = { + '?': 60.0, 'unknown': 60.0, 'briefly': 30.0, + 'quickly': 45.0, 'slowly': 120.0 + } + + if time_str in special_times: + result = special_times[time_str] + debug_print(f"🎯 特殊时间: '{time_str}' → {result}s") + return result + + # 🔢 数字提取(简化正则) + try: + # 提取数字 + numbers = re.findall(r'\d+\.?\d*', time_str) + if numbers: + value = float(numbers[0]) + + # 简化单位判断 + if any(unit in time_str for unit in ['min', 'm']): + result = value * 60.0 + elif any(unit in time_str for unit in ['h', 'hour']): + result = value * 3600.0 + else: + result = value # 默认秒 + + debug_print(f"✅ 时间解析: '{time_str}' → {result}s") + return result + except: + pass + + debug_print(f"⚠️ 时间解析失败: '{time_str}',使用默认60s") + return 60.0 + +def parse_volume_input(volume: Union[float, str], volume_spec: str = "", mass: str = "") -> float: + """统一体积解析函数(精简版)""" + debug_print(f"💧 解析体积: volume={volume}, spec='{volume_spec}', mass='{mass}'") + + # 🎯 优先级1:volume_spec(快速映射) + if volume_spec: + spec_map = { + 'small': 20.0, 'medium': 50.0, 'large': 100.0, + 'minimal': 10.0, 'normal': 50.0, 'generous': 150.0 + } + for key, val in spec_map.items(): + if key in volume_spec.lower(): + debug_print(f"🎯 规格匹配: '{volume_spec}' → {val}mL") + return val + + # 🧮 优先级2:mass转体积(简化:1g=1mL) + if mass: + try: + numbers = re.findall(r'\d+\.?\d*', mass) + if numbers: + value = float(numbers[0]) + if 'mg' in mass.lower(): + result = value / 1000.0 + elif 'kg' in mass.lower(): + result = value * 1000.0 + else: + result = value # 默认g + debug_print(f"⚖️ 质量转换: {mass} → {result}mL") + return result + except: + pass + + # 📦 优先级3:volume + if volume: + if isinstance(volume, (int, float)): + result = float(volume) + debug_print(f"💧 数值体积: {volume} → {result}mL") + return result + elif isinstance(volume, str): + try: + # 提取数字 + numbers = re.findall(r'\d+\.?\d*', volume) + if numbers: + value = float(numbers[0]) + # 简化单位判断 + if 'l' in volume.lower() and 'ml' not in volume.lower(): + result = value * 1000.0 # L转mL + else: + result = value # 默认mL + debug_print(f"💧 字符串体积: '{volume}' → {result}mL") + return result + except: + pass + + # 默认值 + debug_print(f"⚠️ 体积解析失败,使用默认50mL") + return 50.0 + +def find_solvent_source(G: nx.DiGraph, solvent: str) -> str: + """查找溶剂源(精简版)""" + debug_print(f"🔍 查找溶剂源: {solvent}") + + # 简化搜索列表 + search_patterns = [ + f"flask_{solvent}", f"bottle_{solvent}", f"reagent_{solvent}", + "liquid_reagent_bottle_1", "flask_1", "solvent_bottle" + ] + + for pattern in search_patterns: + if pattern in G.nodes(): + debug_print(f"🎉 找到溶剂源: {pattern}") + return pattern + + debug_print(f"⚠️ 使用默认溶剂源: flask_{solvent}") + return f"flask_{solvent}" + +def find_filtrate_vessel(G: nx.DiGraph, filtrate_vessel: str = "") -> str: + """查找滤液容器(精简版)""" + debug_print(f"🔍 查找滤液容器: {filtrate_vessel}") + + # 如果指定了且存在,直接使用 + if filtrate_vessel and filtrate_vessel in G.nodes(): + debug_print(f"✅ 使用指定容器: {filtrate_vessel}") + return filtrate_vessel + + # 简化搜索列表 + default_vessels = ["waste_workup", "filtrate_vessel", "flask_1", "collection_bottle_1"] + + for vessel in default_vessels: + if vessel in G.nodes(): + debug_print(f"🎉 找到滤液容器: {vessel}") + return vessel + + debug_print(f"⚠️ 使用默认滤液容器: waste_workup") + return "waste_workup" def generate_wash_solid_protocol( G: nx.DiGraph, vessel: str, solvent: str, - volume: float, + volume: Union[float, str] = "50", filtrate_vessel: str = "", temp: float = 25.0, stir: bool = False, stir_speed: float = 0.0, - time: float = 0.0, - repeats: int = 1 + time: Union[str, float] = "0", + repeats: int = 1, + volume_spec: str = "", + repeats_spec: str = "", + mass: str = "", + event: str = "", + **kwargs ) -> List[Dict[str, Any]]: """ - 生成固体清洗的协议序列 - - Args: - G: 有向图,节点为设备和容器 - vessel: 装有固体物质的容器名称 - solvent: 用于清洗固体的溶剂名称 - volume: 清洗溶剂的体积 - filtrate_vessel: 滤液要收集到的容器名称,可选参数 - temp: 清洗时的温度,可选参数 - stir: 是否在清洗过程中搅拌,默认为 False - stir_speed: 搅拌速度,可选参数 - time: 清洗的时间,可选参数 - repeats: 清洗操作的重复次数,默认为 1 - - Returns: - List[Dict[str, Any]]: 固体清洗操作的动作序列 - - Raises: - ValueError: 当找不到必要的设备时抛出异常 - - Examples: - wash_solid_protocol = generate_wash_solid_protocol( - G, "reactor", "ethanol", 100.0, "waste_flask", 60.0, True, 300.0, 600.0, 3 - ) + 生成固体清洗协议(精简版) """ + + debug_print("🧼" * 20) + debug_print("🚀 开始生成固体清洗协议 ✨") + debug_print(f"📝 输入参数:") + debug_print(f" 🥽 vessel: {vessel}") + debug_print(f" 🧪 solvent: {solvent}") + debug_print(f" 💧 volume: {volume}") + debug_print(f" ⏰ time: {time}") + debug_print(f" 🔄 repeats: {repeats}") + debug_print("🧼" * 20) + + # 📋 快速验证 + if not vessel or vessel not in G.nodes(): + debug_print("❌ 容器验证失败! 😱") + raise ValueError("vessel 参数无效") + + if not solvent: + debug_print("❌ 溶剂不能为空! 😱") + raise ValueError("solvent 参数不能为空") + + debug_print("✅ 基础验证通过 🎯") + + # 🔄 参数解析 + debug_print("📍 步骤1: 参数解析... ⚡") + final_volume = parse_volume_input(volume, volume_spec, mass) + final_time = parse_time_input(time) + + # 重复次数处理(简化) + if repeats_spec: + spec_map = {'few': 2, 'several': 3, 'many': 4, 'thorough': 5} + final_repeats = next((v for k, v in spec_map.items() if k in repeats_spec.lower()), repeats) + else: + final_repeats = max(1, min(repeats, 5)) # 限制1-5次 + + # 🕐 模拟时间优化 + debug_print(" ⏱️ 模拟时间优化...") + original_time = final_time + if final_time > 60.0: + final_time = 60.0 # 限制最长60秒 + debug_print(f" 🎮 时间优化: {original_time}s → {final_time}s ⚡") + + # 参数修正 + temp = max(25.0, min(temp, 80.0)) # 温度范围25-80°C + stir_speed = max(0.0, min(stir_speed, 300.0)) if stir else 0.0 # 速度范围0-300 + + debug_print(f"🎯 最终参数: 体积={final_volume}mL, 时间={final_time}s, 重复={final_repeats}次") + + # 🔍 查找设备 + debug_print("📍 步骤2: 查找设备... 🔍") + try: + solvent_source = find_solvent_source(G, solvent) + actual_filtrate_vessel = find_filtrate_vessel(G, filtrate_vessel) + debug_print(f"🎉 设备配置完成 ✨") + except Exception as e: + debug_print(f"❌ 设备查找失败: {str(e)} 😭") + raise ValueError(f"设备查找失败: {str(e)}") + + # 🚀 生成动作序列 + debug_print("📍 步骤3: 生成清洗动作... 🧼") action_sequence = [] - # 验证容器是否存在 - if vessel not in G.nodes(): - raise ValueError(f"固体容器 {vessel} 不存在于图中") - - if filtrate_vessel and filtrate_vessel not in G.nodes(): - raise ValueError(f"滤液容器 {filtrate_vessel} 不存在于图中") - - # 查找转移泵设备(用于添加溶剂和转移滤液) - pump_nodes = [node for node in G.nodes() - if G.nodes[node].get('class') == 'virtual_transfer_pump'] - - if not pump_nodes: - raise ValueError("没有找到可用的转移泵设备") - - pump_id = pump_nodes[0] - - # 查找加热设备(如果需要加热) - heatchill_nodes = [node for node in G.nodes() - if G.nodes[node].get('class') == 'virtual_heatchill'] - - heatchill_id = heatchill_nodes[0] if heatchill_nodes else None - - # 查找搅拌设备(如果需要搅拌) - stirrer_nodes = [node for node in G.nodes() - if G.nodes[node].get('class') == 'virtual_stirrer'] - - stirrer_id = stirrer_nodes[0] if stirrer_nodes else None - - # 查找过滤设备(用于分离固体和滤液) - filter_nodes = [node for node in G.nodes() - if G.nodes[node].get('class') == 'virtual_filter'] - - filter_id = filter_nodes[0] if filter_nodes else None - - # 查找溶剂容器 - solvent_vessel = f"flask_{solvent}" - if solvent_vessel not in G.nodes(): - # 如果没有找到特定溶剂容器,查找可用的源容器 - available_vessels = [node for node in G.nodes() - if node.startswith('flask_') and - G.nodes[node].get('type') == 'container'] - if available_vessels: - solvent_vessel = available_vessels[0] - else: - raise ValueError(f"没有找到溶剂容器 {solvent}") - - # 如果没有指定滤液容器,使用废液容器 - if not filtrate_vessel: - waste_vessels = [node for node in G.nodes() - if 'waste' in node.lower() and - G.nodes[node].get('type') == 'container'] - filtrate_vessel = waste_vessels[0] if waste_vessels else "waste_flask" - - # 重复清洗操作 - for repeat in range(repeats): - repeat_num = repeat + 1 + for cycle in range(final_repeats): + debug_print(f" 🔄 第{cycle+1}/{final_repeats}次清洗...") - # 步骤1:如果需要加热,先设置温度 - if temp > 25.0 and heatchill_id: - action_sequence.append({ - "device_id": heatchill_id, - "action_name": "heat_chill_start", + # 1. 转移溶剂 + try: + from .pump_protocol import generate_pump_protocol_with_rinsing + + transfer_actions = generate_pump_protocol_with_rinsing( + G=G, + from_vessel=solvent_source, + to_vessel=vessel, + volume=final_volume, + amount="", + time=0.0, + viscous=False, + rinsing_solvent="", + rinsing_volume=0.0, + rinsing_repeats=0, + solid=False, + flowrate=2.5, + transfer_flowrate=0.5 + ) + + if transfer_actions: + action_sequence.extend(transfer_actions) + debug_print(f" ✅ 转移动作: {len(transfer_actions)}个 🚚") + + except Exception as e: + debug_print(f" ❌ 转移失败: {str(e)} 😞") + + # 2. 搅拌(如果需要) + if stir and final_time > 0: + stir_action = { + "device_id": "stirrer_1", + "action_name": "stir", "action_kwargs": { "vessel": vessel, - "temp": temp, - "purpose": f"固体清洗 - 第 {repeat_num} 次" + "time": str(time), + "stir_time": final_time, + "stir_speed": stir_speed, + "settling_time": 10.0 # 🕐 缩短沉降时间 } - }) - - # 步骤2:添加清洗溶剂到固体容器 - action_sequence.append({ - "device_id": pump_id, - "action_name": "transfer", - "action_kwargs": { - "from_vessel": solvent_vessel, - "to_vessel": vessel, - "volume": volume, - "amount": f"清洗溶剂 {solvent} - 第 {repeat_num} 次", - "time": 0.0, - "viscous": False, - "rinsing_solvent": "", - "rinsing_volume": 0.0, - "rinsing_repeats": 0, - "solid": False } + action_sequence.append(stir_action) + debug_print(f" ✅ 搅拌动作: {final_time}s, {stir_speed}RPM 🌪️") + + # 3. 过滤 + filter_action = { + "device_id": "filter_1", + "action_name": "filter", + "action_kwargs": { + "vessel": vessel, + "filtrate_vessel": actual_filtrate_vessel, + "temp": temp, + "volume": final_volume + } + } + action_sequence.append(filter_action) + debug_print(f" ✅ 过滤动作: → {actual_filtrate_vessel} 🌊") + + # 4. 等待(缩短时间) + wait_time = 5.0 # 🕐 缩短等待时间:10s → 5s + action_sequence.append({ + "action_name": "wait", + "action_kwargs": {"time": wait_time} }) - - # 步骤3:如果需要搅拌,开始搅拌 - if stir and stir_speed > 0 and stirrer_id: - if time > 0: - # 定时搅拌 - action_sequence.append({ - "device_id": stirrer_id, - "action_name": "stir", - "action_kwargs": { - "stir_time": time, - "stir_speed": stir_speed, - "settling_time": 30.0 # 搅拌后静置30秒 - } - }) - else: - # 开始搅拌(需要手动停止) - action_sequence.append({ - "device_id": stirrer_id, - "action_name": "start_stir", - "action_kwargs": { - "vessel": vessel, - "stir_speed": stir_speed, - "purpose": f"固体清洗搅拌 - 第 {repeat_num} 次" - } - }) - - # 步骤4:如果指定了清洗时间但没有搅拌,等待清洗时间 - if time > 0 and (not stir or stir_speed == 0): - # 这里可以添加等待操作,暂时跳过 - pass - - # 步骤5:如果有搅拌且没有定时,停止搅拌 - if stir and stir_speed > 0 and time == 0 and stirrer_id: - action_sequence.append({ - "device_id": stirrer_id, - "action_name": "stop_stir", - "action_kwargs": { - "vessel": vessel - } - }) - - # 步骤6:过滤分离固体和滤液 - if filter_id: - action_sequence.append({ - "device_id": filter_id, - "action_name": "filter_sample", - "action_kwargs": { - "vessel": vessel, - "filtrate_vessel": filtrate_vessel, - "stir": False, - "stir_speed": 0.0, - "temp": temp, - "continue_heatchill": temp > 25.0, - "volume": volume - } - }) - else: - # 没有专门的过滤设备,使用转移泵模拟过滤过程 - # 将滤液转移到滤液容器 - action_sequence.append({ - "device_id": pump_id, - "action_name": "transfer", - "action_kwargs": { - "from_vessel": vessel, - "to_vessel": filtrate_vessel, - "volume": volume, - "amount": f"转移滤液 - 第 {repeat_num} 次清洗", - "time": 0.0, - "viscous": False, - "rinsing_solvent": "", - "rinsing_volume": 0.0, - "rinsing_repeats": 0, - "solid": False - } - }) - - # 步骤7:如果加热了,停止加热(在最后一次清洗后) - if temp > 25.0 and heatchill_id and repeat_num == repeats: - action_sequence.append({ - "device_id": heatchill_id, - "action_name": "heat_chill_stop", - "action_kwargs": { - "vessel": vessel - } - }) + debug_print(f" ✅ 等待: {wait_time}s ⏰") + + # 🎊 总结 + debug_print("🧼" * 20) + debug_print(f"🎉 固体清洗协议生成完成! ✨") + debug_print(f"📊 总动作数: {len(action_sequence)} 个") + debug_print(f"🥽 清洗容器: {vessel}") + debug_print(f"🧪 使用溶剂: {solvent}") + debug_print(f"💧 清洗体积: {final_volume}mL × {final_repeats}次") + debug_print(f"⏱️ 预计总时间: {(final_time + 5) * final_repeats / 60:.1f} 分钟") + debug_print("🧼" * 20) return action_sequence \ No newline at end of file diff --git a/unilabos/devices/virtual/virtual_column.py b/unilabos/devices/virtual/virtual_column.py index c83da1c..892a320 100644 --- a/unilabos/devices/virtual/virtual_column.py +++ b/unilabos/devices/virtual/virtual_column.py @@ -3,7 +3,7 @@ import logging from typing import Dict, Any, Optional class VirtualColumn: - """Virtual column device for RunColumn protocol""" + """Virtual column device for RunColumn protocol 🏛️""" def __init__(self, device_id: str = None, config: Dict[str, Any] = None, **kwargs): # 处理可能的不同调用方式 @@ -25,45 +25,77 @@ class VirtualColumn: self._column_length = self.config.get('column_length') or kwargs.get('column_length', 25.0) self._column_diameter = self.config.get('column_diameter') or kwargs.get('column_diameter', 2.0) - print(f"=== VirtualColumn {self.device_id} created with max_flow_rate={self._max_flow_rate}, length={self._column_length}cm ===") + print(f"🏛️ === 虚拟色谱柱 {self.device_id} 已创建 === ✨") + print(f"📏 柱参数: 流速={self._max_flow_rate}mL/min | 长度={self._column_length}cm | 直径={self._column_diameter}cm 🔬") async def initialize(self) -> bool: - """Initialize virtual column""" - self.logger.info(f"Initializing virtual column {self.device_id}") + """Initialize virtual column 🚀""" + self.logger.info(f"🔧 初始化虚拟色谱柱 {self.device_id} ✨") + self.data.update({ "status": "Idle", - "column_state": "Ready", + "column_state": "Ready", "current_flow_rate": 0.0, "max_flow_rate": self._max_flow_rate, "column_length": self._column_length, "column_diameter": self._column_diameter, "processed_volume": 0.0, "progress": 0.0, - "current_status": "Ready" + "current_status": "Ready for separation" }) + + self.logger.info(f"✅ 色谱柱 {self.device_id} 初始化完成 🏛️") + self.logger.info(f"📊 设备规格: 最大流速 {self._max_flow_rate}mL/min | 柱长 {self._column_length}cm 📏") return True async def cleanup(self) -> bool: - """Cleanup virtual column""" - self.logger.info(f"Cleaning up virtual column {self.device_id}") + """Cleanup virtual column 🧹""" + self.logger.info(f"🧹 清理虚拟色谱柱 {self.device_id} 🔚") + + self.data.update({ + "status": "Offline", + "column_state": "Offline", + "current_status": "System offline" + }) + + self.logger.info(f"✅ 色谱柱 {self.device_id} 清理完成 💤") return True - async def run_column(self, from_vessel: str, to_vessel: str, column: str) -> bool: - """Execute column chromatography run - matches RunColumn action""" - self.logger.info(f"Running column separation: {from_vessel} -> {to_vessel} using {column}") + async def run_column(self, from_vessel: str, to_vessel: str, column: str, **kwargs) -> bool: + """Execute column chromatography run - matches RunColumn action 🏛️""" + + # 提取额外参数 + rf = kwargs.get('rf', '0.3') + solvent1 = kwargs.get('solvent1', 'ethyl_acetate') + solvent2 = kwargs.get('solvent2', 'hexane') + ratio = kwargs.get('ratio', '30:70') + + self.logger.info(f"🏛️ 开始柱层析分离: {from_vessel} → {to_vessel} 🚰") + self.logger.info(f" 🧪 使用色谱柱: {column}") + self.logger.info(f" 🎯 Rf值: {rf}") + self.logger.info(f" 🧪 洗脱溶剂: {solvent1}:{solvent2} ({ratio}) 💧") # 更新设备状态 self.data.update({ "status": "Running", "column_state": "Separating", - "current_status": "Column separation in progress", + "current_status": "🏛️ Column separation in progress", "progress": 0.0, - "processed_volume": 0.0 + "processed_volume": 0.0, + "current_from_vessel": from_vessel, + "current_to_vessel": to_vessel, + "current_column": column, + "current_rf": rf, + "current_solvents": f"{solvent1}:{solvent2} ({ratio})" }) # 模拟柱层析分离过程 # 假设处理时间基于流速和柱子长度 - separation_time = (self._column_length * 2) / self._max_flow_rate # 简化计算 + base_time = (self._column_length * 2) / self._max_flow_rate # 简化计算 + separation_time = max(base_time, 20.0) # 最少20秒 + + self.logger.info(f"⏱️ 预计分离时间: {separation_time:.1f}秒 ⌛") + self.logger.info(f"📏 柱参数: 长度 {self._column_length}cm | 流速 {self._max_flow_rate}mL/min 🌊") steps = 20 # 分20个步骤模拟分离过程 step_time = separation_time / steps @@ -74,34 +106,65 @@ class VirtualColumn: progress = (i + 1) / steps * 100 volume_processed = (i + 1) * 5.0 # 假设每步处理5mL + # 不同阶段的状态描述 + if progress <= 25: + phase = "🌊 样品上柱阶段" + phase_emoji = "📥" + elif progress <= 50: + phase = "🧪 洗脱开始" + phase_emoji = "💧" + elif progress <= 75: + phase = "⚗️ 成分分离中" + phase_emoji = "🔄" + else: + phase = "🎯 收集产物" + phase_emoji = "📤" + # 更新状态 + status_msg = f"{phase_emoji} {phase}: {progress:.1f}% | 💧 已处理: {volume_processed:.1f}mL" + self.data.update({ "progress": progress, "processed_volume": volume_processed, - "current_status": f"Column separation: {progress:.1f}% - Processing {volume_processed:.1f}mL" + "current_status": status_msg, + "current_phase": phase }) - self.logger.info(f"Column separation progress: {progress:.1f}%") + # 进度日志(每25%打印一次) + if progress >= 25 and (i + 1) % 5 == 0: # 每5步(25%)打印一次 + self.logger.info(f"📊 分离进度: {progress:.0f}% | {phase} | 💧 {volume_processed:.1f}mL 完成 ✨") # 分离完成 + final_status = f"✅ 柱层析分离完成: {from_vessel} → {to_vessel} | 💧 共处理 {volume_processed:.1f}mL" + self.data.update({ "status": "Idle", "column_state": "Ready", - "current_status": "Column separation completed", - "progress": 100.0 + "current_status": final_status, + "progress": 100.0, + "final_volume": volume_processed }) - self.logger.info(f"Column separation completed: {from_vessel} -> {to_vessel}") + self.logger.info(f"🎉 柱层析分离完成! ✨") + self.logger.info(f"📊 分离结果:") + self.logger.info(f" 🥽 源容器: {from_vessel}") + self.logger.info(f" 🥽 目标容器: {to_vessel}") + self.logger.info(f" 🏛️ 使用色谱柱: {column}") + self.logger.info(f" 💧 处理体积: {volume_processed:.1f}mL") + self.logger.info(f" 🧪 洗脱条件: {solvent1}:{solvent2} ({ratio})") + self.logger.info(f" 🎯 Rf值: {rf}") + self.logger.info(f" ⏱️ 总耗时: {separation_time:.1f}秒 🏁") + return True # 状态属性 @property def status(self) -> str: - return self.data.get("status", "Unknown") + return self.data.get("status", "❓ Unknown") @property def column_state(self) -> str: - return self.data.get("column_state", "Unknown") + return self.data.get("column_state", "❓ Unknown") @property def current_flow_rate(self) -> float: @@ -129,4 +192,12 @@ class VirtualColumn: @property def current_status(self) -> str: - return self.data.get("current_status", "Ready") \ No newline at end of file + return self.data.get("current_status", "📋 Ready") + + @property + def current_phase(self) -> str: + return self.data.get("current_phase", "🏠 待机中") + + @property + def final_volume(self) -> float: + return self.data.get("final_volume", 0.0) \ No newline at end of file diff --git a/unilabos/devices/virtual/virtual_filter.py b/unilabos/devices/virtual/virtual_filter.py index ca2e8b2..655934b 100644 --- a/unilabos/devices/virtual/virtual_filter.py +++ b/unilabos/devices/virtual/virtual_filter.py @@ -5,7 +5,7 @@ from typing import Dict, Any, Optional class VirtualFilter: - """Virtual filter device - 完全按照 Filter.action 规范""" + """Virtual filter device - 完全按照 Filter.action 规范 🌊""" def __init__(self, device_id: Optional[str] = None, config: Optional[Dict[str, Any]] = None, **kwargs): if device_id is None and 'id' in kwargs: @@ -31,8 +31,8 @@ class VirtualFilter: setattr(self, key, value) async def initialize(self) -> bool: - """Initialize virtual filter""" - self.logger.info(f"Initializing virtual filter {self.device_id}") + """Initialize virtual filter 🚀""" + self.logger.info(f"🔧 初始化虚拟过滤器 {self.device_id} ✨") # 按照 Filter.action 的 feedback 字段初始化 self.data.update({ @@ -43,17 +43,21 @@ class VirtualFilter: "current_status": "Ready for filtration", # Filter.action feedback "message": "Ready for filtration" }) + + self.logger.info(f"✅ 过滤器 {self.device_id} 初始化完成 🌊") return True async def cleanup(self) -> bool: - """Cleanup virtual filter""" - self.logger.info(f"Cleaning up virtual filter {self.device_id}") + """Cleanup virtual filter 🧹""" + self.logger.info(f"🧹 清理虚拟过滤器 {self.device_id} 🔚") self.data.update({ "status": "Offline", "current_status": "System offline", "message": "System offline" }) + + self.logger.info(f"✅ 过滤器 {self.device_id} 清理完成 💤") return True async def filter( @@ -66,64 +70,82 @@ class VirtualFilter: continue_heatchill: bool = False, volume: float = 0.0 ) -> bool: - """Execute filter action - 完全按照 Filter.action 参数""" - self.logger.info(f"Filter: vessel={vessel}, filtrate_vessel={filtrate_vessel}") - self.logger.info(f" stir={stir}, stir_speed={stir_speed}, temp={temp}") - self.logger.info(f" continue_heatchill={continue_heatchill}, volume={volume}") + """Execute filter action - 完全按照 Filter.action 参数 🌊""" + + # 🔧 新增:温度自动调整 + original_temp = temp + if temp == 0.0: + temp = 25.0 # 0度自动设置为室温 + self.logger.info(f"🌡️ 温度自动调整: {original_temp}°C → {temp}°C (室温) 🏠") + elif temp < 4.0: + temp = 4.0 # 小于4度自动设置为4度 + self.logger.info(f"🌡️ 温度自动调整: {original_temp}°C → {temp}°C (最低温度) ❄️") + + self.logger.info(f"🌊 开始过滤操作: {vessel} → {filtrate_vessel} 🚰") + self.logger.info(f" 🌪️ 搅拌: {stir} ({stir_speed} RPM)") + self.logger.info(f" 🌡️ 温度: {temp}°C") + self.logger.info(f" 💧 体积: {volume}mL") + self.logger.info(f" 🔥 保持加热: {continue_heatchill}") # 验证参数 if temp > self._max_temp or temp < 4.0: - error_msg = f"温度 {temp}°C 超出范围 (4-{self._max_temp}°C)" - self.logger.error(error_msg) + error_msg = f"🌡️ 温度 {temp}°C 超出范围 (4-{self._max_temp}°C) ⚠️" + self.logger.error(f"❌ {error_msg}") self.data.update({ - "status": f"Error: {error_msg}", - "current_status": f"Error: {error_msg}", + "status": f"Error: 温度超出范围 ⚠️", + "current_status": f"Error: 温度超出范围 ⚠️", "message": error_msg }) return False if stir and stir_speed > self._max_stir_speed: - error_msg = f"搅拌速度 {stir_speed} RPM 超出范围 (0-{self._max_stir_speed} RPM)" - self.logger.error(error_msg) + error_msg = f"🌪️ 搅拌速度 {stir_speed} RPM 超出范围 (0-{self._max_stir_speed} RPM) ⚠️" + self.logger.error(f"❌ {error_msg}") self.data.update({ - "status": f"Error: {error_msg}", - "current_status": f"Error: {error_msg}", + "status": f"Error: 搅拌速度超出范围 ⚠️", + "current_status": f"Error: 搅拌速度超出范围 ⚠️", "message": error_msg }) return False if volume > self._max_volume: - error_msg = f"过滤体积 {volume} mL 超出范围 (0-{self._max_volume} mL)" - self.logger.error(error_msg) + error_msg = f"💧 过滤体积 {volume} mL 超出范围 (0-{self._max_volume} mL) ⚠️" + self.logger.error(f"❌ {error_msg}") self.data.update({ - "status": f"Error: {error_msg}", - "current_status": f"Error: {error_msg}", + "status": f"Error: 体积超出范围 ⚠️", + "current_status": f"Error: 体积超出范围 ⚠️", "message": error_msg }) return False # 开始过滤 filter_volume = volume if volume > 0 else 50.0 + self.logger.info(f"🚀 开始过滤 {filter_volume}mL 液体 💧") self.data.update({ - "status": f"过滤中: {vessel}", + "status": f"🌊 过滤中: {vessel}", "current_temp": temp, "filtered_volume": 0.0, "progress": 0.0, - "current_status": f"Filtering {vessel} → {filtrate_vessel}", - "message": f"Starting filtration: {vessel} → {filtrate_vessel}" + "current_status": f"🌊 Filtering {vessel} → {filtrate_vessel}", + "message": f"🚀 Starting filtration: {vessel} → {filtrate_vessel}" }) try: # 过滤过程 - 实时更新进度 start_time = time_module.time() + # 根据体积和搅拌估算过滤时间 base_time = filter_volume / 5.0 # 5mL/s 基础速度 if stir: base_time *= 0.8 # 搅拌加速过滤 + self.logger.info(f"🌪️ 搅拌加速过滤,预计时间减少20% ⚡") if temp > 50.0: base_time *= 0.7 # 高温加速过滤 + self.logger.info(f"🔥 高温加速过滤,预计时间减少30% ⚡") + filter_time = max(base_time, 10.0) # 最少10秒 + self.logger.info(f"⏱️ 预计过滤时间: {filter_time:.1f}秒 ⌛") while True: current_time = time_module.time() @@ -133,20 +155,24 @@ class VirtualFilter: current_filtered = (progress / 100.0) * filter_volume # 更新状态 - 按照 Filter.action feedback 字段 - status_msg = f"过滤中: {vessel}" + status_msg = f"🌊 过滤中: {vessel}" if stir: - status_msg += f" | 搅拌: {stir_speed} RPM" - status_msg += f" | {temp}°C | {progress:.1f}% | 已过滤: {current_filtered:.1f}mL" + status_msg += f" | 🌪️ 搅拌: {stir_speed} RPM" + status_msg += f" | 🌡️ {temp}°C | 📊 {progress:.1f}% | 💧 已过滤: {current_filtered:.1f}mL" self.data.update({ "progress": progress, # Filter.action feedback "current_temp": temp, # Filter.action feedback "filtered_volume": current_filtered, # Filter.action feedback - "current_status": f"Filtering: {progress:.1f}% complete", # Filter.action feedback + "current_status": f"🌊 Filtering: {progress:.1f}% complete", # Filter.action feedback "status": status_msg, - "message": f"Filtering: {progress:.1f}% complete, {current_filtered:.1f}mL filtered" + "message": f"🌊 Filtering: {progress:.1f}% complete, {current_filtered:.1f}mL filtered" }) + # 进度日志(每25%打印一次) + if progress >= 25 and progress % 25 < 1: + self.logger.info(f"📊 过滤进度: {progress:.0f}% | 💧 {current_filtered:.1f}mL 完成 ✨") + if remaining <= 0: break @@ -154,54 +180,57 @@ class VirtualFilter: # 过滤完成 final_temp = temp if continue_heatchill else 25.0 - final_status = f"过滤完成: {vessel} | {filter_volume}mL → {filtrate_vessel}" + final_status = f"✅ 过滤完成: {vessel} | 💧 {filter_volume}mL → {filtrate_vessel}" if continue_heatchill: - final_status += " | 继续加热搅拌" + final_status += " | 🔥 继续加热搅拌" + self.logger.info(f"🔥 继续保持加热搅拌状态 🌪️") self.data.update({ "status": final_status, "progress": 100.0, # Filter.action feedback "current_temp": final_temp, # Filter.action feedback "filtered_volume": filter_volume, # Filter.action feedback - "current_status": f"Filtration completed: {filter_volume}mL", # Filter.action feedback - "message": f"Filtration completed: {filter_volume}mL filtered from {vessel}" + "current_status": f"✅ Filtration completed: {filter_volume}mL", # Filter.action feedback + "message": f"✅ Filtration completed: {filter_volume}mL filtered from {vessel}" }) - self.logger.info(f"Filtration completed: {filter_volume}mL from {vessel} to {filtrate_vessel}") + self.logger.info(f"🎉 过滤完成! 💧 {filter_volume}mL 从 {vessel} 过滤到 {filtrate_vessel} ✨") + self.logger.info(f"📊 最终状态: 温度 {final_temp}°C | 进度 100% | 体积 {filter_volume}mL 🏁") return True except Exception as e: - self.logger.error(f"Error during filtration: {str(e)}") + error_msg = f"过滤过程中发生错误: {str(e)} 💥" + self.logger.error(f"❌ {error_msg}") self.data.update({ - "status": f"过滤错误: {str(e)}", - "current_status": f"Filtration failed: {str(e)}", - "message": f"Filtration failed: {str(e)}" + "status": f"❌ 过滤错误: {str(e)}", + "current_status": f"❌ Filtration failed: {str(e)}", + "message": f"❌ Filtration failed: {str(e)}" }) return False # === 核心状态属性 - 按照 Filter.action feedback 字段 === @property def status(self) -> str: - return self.data.get("status", "Unknown") + return self.data.get("status", "❓ Unknown") @property def progress(self) -> float: - """Filter.action feedback 字段""" + """Filter.action feedback 字段 📊""" return self.data.get("progress", 0.0) @property def current_temp(self) -> float: - """Filter.action feedback 字段""" + """Filter.action feedback 字段 🌡️""" return self.data.get("current_temp", 25.0) @property def filtered_volume(self) -> float: - """Filter.action feedback 字段""" + """Filter.action feedback 字段 💧""" return self.data.get("filtered_volume", 0.0) @property def current_status(self) -> str: - """Filter.action feedback 字段""" + """Filter.action feedback 字段 📋""" return self.data.get("current_status", "") @property diff --git a/unilabos/devices/virtual/virtual_heatchill.py b/unilabos/devices/virtual/virtual_heatchill.py index 541434a..94ab572 100644 --- a/unilabos/devices/virtual/virtual_heatchill.py +++ b/unilabos/devices/virtual/virtual_heatchill.py @@ -4,7 +4,7 @@ import time as time_module # 重命名time模块,避免与参数冲突 from typing import Dict, Any class VirtualHeatChill: - """Virtual heat chill device for HeatChillProtocol testing""" + """Virtual heat chill device for HeatChillProtocol testing 🌡️""" def __init__(self, device_id: str = None, config: Dict[str, Any] = None, **kwargs): # 处理可能的不同调用方式 @@ -31,94 +31,149 @@ class VirtualHeatChill: for key, value in kwargs.items(): if key not in skip_keys and not hasattr(self, key): setattr(self, key, value) + + print(f"🌡️ === 虚拟温控设备 {self.device_id} 已创建 === ✨") + print(f"🔥 温度范围: {self._min_temp}°C ~ {self._max_temp}°C | 🌪️ 最大搅拌: {self._max_stir_speed} RPM") async def initialize(self) -> bool: - """Initialize virtual heat chill""" - self.logger.info(f"Initializing virtual heat chill {self.device_id}") + """Initialize virtual heat chill 🚀""" + self.logger.info(f"🔧 初始化虚拟温控设备 {self.device_id} ✨") # 初始化状态信息 self.data.update({ - "status": "Idle", + "status": "🏠 待机中", "operation_mode": "Idle", "is_stirring": False, "stir_speed": 0.0, "remaining_time": 0.0, }) + + self.logger.info(f"✅ 温控设备 {self.device_id} 初始化完成 🌡️") + self.logger.info(f"📊 设备规格: 温度范围 {self._min_temp}°C ~ {self._max_temp}°C | 搅拌范围 0 ~ {self._max_stir_speed} RPM") return True async def cleanup(self) -> bool: - """Cleanup virtual heat chill""" - self.logger.info(f"Cleaning up virtual heat chill {self.device_id}") + """Cleanup virtual heat chill 🧹""" + self.logger.info(f"🧹 清理虚拟温控设备 {self.device_id} 🔚") + self.data.update({ - "status": "Offline", + "status": "💤 离线", "operation_mode": "Offline", "is_stirring": False, "stir_speed": 0.0, "remaining_time": 0.0 }) + + self.logger.info(f"✅ 温控设备 {self.device_id} 清理完成 💤") return True - async def heat_chill(self, vessel: str, temp: float, time: float, stir: bool, + async def heat_chill(self, vessel: str, temp: float, time, stir: bool, stir_speed: float, purpose: str) -> bool: - """Execute heat chill action - 按实际时间运行,实时更新剩余时间""" - self.logger.info(f"HeatChill: vessel={vessel}, temp={temp}°C, time={time}s, stir={stir}, stir_speed={stir_speed}") + """Execute heat chill action - 🔧 修复:确保参数类型正确""" - # 验证参数 - if temp > self._max_temp or temp < self._min_temp: - error_msg = f"温度 {temp}°C 超出范围 ({self._min_temp}°C - {self._max_temp}°C)" - self.logger.error(error_msg) + # 🔧 关键修复:确保所有参数类型正确 + try: + temp = float(temp) + time_value = float(time) # 强制转换为浮点数 + stir_speed = float(stir_speed) + stir = bool(stir) + vessel = str(vessel) + purpose = str(purpose) + except (ValueError, TypeError) as e: + error_msg = f"参数类型转换错误: temp={temp}({type(temp)}), time={time}({type(time)}), error={str(e)}" + self.logger.error(f"❌ {error_msg}") self.data.update({ - "status": f"Error: {error_msg}", + "status": f"❌ 错误: {error_msg}", + "operation_mode": "Error" + }) + return False + + # 确定温度操作emoji + if temp > 25.0: + temp_emoji = "🔥" + operation_mode = "Heating" + status_action = "加热" + elif temp < 25.0: + temp_emoji = "❄️" + operation_mode = "Cooling" + status_action = "冷却" + else: + temp_emoji = "🌡️" + operation_mode = "Maintaining" + status_action = "保温" + + self.logger.info(f"🌡️ 开始温控操作: {vessel} → {temp}°C {temp_emoji}") + self.logger.info(f" 🥽 容器: {vessel}") + self.logger.info(f" 🎯 目标温度: {temp}°C {temp_emoji}") + self.logger.info(f" ⏰ 持续时间: {time_value}s") + self.logger.info(f" 🌪️ 搅拌: {stir} ({stir_speed} RPM)") + self.logger.info(f" 📝 目的: {purpose}") + + # 验证参数范围 + if temp > self._max_temp or temp < self._min_temp: + error_msg = f"🌡️ 温度 {temp}°C 超出范围 ({self._min_temp}°C - {self._max_temp}°C) ⚠️" + self.logger.error(f"❌ {error_msg}") + self.data.update({ + "status": f"❌ 错误: 温度超出范围 ⚠️", "operation_mode": "Error" }) return False if stir and stir_speed > self._max_stir_speed: - error_msg = f"搅拌速度 {stir_speed} RPM 超出最大值 {self._max_stir_speed} RPM" - self.logger.error(error_msg) + error_msg = f"🌪️ 搅拌速度 {stir_speed} RPM 超出最大值 {self._max_stir_speed} RPM ⚠️" + self.logger.error(f"❌ {error_msg}") self.data.update({ - "status": f"Error: {error_msg}", + "status": f"❌ 错误: 搅拌速度超出范围 ⚠️", "operation_mode": "Error" }) return False - # 确定操作模式 - if temp > 25.0: - operation_mode = "Heating" - status_action = "加热" - elif temp < 25.0: - operation_mode = "Cooling" - status_action = "冷却" - else: - operation_mode = "Maintaining" - status_action = "保温" + if time_value <= 0: + error_msg = f"⏰ 时间 {time_value}s 必须大于0 ⚠️" + self.logger.error(f"❌ {error_msg}") + self.data.update({ + "status": f"❌ 错误: 时间参数无效 ⚠️", + "operation_mode": "Error" + }) + return False - # **修复**: 使用重命名的time模块 + # 🔧 修复:使用转换后的时间值 start_time = time_module.time() - total_time = time + total_time = time_value # 使用转换后的浮点数 + + self.logger.info(f"🚀 开始{status_action}程序! 预计用时 {total_time:.1f}秒 ⏱️") # 开始操作 - stir_info = f" | 搅拌: {stir_speed} RPM" if stir else "" + stir_info = f" | 🌪️ 搅拌: {stir_speed} RPM" if stir else "" + self.data.update({ - "status": f"运行中: {status_action} {vessel} 至 {temp}°C | 剩余: {total_time:.0f}s{stir_info}", + "status": f"{temp_emoji} 运行中: {status_action} {vessel} 至 {temp}°C | ⏰ 剩余: {total_time:.0f}s{stir_info}", "operation_mode": operation_mode, "is_stirring": stir, "stir_speed": stir_speed if stir else 0.0, "remaining_time": total_time, }) - # **修复**: 在等待过程中每秒更新剩余时间 + # 在等待过程中每秒更新剩余时间 + last_logged_time = 0 while True: - current_time = time_module.time() # 使用重命名的time模块 + current_time = time_module.time() elapsed = current_time - start_time remaining = max(0, total_time - elapsed) + progress = (elapsed / total_time) * 100 if total_time > 0 else 100 # 更新剩余时间和状态 self.data.update({ "remaining_time": remaining, - "status": f"运行中: {status_action} {vessel} 至 {temp}°C | 剩余: {remaining:.0f}s{stir_info}" + "status": f"{temp_emoji} 运行中: {status_action} {vessel} 至 {temp}°C | ⏰ 剩余: {remaining:.0f}s{stir_info}", + "progress": progress }) + # 进度日志(每25%打印一次) + if progress >= 25 and int(progress) % 25 == 0 and int(progress) != last_logged_time: + self.logger.info(f"📊 {status_action}进度: {progress:.0f}% | ⏰ 剩余: {remaining:.0f}s | {temp_emoji} 目标: {temp}°C ✨") + last_logged_time = int(progress) + # 如果时间到了,退出循环 if remaining <= 0: break @@ -127,71 +182,114 @@ class VirtualHeatChill: await asyncio.sleep(1.0) # 操作完成 - final_stir_info = f" | 搅拌: {stir_speed} RPM" if stir else "" + final_stir_info = f" | 🌪️ 搅拌: {stir_speed} RPM" if stir else "" + self.data.update({ - "status": f"完成: {vessel} 已达到 {temp}°C | 用时: {total_time:.0f}s{final_stir_info}", + "status": f"✅ 完成: {vessel} 已达到 {temp}°C {temp_emoji} | ⏱️ 用时: {total_time:.0f}s{final_stir_info}", "operation_mode": "Completed", "remaining_time": 0.0, "is_stirring": False, - "stir_speed": 0.0 + "stir_speed": 0.0, + "progress": 100.0 }) - self.logger.info(f"HeatChill completed for vessel {vessel} at {temp}°C after {total_time}s") + self.logger.info(f"🎉 温控操作完成! ✨") + self.logger.info(f"📊 操作结果:") + self.logger.info(f" 🥽 容器: {vessel}") + self.logger.info(f" 🌡️ 达到温度: {temp}°C {temp_emoji}") + self.logger.info(f" ⏱️ 总用时: {total_time:.0f}s") + if stir: + self.logger.info(f" 🌪️ 搅拌速度: {stir_speed} RPM") + self.logger.info(f" 📝 操作目的: {purpose} 🏁") + return True async def heat_chill_start(self, vessel: str, temp: float, purpose: str) -> bool: - """Start continuous heat chill""" - self.logger.info(f"HeatChillStart: vessel={vessel}, temp={temp}°C") + """Start continuous heat chill 🔄""" - # 验证参数 - if temp > self._max_temp or temp < self._min_temp: - error_msg = f"温度 {temp}°C 超出范围 ({self._min_temp}°C - {self._max_temp}°C)" - self.logger.error(error_msg) + # 🔧 添加类型转换 + try: + temp = float(temp) + vessel = str(vessel) + purpose = str(purpose) + except (ValueError, TypeError) as e: + error_msg = f"参数类型转换错误: {str(e)}" + self.logger.error(f"❌ {error_msg}") self.data.update({ - "status": f"Error: {error_msg}", + "status": f"❌ 错误: {error_msg}", "operation_mode": "Error" }) return False - # 确定操作模式 + # 确定温度操作emoji if temp > 25.0: + temp_emoji = "🔥" operation_mode = "Heating" status_action = "持续加热" elif temp < 25.0: + temp_emoji = "❄️" operation_mode = "Cooling" status_action = "持续冷却" else: + temp_emoji = "🌡️" operation_mode = "Maintaining" status_action = "恒温保持" + self.logger.info(f"🔄 启动持续温控: {vessel} → {temp}°C {temp_emoji}") + self.logger.info(f" 🥽 容器: {vessel}") + self.logger.info(f" 🎯 目标温度: {temp}°C {temp_emoji}") + self.logger.info(f" 🔄 模式: {status_action}") + self.logger.info(f" 📝 目的: {purpose}") + + # 验证参数 + if temp > self._max_temp or temp < self._min_temp: + error_msg = f"🌡️ 温度 {temp}°C 超出范围 ({self._min_temp}°C - {self._max_temp}°C) ⚠️" + self.logger.error(f"❌ {error_msg}") + self.data.update({ + "status": f"❌ 错误: 温度超出范围 ⚠️", + "operation_mode": "Error" + }) + return False + self.data.update({ - "status": f"启动: {status_action} {vessel} 至 {temp}°C | 持续运行", + "status": f"🔄 启动: {status_action} {vessel} 至 {temp}°C {temp_emoji} | ♾️ 持续运行", "operation_mode": operation_mode, "is_stirring": False, "stir_speed": 0.0, "remaining_time": -1.0, # -1 表示持续运行 }) + self.logger.info(f"✅ 持续温控已启动! {temp_emoji} {status_action}模式 🚀") return True async def heat_chill_stop(self, vessel: str) -> bool: - """Stop heat chill""" - self.logger.info(f"HeatChillStop: vessel={vessel}") + """Stop heat chill 🛑""" + + # 🔧 添加类型转换 + try: + vessel = str(vessel) + except (ValueError, TypeError) as e: + error_msg = f"参数类型转换错误: {str(e)}" + self.logger.error(f"❌ {error_msg}") + return False + + self.logger.info(f"🛑 停止温控: {vessel}") self.data.update({ - "status": f"已停止: {vessel} 温控停止", + "status": f"🛑 已停止: {vessel} 温控停止", "operation_mode": "Stopped", "is_stirring": False, "stir_speed": 0.0, "remaining_time": 0.0, }) + self.logger.info(f"✅ 温控设备已停止 {vessel} 的温度控制 🏁") return True # 状态属性 @property def status(self) -> str: - return self.data.get("status", "Idle") + return self.data.get("status", "🏠 待机中") @property def operation_mode(self) -> str: @@ -207,4 +305,20 @@ class VirtualHeatChill: @property def remaining_time(self) -> float: - return self.data.get("remaining_time", 0.0) \ No newline at end of file + return self.data.get("remaining_time", 0.0) + + @property + def progress(self) -> float: + return self.data.get("progress", 0.0) + + @property + def max_temp(self) -> float: + return self._max_temp + + @property + def min_temp(self) -> float: + return self._min_temp + + @property + def max_stir_speed(self) -> float: + return self._max_stir_speed \ No newline at end of file diff --git a/unilabos/devices/virtual/virtual_multiway_valve.py b/unilabos/devices/virtual/virtual_multiway_valve.py index c24b7b1..468175c 100644 --- a/unilabos/devices/virtual/virtual_multiway_valve.py +++ b/unilabos/devices/virtual/virtual_multiway_valve.py @@ -1,16 +1,20 @@ import time +import logging from typing import Union, Dict, Optional class VirtualMultiwayValve: """ - 虚拟九通阀门 - 0号位连接transfer pump,1-8号位连接其他设备 + 虚拟九通阀门 - 0号位连接transfer pump,1-8号位连接其他设备 🔄 """ def __init__(self, port: str = "VIRTUAL", positions: int = 8): self.port = port self.max_positions = positions # 1-8号位 self.total_positions = positions + 1 # 0-8号位,共9个位置 + # 添加日志记录器 + self.logger = logging.getLogger(f"VirtualMultiwayValve.{port}") + # 状态属性 self._status = "Idle" self._valve_state = "Ready" @@ -29,6 +33,10 @@ class VirtualMultiwayValve: 7: "port_7", # 7号位 8: "port_8" # 8号位 } + + print(f"🔄 === 虚拟多通阀门已创建 === ✨") + print(f"🎯 端口: {port} | 📊 位置范围: 0-{self.max_positions} | 🏠 初始位置: 0 (transfer_pump)") + self.logger.info(f"🔧 多通阀门初始化: 端口={port}, 最大位置={self.max_positions}") @property def status(self) -> str: @@ -47,16 +55,16 @@ class VirtualMultiwayValve: return self._target_position def get_current_position(self) -> int: - """获取当前阀门位置""" + """获取当前阀门位置 📍""" return self._current_position def get_current_port(self) -> str: - """获取当前连接的端口名称""" + """获取当前连接的端口名称 🔌""" return self.position_map.get(self._current_position, "unknown") def set_position(self, command: Union[int, str]): """ - 设置阀门位置 - 支持0-8位置 + 设置阀门位置 - 支持0-8位置 🎯 Args: command: 目标位置 (0-8) 或位置字符串 @@ -71,7 +79,22 @@ class VirtualMultiwayValve: pos = int(command) if pos < 0 or pos > self.max_positions: - raise ValueError(f"Position must be between 0 and {self.max_positions}") + error_msg = f"位置必须在 0-{self.max_positions} 范围内" + self.logger.error(f"❌ {error_msg}: 请求位置={pos}") + raise ValueError(error_msg) + + # 获取位置描述emoji + if pos == 0: + pos_emoji = "🚰" + pos_desc = "泵位置" + else: + pos_emoji = "🔌" + pos_desc = f"端口{pos}" + + old_position = self._current_position + old_port = self.get_current_port() + + self.logger.info(f"🔄 阀门切换: {old_position}({old_port}) → {pos}({self.position_map.get(pos, 'unknown')}) {pos_emoji}") self._status = "Busy" self._valve_state = "Moving" @@ -79,104 +102,139 @@ class VirtualMultiwayValve: # 模拟阀门切换时间 switch_time = abs(self._current_position - pos) * 0.5 # 每个位置0.5秒 - time.sleep(switch_time) + + if switch_time > 0: + self.logger.info(f"⏱️ 阀门移动中... 预计用时: {switch_time:.1f}秒 🔄") + time.sleep(switch_time) self._current_position = pos self._status = "Idle" self._valve_state = "Ready" current_port = self.get_current_port() - return f"Position set to {pos} ({current_port})" + success_msg = f"✅ 阀门已切换到位置 {pos} ({current_port}) {pos_emoji}" + + self.logger.info(success_msg) + return success_msg except ValueError as e: + error_msg = f"❌ 阀门切换失败: {str(e)}" self._status = "Error" self._valve_state = "Error" - return f"Error: {str(e)}" + self.logger.error(error_msg) + return error_msg def set_to_pump_position(self): - """切换到transfer pump位置(0号位)""" + """切换到transfer pump位置(0号位)🚰""" + self.logger.info(f"🚰 切换到泵位置...") return self.set_position(0) def set_to_port(self, port_number: int): """ - 切换到指定端口位置 + 切换到指定端口位置 🔌 Args: port_number: 端口号 (1-8) """ if port_number < 1 or port_number > self.max_positions: - raise ValueError(f"Port number must be between 1 and {self.max_positions}") + error_msg = f"端口号必须在 1-{self.max_positions} 范围内" + self.logger.error(f"❌ {error_msg}: 请求端口={port_number}") + raise ValueError(error_msg) + + self.logger.info(f"🔌 切换到端口 {port_number}...") return self.set_position(port_number) def open(self): - """打开阀门 - 设置到transfer pump位置(0号位)""" + """打开阀门 - 设置到transfer pump位置(0号位)🔓""" + self.logger.info(f"🔓 打开阀门,设置到泵位置...") return self.set_to_pump_position() def close(self): - """关闭阀门 - 对于多通阀门,设置到一个"关闭"状态""" + """关闭阀门 - 对于多通阀门,设置到一个"关闭"状态 🔒""" + self.logger.info(f"🔒 关闭阀门...") + self._status = "Busy" self._valve_state = "Closing" time.sleep(0.5) - + # 可以选择保持当前位置或设置特殊关闭状态 self._status = "Idle" self._valve_state = "Closed" - return f"Valve closed at position {self._current_position}" + close_msg = f"🔒 阀门已关闭,保持在位置 {self._current_position} ({self.get_current_port()})" + self.logger.info(close_msg) + return close_msg def get_valve_position(self) -> int: - """获取阀门位置 - 兼容性方法""" + """获取阀门位置 - 兼容性方法 📍""" return self._current_position def is_at_position(self, position: int) -> bool: - """检查是否在指定位置""" - return self._current_position == position + """检查是否在指定位置 🎯""" + result = self._current_position == position + # 删除debug日志:self.logger.debug(f"🎯 位置检查: 当前={self._current_position}, 目标={position}, 匹配={result}") + return result def is_at_pump_position(self) -> bool: - """检查是否在transfer pump位置""" - return self._current_position == 0 + """检查是否在transfer pump位置 🚰""" + result = self._current_position == 0 + # 删除debug日志:pump_status = "是" if result else "否" + # 删除debug日志:self.logger.debug(f"🚰 泵位置检查: {pump_status} (当前位置: {self._current_position})") + return result def is_at_port(self, port_number: int) -> bool: - """检查是否在指定端口位置""" - return self._current_position == port_number + """检查是否在指定端口位置 🔌""" + result = self._current_position == port_number + # 删除debug日志:port_status = "是" if result else "否" + # 删除debug日志:self.logger.debug(f"🔌 端口{port_number}检查: {port_status} (当前位置: {self._current_position})") + return result def get_available_positions(self) -> list: - """获取可用位置列表""" - return list(range(0, self.max_positions + 1)) + """获取可用位置列表 📋""" + positions = list(range(0, self.max_positions + 1)) + # 删除debug日志:self.logger.debug(f"📋 可用位置: {positions}") + return positions def get_available_ports(self) -> Dict[int, str]: - """获取可用端口映射""" + """获取可用端口映射 🗺️""" + # 删除debug日志:self.logger.debug(f"🗺️ 端口映射: {self.position_map}") return self.position_map.copy() def reset(self): - """重置阀门到transfer pump位置(0号位)""" + """重置阀门到transfer pump位置(0号位)🔄""" + self.logger.info(f"🔄 重置阀门到泵位置...") return self.set_position(0) def switch_between_pump_and_port(self, port_number: int): """ - 在transfer pump位置和指定端口之间切换 + 在transfer pump位置和指定端口之间切换 🔄 Args: port_number: 目标端口号 (1-8) """ if self._current_position == 0: # 当前在pump位置,切换到指定端口 + self.logger.info(f"🔄 从泵位置切换到端口 {port_number}...") return self.set_to_port(port_number) else: # 当前在某个端口,切换到pump位置 + self.logger.info(f"🔄 从端口 {self._current_position} 切换到泵位置...") return self.set_to_pump_position() def get_flow_path(self) -> str: - """获取当前流路路径描述""" + """获取当前流路路径描述 🌊""" current_port = self.get_current_port() if self._current_position == 0: - return f"Transfer pump connected (position {self._current_position})" + flow_path = f"🚰 转移泵已连接 (位置 {self._current_position})" else: - return f"Port {self._current_position} connected ({current_port})" + flow_path = f"🔌 端口 {self._current_position} 已连接 ({current_port})" + + # 删除debug日志:self.logger.debug(f"🌊 当前流路: {flow_path}") + return flow_path def get_info(self) -> dict: - """获取阀门详细信息""" - return { + """获取阀门详细信息 📊""" + info = { "port": self.port, "max_positions": self.max_positions, "total_positions": self.total_positions, @@ -188,18 +246,25 @@ class VirtualMultiwayValve: "flow_path": self.get_flow_path(), "position_map": self.position_map } + + # 删除debug日志:self.logger.debug(f"📊 阀门信息: 位置={self._current_position}, 状态={self._status}, 端口={self.get_current_port()}") + return info def __str__(self): - return f"VirtualMultiwayValve(Position: {self._current_position}/{self.max_positions}, Port: {self.get_current_port()}, Status: {self._status})" + current_port = self.get_current_port() + status_emoji = "✅" if self._status == "Idle" else "🔄" if self._status == "Busy" else "❌" + + return f"🔄 VirtualMultiwayValve({status_emoji} 位置: {self._current_position}/{self.max_positions}, 端口: {current_port}, 状态: {self._status})" def set_valve_position(self, command: Union[int, str]): """ - 设置阀门位置 - 兼容pump_protocol调用 + 设置阀门位置 - 兼容pump_protocol调用 🎯 这是set_position的别名方法,用于兼容pump_protocol.py Args: command: 目标位置 (0-8) 或位置字符串 """ + # 删除debug日志:self.logger.debug(f"🎯 兼容性调用: set_valve_position({command})") return self.set_position(command) @@ -207,25 +272,35 @@ class VirtualMultiwayValve: if __name__ == "__main__": valve = VirtualMultiwayValve() - print("=== 虚拟九通阀门测试 ===") - print(f"初始状态: {valve}") - print(f"当前流路: {valve.get_flow_path()}") + print("🔄 === 虚拟九通阀门测试 === ✨") + print(f"🏠 初始状态: {valve}") + print(f"🌊 当前流路: {valve.get_flow_path()}") # 切换到试剂瓶1(1号位) - print(f"\n切换到1号位: {valve.set_position(1)}") - print(f"当前状态: {valve}") + print(f"\n🔌 切换到1号位: {valve.set_position(1)}") + print(f"📍 当前状态: {valve}") # 切换到transfer pump位置(0号位) - print(f"\n切换到pump位置: {valve.set_to_pump_position()}") - print(f"当前状态: {valve}") + print(f"\n🚰 切换到pump位置: {valve.set_to_pump_position()}") + print(f"📍 当前状态: {valve}") # 切换到试剂瓶2(2号位) - print(f"\n切换到2号位: {valve.set_to_port(2)}") - print(f"当前状态: {valve}") + print(f"\n🔌 切换到2号位: {valve.set_to_port(2)}") + print(f"📍 当前状态: {valve}") # 显示所有可用位置 - print(f"\n可用位置: {valve.get_available_positions()}") - print(f"端口映射: {valve.get_available_ports()}") + print(f"\n📋 可用位置: {valve.get_available_positions()}") + print(f"🗺️ 端口映射: {valve.get_available_ports()}") # 获取详细信息 - print(f"\n详细信息: {valve.get_info()}") \ No newline at end of file + print(f"\n📊 详细信息: {valve.get_info()}") + + # 测试切换功能 + print(f"\n🔄 智能切换测试:") + print(f"当前位置: {valve._current_position}") + print(f"切换结果: {valve.switch_between_pump_and_port(3)}") + print(f"新位置: {valve._current_position}") + + # 重置测试 + print(f"\n🔄 重置测试: {valve.reset()}") + print(f"📍 重置后状态: {valve}") \ No newline at end of file diff --git a/unilabos/devices/virtual/virtual_rotavap.py b/unilabos/devices/virtual/virtual_rotavap.py index ba01c7b..dd1cca4 100644 --- a/unilabos/devices/virtual/virtual_rotavap.py +++ b/unilabos/devices/virtual/virtual_rotavap.py @@ -3,9 +3,12 @@ import logging import time as time_module from typing import Dict, Any, Optional +def debug_print(message): + """调试输出 🔍""" + print(f"🌪️ [ROTAVAP] {message}", flush=True) class VirtualRotavap: - """Virtual rotary evaporator device - 简化版,只保留核心功能""" + """Virtual rotary evaporator device - 简化版,只保留核心功能 🌪️""" def __init__(self, device_id: Optional[str] = None, config: Optional[Dict[str, Any]] = None, **kwargs): # 处理可能的不同调用方式 @@ -32,13 +35,16 @@ class VirtualRotavap: if key not in skip_keys and not hasattr(self, key): setattr(self, key, value) + print(f"🌪️ === 虚拟旋转蒸发仪 {self.device_id} 已创建 === ✨") + print(f"🔥 温度范围: 10°C ~ {self._max_temp}°C | 🌀 转速范围: 10 ~ {self._max_rotation_speed} RPM") + async def initialize(self) -> bool: - """Initialize virtual rotary evaporator""" - self.logger.info(f"Initializing virtual rotary evaporator {self.device_id}") + """Initialize virtual rotary evaporator 🚀""" + self.logger.info(f"🔧 初始化虚拟旋转蒸发仪 {self.device_id} ✨") # 只保留核心状态 self.data.update({ - "status": "Idle", + "status": "🏠 待机中", "rotavap_state": "Ready", # Ready, Evaporating, Completed, Error "current_temp": 25.0, "target_temp": 25.0, @@ -47,22 +53,27 @@ class VirtualRotavap: "evaporated_volume": 0.0, "progress": 0.0, "remaining_time": 0.0, - "message": "Ready for evaporation" + "message": "🌪️ Ready for evaporation" }) + + self.logger.info(f"✅ 旋转蒸发仪 {self.device_id} 初始化完成 🌪️") + self.logger.info(f"📊 设备规格: 温度范围 10°C ~ {self._max_temp}°C | 转速范围 10 ~ {self._max_rotation_speed} RPM") return True async def cleanup(self) -> bool: - """Cleanup virtual rotary evaporator""" - self.logger.info(f"Cleaning up virtual rotary evaporator {self.device_id}") + """Cleanup virtual rotary evaporator 🧹""" + self.logger.info(f"🧹 清理虚拟旋转蒸发仪 {self.device_id} 🔚") self.data.update({ - "status": "Offline", + "status": "💤 离线", "rotavap_state": "Offline", "current_temp": 25.0, "rotation_speed": 0.0, "vacuum_pressure": 1.0, - "message": "System offline" + "message": "💤 System offline" }) + + self.logger.info(f"✅ 旋转蒸发仪 {self.device_id} 清理完成 💤") return True async def evaporate( @@ -70,46 +81,88 @@ class VirtualRotavap: vessel: str, pressure: float = 0.1, temp: float = 60.0, - time: float = 1800.0, # 30分钟默认 - stir_speed: float = 100.0 + time: float = 180.0, + stir_speed: float = 100.0, + solvent: str = "", + **kwargs ) -> bool: - """Execute evaporate action - 简化的蒸发流程""" - self.logger.info(f"Evaporate: vessel={vessel}, pressure={pressure} bar, temp={temp}°C, time={time}s, rotation={stir_speed} RPM") - + """Execute evaporate action - 简化版 🌪️""" + + # 🔧 简化处理:如果vessel就是设备自己,直接操作 + if vessel == self.device_id: + debug_print(f"🎯 在设备 {self.device_id} 上直接执行蒸发操作") + actual_vessel = self.device_id + else: + actual_vessel = vessel + + # 参数预处理 + if solvent: + self.logger.info(f"🧪 识别到溶剂: {solvent}") + # 根据溶剂调整参数 + solvent_lower = solvent.lower() + if any(s in solvent_lower for s in ['water', 'aqueous']): + temp = max(temp, 80.0) + pressure = max(pressure, 0.2) + self.logger.info(f"💧 水系溶剂:调整参数 → 温度 {temp}°C, 压力 {pressure} bar") + elif any(s in solvent_lower for s in ['ethanol', 'methanol', 'acetone']): + temp = min(temp, 50.0) + pressure = min(pressure, 0.05) + self.logger.info(f"⚡ 易挥发溶剂:调整参数 → 温度 {temp}°C, 压力 {pressure} bar") + + self.logger.info(f"🌪️ 开始蒸发操作: {actual_vessel}") + self.logger.info(f" 🥽 容器: {actual_vessel}") + self.logger.info(f" 🌡️ 温度: {temp}°C") + self.logger.info(f" 💨 真空度: {pressure} bar") + self.logger.info(f" ⏰ 时间: {time}s") + self.logger.info(f" 🌀 转速: {stir_speed} RPM") + if solvent: + self.logger.info(f" 🧪 溶剂: {solvent}") + # 验证参数 if temp > self._max_temp or temp < 10.0: - error_msg = f"温度 {temp}°C 超出范围 (10-{self._max_temp}°C)" - self.logger.error(error_msg) + error_msg = f"🌡️ 温度 {temp}°C 超出范围 (10-{self._max_temp}°C) ⚠️" + self.logger.error(f"❌ {error_msg}") self.data.update({ - "status": f"Error: {error_msg}", + "status": f"❌ 错误: 温度超出范围", "rotavap_state": "Error", + "current_temp": 25.0, + "progress": 0.0, + "evaporated_volume": 0.0, "message": error_msg }) return False if stir_speed > self._max_rotation_speed or stir_speed < 10.0: - error_msg = f"旋转速度 {stir_speed} RPM 超出范围 (10-{self._max_rotation_speed} RPM)" - self.logger.error(error_msg) + error_msg = f"🌀 旋转速度 {stir_speed} RPM 超出范围 (10-{self._max_rotation_speed} RPM) ⚠️" + self.logger.error(f"❌ {error_msg}") self.data.update({ - "status": f"Error: {error_msg}", + "status": f"❌ 错误: 转速超出范围", "rotavap_state": "Error", + "current_temp": 25.0, + "progress": 0.0, + "evaporated_volume": 0.0, "message": error_msg }) return False if pressure < 0.01 or pressure > 1.0: - error_msg = f"真空度 {pressure} bar 超出范围 (0.01-1.0 bar)" - self.logger.error(error_msg) + error_msg = f"💨 真空度 {pressure} bar 超出范围 (0.01-1.0 bar) ⚠️" + self.logger.error(f"❌ {error_msg}") self.data.update({ - "status": f"Error: {error_msg}", + "status": f"❌ 错误: 压力超出范围", "rotavap_state": "Error", + "current_temp": 25.0, + "progress": 0.0, + "evaporated_volume": 0.0, "message": error_msg }) return False # 开始蒸发 + self.logger.info(f"🚀 启动蒸发程序! 预计用时 {time/60:.1f}分钟 ⏱️") + self.data.update({ - "status": f"蒸发中: {vessel}", + "status": f"🌪️ 蒸发中: {actual_vessel}", "rotavap_state": "Evaporating", "current_temp": temp, "target_temp": temp, @@ -118,13 +171,14 @@ class VirtualRotavap: "remaining_time": time, "progress": 0.0, "evaporated_volume": 0.0, - "message": f"Evaporating {vessel} at {temp}°C, {pressure} bar, {stir_speed} RPM" + "message": f"🌪️ Evaporating {actual_vessel} at {temp}°C, {pressure} bar, {stir_speed} RPM" }) try: # 蒸发过程 - 实时更新进度 start_time = time_module.time() total_time = time + last_logged_progress = 0 while True: current_time = time_module.time() @@ -132,18 +186,31 @@ class VirtualRotavap: remaining = max(0, total_time - elapsed) progress = min(100.0, (elapsed / total_time) * 100) - # 模拟蒸发体积 - evaporated_vol = progress * 0.8 # 假设最多蒸发80mL + # 模拟蒸发体积 - 根据溶剂类型调整 + if solvent and any(s in solvent.lower() for s in ['water', 'aqueous']): + evaporated_vol = progress * 0.6 # 水系溶剂蒸发慢 + elif solvent and any(s in solvent.lower() for s in ['ethanol', 'methanol', 'acetone']): + evaporated_vol = progress * 1.0 # 易挥发溶剂蒸发快 + else: + evaporated_vol = progress * 0.8 # 默认蒸发量 + + # 🔧 更新状态 - 确保包含所有必需字段 + status_msg = f"🌪️ 蒸发中: {actual_vessel} | 🌡️ {temp}°C | 💨 {pressure} bar | 🌀 {stir_speed} RPM | 📊 {progress:.1f}% | ⏰ 剩余: {remaining:.0f}s" - # 更新状态 self.data.update({ "remaining_time": remaining, "progress": progress, "evaporated_volume": evaporated_vol, - "status": f"蒸发中: {vessel} | {temp}°C | {pressure} bar | {progress:.1f}% | 剩余: {remaining:.0f}s", - "message": f"Evaporating: {progress:.1f}% complete, {remaining:.0f}s remaining" + "current_temp": temp, + "status": status_msg, + "message": f"🌪️ Evaporating: {progress:.1f}% complete, 💧 {evaporated_vol:.1f}mL evaporated, ⏰ {remaining:.0f}s remaining" }) + # 进度日志(每25%打印一次) + if progress >= 25 and int(progress) % 25 == 0 and int(progress) != last_logged_progress: + self.logger.info(f"📊 蒸发进度: {progress:.0f}% | 💧 已蒸发: {evaporated_vol:.1f}mL | ⏰ 剩余: {remaining:.0f}s ✨") + last_logged_progress = int(progress) + # 时间到了,退出循环 if remaining <= 0: break @@ -152,40 +219,59 @@ class VirtualRotavap: await asyncio.sleep(1.0) # 蒸发完成 - final_evaporated = 80.0 + if solvent and any(s in solvent.lower() for s in ['water', 'aqueous']): + final_evaporated = 60.0 # 水系溶剂 + elif solvent and any(s in solvent.lower() for s in ['ethanol', 'methanol', 'acetone']): + final_evaporated = 100.0 # 易挥发溶剂 + else: + final_evaporated = 80.0 # 默认 + self.data.update({ - "status": f"蒸发完成: {vessel} | 蒸发量: {final_evaporated:.1f}mL", + "status": f"✅ 蒸发完成: {actual_vessel} | 💧 蒸发量: {final_evaporated:.1f}mL", "rotavap_state": "Completed", "evaporated_volume": final_evaporated, "progress": 100.0, + "current_temp": temp, "remaining_time": 0.0, - "current_temp": 25.0, # 冷却下来 - "rotation_speed": 0.0, # 停止旋转 - "vacuum_pressure": 1.0, # 恢复大气压 - "message": f"Evaporation completed: {final_evaporated}mL evaporated from {vessel}" + "rotation_speed": 0.0, + "vacuum_pressure": 1.0, + "message": f"✅ Evaporation completed: {final_evaporated}mL evaporated from {actual_vessel}" }) - self.logger.info(f"Evaporation completed: {final_evaporated}mL evaporated from {vessel}") + self.logger.info(f"🎉 蒸发操作完成! ✨") + self.logger.info(f"📊 蒸发结果:") + self.logger.info(f" 🥽 容器: {actual_vessel}") + self.logger.info(f" 💧 蒸发量: {final_evaporated:.1f}mL") + self.logger.info(f" 🌡️ 蒸发温度: {temp}°C") + self.logger.info(f" 💨 真空度: {pressure} bar") + self.logger.info(f" 🌀 旋转速度: {stir_speed} RPM") + self.logger.info(f" ⏱️ 总用时: {total_time:.0f}s") + if solvent: + self.logger.info(f" 🧪 处理溶剂: {solvent} 🏁") + return True except Exception as e: # 出错处理 - self.logger.error(f"Error during evaporation: {str(e)}") + error_msg = f"蒸发过程中发生错误: {str(e)} 💥" + self.logger.error(f"❌ {error_msg}") self.data.update({ - "status": f"蒸发错误: {str(e)}", + "status": f"❌ 蒸发错误: {str(e)}", "rotavap_state": "Error", "current_temp": 25.0, + "progress": 0.0, + "evaporated_volume": 0.0, "rotation_speed": 0.0, "vacuum_pressure": 1.0, - "message": f"Evaporation failed: {str(e)}" + "message": f"❌ Evaporation failed: {str(e)}" }) return False # === 核心状态属性 === @property def status(self) -> str: - return self.data.get("status", "Unknown") + return self.data.get("status", "❓ Unknown") @property def rotavap_state(self) -> str: diff --git a/unilabos/devices/virtual/virtual_solenoid_valve.py b/unilabos/devices/virtual/virtual_solenoid_valve.py index f25cc84..54a1e6d 100644 --- a/unilabos/devices/virtual/virtual_solenoid_valve.py +++ b/unilabos/devices/virtual/virtual_solenoid_valve.py @@ -43,10 +43,25 @@ class VirtualSolenoidValve: def is_open(self) -> bool: return self._is_open - def get_valve_position(self) -> str: + @property + def valve_position(self) -> str: """获取阀门位置状态""" return "OPEN" if self._is_open else "CLOSED" + @property + def state(self) -> dict: + """获取阀门完整状态""" + return { + "device_id": self.device_id, + "port": self.port, + "voltage": self.voltage, + "response_time": self.response_time, + "is_open": self._is_open, + "valve_state": self._valve_state, + "status": self._status, + "position": self.valve_position + } + async def set_valve_position(self, command: str = None, **kwargs): """ 设置阀门位置 - ROS动作接口 @@ -91,7 +106,7 @@ class VirtualSolenoidValve: return { "success": True, "message": result_msg, - "valve_position": self.get_valve_position() + "valve_position": self.valve_position } async def open(self, **kwargs): @@ -102,21 +117,25 @@ class VirtualSolenoidValve: """关闭电磁阀 - ROS动作接口""" return await self.set_valve_position(command="CLOSED") - async def set_state(self, command: Union[bool, str], **kwargs): + async def set_status(self, string: str = None, **kwargs): """ - 设置阀门状态 - 兼容 SendCmd 类型 + 设置阀门状态 - 兼容 StrSingleInput 类型 Args: - command: True/False 或 "open"/"close" + string: "ON"/"OFF" 或 "OPEN"/"CLOSED" """ - if isinstance(command, bool): - cmd_str = "OPEN" if command else "CLOSED" - elif isinstance(command, str): - cmd_str = command - else: - return {"success": False, "message": "Invalid command type"} + if string is None: + return {"success": False, "message": "Missing string parameter"} - return await self.set_valve_position(command=cmd_str) + # 将 string 参数转换为 command 参数 + if string.upper() in ["ON", "OPEN"]: + command = "OPEN" + elif string.upper() in ["OFF", "CLOSED"]: + command = "CLOSED" + else: + command = string + + return await self.set_valve_position(command=command) def toggle(self): """切换阀门状态""" @@ -129,19 +148,6 @@ class VirtualSolenoidValve: """检查阀门是否关闭""" return not self._is_open - def get_state(self) -> dict: - """获取阀门完整状态""" - return { - "device_id": self.device_id, - "port": self.port, - "voltage": self.voltage, - "response_time": self.response_time, - "is_open": self._is_open, - "valve_state": self._valve_state, - "status": self._status, - "position": self.get_valve_position() - } - async def reset(self): """重置阀门到关闭状态""" return await self.close() \ No newline at end of file diff --git a/unilabos/devices/virtual/virtual_solid_dispenser.py b/unilabos/devices/virtual/virtual_solid_dispenser.py new file mode 100644 index 0000000..439c348 --- /dev/null +++ b/unilabos/devices/virtual/virtual_solid_dispenser.py @@ -0,0 +1,389 @@ +import asyncio +import logging +import re +from typing import Dict, Any, Optional + +class VirtualSolidDispenser: + """ + 虚拟固体粉末加样器 - 用于处理 Add Protocol 中的固体试剂添加 ⚗️ + + 特点: + - 高兼容性:缺少参数不报错 ✅ + - 智能识别:自动查找固体试剂瓶 🔍 + - 简单反馈:成功/失败 + 消息 📊 + """ + + def __init__(self, device_id: str = None, config: Dict[str, Any] = None, **kwargs): + self.device_id = device_id or "virtual_solid_dispenser" + self.config = config or {} + + # 设备参数 + self.max_capacity = float(self.config.get('max_capacity', 100.0)) # 最大加样量 (g) + self.precision = float(self.config.get('precision', 0.001)) # 精度 (g) + + # 状态变量 + self._status = "Idle" + self._current_reagent = "" + self._dispensed_amount = 0.0 + self._total_operations = 0 + + self.logger = logging.getLogger(f"VirtualSolidDispenser.{self.device_id}") + + print(f"⚗️ === 虚拟固体分配器 {self.device_id} 创建成功! === ✨") + print(f"📊 设备规格: 最大容量 {self.max_capacity}g | 精度 {self.precision}g 🎯") + + async def initialize(self) -> bool: + """初始化固体加样器 🚀""" + self.logger.info(f"🔧 初始化固体分配器 {self.device_id} ✨") + self._status = "Ready" + self._current_reagent = "" + self._dispensed_amount = 0.0 + + self.logger.info(f"✅ 固体分配器 {self.device_id} 初始化完成 ⚗️") + return True + + async def cleanup(self) -> bool: + """清理固体加样器 🧹""" + self.logger.info(f"🧹 清理固体分配器 {self.device_id} 🔚") + self._status = "Idle" + + self.logger.info(f"✅ 固体分配器 {self.device_id} 清理完成 💤") + return True + + def parse_mass_string(self, mass_str: str) -> float: + """ + 解析质量字符串为数值 (g) ⚖️ + + 支持格式: "2.9 g", "19.3g", "4.5 mg", "1.2 kg" 等 + """ + if not mass_str or not isinstance(mass_str, str): + return 0.0 + + # 移除空格并转小写 + mass_clean = mass_str.strip().lower() + + # 正则匹配数字和单位 + pattern = r'(\d+(?:\.\d+)?)\s*([a-z]*)' + match = re.search(pattern, mass_clean) + + if not match: + self.logger.debug(f"🔍 无法解析质量字符串: {mass_str}") + return 0.0 + + try: + value = float(match.group(1)) + unit = match.group(2) or 'g' # 默认单位 g + + # 单位转换为 g + unit_multipliers = { + 'g': 1.0, + 'gram': 1.0, + 'grams': 1.0, + 'mg': 0.001, + 'milligram': 0.001, + 'milligrams': 0.001, + 'kg': 1000.0, + 'kilogram': 1000.0, + 'kilograms': 1000.0, + 'μg': 0.000001, + 'ug': 0.000001, + 'microgram': 0.000001, + 'micrograms': 0.000001, + } + + multiplier = unit_multipliers.get(unit, 1.0) + result = value * multiplier + + self.logger.debug(f"⚖️ 质量解析: {mass_str} → {result:.6f}g (原值: {value} {unit})") + return result + + except (ValueError, TypeError): + self.logger.warning(f"⚠️ 无法解析质量字符串: {mass_str}") + return 0.0 + + def parse_mol_string(self, mol_str: str) -> float: + """ + 解析摩尔数字符串为数值 (mol) 🧮 + + 支持格式: "0.12 mol", "16.2 mmol", "25.2mmol" 等 + """ + if not mol_str or not isinstance(mol_str, str): + return 0.0 + + # 移除空格并转小写 + mol_clean = mol_str.strip().lower() + + # 正则匹配数字和单位 + pattern = r'(\d+(?:\.\d+)?)\s*(m?mol)' + match = re.search(pattern, mol_clean) + + if not match: + self.logger.debug(f"🔍 无法解析摩尔数字符串: {mol_str}") + return 0.0 + + try: + value = float(match.group(1)) + unit = match.group(2) + + # 单位转换为 mol + if unit == 'mmol': + result = value * 0.001 + else: # mol + result = value + + self.logger.debug(f"🧮 摩尔数解析: {mol_str} → {result:.6f}mol (原值: {value} {unit})") + return result + + except (ValueError, TypeError): + self.logger.warning(f"⚠️ 无法解析摩尔数字符串: {mol_str}") + return 0.0 + + def find_solid_reagent_bottle(self, reagent_name: str) -> str: + """ + 查找固体试剂瓶 🔍 + + 这是一个简化版本,实际使用时应该连接到系统的设备图 + """ + if not reagent_name: + self.logger.debug(f"🔍 未指定试剂名称,使用默认瓶") + return "unknown_solid_bottle" + + # 可能的固体试剂瓶命名模式 + possible_names = [ + f"solid_bottle_{reagent_name}", + f"reagent_solid_{reagent_name}", + f"powder_{reagent_name}", + f"{reagent_name}_solid", + f"{reagent_name}_powder", + f"solid_{reagent_name}", + ] + + # 这里简化处理,实际应该查询设备图 + selected_bottle = possible_names[0] + self.logger.debug(f"🔍 为试剂 {reagent_name} 选择试剂瓶: {selected_bottle}") + return selected_bottle + + async def add_solid( + self, + vessel: str, + reagent: str, + mass: str = "", + mol: str = "", + purpose: str = "", + **kwargs # 兼容额外参数 + ) -> Dict[str, Any]: + """ + 添加固体试剂的主要方法 ⚗️ + + Args: + vessel: 目标容器 + reagent: 试剂名称 + mass: 质量字符串 (如 "2.9 g") + mol: 摩尔数字符串 (如 "0.12 mol") + purpose: 添加目的 + **kwargs: 其他兼容参数 + + Returns: + Dict: 操作结果 + """ + try: + self.logger.info(f"⚗️ === 开始固体加样操作 === ✨") + self.logger.info(f" 🥽 目标容器: {vessel}") + self.logger.info(f" 🧪 试剂: {reagent}") + self.logger.info(f" ⚖️ 质量: {mass}") + self.logger.info(f" 🧮 摩尔数: {mol}") + self.logger.info(f" 📝 目的: {purpose}") + + # 参数验证 - 宽松处理 + if not vessel: + vessel = "main_reactor" # 默认容器 + self.logger.warning(f"⚠️ 未指定容器,使用默认容器: {vessel} 🏠") + + if not reagent: + error_msg = "❌ 错误: 必须指定试剂名称" + self.logger.error(error_msg) + return { + "success": False, + "message": error_msg, + "return_info": "missing_reagent" + } + + # 解析质量和摩尔数 + mass_value = self.parse_mass_string(mass) + mol_value = self.parse_mol_string(mol) + + self.logger.info(f"📊 解析结果 - 质量: {mass_value:.6f}g | 摩尔数: {mol_value:.6f}mol") + + # 确定实际加样量 + if mass_value > 0: + actual_amount = mass_value + amount_unit = "g" + amount_emoji = "⚖️" + self.logger.info(f"⚖️ 按质量加样: {actual_amount:.6f} {amount_unit}") + elif mol_value > 0: + # 简化处理:假设分子量为100 g/mol + assumed_mw = 100.0 + actual_amount = mol_value * assumed_mw + amount_unit = "g (from mol)" + amount_emoji = "🧮" + self.logger.info(f"🧮 按摩尔数加样: {mol_value:.6f} mol → {actual_amount:.6f} g (假设分子量 {assumed_mw})") + else: + # 没有指定量,使用默认值 + actual_amount = 1.0 + amount_unit = "g (default)" + amount_emoji = "🎯" + self.logger.warning(f"⚠️ 未指定质量或摩尔数,使用默认值: {actual_amount} {amount_unit} 🎯") + + # 检查容量限制 + if actual_amount > self.max_capacity: + error_msg = f"❌ 错误: 请求量 {actual_amount:.3f}g 超过最大容量 {self.max_capacity}g" + self.logger.error(error_msg) + return { + "success": False, + "message": error_msg, + "return_info": "exceeds_capacity" + } + + # 查找试剂瓶 + reagent_bottle = self.find_solid_reagent_bottle(reagent) + self.logger.info(f"🔍 使用试剂瓶: {reagent_bottle}") + + # 模拟加样过程 + self._status = "Dispensing" + self._current_reagent = reagent + + # 计算操作时间 (基于质量) + operation_time = max(0.5, actual_amount * 0.1) # 每克0.1秒,最少0.5秒 + + self.logger.info(f"🚀 开始加样,预计时间: {operation_time:.1f}秒 ⏱️") + + # 显示进度的模拟 + steps = max(3, int(operation_time)) + step_time = operation_time / steps + + for i in range(steps): + progress = (i + 1) / steps * 100 + await asyncio.sleep(step_time) + if i % 2 == 0: # 每隔一步显示进度 + self.logger.debug(f"📊 加样进度: {progress:.0f}% | {amount_emoji} 正在分配 {reagent}...") + + # 更新状态 + self._dispensed_amount = actual_amount + self._total_operations += 1 + self._status = "Ready" + + # 成功结果 + success_message = f"✅ 成功添加 {reagent} {actual_amount:.6f} {amount_unit} 到 {vessel}" + + self.logger.info(f"🎉 === 固体加样完成 === ✨") + self.logger.info(f"📊 操作结果:") + self.logger.info(f" ✅ {success_message}") + self.logger.info(f" 🧪 试剂瓶: {reagent_bottle}") + self.logger.info(f" ⏱️ 用时: {operation_time:.1f}秒") + self.logger.info(f" 🎯 总操作次数: {self._total_operations} 🏁") + + return { + "success": True, + "message": success_message, + "return_info": f"dispensed_{actual_amount:.6f}g", + "dispensed_amount": actual_amount, + "reagent": reagent, + "vessel": vessel + } + + except Exception as e: + error_message = f"❌ 固体加样失败: {str(e)} 💥" + self.logger.error(error_message) + self._status = "Error" + + return { + "success": False, + "message": error_message, + "return_info": "operation_failed" + } + + # 状态属性 + @property + def status(self) -> str: + return self._status + + @property + def current_reagent(self) -> str: + return self._current_reagent + + @property + def dispensed_amount(self) -> float: + return self._dispensed_amount + + @property + def total_operations(self) -> int: + return self._total_operations + + def get_device_info(self) -> Dict[str, Any]: + """获取设备状态信息 📊""" + info = { + "device_id": self.device_id, + "status": self._status, + "current_reagent": self._current_reagent, + "last_dispensed_amount": self._dispensed_amount, + "total_operations": self._total_operations, + "max_capacity": self.max_capacity, + "precision": self.precision + } + + self.logger.debug(f"📊 设备信息: 状态={self._status}, 试剂={self._current_reagent}, 加样量={self._dispensed_amount:.6f}g") + return info + + def __str__(self): + status_emoji = "✅" if self._status == "Ready" else "🔄" if self._status == "Dispensing" else "❌" if self._status == "Error" else "🏠" + return f"⚗️ VirtualSolidDispenser({status_emoji} {self.device_id}: {self._status}, 最后加样 {self._dispensed_amount:.3f}g)" + + +# 测试函数 +async def test_solid_dispenser(): + """测试固体加样器 🧪""" + print("⚗️ === 固体加样器测试开始 === 🧪") + + dispenser = VirtualSolidDispenser("test_dispenser") + await dispenser.initialize() + + # 测试1: 按质量加样 + print(f"\n🧪 测试1: 按质量加样...") + result1 = await dispenser.add_solid( + vessel="main_reactor", + reagent="magnesium", + mass="2.9 g" + ) + print(f"📊 测试1结果: {result1}") + + # 测试2: 按摩尔数加样 + print(f"\n🧮 测试2: 按摩尔数加样...") + result2 = await dispenser.add_solid( + vessel="main_reactor", + reagent="sodium_nitrite", + mol="0.28 mol" + ) + print(f"📊 测试2结果: {result2}") + + # 测试3: 缺少参数 + print(f"\n⚠️ 测试3: 缺少参数测试...") + result3 = await dispenser.add_solid( + reagent="test_compound" + ) + print(f"📊 测试3结果: {result3}") + + # 测试4: 超容量测试 + print(f"\n❌ 测试4: 超容量测试...") + result4 = await dispenser.add_solid( + vessel="main_reactor", + reagent="heavy_compound", + mass="150 g" # 超过100g限制 + ) + print(f"📊 测试4结果: {result4}") + + print(f"\n📊 最终设备信息: {dispenser.get_device_info()}") + print(f"✅ === 测试完成 === 🎉") + + +if __name__ == "__main__": + asyncio.run(test_solid_dispenser()) \ No newline at end of file diff --git a/unilabos/devices/virtual/virtual_stirrer.py b/unilabos/devices/virtual/virtual_stirrer.py index 874f997..2b9058b 100644 --- a/unilabos/devices/virtual/virtual_stirrer.py +++ b/unilabos/devices/virtual/virtual_stirrer.py @@ -4,7 +4,7 @@ import time as time_module from typing import Dict, Any class VirtualStirrer: - """Virtual stirrer device for StirProtocol testing - 功能完整版""" + """Virtual stirrer device for StirProtocol testing - 功能完整版 🌪️""" def __init__(self, device_id: str = None, config: Dict[str, Any] = None, **kwargs): # 处理可能的不同调用方式 @@ -30,45 +30,69 @@ class VirtualStirrer: for key, value in kwargs.items(): if key not in skip_keys and not hasattr(self, key): setattr(self, key, value) + + print(f"🌪️ === 虚拟搅拌器 {self.device_id} 已创建 === ✨") + print(f"🔧 速度范围: {self._min_speed} ~ {self._max_speed} RPM | 📱 端口: {self.port}") async def initialize(self) -> bool: - """Initialize virtual stirrer""" - self.logger.info(f"Initializing virtual stirrer {self.device_id}") + """Initialize virtual stirrer 🚀""" + self.logger.info(f"🔧 初始化虚拟搅拌器 {self.device_id} ✨") # 初始化状态信息 self.data.update({ - "status": "Idle", + "status": "🏠 待机中", "operation_mode": "Idle", # 操作模式: Idle, Stirring, Settling, Completed, Error "current_vessel": "", # 当前搅拌的容器 "current_speed": 0.0, # 当前搅拌速度 "is_stirring": False, # 是否正在搅拌 "remaining_time": 0.0, # 剩余时间 }) + + self.logger.info(f"✅ 搅拌器 {self.device_id} 初始化完成 🌪️") + self.logger.info(f"📊 设备规格: 速度范围 {self._min_speed} ~ {self._max_speed} RPM") return True async def cleanup(self) -> bool: - """Cleanup virtual stirrer""" - self.logger.info(f"Cleaning up virtual stirrer {self.device_id}") + """Cleanup virtual stirrer 🧹""" + self.logger.info(f"🧹 清理虚拟搅拌器 {self.device_id} 🔚") + self.data.update({ - "status": "Offline", + "status": "💤 离线", "operation_mode": "Offline", "current_vessel": "", "current_speed": 0.0, "is_stirring": False, "remaining_time": 0.0, }) + + self.logger.info(f"✅ 搅拌器 {self.device_id} 清理完成 💤") return True - async def stir(self, stir_time: float, stir_speed: float, settling_time: float) -> bool: - """Execute stir action - 定时搅拌 + 沉降""" - self.logger.info(f"Stir: speed={stir_speed} RPM, time={stir_time}s, settling={settling_time}s") + async def stir(self, stir_time: float, stir_speed: float, settling_time: float, **kwargs) -> bool: + """Execute stir action - 定时搅拌 + 沉降 🌪️""" + + # 🔧 类型转换 - 确保所有参数都是数字类型 + try: + stir_time = float(stir_time) + stir_speed = float(stir_speed) + settling_time = float(settling_time) + except (ValueError, TypeError) as e: + error_msg = f"参数类型转换失败: stir_time={stir_time}, stir_speed={stir_speed}, settling_time={settling_time}, error={e}" + self.logger.error(f"❌ {error_msg}") + self.data.update({ + "status": f"❌ 错误: {error_msg}", + "operation_mode": "Error" + }) + return False + + self.logger.info(f"🌪️ 开始搅拌操作: 速度 {stir_speed} RPM | 时间 {stir_time}s | 沉降 {settling_time}s") # 验证参数 if stir_speed > self._max_speed or stir_speed < self._min_speed: - error_msg = f"搅拌速度 {stir_speed} RPM 超出范围 ({self._min_speed} - {self._max_speed} RPM)" - self.logger.error(error_msg) + error_msg = f"🌪️ 搅拌速度 {stir_speed} RPM 超出范围 ({self._min_speed} - {self._max_speed} RPM) ⚠️" + self.logger.error(f"❌ {error_msg}") self.data.update({ - "status": f"Error: {error_msg}", + "status": f"❌ 错误: 速度超出范围", "operation_mode": "Error" }) return False @@ -77,8 +101,10 @@ class VirtualStirrer: start_time = time_module.time() total_stir_time = stir_time + self.logger.info(f"🚀 开始搅拌阶段: {stir_speed} RPM × {total_stir_time}s ⏱️") + self.data.update({ - "status": f"搅拌中: {stir_speed} RPM | 剩余: {total_stir_time:.0f}s", + "status": f"🌪️ 搅拌中: {stir_speed} RPM | ⏰ 剩余: {total_stir_time:.0f}s", "operation_mode": "Stirring", "current_speed": stir_speed, "is_stirring": True, @@ -86,30 +112,41 @@ class VirtualStirrer: }) # 搅拌过程 - 实时更新剩余时间 + last_logged_time = 0 while True: current_time = time_module.time() elapsed = current_time - start_time remaining = max(0, total_stir_time - elapsed) + progress = (elapsed / total_stir_time) * 100 if total_stir_time > 0 else 100 # 更新状态 self.data.update({ "remaining_time": remaining, - "status": f"搅拌中: {stir_speed} RPM | 剩余: {remaining:.0f}s" + "status": f"🌪️ 搅拌中: {stir_speed} RPM | ⏰ 剩余: {remaining:.0f}s" }) + # 进度日志(每25%打印一次) + if progress >= 25 and int(progress) % 25 == 0 and int(progress) != last_logged_time: + self.logger.info(f"📊 搅拌进度: {progress:.0f}% | 🌪️ {stir_speed} RPM | ⏰ 剩余: {remaining:.0f}s ✨") + last_logged_time = int(progress) + # 搅拌时间到了 if remaining <= 0: break await asyncio.sleep(1.0) + self.logger.info(f"✅ 搅拌阶段完成! 🌪️ {stir_speed} RPM × {stir_time}s") + # === 第二阶段:沉降(如果需要)=== if settling_time > 0: start_settling_time = time_module.time() total_settling_time = settling_time + self.logger.info(f"🛑 开始沉降阶段: 停止搅拌 × {total_settling_time}s ⏱️") + self.data.update({ - "status": f"沉降中: 停止搅拌 | 剩余: {total_settling_time:.0f}s", + "status": f"🛑 沉降中: 停止搅拌 | ⏰ 剩余: {total_settling_time:.0f}s", "operation_mode": "Settling", "current_speed": 0.0, "is_stirring": False, @@ -117,52 +154,87 @@ class VirtualStirrer: }) # 沉降过程 - 实时更新剩余时间 + last_logged_settling = 0 while True: current_time = time_module.time() elapsed = current_time - start_settling_time remaining = max(0, total_settling_time - elapsed) + progress = (elapsed / total_settling_time) * 100 if total_settling_time > 0 else 100 # 更新状态 self.data.update({ "remaining_time": remaining, - "status": f"沉降中: 停止搅拌 | 剩余: {remaining:.0f}s" + "status": f"🛑 沉降中: 停止搅拌 | ⏰ 剩余: {remaining:.0f}s" }) + # 进度日志(每25%打印一次) + if progress >= 25 and int(progress) % 25 == 0 and int(progress) != last_logged_settling: + self.logger.info(f"📊 沉降进度: {progress:.0f}% | 🛑 静置中 | ⏰ 剩余: {remaining:.0f}s ✨") + last_logged_settling = int(progress) + # 沉降时间到了 if remaining <= 0: break await asyncio.sleep(1.0) + + self.logger.info(f"✅ 沉降阶段完成! 🛑 静置 {settling_time}s") # === 操作完成 === - settling_info = f" | 沉降: {settling_time:.0f}s" if settling_time > 0 else "" + settling_info = f" | 🛑 沉降: {settling_time:.0f}s" if settling_time > 0 else "" + self.data.update({ - "status": f"完成: 搅拌 {stir_speed} RPM, {stir_time:.0f}s{settling_info}", + "status": f"✅ 完成: 🌪️ 搅拌 {stir_speed} RPM × {stir_time:.0f}s{settling_info}", "operation_mode": "Completed", "current_speed": 0.0, "is_stirring": False, "remaining_time": 0.0, }) - self.logger.info(f"Stir completed: {stir_speed} RPM for {stir_time}s + settling {settling_time}s") + self.logger.info(f"🎉 搅拌操作完成! ✨") + self.logger.info(f"📊 操作总结:") + self.logger.info(f" 🌪️ 搅拌: {stir_speed} RPM × {stir_time}s") + if settling_time > 0: + self.logger.info(f" 🛑 沉降: {settling_time}s") + self.logger.info(f" ⏱️ 总用时: {(stir_time + settling_time):.0f}s 🏁") + return True - async def start_stir(self, vessel: str, stir_speed: float, purpose: str) -> bool: - """Start stir action - 开始持续搅拌""" - self.logger.info(f"StartStir: vessel={vessel}, speed={stir_speed} RPM, purpose={purpose}") + async def start_stir(self, vessel: str, stir_speed: float, purpose: str = "") -> bool: + """Start stir action - 开始持续搅拌 🔄""" - # 验证参数 - if stir_speed > self._max_speed or stir_speed < self._min_speed: - error_msg = f"搅拌速度 {stir_speed} RPM 超出范围 ({self._min_speed} - {self._max_speed} RPM)" - self.logger.error(error_msg) + # 🔧 类型转换 + try: + stir_speed = float(stir_speed) + vessel = str(vessel) + purpose = str(purpose) + except (ValueError, TypeError) as e: + error_msg = f"参数类型转换错误: {str(e)}" + self.logger.error(f"❌ {error_msg}") self.data.update({ - "status": f"Error: {error_msg}", + "status": f"❌ 错误: {error_msg}", "operation_mode": "Error" }) return False + self.logger.info(f"🔄 启动持续搅拌: {vessel} | 🌪️ {stir_speed} RPM") + if purpose: + self.logger.info(f"📝 搅拌目的: {purpose}") + + # 验证参数 + if stir_speed > self._max_speed or stir_speed < self._min_speed: + error_msg = f"🌪️ 搅拌速度 {stir_speed} RPM 超出范围 ({self._min_speed} - {self._max_speed} RPM) ⚠️" + self.logger.error(f"❌ {error_msg}") + self.data.update({ + "status": f"❌ 错误: 速度超出范围", + "operation_mode": "Error" + }) + return False + + purpose_info = f" | 📝 {purpose}" if purpose else "" + self.data.update({ - "status": f"启动: 持续搅拌 {vessel} at {stir_speed} RPM | {purpose}", + "status": f"🔄 启动: 持续搅拌 {vessel} | 🌪️ {stir_speed} RPM{purpose_info}", "operation_mode": "Stirring", "current_vessel": vessel, "current_speed": stir_speed, @@ -170,16 +242,28 @@ class VirtualStirrer: "remaining_time": -1.0, # -1 表示持续运行 }) + self.logger.info(f"✅ 持续搅拌已启动! 🌪️ {stir_speed} RPM × ♾️ 🚀") return True async def stop_stir(self, vessel: str) -> bool: - """Stop stir action - 停止搅拌""" - self.logger.info(f"StopStir: vessel={vessel}") + """Stop stir action - 停止搅拌 🛑""" + + # 🔧 类型转换 + try: + vessel = str(vessel) + except (ValueError, TypeError) as e: + error_msg = f"参数类型转换错误: {str(e)}" + self.logger.error(f"❌ {error_msg}") + return False current_speed = self.data.get("current_speed", 0.0) + self.logger.info(f"🛑 停止搅拌: {vessel}") + if current_speed > 0: + self.logger.info(f"🌪️ 之前搅拌速度: {current_speed} RPM") + self.data.update({ - "status": f"已停止: {vessel} 搅拌停止 | 之前速度: {current_speed} RPM", + "status": f"🛑 已停止: {vessel} 搅拌停止 | 之前速度: {current_speed} RPM", "operation_mode": "Stopped", "current_vessel": "", "current_speed": 0.0, @@ -187,12 +271,13 @@ class VirtualStirrer: "remaining_time": 0.0, }) + self.logger.info(f"✅ 搅拌器已停止 {vessel} 的搅拌操作 🏁") return True # 状态属性 @property def status(self) -> str: - return self.data.get("status", "Idle") + return self.data.get("status", "🏠 待机中") @property def operation_mode(self) -> str: @@ -212,4 +297,33 @@ class VirtualStirrer: @property def remaining_time(self) -> float: - return self.data.get("remaining_time", 0.0) \ No newline at end of file + return self.data.get("remaining_time", 0.0) + + @property + def max_speed(self) -> float: + return self._max_speed + + @property + def min_speed(self) -> float: + return self._min_speed + + def get_device_info(self) -> Dict[str, Any]: + """获取设备状态信息 📊""" + info = { + "device_id": self.device_id, + "status": self.status, + "operation_mode": self.operation_mode, + "current_vessel": self.current_vessel, + "current_speed": self.current_speed, + "is_stirring": self.is_stirring, + "remaining_time": self.remaining_time, + "max_speed": self._max_speed, + "min_speed": self._min_speed + } + + self.logger.debug(f"📊 设备信息: 模式={self.operation_mode}, 速度={self.current_speed} RPM, 搅拌={self.is_stirring}") + return info + + def __str__(self): + status_emoji = "✅" if self.operation_mode == "Idle" else "🌪️" if self.operation_mode == "Stirring" else "🛑" if self.operation_mode == "Settling" else "❌" + return f"🌪️ VirtualStirrer({status_emoji} {self.device_id}: {self.operation_mode}, {self.current_speed} RPM)" \ No newline at end of file diff --git a/unilabos/devices/virtual/virtual_transferpump.py b/unilabos/devices/virtual/virtual_transferpump.py index a2cba9c..7d80744 100644 --- a/unilabos/devices/virtual/virtual_transferpump.py +++ b/unilabos/devices/virtual/virtual_transferpump.py @@ -12,7 +12,7 @@ class VirtualPumpMode(Enum): class VirtualTransferPump: - """虚拟转移泵类 - 模拟泵的基本功能,无需实际硬件""" + """虚拟转移泵类 - 模拟泵的基本功能,无需实际硬件 🚰""" def __init__(self, device_id: str = None, config: dict = None, **kwargs): """ @@ -42,20 +42,31 @@ class VirtualTransferPump: self._max_velocity = 5.0 # float self._current_volume = 0.0 # float + # 🚀 新增:快速模式设置 - 大幅缩短执行时间 + self._fast_mode = True # 是否启用快速模式 + self._fast_move_time = 1.0 # 快速移动时间(秒) + self._fast_dispense_time = 1.0 # 快速喷射时间(秒) + self.logger = logging.getLogger(f"VirtualTransferPump.{self.device_id}") + + print(f"🚰 === 虚拟转移泵 {self.device_id} 已创建 === ✨") + print(f"💨 快速模式: {'启用' if self._fast_mode else '禁用'} | 移动时间: {self._fast_move_time}s | 喷射时间: {self._fast_dispense_time}s") + print(f"📊 最大容量: {self.max_volume}mL | 端口: {self.port}") async def initialize(self) -> bool: - """初始化虚拟泵""" - self.logger.info(f"Initializing virtual pump {self.device_id}") + """初始化虚拟泵 🚀""" + self.logger.info(f"🔧 初始化虚拟转移泵 {self.device_id} ✨") self._status = "Idle" self._position = 0.0 self._current_volume = 0.0 + self.logger.info(f"✅ 转移泵 {self.device_id} 初始化完成 🚰") return True async def cleanup(self) -> bool: - """清理虚拟泵""" - self.logger.info(f"Cleaning up virtual pump {self.device_id}") + """清理虚拟泵 🧹""" + self.logger.info(f"🧹 清理虚拟转移泵 {self.device_id} 🔚") self._status = "Idle" + self.logger.info(f"✅ 转移泵 {self.device_id} 清理完成 💤") return True # 基本属性 @@ -65,12 +76,12 @@ class VirtualTransferPump: @property def position(self) -> float: - """当前柱塞位置 (ml)""" + """当前柱塞位置 (ml) 📍""" return self._position @property def current_volume(self) -> float: - """当前注射器中的体积 (ml)""" + """当前注射器中的体积 (ml) 💧""" return self._current_volume @property @@ -82,22 +93,50 @@ class VirtualTransferPump: return self._transfer_rate def set_max_velocity(self, velocity: float): - """设置最大速度 (ml/s)""" + """设置最大速度 (ml/s) 🌊""" self._max_velocity = max(0.1, min(50.0, velocity)) # 限制在合理范围内 - self.logger.info(f"Set max velocity to {self._max_velocity} ml/s") + self.logger.info(f"🌊 设置最大速度为 {self._max_velocity} mL/s") def get_status(self) -> str: - """获取泵状态""" + """获取泵状态 📋""" return self._status async def _simulate_operation(self, duration: float): - """模拟操作延时""" + """模拟操作延时 ⏱️""" self._status = "Busy" await asyncio.sleep(duration) self._status = "Idle" def _calculate_duration(self, volume: float, velocity: float = None) -> float: - """计算操作持续时间""" + """ + 计算操作持续时间 ⏰ + 🚀 快速模式:保留计算逻辑用于日志显示,但实际使用固定的快速时间 + """ + if velocity is None: + velocity = self._max_velocity + + # 📊 计算理论时间(用于日志显示) + theoretical_duration = abs(volume) / velocity + + # 🚀 如果启用快速模式,使用固定的快速时间 + if self._fast_mode: + # 根据操作类型选择快速时间 + if abs(volume) > 0.1: # 大于0.1mL的操作 + actual_duration = self._fast_move_time + else: # 很小的操作 + actual_duration = 0.5 + + self.logger.debug(f"⚡ 快速模式: 理论时间 {theoretical_duration:.2f}s → 实际时间 {actual_duration:.2f}s") + return actual_duration + else: + # 正常模式使用理论时间 + return theoretical_duration + + def _calculate_display_duration(self, volume: float, velocity: float = None) -> float: + """ + 计算显示用的持续时间(用于日志) 📊 + 这个函数返回理论计算时间,用于日志显示 + """ if velocity is None: velocity = self._max_velocity return abs(volume) / velocity @@ -105,7 +144,7 @@ class VirtualTransferPump: # 新的set_position方法 - 专门用于SetPumpPosition动作 async def set_position(self, position: float, max_velocity: float = None): """ - 移动到绝对位置 - 专门用于SetPumpPosition动作 + 移动到绝对位置 - 专门用于SetPumpPosition动作 🎯 Args: position (float): 目标位置 (ml) @@ -122,56 +161,107 @@ class VirtualTransferPump: # 限制位置在有效范围内 target_position = max(0.0, min(float(self.max_volume), target_position)) - # 计算移动距离和时间 + # 计算移动距离 volume_to_move = abs(target_position - self._position) - duration = self._calculate_duration(volume_to_move, velocity) - self.logger.info(f"SET_POSITION: Moving to {target_position} ml (current: {self._position} ml), velocity: {velocity} ml/s") + # 📊 计算显示用的时间(用于日志) + display_duration = self._calculate_display_duration(volume_to_move, velocity) - # 模拟移动过程 - start_position = self._position - steps = 10 if duration > 0.1 else 1 # 如果移动距离很小,只用1步 - step_duration = duration / steps if steps > 1 else duration + # ⚡ 计算实际执行时间(快速模式) + actual_duration = self._calculate_duration(volume_to_move, velocity) - for i in range(steps + 1): - # 计算当前位置和进度 - progress = (i / steps) * 100 if steps > 0 else 100 - current_pos = start_position + (target_position - start_position) * (i / steps) if steps > 0 else target_position + # 🎯 确定操作类型和emoji + if target_position > self._position: + operation_type = "吸液" + operation_emoji = "📥" + elif target_position < self._position: + operation_type = "排液" + operation_emoji = "📤" + else: + operation_type = "保持" + operation_emoji = "📍" + + self.logger.info(f"🎯 SET_POSITION: {operation_type} {operation_emoji}") + self.logger.info(f" 📍 位置: {self._position:.2f}mL → {target_position:.2f}mL (移动 {volume_to_move:.2f}mL)") + self.logger.info(f" 🌊 速度: {velocity:.2f} mL/s") + self.logger.info(f" ⏰ 预计时间: {display_duration:.2f}s") + + if self._fast_mode: + self.logger.info(f" ⚡ 快速模式: 实际用时 {actual_duration:.2f}s") + + # 🚀 模拟移动过程 + if volume_to_move > 0.01: # 只有当移动距离足够大时才显示进度 + start_position = self._position + steps = 5 if actual_duration > 0.5 else 2 # 根据实际时间调整步数 + step_duration = actual_duration / steps - # 更新状态 - self._status = "Moving" if i < steps else "Idle" - self._position = current_pos - self._current_volume = current_pos + self.logger.info(f"🚀 开始{operation_type}... {operation_emoji}") - # 等待一小步时间 - if i < steps and step_duration > 0: - await asyncio.sleep(step_duration) + for i in range(steps + 1): + # 计算当前位置和进度 + progress = (i / steps) * 100 if steps > 0 else 100 + current_pos = start_position + (target_position - start_position) * (i / steps) if steps > 0 else target_position + + # 更新状态 + if i < steps: + self._status = f"{operation_type}中" + status_emoji = "🔄" + else: + self._status = "Idle" + status_emoji = "✅" + + self._position = current_pos + self._current_volume = current_pos + + # 显示进度(每25%或最后一步) + if i == 0: + self.logger.debug(f" 🔄 {operation_type}开始: {progress:.0f}%") + elif progress >= 50 and i == steps // 2: + self.logger.debug(f" 🔄 {operation_type}进度: {progress:.0f}%") + elif i == steps: + self.logger.info(f" ✅ {operation_type}完成: {progress:.0f}% | 当前位置: {current_pos:.2f}mL") + + # 等待一小步时间 + if i < steps and step_duration > 0: + await asyncio.sleep(step_duration) + else: + # 移动距离很小,直接完成 + self._position = target_position + self._current_volume = target_position + self.logger.info(f" 📍 微调完成: {target_position:.2f}mL") # 确保最终位置准确 self._position = target_position self._current_volume = target_position self._status = "Idle" - self.logger.info(f"SET_POSITION: Reached position {self._position} ml, current volume: {self._current_volume} ml") + # 📊 最终状态日志 + if volume_to_move > 0.01: + self.logger.info(f"🎉 SET_POSITION 完成! 📍 最终位置: {self._position:.2f}mL | 💧 当前体积: {self._current_volume:.2f}mL") # 返回符合action定义的结果 return { "success": True, - "message": f"Successfully moved to position {self._position} ml" + "message": f"✅ 成功移动到位置 {self._position:.2f}mL ({operation_type})", + "final_position": self._position, + "final_volume": self._current_volume, + "operation_type": operation_type } except Exception as e: - error_msg = f"Failed to set position: {str(e)}" + error_msg = f"❌ 设置位置失败: {str(e)}" self.logger.error(error_msg) return { "success": False, - "message": error_msg + "message": error_msg, + "final_position": self._position, + "final_volume": self._current_volume } # 其他泵操作方法 async def pull_plunger(self, volume: float, velocity: float = None): """ - 拉取柱塞(吸液) + 拉取柱塞(吸液) 📥 Args: volume (float): 要拉取的体积 (ml) @@ -181,23 +271,29 @@ class VirtualTransferPump: actual_volume = new_position - self._position if actual_volume <= 0: - self.logger.warning("Cannot pull - already at maximum volume") + self.logger.warning("⚠️ 无法吸液 - 已达到最大容量") return - duration = self._calculate_duration(actual_volume, velocity) + display_duration = self._calculate_display_duration(actual_volume, velocity) + actual_duration = self._calculate_duration(actual_volume, velocity) - self.logger.info(f"Pulling {actual_volume} ml (from {self._position} to {new_position})") + self.logger.info(f"📥 开始吸液: {actual_volume:.2f}mL") + self.logger.info(f" 📍 位置: {self._position:.2f}mL → {new_position:.2f}mL") + self.logger.info(f" ⏰ 预计时间: {display_duration:.2f}s") - await self._simulate_operation(duration) + if self._fast_mode: + self.logger.info(f" ⚡ 快速模式: 实际用时 {actual_duration:.2f}s") + + await self._simulate_operation(actual_duration) self._position = new_position self._current_volume = new_position - self.logger.info(f"Pulled {actual_volume} ml, current volume: {self._current_volume} ml") + self.logger.info(f"✅ 吸液完成: {actual_volume:.2f}mL | 💧 当前体积: {self._current_volume:.2f}mL") async def push_plunger(self, volume: float, velocity: float = None): """ - 推出柱塞(排液) + 推出柱塞(排液) 📤 Args: volume (float): 要推出的体积 (ml) @@ -207,35 +303,44 @@ class VirtualTransferPump: actual_volume = self._position - new_position if actual_volume <= 0: - self.logger.warning("Cannot push - already at minimum volume") + self.logger.warning("⚠️ 无法排液 - 已达到最小容量") return - duration = self._calculate_duration(actual_volume, velocity) + display_duration = self._calculate_display_duration(actual_volume, velocity) + actual_duration = self._calculate_duration(actual_volume, velocity) - self.logger.info(f"Pushing {actual_volume} ml (from {self._position} to {new_position})") + self.logger.info(f"📤 开始排液: {actual_volume:.2f}mL") + self.logger.info(f" 📍 位置: {self._position:.2f}mL → {new_position:.2f}mL") + self.logger.info(f" ⏰ 预计时间: {display_duration:.2f}s") - await self._simulate_operation(duration) + if self._fast_mode: + self.logger.info(f" ⚡ 快速模式: 实际用时 {actual_duration:.2f}s") + + await self._simulate_operation(actual_duration) self._position = new_position self._current_volume = new_position - self.logger.info(f"Pushed {actual_volume} ml, current volume: {self._current_volume} ml") + self.logger.info(f"✅ 排液完成: {actual_volume:.2f}mL | 💧 当前体积: {self._current_volume:.2f}mL") # 便捷操作方法 async def aspirate(self, volume: float, velocity: float = None): - """吸液操作""" + """吸液操作 📥""" await self.pull_plunger(volume, velocity) async def dispense(self, volume: float, velocity: float = None): - """排液操作""" + """排液操作 📤""" await self.push_plunger(volume, velocity) async def transfer(self, volume: float, aspirate_velocity: float = None, dispense_velocity: float = None): - """转移操作(先吸后排)""" + """转移操作(先吸后排) 🔄""" + self.logger.info(f"🔄 开始转移操作: {volume:.2f}mL") + # 吸液 await self.aspirate(volume, aspirate_velocity) # 短暂停顿 + self.logger.debug("⏸️ 短暂停顿...") await asyncio.sleep(0.1) # 排液 diff --git a/unilabos/messages/__init__.py b/unilabos/messages/__init__.py index 47f21f1..f91f382 100644 --- a/unilabos/messages/__init__.py +++ b/unilabos/messages/__init__.py @@ -10,18 +10,88 @@ class Point3D(BaseModel): # Start Protocols class PumpTransferProtocol(BaseModel): + # === 核心参数(保持必需) === from_vessel: str to_vessel: str - volume: float + + # === 所有其他参数都改为可选,添加默认值 === + volume: float = 0.0 # 🔧 改为-1,表示转移全部体积 amount: str = "" - time: float = 0 + time: float = 0.0 viscous: bool = False - rinsing_solvent: str = "air" - rinsing_volume: float = 5000 - rinsing_repeats: int = 2 + rinsing_solvent: str = "" + rinsing_volume: float = 0.0 + rinsing_repeats: int = 0 solid: bool = False - flowrate: float = 500 - transfer_flowrate: float = 2500 + flowrate: float = 2.5 + transfer_flowrate: float = 0.5 + + # === 新版XDL兼容参数(可选) === + rate_spec: str = "" + event: str = "" + through: str = "" + + def model_post_init(self, __context): + """后处理:智能参数处理和兼容性调整""" + + # 如果指定了 amount 但volume是默认值,尝试解析 amount + if self.amount and self.volume == 0.0: + parsed_volume = self._parse_amount_to_volume(self.amount) + if parsed_volume > 0: + self.volume = parsed_volume + + # 如果指定了 time 但没有明确设置流速,根据时间计算流速 + if self.time > 0 and self.volume > 0: + if self.flowrate == 2.5 and self.transfer_flowrate == 0.5: + calculated_flowrate = self.volume / self.time + self.flowrate = min(calculated_flowrate, 10.0) + self.transfer_flowrate = min(calculated_flowrate, 5.0) + + # 🔧 核心修复:如果flowrate为0(ROS2传入),使用默认值 + if self.flowrate <= 0: + self.flowrate = 2.5 + if self.transfer_flowrate <= 0: + self.transfer_flowrate = 0.5 + + # 根据 rate_spec 调整流速 + if self.rate_spec == "dropwise": + self.flowrate = min(self.flowrate, 0.1) + self.transfer_flowrate = min(self.transfer_flowrate, 0.1) + elif self.rate_spec == "slowly": + self.flowrate = min(self.flowrate, 0.5) + self.transfer_flowrate = min(self.transfer_flowrate, 0.3) + elif self.rate_spec == "quickly": + self.flowrate = max(self.flowrate, 5.0) + self.transfer_flowrate = max(self.transfer_flowrate, 2.0) + + def _parse_amount_to_volume(self, amount: str) -> float: + """解析 amount 字符串为体积""" + if not amount: + return 0.0 + + amount = amount.lower().strip() + + # 处理特殊关键词 + if amount == "all": + return 0.0 # 🔧 "all"也表示转移全部 + + # 提取数字 + import re + numbers = re.findall(r'[\d.]+', amount) + if numbers: + volume = float(numbers[0]) + + # 单位转换 + if 'ml' in amount or 'milliliter' in amount: + return volume + elif 'l' in amount and 'ml' not in amount: + return volume * 1000 + elif 'μl' in amount or 'microliter' in amount: + return volume / 1000 + else: + return volume + + return 0.0 class CleanProtocol(BaseModel): @@ -49,17 +119,96 @@ class SeparateProtocol(BaseModel): class EvaporateProtocol(BaseModel): - vessel: str - pressure: float - temp: float - time: float - stir_speed: float + # === 核心参数(必需) === + vessel: str = Field(..., description="蒸发容器名称") + + # === 所有其他参数都改为可选,添加默认值 === + pressure: float = Field(0.1, description="真空度 (bar),默认0.1 bar") + temp: float = Field(60.0, description="加热温度 (°C),默认60°C") + time: float = Field(180.0, description="蒸发时间 (秒),默认1800s (30分钟)") + stir_speed: float = Field(100.0, description="旋转速度 (RPM),默认100 RPM") + + # === 新版XDL兼容参数(可选) === + solvent: str = Field("", description="溶剂名称(用于识别蒸发的溶剂类型)") + + def model_post_init(self, __context): + """后处理:智能参数处理和兼容性调整""" + + # 参数范围验证和修正 + if self.pressure <= 0 or self.pressure > 1.0: + logger.warning(f"真空度 {self.pressure} bar 超出范围,修正为 0.1 bar") + self.pressure = 0.1 + + if self.temp < 10.0 or self.temp > 200.0: + logger.warning(f"温度 {self.temp}°C 超出范围,修正为 60°C") + self.temp = 60.0 + + if self.time <= 0: + logger.warning(f"时间 {self.time}s 无效,修正为 1800s") + self.time = 1800.0 + + if self.stir_speed < 10.0 or self.stir_speed > 300.0: + logger.warning(f"旋转速度 {self.stir_speed} RPM 超出范围,修正为 100 RPM") + self.stir_speed = 100.0 + + # 根据溶剂类型调整参数 + if self.solvent: + self._adjust_parameters_by_solvent() + + def _adjust_parameters_by_solvent(self): + """根据溶剂类型调整蒸发参数""" + solvent_lower = self.solvent.lower() + + # 水系溶剂:较高温度,较低真空度 + if any(s in solvent_lower for s in ['water', 'aqueous', 'h2o']): + if self.temp == 60.0: # 如果是默认值,则调整 + self.temp = 80.0 + if self.pressure == 0.1: + self.pressure = 0.2 + + # 有机溶剂:根据沸点调整 + elif any(s in solvent_lower for s in ['ethanol', 'methanol', 'acetone']): + if self.temp == 60.0: + self.temp = 50.0 + if self.pressure == 0.1: + self.pressure = 0.05 + + # 高沸点溶剂:更高温度 + elif any(s in solvent_lower for s in ['dmso', 'dmi', 'toluene']): + if self.temp == 60.0: + self.temp = 100.0 + if self.pressure == 0.1: + self.pressure = 0.01 class EvacuateAndRefillProtocol(BaseModel): - vessel: str - gas: str - repeats: int + # === 必需参数 === + vessel: str = Field(..., description="目标容器名称") + gas: str = Field(..., description="气体名称") + + # 🔧 删除 repeats 参数,直接在代码中硬编码为 3 次 + + def model_post_init(self, __context): + """后处理:参数验证和兼容性调整""" + + # 验证气体名称 + if not self.gas.strip(): + logger.warning("气体名称为空,使用默认值 'nitrogen'") + self.gas = "nitrogen" + + # 标准化气体名称 + gas_aliases = { + 'n2': 'nitrogen', + 'ar': 'argon', + 'air': 'air', + 'o2': 'oxygen', + 'co2': 'carbon_dioxide', + 'h2': 'hydrogen' + } + + gas_lower = self.gas.lower().strip() + if gas_lower in gas_aliases: + self.gas = gas_aliases[gas_lower] class AGVTransferProtocol(BaseModel): @@ -88,42 +237,282 @@ class CentrifugeProtocol(BaseModel): temp: float class FilterProtocol(BaseModel): - vessel: str - filtrate_vessel: str - stir: bool - stir_speed: float - temp: float - continue_heatchill: bool - volume: float + # === 必需参数 === + vessel: str = Field(..., description="过滤容器名称") + + # === 可选参数 === + filtrate_vessel: str = Field("", description="滤液容器名称(可选,自动查找)") + + def model_post_init(self, __context): + """后处理:参数验证""" + # 验证容器名称 + if not self.vessel.strip(): + raise ValueError("vessel 参数不能为空") class HeatChillProtocol(BaseModel): - vessel: str - temp: float - time: float - stir: bool - stir_speed: float - purpose: str + # === 必需参数 === + vessel: str = Field(..., description="加热容器名称") + + # === 可选参数 - 温度相关 === + temp: float = Field(25.0, description="目标温度 (°C)") + temp_spec: str = Field("", description="温度规格(如 'room temperature', 'reflux')") + + # === 可选参数 - 时间相关 === + time: float = Field(300.0, description="加热时间 (秒)") + time_spec: str = Field("", description="时间规格(如 'overnight', '2 h')") + + # === 可选参数 - 其他XDL参数 === + pressure: str = Field("", description="压力规格(如 '1 mbar'),不做特殊处理") + reflux_solvent: str = Field("", description="回流溶剂名称,不做特殊处理") + + # === 可选参数 - 搅拌相关 === + stir: bool = Field(False, description="是否搅拌") + stir_speed: float = Field(300.0, description="搅拌速度 (RPM)") + purpose: str = Field("", description="操作目的") + + def model_post_init(self, __context): + """后处理:参数验证和解析""" + + # 验证必需参数 + if not self.vessel.strip(): + raise ValueError("vessel 参数不能为空") + + # 温度解析:优先使用 temp_spec,然后是 temp + if self.temp_spec: + self.temp = self._parse_temp_spec(self.temp_spec) + + # 时间解析:优先使用 time_spec,然后是 time + if self.time_spec: + self.time = self._parse_time_spec(self.time_spec) + + # 参数范围验证 + if self.temp < -50.0 or self.temp > 300.0: + logger.warning(f"温度 {self.temp}°C 超出范围,修正为 25°C") + self.temp = 25.0 + + if self.time < 0: + logger.warning(f"时间 {self.time}s 无效,修正为 300s") + self.time = 300.0 + + if self.stir_speed < 0 or self.stir_speed > 1500.0: + logger.warning(f"搅拌速度 {self.stir_speed} RPM 超出范围,修正为 300 RPM") + self.stir_speed = 300.0 + + def _parse_temp_spec(self, temp_spec: str) -> float: + """解析温度规格为具体温度""" + + temp_spec = temp_spec.strip().lower() + + # 特殊温度规格 + special_temps = { + "room temperature": 25.0, # 室温 + "reflux": 78.0, # 默认回流温度(乙醇沸点) + "ice bath": 0.0, # 冰浴 + "boiling": 100.0, # 沸腾 + "hot": 60.0, # 热 + "warm": 40.0, # 温热 + "cold": 10.0, # 冷 + } + + if temp_spec in special_temps: + return special_temps[temp_spec] + + # 解析带单位的温度(如 "256 °C") + import re + temp_pattern = r'(\d+(?:\.\d+)?)\s*°?[cf]?' + match = re.search(temp_pattern, temp_spec) + + if match: + return float(match.group(1)) + + return 25.0 # 默认室温 + + def _parse_time_spec(self, time_spec: str) -> float: + """解析时间规格为秒数""" + + time_spec = time_spec.strip().lower() + + # 特殊时间规格 + special_times = { + "overnight": 43200.0, # 12小时 + "several hours": 10800.0, # 3小时 + "few hours": 7200.0, # 2小时 + "long time": 3600.0, # 1小时 + "short time": 300.0, # 5分钟 + } + + if time_spec in special_times: + return special_times[time_spec] + + # 解析带单位的时间(如 "2 h") + import re + time_pattern = r'(\d+(?:\.\d+)?)\s*([a-zA-Z]+)' + match = re.search(time_pattern, time_spec) + + if match: + value = float(match.group(1)) + unit = match.group(2).lower() + + unit_multipliers = { + 's': 1.0, + 'sec': 1.0, + 'second': 1.0, + 'seconds': 1.0, + 'min': 60.0, + 'minute': 60.0, + 'minutes': 60.0, + 'h': 3600.0, + 'hr': 3600.0, + 'hour': 3600.0, + 'hours': 3600.0, + } + + multiplier = unit_multipliers.get(unit, 3600.0) # 默认按小时计算 + return value * multiplier + + return 300.0 # 默认5分钟 + class HeatChillStartProtocol(BaseModel): - vessel: str - temp: float - purpose: str + # === 必需参数 === + vessel: str = Field(..., description="加热容器名称") + + # === 可选参数 - 温度相关 === + temp: float = Field(25.0, description="目标温度 (°C)") + temp_spec: str = Field("", description="温度规格(如 'room temperature', 'reflux')") + + # === 可选参数 - 其他XDL参数 === + pressure: str = Field("", description="压力规格(如 '1 mbar'),不做特殊处理") + reflux_solvent: str = Field("", description="回流溶剂名称,不做特殊处理") + + # === 可选参数 - 搅拌相关 === + stir: bool = Field(False, description="是否搅拌") + stir_speed: float = Field(300.0, description="搅拌速度 (RPM)") + purpose: str = Field("", description="操作目的") + class HeatChillStopProtocol(BaseModel): - vessel: str + # === 必需参数 === + vessel: str = Field(..., description="加热容器名称") + class StirProtocol(BaseModel): - stir_time: float - stir_speed: float - settling_time: float + # === 必需参数 === + vessel: str = Field(..., description="搅拌容器名称") + + # === 可选参数 === + time: str = Field("5 min", description="搅拌时间(如 '0.5 h', '30 min')") + event: str = Field("", description="事件标识(如 'A', 'B')") + time_spec: str = Field("", description="时间规格(如 'several minutes', 'overnight')") + + def model_post_init(self, __context): + """后处理:参数验证和时间解析""" + + # 验证必需参数 + if not self.vessel.strip(): + raise ValueError("vessel 参数不能为空") + + # 优先使用 time_spec,然后是 time + if self.time_spec: + self.time = self.time_spec + + # 时间解析和验证 + if self.time: + try: + # 解析时间字符串为秒数 + parsed_time = self._parse_time_string(self.time) + if parsed_time <= 0: + logger.warning(f"时间 '{self.time}' 解析结果无效,使用默认值 300s") + self.time = "5 min" + except Exception as e: + logger.warning(f"时间 '{self.time}' 解析失败: {e},使用默认值 300s") + self.time = "5 min" + + def _parse_time_string(self, time_str: str) -> float: + """解析时间字符串为秒数""" + import re + + time_str = time_str.strip().lower() + + # 特殊时间规格 + special_times = { + "several minutes": 300.0, # 5分钟 + "few minutes": 180.0, # 3分钟 + "overnight": 43200.0, # 12小时 + "room temperature": 300.0, # 默认5分钟 + } + + if time_str in special_times: + return special_times[time_str] + + # 正则表达式匹配数字和单位 + pattern = r'(\d+\.?\d*)\s*([a-zA-Z]+)' + match = re.match(pattern, time_str) + + if not match: + return 300.0 # 默认5分钟 + + value = float(match.group(1)) + unit = match.group(2).lower() + + # 时间单位转换 + unit_multipliers = { + 's': 1.0, + 'sec': 1.0, + 'second': 1.0, + 'seconds': 1.0, + 'min': 60.0, + 'minute': 60.0, + 'minutes': 60.0, + 'h': 3600.0, + 'hr': 3600.0, + 'hour': 3600.0, + 'hours': 3600.0, + 'd': 86400.0, + 'day': 86400.0, + 'days': 86400.0, + } + + multiplier = unit_multipliers.get(unit, 60.0) # 默认按分钟计算 + return value * multiplier + + def get_time_in_seconds(self) -> float: + """获取时间(秒)""" + return self._parse_time_string(self.time) class StartStirProtocol(BaseModel): - vessel: str - stir_speed: float - purpose: str + # === 必需参数 === + vessel: str = Field(..., description="搅拌容器名称") + + # === 可选参数,添加默认值 === + stir_speed: float = Field(200.0, description="搅拌速度 (RPM),默认200 RPM") + purpose: str = Field("", description="搅拌目的(可选)") + + def model_post_init(self, __context): + """后处理:参数验证和修正""" + + # 验证必需参数 + if not self.vessel.strip(): + raise ValueError("vessel 参数不能为空") + + # 修正参数范围 + if self.stir_speed < 10.0: + logger.warning(f"搅拌速度 {self.stir_speed} RPM 过低,修正为 100 RPM") + self.stir_speed = 100.0 + elif self.stir_speed > 1500.0: + logger.warning(f"搅拌速度 {self.stir_speed} RPM 过高,修正为 1000 RPM") + self.stir_speed = 1000.0 class StopStirProtocol(BaseModel): - vessel: str + # === 必需参数 === + vessel: str = Field(..., description="搅拌容器名称") + + def model_post_init(self, __context): + """后处理:参数验证""" + + # 验证必需参数 + if not self.vessel.strip(): + raise ValueError("vessel 参数不能为空") class TransferProtocol(BaseModel): from_vessel: str @@ -168,16 +557,52 @@ class RunColumnProtocol(BaseModel): column: str class WashSolidProtocol(BaseModel): - vessel: str - solvent: str - volume: float - filtrate_vessel: str = "" - temp: float = 25.0 - stir: bool = False - stir_speed: float = 0.0 - time: float = 0.0 - repeats: int = 1 - + # === 必需参数 === + vessel: str = Field(..., description="装有固体的容器名称") + solvent: str = Field(..., description="清洗溶剂名称") + volume: float = Field(..., description="清洗溶剂体积 (mL)") + + # === 可选参数,添加默认值 === + filtrate_vessel: str = Field("", description="滤液收集容器(可选,自动查找)") + temp: float = Field(25.0, description="清洗温度 (°C),默认25°C") + stir: bool = Field(False, description="是否搅拌,默认False") + stir_speed: float = Field(0.0, description="搅拌速度 (RPM),默认0") + time: float = Field(0.0, description="清洗时间 (秒),默认0") + repeats: int = Field(1, description="重复次数,默认1") + + def model_post_init(self, __context): + """后处理:参数验证和修正""" + + # 验证必需参数 + if not self.vessel.strip(): + raise ValueError("vessel 参数不能为空") + + if not self.solvent.strip(): + raise ValueError("solvent 参数不能为空") + + if self.volume <= 0: + raise ValueError("volume 必须大于0") + + # 修正参数范围 + if self.temp < 0 or self.temp > 200: + logger.warning(f"温度 {self.temp}°C 超出范围,修正为 25°C") + self.temp = 25.0 + + if self.stir_speed < 0 or self.stir_speed > 500: + logger.warning(f"搅拌速度 {self.stir_speed} RPM 超出范围,修正为 0") + self.stir_speed = 0.0 + + if self.time < 0: + logger.warning(f"时间 {self.time}s 无效,修正为 0") + self.time = 0.0 + + if self.repeats < 1: + logger.warning(f"重复次数 {self.repeats} 无效,修正为 1") + self.repeats = 1 + elif self.repeats > 10: + logger.warning(f"重复次数 {self.repeats} 过多,修正为 10") + self.repeats = 10 + class AdjustPHProtocol(BaseModel): vessel: str = Field(..., description="目标容器") ph_value: float = Field(..., description="目标pH值") # 改为 ph_value @@ -207,7 +632,8 @@ __all__ = [ "Point3D", "PumpTransferProtocol", "CleanProtocol", "SeparateProtocol", "EvaporateProtocol", "EvacuateAndRefillProtocol", "AGVTransferProtocol", "CentrifugeProtocol", "AddProtocol", "FilterProtocol", - "HeatChillProtocol", "HeatChillStartProtocol", "HeatChillStopProtocol", + "HeatChillProtocol", + "HeatChillStartProtocol", "HeatChillStopProtocol", "StirProtocol", "StartStirProtocol", "StopStirProtocol", "TransferProtocol", "CleanVesselProtocol", "DissolveProtocol", "FilterThroughProtocol", "RunColumnProtocol", "WashSolidProtocol", diff --git a/unilabos/registry/devices/mock_devices.yaml b/unilabos/registry/devices/mock_devices.yaml index 5bfe5d7..461fc73 100644 --- a/unilabos/registry/devices/mock_devices.yaml +++ b/unilabos/registry/devices/mock_devices.yaml @@ -539,11 +539,15 @@ mock_heater: time: time vessel: vessel goal_default: + pressure: '' purpose: '' + reflux_solvent: '' stir: false stir_speed: 0.0 temp: 0.0 + temp_spec: '' time: 0.0 + time_spec: '' vessel: '' handles: [] result: @@ -561,22 +565,34 @@ mock_heater: type: object goal: properties: + pressure: + type: string purpose: type: string + reflux_solvent: + type: string stir: type: boolean stir_speed: type: number temp: type: number + temp_spec: + type: string time: type: number + time_spec: + type: string vessel: type: string required: - vessel - temp - time + - temp_spec + - time_spec + - pressure + - reflux_solvent - stir - stir_speed - purpose @@ -584,13 +600,16 @@ mock_heater: type: object result: properties: + message: + type: string return_info: type: string success: type: boolean required: - - return_info - success + - message + - return_info title: HeatChill_Result type: object required: @@ -836,13 +855,18 @@ mock_pump: volume: volume goal_default: amount: '' + event: '' + flowrate: 0.0 from_vessel: '' + rate_spec: '' rinsing_repeats: 0 rinsing_solvent: '' rinsing_volume: 0.0 solid: false + through: '' time: 0.0 to_vessel: '' + transfer_flowrate: 0.0 viscous: false volume: 0.0 handles: [] @@ -898,8 +922,14 @@ mock_pump: properties: amount: type: string + event: + type: string + flowrate: + type: number from_vessel: type: string + rate_spec: + type: string rinsing_repeats: maximum: 2147483647 minimum: -2147483648 @@ -910,10 +940,14 @@ mock_pump: type: number solid: type: boolean + through: + type: string time: type: number to_vessel: type: string + transfer_flowrate: + type: number viscous: type: boolean volume: @@ -929,6 +963,11 @@ mock_pump: - rinsing_volume - rinsing_repeats - solid + - flowrate + - transfer_flowrate + - rate_spec + - event + - through title: PumpTransfer_Goal type: object result: @@ -1519,6 +1558,7 @@ mock_separator: goal_default: from_vessel: '' product_phase: '' + product_vessel: '' purpose: '' repeats: 0 separation_vessel: '' @@ -1529,7 +1569,10 @@ mock_separator: stir_time: 0.0 through: '' to_vessel: '' + vessel: '' + volume: '' waste_phase_to_vessel: '' + waste_vessel: '' handles: [] result: success: success @@ -1585,6 +1628,8 @@ mock_separator: type: string product_phase: type: string + product_vessel: + type: string purpose: type: string repeats: @@ -1607,8 +1652,14 @@ mock_separator: type: string to_vessel: type: string + vessel: + type: string + volume: + type: string waste_phase_to_vessel: type: string + waste_vessel: + type: string required: - purpose - product_phase @@ -1623,17 +1674,24 @@ mock_separator: - stir_time - stir_speed - settling_time + - vessel + - volume + - product_vessel + - waste_vessel title: Separate_Goal type: object result: properties: + message: + type: string return_info: type: string success: type: boolean required: - - return_info - success + - message + - return_info title: Separate_Result type: object required: @@ -2410,9 +2468,13 @@ mock_stirrer_new: stir_speed: stir_speed stir_time: stir_time goal_default: + event: '' settling_time: 0.0 stir_speed: 0.0 stir_time: 0.0 + time: '' + time_spec: '' + vessel: '' handles: [] result: success: success @@ -2429,13 +2491,25 @@ mock_stirrer_new: type: object goal: properties: + event: + type: string settling_time: type: number stir_speed: type: number stir_time: type: number + time: + type: string + time_spec: + type: string + vessel: + type: string required: + - vessel + - time + - event + - time_spec - stir_time - stir_speed - settling_time @@ -2443,13 +2517,16 @@ mock_stirrer_new: type: object result: properties: + message: + type: string return_info: type: string success: type: boolean required: - - return_info - success + - message + - return_info title: Stir_Result type: object required: diff --git a/unilabos/registry/devices/organic_miscellaneous.yaml b/unilabos/registry/devices/organic_miscellaneous.yaml index aca63df..3ac61fc 100644 --- a/unilabos/registry/devices/organic_miscellaneous.yaml +++ b/unilabos/registry/devices/organic_miscellaneous.yaml @@ -242,9 +242,13 @@ separator.homemade: stir_speed: stir_speed stir_time: stir_time, goal_default: + event: '' settling_time: 0.0 stir_speed: 0.0 stir_time: 0.0 + time: '' + time_spec: '' + vessel: '' handles: [] result: success: success @@ -261,13 +265,25 @@ separator.homemade: type: object goal: properties: + event: + type: string settling_time: type: number stir_speed: type: number stir_time: type: number + time: + type: string + time_spec: + type: string + vessel: + type: string required: + - vessel + - time + - event + - time_spec - stir_time - stir_speed - settling_time @@ -275,13 +291,16 @@ separator.homemade: type: object result: properties: + message: + type: string return_info: type: string success: type: boolean required: - - return_info - success + - message + - return_info title: Stir_Result type: object required: diff --git a/unilabos/registry/devices/temperature.yaml b/unilabos/registry/devices/temperature.yaml index 2da45fd..fe4ad5b 100644 --- a/unilabos/registry/devices/temperature.yaml +++ b/unilabos/registry/devices/temperature.yaml @@ -259,11 +259,15 @@ heaterstirrer.dalong: time: time vessel: vessel goal_default: + pressure: '' purpose: '' + reflux_solvent: '' stir: false stir_speed: 0.0 temp: 0.0 + temp_spec: '' time: 0.0 + time_spec: '' vessel: '' handles: [] result: @@ -281,22 +285,34 @@ heaterstirrer.dalong: type: object goal: properties: + pressure: + type: string purpose: type: string + reflux_solvent: + type: string stir: type: boolean stir_speed: type: number temp: type: number + temp_spec: + type: string time: type: number + time_spec: + type: string vessel: type: string required: - vessel - temp - time + - temp_spec + - time_spec + - pressure + - reflux_solvent - stir - stir_speed - purpose @@ -304,13 +320,16 @@ heaterstirrer.dalong: type: object result: properties: + message: + type: string return_info: type: string success: type: boolean required: - - return_info - success + - message + - return_info title: HeatChill_Result type: object required: diff --git a/unilabos/registry/devices/virtual_device.yaml b/unilabos/registry/devices/virtual_device.yaml index d8f8f19..0a263b4 100644 --- a/unilabos/registry/devices/virtual_device.yaml +++ b/unilabos/registry/devices/virtual_device.yaml @@ -248,6 +248,12 @@ virtual_column: goal_default: column: '' from_vessel: '' + pct1: '' + pct2: '' + ratio: '' + rf: '' + solvent1: '' + solvent2: '' to_vessel: '' handles: [] result: @@ -274,12 +280,30 @@ virtual_column: type: string from_vessel: type: string + pct1: + type: string + pct2: + type: string + ratio: + type: string + rf: + type: string + solvent1: + type: string + solvent2: + type: string to_vessel: type: string required: - from_vessel - to_vessel - column + - rf + - pct1 + - pct2 + - solvent1 + - solvent2 + - ratio title: RunColumn_Goal type: object result: @@ -861,11 +885,15 @@ virtual_heatchill: time: time vessel: vessel goal_default: + pressure: '' purpose: '' + reflux_solvent: '' stir: false stir_speed: 0.0 temp: 0.0 + temp_spec: '' time: 0.0 + time_spec: '' vessel: '' handles: [] result: @@ -883,22 +911,34 @@ virtual_heatchill: type: object goal: properties: + pressure: + type: string purpose: type: string + reflux_solvent: + type: string stir: type: boolean stir_speed: type: number temp: type: number + temp_spec: + type: string time: type: number + time_spec: + type: string vessel: type: string required: - vessel - temp - time + - temp_spec + - time_spec + - pressure + - reflux_solvent - stir - stir_speed - purpose @@ -906,13 +946,16 @@ virtual_heatchill: type: object result: properties: + message: + type: string return_info: type: string success: type: boolean required: - - return_info - success + - message + - return_info title: HeatChill_Result type: object required: @@ -1630,13 +1673,18 @@ virtual_pump: volume: volume goal_default: amount: '' + event: '' + flowrate: 0.0 from_vessel: '' + rate_spec: '' rinsing_repeats: 0 rinsing_solvent: '' rinsing_volume: 0.0 solid: false + through: '' time: 0.0 to_vessel: '' + transfer_flowrate: 0.0 viscous: false volume: 0.0 handles: [] @@ -1692,8 +1740,14 @@ virtual_pump: properties: amount: type: string + event: + type: string + flowrate: + type: number from_vessel: type: string + rate_spec: + type: string rinsing_repeats: maximum: 2147483647 minimum: -2147483648 @@ -1704,10 +1758,14 @@ virtual_pump: type: number solid: type: boolean + through: + type: string time: type: number to_vessel: type: string + transfer_flowrate: + type: number viscous: type: boolean volume: @@ -1723,6 +1781,11 @@ virtual_pump: - rinsing_volume - rinsing_repeats - solid + - flowrate + - transfer_flowrate + - rate_spec + - event + - through title: PumpTransfer_Goal type: object result: @@ -1853,10 +1916,8 @@ virtual_rotavap: type: UniLabJsonCommandAsync evaporate: feedback: - current_temp: current_temp - evaporated_volume: evaporated_volume - progress: progress status: status + current_device: current_device goal: pressure: pressure stir_speed: stir_speed @@ -1865,6 +1926,7 @@ virtual_rotavap: vessel: vessel goal_default: pressure: 0.0 + solvent: '' stir_speed: 0.0 temp: 0.0 time: 0.0 @@ -1923,6 +1985,8 @@ virtual_rotavap: properties: pressure: type: number + solvent: + type: string stir_speed: type: number temp: @@ -1937,6 +2001,7 @@ virtual_rotavap: - temp - time - stir_speed + - solvent title: Evaporate_Goal type: object result: @@ -2107,6 +2172,7 @@ virtual_separator: goal_default: from_vessel: '' product_phase: '' + product_vessel: '' purpose: '' repeats: 0 separation_vessel: '' @@ -2117,7 +2183,10 @@ virtual_separator: stir_time: 0.0 through: '' to_vessel: '' + vessel: '' + volume: '' waste_phase_to_vessel: '' + waste_vessel: '' handles: [] result: message: message @@ -2174,6 +2243,8 @@ virtual_separator: type: string product_phase: type: string + product_vessel: + type: string purpose: type: string repeats: @@ -2196,8 +2267,14 @@ virtual_separator: type: string to_vessel: type: string + vessel: + type: string + volume: + type: string waste_phase_to_vessel: type: string + waste_vessel: + type: string required: - purpose - product_phase @@ -2212,17 +2289,24 @@ virtual_separator: - stir_time - stir_speed - settling_time + - vessel + - volume + - product_vessel + - waste_vessel title: Separate_Goal type: object result: properties: + message: + type: string return_info: type: string success: type: boolean required: - - return_info - success + - message + - return_info title: Separate_Result type: object required: @@ -2381,6 +2465,26 @@ virtual_solenoid_valve: title: is_closed参数 type: object type: UniLabJsonCommand + auto-open: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: open的参数schema + properties: + feedback: {} + goal: + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: open参数 + type: object + type: UniLabJsonCommandAsync auto-reset: feedback: {} goal: {} @@ -2401,6 +2505,53 @@ virtual_solenoid_valve: title: reset参数 type: object type: UniLabJsonCommandAsync + auto-set_state: + feedback: {} + goal: {} + goal_default: + command: null + handles: [] + result: {} + schema: + description: set_state的参数schema + properties: + feedback: {} + goal: + properties: + command: + type: string + required: + - command + type: object + result: {} + required: + - goal + title: set_state参数 + type: object + type: UniLabJsonCommandAsync + auto-set_valve_position: + feedback: {} + goal: {} + goal_default: + command: null + handles: [] + result: {} + schema: + description: set_valve_position的参数schema + properties: + feedback: {} + goal: + properties: + command: + type: string + required: [] + type: object + result: {} + required: + - goal + title: set_valve_position参数 + type: object + type: UniLabJsonCommandAsync auto-toggle: feedback: {} goal: {} @@ -2431,111 +2582,86 @@ virtual_solenoid_valve: result: success: success schema: - description: '' + description: ROS Action SendCmd 的 JSON Schema properties: feedback: - properties: - status: - type: string - required: - - status - title: SendCmd_Feedback + properties: {} + required: [] + title: EmptyIn_Feedback type: object goal: - properties: - command: - type: string - required: - - command - title: SendCmd_Goal + properties: {} + required: [] + title: EmptyIn_Goal type: object result: properties: return_info: type: string - success: - type: boolean required: - return_info - - success - title: SendCmd_Result + title: EmptyIn_Result type: object required: - goal - title: SendCmd + title: EmptyIn type: object - type: SendCmd + type: EmptyIn open: feedback: {} - goal: - command: OPEN - goal_default: - command: '' + goal: {} + goal_default: {} handles: [] - result: - success: success + result: {} schema: - description: '' + description: ROS Action SendCmd 的 JSON Schema properties: feedback: - properties: - status: - type: string - required: - - status - title: SendCmd_Feedback + properties: {} + required: [] + title: EmptyIn_Feedback type: object goal: - properties: - command: - type: string - required: - - command - title: SendCmd_Goal + properties: {} + required: [] + title: EmptyIn_Goal type: object result: properties: return_info: type: string - success: - type: boolean required: - return_info - - success - title: SendCmd_Result + title: EmptyIn_Result type: object required: - goal - title: SendCmd + title: EmptyIn type: object - type: SendCmd - set_state: + type: EmptyIn + set_status: feedback: {} goal: - command: command + string: string goal_default: - command: '' + string: '' handles: [] - result: - success: success + result: {} schema: - description: '' + description: ROS Action SendCmd 的 JSON Schema properties: feedback: - properties: - status: - type: string - required: - - status - title: SendCmd_Feedback + properties: {} + required: [] + title: StrSingleInput_Feedback type: object goal: properties: - command: + string: type: string required: - - command - title: SendCmd_Goal + - string + title: StrSingleInput_Goal type: object result: properties: @@ -2546,13 +2672,13 @@ virtual_solenoid_valve: required: - return_info - success - title: SendCmd_Result + title: StrSingleInput_Result type: object required: - goal - title: SendCmd + title: StrSingleInput type: object - type: SendCmd + type: StrSingleInput set_valve_position: feedback: {} goal: @@ -2562,15 +2688,14 @@ virtual_solenoid_valve: handles: [] result: success: success + message: message + valve_position: valve_position schema: description: '' properties: feedback: - properties: - status: - type: string - required: - - status + properties: {} + required: [] title: SendCmd_Feedback type: object goal: @@ -2583,13 +2708,15 @@ virtual_solenoid_valve: type: object result: properties: - return_info: - type: string success: type: boolean + message: + type: string + valve_position: + type: string required: - - return_info - success + - message title: SendCmd_Result type: object required: @@ -2652,7 +2779,6 @@ virtual_solenoid_valve: - valve_position - state type: object - version: 0.0.1 virtual_stirrer: class: action_value_mappings: @@ -2768,9 +2894,13 @@ virtual_stirrer: stir_speed: stir_speed stir_time: stir_time goal_default: + event: '' settling_time: 0.0 stir_speed: 0.0 stir_time: 0.0 + time: '' + time_spec: '' + vessel: '' handles: [] result: success: success @@ -2787,13 +2917,25 @@ virtual_stirrer: type: object goal: properties: + event: + type: string settling_time: type: number stir_speed: type: number stir_time: type: number + time: + type: string + time_spec: + type: string + vessel: + type: string required: + - vessel + - time + - event + - time_spec - stir_time - stir_speed - settling_time @@ -2801,13 +2943,16 @@ virtual_stirrer: type: object result: properties: + message: + type: string return_info: type: string success: type: boolean required: - - return_info - success + - message + - return_info title: Stir_Result type: object required: diff --git a/unilabos/registry/devices/work_station.yaml b/unilabos/registry/devices/work_station.yaml index 91e4c4f..91ea9bd 100644 --- a/unilabos/registry/devices/work_station.yaml +++ b/unilabos/registry/devices/work_station.yaml @@ -54,9 +54,10 @@ workstation: handles: [] result: {} schema: - description: '' + description: ROS Action AGVTransfer 的 JSON Schema properties: feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -65,6 +66,7 @@ workstation: title: AGVTransfer_Feedback type: object goal: + description: Action 目标 - 从客户端发送到服务器 properties: from_repo: properties: @@ -224,6 +226,7 @@ workstation: title: AGVTransfer_Goal type: object result: + description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -254,8 +257,13 @@ workstation: volume: volume goal_default: amount: '' + equiv: '' + event: '' mass: 0.0 + mol: '' purpose: '' + rate_spec: '' + ratio: '' reagent: '' stir: false stir_speed: 0.0 @@ -283,9 +291,10 @@ workstation: label: Vessel result: {} schema: - description: '' + description: ROS Action Add 的 JSON Schema properties: feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_status: type: string @@ -297,13 +306,24 @@ workstation: title: Add_Feedback type: object goal: + description: Action 目标 - 从客户端发送到服务器 properties: amount: type: string + equiv: + type: string + event: + type: string mass: type: number + mol: + type: string purpose: type: string + rate_spec: + type: string + ratio: + type: string reagent: type: string stir: @@ -329,9 +349,15 @@ workstation: - stir_speed - viscous - purpose + - event + - mol + - rate_spec + - equiv + - ratio title: Add_Goal type: object result: + description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -380,9 +406,10 @@ workstation: label: Vessel result: {} schema: - description: '' + description: ROS Action AdjustPH 的 JSON Schema properties: feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -394,6 +421,7 @@ workstation: title: AdjustPH_Feedback type: object goal: + description: Action 目标 - 从客户端发送到服务器 properties: ph_value: type: number @@ -408,6 +436,7 @@ workstation: title: AdjustPH_Goal type: object result: + description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -453,9 +482,10 @@ workstation: label: Vessel result: {} schema: - description: '' + description: ROS Action Centrifuge 的 JSON Schema properties: feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_speed: type: number @@ -473,6 +503,7 @@ workstation: title: Centrifuge_Feedback type: object goal: + description: Action 目标 - 从客户端发送到服务器 properties: speed: type: number @@ -490,6 +521,7 @@ workstation: title: Centrifuge_Goal type: object result: + description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -542,9 +574,10 @@ workstation: label: Vessel result: {} schema: - description: '' + description: ROS Action Clean 的 JSON Schema properties: feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -588,6 +621,7 @@ workstation: title: Clean_Feedback type: object goal: + description: Action 目标 - 从客户端发送到服务器 properties: repeats: maximum: 2147483647 @@ -610,6 +644,7 @@ workstation: title: Clean_Goal type: object result: + description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -659,9 +694,10 @@ workstation: label: Vessel result: {} schema: - description: '' + description: ROS Action CleanVessel 的 JSON Schema properties: feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -673,6 +709,7 @@ workstation: title: CleanVessel_Feedback type: object goal: + description: Action 目标 - 从客户端发送到服务器 properties: repeats: maximum: 2147483647 @@ -695,6 +732,7 @@ workstation: title: CleanVessel_Goal type: object result: + description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -725,6 +763,9 @@ workstation: volume: volume goal_default: amount: '' + mass: '' + mol: '' + reagent: '' solvent: '' stir_speed: 0.0 temp: 0.0 @@ -751,9 +792,10 @@ workstation: label: Vessel result: {} schema: - description: '' + description: ROS Action Dissolve 的 JSON Schema properties: feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -765,9 +807,16 @@ workstation: title: Dissolve_Feedback type: object goal: + description: Action 目标 - 从客户端发送到服务器 properties: amount: type: string + mass: + type: string + mol: + type: string + reagent: + type: string solvent: type: string stir_speed: @@ -788,9 +837,13 @@ workstation: - temp - time - stir_speed + - mass + - mol + - reagent title: Dissolve_Goal type: object result: + description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -832,9 +885,10 @@ workstation: label: Vessel result: {} schema: - description: '' + description: ROS Action Dry 的 JSON Schema properties: feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -846,6 +900,7 @@ workstation: title: Dry_Feedback type: object goal: + description: Action 目标 - 从客户端发送到服务器 properties: compound: type: string @@ -857,6 +912,7 @@ workstation: title: Dry_Goal type: object result: + description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -879,11 +935,9 @@ workstation: feedback: {} goal: gas: gas - repeats: repeats vessel: vessel goal_default: gas: '' - repeats: 0 vessel: '' handles: input: @@ -900,9 +954,10 @@ workstation: label: Vessel result: {} schema: - description: '' + description: ROS Action EvacuateAndRefill 的 JSON Schema properties: feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -946,22 +1001,19 @@ workstation: title: EvacuateAndRefill_Feedback type: object goal: + description: Action 目标 - 从客户端发送到服务器 properties: gas: type: string - repeats: - maximum: 2147483647 - minimum: -2147483648 - type: integer vessel: type: string required: - vessel - gas - - repeats title: EvacuateAndRefill_Goal type: object result: + description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -981,12 +1033,14 @@ workstation: feedback: {} goal: pressure: pressure + solvent: solvent stir_speed: stir_speed temp: temp time: time vessel: vessel goal_default: pressure: 0.0 + solvent: '' stir_speed: 0.0 temp: 0.0 time: 0.0 @@ -996,19 +1050,20 @@ workstation: - data_key: vessel data_source: handle data_type: resource - handler_key: Vessel - label: Vessel + handler_key: vessel + label: Evaporation Vessel output: - data_key: vessel - data_source: executor + data_source: handle data_type: resource - handler_key: VesselOut - label: Vessel + handler_key: vessel_out + label: Evaporation Vessel result: {} schema: - description: '' + description: ROS Action Evaporate 的 JSON Schema properties: feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -1052,9 +1107,12 @@ workstation: title: Evaporate_Feedback type: object goal: + description: Action 目标 - 从客户端发送到服务器 properties: pressure: type: number + solvent: + type: string stir_speed: type: number temp: @@ -1069,9 +1127,11 @@ workstation: - temp - time - stir_speed + - solvent title: Evaporate_Goal type: object result: + description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1112,7 +1172,7 @@ workstation: data_type: resource handler_key: Vessel label: Vessel - - data_key: vessel + - data_key: filtrate_vessel data_source: handle data_type: resource handler_key: filtrate_vessel @@ -1123,16 +1183,17 @@ workstation: data_type: resource handler_key: VesselOut label: Vessel - - data_key: vessel + - data_key: filtrate_vessel data_source: executor data_type: resource handler_key: filtrate_out label: Filtrate Vessel result: {} schema: - description: '' + description: ROS Action Filter 的 JSON Schema properties: feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_status: type: string @@ -1150,6 +1211,7 @@ workstation: title: Filter_Feedback type: object goal: + description: Action 目标 - 从客户端发送到服务器 properties: continue_heatchill: type: boolean @@ -1176,6 +1238,7 @@ workstation: title: Filter_Goal type: object result: + description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -1242,9 +1305,10 @@ workstation: label: To Vessel result: {} schema: - description: '' + description: ROS Action FilterThrough 的 JSON Schema properties: feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -1256,6 +1320,7 @@ workstation: title: FilterThrough_Feedback type: object goal: + description: Action 目标 - 从客户端发送到服务器 properties: eluting_repeats: maximum: 2147483647 @@ -1284,6 +1349,7 @@ workstation: title: FilterThrough_Goal type: object result: + description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -1305,18 +1371,26 @@ workstation: HeatChillProtocol: feedback: {} goal: + pressure: pressure purpose: purpose + reflux_solvent: reflux_solvent stir: stir stir_speed: stir_speed temp: temp + temp_spec: temp_spec time: time + time_spec: time_spec vessel: vessel goal_default: + pressure: '' purpose: '' + reflux_solvent: '' stir: false stir_speed: 0.0 temp: 0.0 + temp_spec: '' time: 0.0 + time_spec: '' vessel: '' handles: input: @@ -1333,9 +1407,10 @@ workstation: label: Vessel result: {} schema: - description: '' + description: ROS Action HeatChill 的 JSON Schema properties: feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -1344,37 +1419,54 @@ workstation: title: HeatChill_Feedback type: object goal: + description: Action 目标 - 从客户端发送到服务器 properties: + pressure: + type: string purpose: type: string + reflux_solvent: + type: string stir: type: boolean stir_speed: type: number temp: type: number + temp_spec: + type: string time: type: number + time_spec: + type: string vessel: type: string required: - vessel - temp - time + - temp_spec + - time_spec + - pressure + - reflux_solvent - stir - stir_speed - purpose title: HeatChill_Goal type: object result: + description: Action 结果 - 完成后从服务器发送到客户端 properties: + message: + type: string return_info: type: string success: type: boolean required: - - return_info - success + - message + - return_info title: HeatChill_Result type: object required: @@ -1407,9 +1499,10 @@ workstation: label: Vessel result: {} schema: - description: '' + description: ROS Action HeatChillStart 的 JSON Schema properties: feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -1418,6 +1511,7 @@ workstation: title: HeatChillStart_Feedback type: object goal: + description: Action 目标 - 从客户端发送到服务器 properties: purpose: type: string @@ -1432,6 +1526,7 @@ workstation: title: HeatChillStart_Goal type: object result: + description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1468,9 +1563,10 @@ workstation: label: Vessel result: {} schema: - description: '' + description: ROS Action HeatChillStop 的 JSON Schema properties: feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -1479,6 +1575,7 @@ workstation: title: HeatChillStop_Feedback type: object goal: + description: Action 目标 - 从客户端发送到服务器 properties: vessel: type: string @@ -1487,6 +1584,7 @@ workstation: title: HeatChillStop_Goal type: object result: + description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1527,9 +1625,10 @@ workstation: label: Vessel result: {} schema: - description: '' + description: ROS Action Hydrogenate 的 JSON Schema properties: feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -1541,6 +1640,7 @@ workstation: title: Hydrogenate_Feedback type: object goal: + description: Action 目标 - 从客户端发送到服务器 properties: temp: type: string @@ -1555,6 +1655,7 @@ workstation: title: Hydrogenate_Goal type: object result: + description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -1577,24 +1678,34 @@ workstation: feedback: {} goal: amount: amount + event: event + flowrate: flowrate from_vessel: from_vessel + rate_spec: rate_spec rinsing_repeats: rinsing_repeats rinsing_solvent: rinsing_solvent rinsing_volume: rinsing_volume solid: solid + through: through time: time to_vessel: to_vessel + transfer_flowrate: transfer_flowrate viscous: viscous volume: volume goal_default: amount: '' + event: '' + flowrate: 0.0 from_vessel: '' + rate_spec: '' rinsing_repeats: 0 rinsing_solvent: '' rinsing_volume: 0.0 solid: false + through: '' time: 0.0 to_vessel: '' + transfer_flowrate: 0.0 viscous: false volume: 0.0 handles: @@ -1627,9 +1738,10 @@ workstation: label: To Vessel result: {} schema: - description: '' + description: ROS Action PumpTransfer 的 JSON Schema properties: feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -1673,11 +1785,18 @@ workstation: title: PumpTransfer_Feedback type: object goal: + description: Action 目标 - 从客户端发送到服务器 properties: amount: type: string + event: + type: string + flowrate: + type: number from_vessel: type: string + rate_spec: + type: string rinsing_repeats: maximum: 2147483647 minimum: -2147483648 @@ -1688,10 +1807,14 @@ workstation: type: number solid: type: boolean + through: + type: string time: type: number to_vessel: type: string + transfer_flowrate: + type: number viscous: type: boolean volume: @@ -1707,9 +1830,15 @@ workstation: - rinsing_volume - rinsing_repeats - solid + - flowrate + - transfer_flowrate + - rate_spec + - event + - through title: PumpTransfer_Goal type: object result: + description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1746,12 +1875,12 @@ workstation: data_type: resource handler_key: Vessel label: Vessel - - data_key: solvent + - data_key: solvent1 data_source: handle data_type: resource handler_key: solvent1 label: Solvent 1 - - data_key: solvent + - data_key: solvent2 data_source: handle data_type: resource handler_key: solvent2 @@ -1764,9 +1893,10 @@ workstation: label: Vessel result: {} schema: - description: '' + description: ROS Action Recrystallize 的 JSON Schema properties: feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -1778,6 +1908,7 @@ workstation: title: Recrystallize_Feedback type: object goal: + description: Action 目标 - 从客户端发送到服务器 properties: ratio: type: string @@ -1798,6 +1929,7 @@ workstation: title: Recrystallize_Goal type: object result: + description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -1832,9 +1964,10 @@ workstation: output: [] result: {} schema: - description: '' + description: ROS Action ResetHandling 的 JSON Schema properties: feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -1846,6 +1979,7 @@ workstation: title: ResetHandling_Feedback type: object goal: + description: Action 目标 - 从客户端发送到服务器 properties: solvent: type: string @@ -1854,6 +1988,7 @@ workstation: title: ResetHandling_Goal type: object result: + description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -1881,6 +2016,12 @@ workstation: goal_default: column: '' from_vessel: '' + pct1: '' + pct2: '' + ratio: '' + rf: '' + solvent1: '' + solvent2: '' to_vessel: '' handles: input: @@ -1907,9 +2048,10 @@ workstation: label: To Vessel result: {} schema: - description: '' + description: ROS Action RunColumn 的 JSON Schema properties: feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -1921,20 +2063,40 @@ workstation: title: RunColumn_Feedback type: object goal: + description: Action 目标 - 从客户端发送到服务器 properties: column: type: string from_vessel: type: string + pct1: + type: string + pct2: + type: string + ratio: + type: string + rf: + type: string + solvent1: + type: string + solvent2: + type: string to_vessel: type: string required: - from_vessel - to_vessel - column + - rf + - pct1 + - pct2 + - solvent1 + - solvent2 + - ratio title: RunColumn_Goal type: object result: + description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -1972,6 +2134,7 @@ workstation: goal_default: from_vessel: '' product_phase: '' + product_vessel: '' purpose: '' repeats: 0 separation_vessel: '' @@ -1982,7 +2145,10 @@ workstation: stir_time: 0.0 through: '' to_vessel: '' + vessel: '' + volume: '' waste_phase_to_vessel: '' + waste_vessel: '' handles: input: - data_key: vessel @@ -2013,9 +2179,10 @@ workstation: label: To Vessel result: {} schema: - description: '' + description: ROS Action Separate 的 JSON Schema properties: feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -2059,11 +2226,14 @@ workstation: title: Separate_Feedback type: object goal: + description: Action 目标 - 从客户端发送到服务器 properties: from_vessel: type: string product_phase: type: string + product_vessel: + type: string purpose: type: string repeats: @@ -2086,8 +2256,14 @@ workstation: type: string to_vessel: type: string + vessel: + type: string + volume: + type: string waste_phase_to_vessel: type: string + waste_vessel: + type: string required: - purpose - product_phase @@ -2102,17 +2278,25 @@ workstation: - stir_time - stir_speed - settling_time + - vessel + - volume + - product_vessel + - waste_vessel title: Separate_Goal type: object result: + description: Action 结果 - 完成后从服务器发送到客户端 properties: + message: + type: string return_info: type: string success: type: boolean required: - - return_info - success + - message + - return_info title: Separate_Result type: object required: @@ -2145,9 +2329,10 @@ workstation: label: Vessel result: {} schema: - description: '' + description: ROS Action StartStir 的 JSON Schema properties: feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_speed: type: number @@ -2162,6 +2347,7 @@ workstation: title: StartStir_Feedback type: object goal: + description: Action 目标 - 从客户端发送到服务器 properties: purpose: type: string @@ -2176,6 +2362,7 @@ workstation: title: StartStir_Goal type: object result: + description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -2197,13 +2384,21 @@ workstation: StirProtocol: feedback: {} goal: + event: event settling_time: settling_time stir_speed: stir_speed stir_time: stir_time + time: time + time_spec: time_spec + vessel: vessel goal_default: + event: '' settling_time: 0.0 stir_speed: 0.0 stir_time: 0.0 + time: '' + time_spec: '' + vessel: '' handles: input: - data_key: vessel @@ -2219,9 +2414,10 @@ workstation: label: Vessel result: {} schema: - description: '' + description: ROS Action Stir 的 JSON Schema properties: feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -2230,28 +2426,45 @@ workstation: title: Stir_Feedback type: object goal: + description: Action 目标 - 从客户端发送到服务器 properties: + event: + type: string settling_time: type: number stir_speed: type: number stir_time: type: number + time: + type: string + time_spec: + type: string + vessel: + type: string required: + - vessel + - time + - event + - time_spec - stir_time - stir_speed - settling_time title: Stir_Goal type: object result: + description: Action 结果 - 完成后从服务器发送到客户端 properties: + message: + type: string return_info: type: string success: type: boolean required: - - return_info - success + - message + - return_info title: Stir_Result type: object required: @@ -2280,9 +2493,10 @@ workstation: label: Vessel result: {} schema: - description: '' + description: ROS Action StopStir 的 JSON Schema properties: feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_status: type: string @@ -2294,6 +2508,7 @@ workstation: title: StopStir_Feedback type: object goal: + description: Action 目标 - 从客户端发送到服务器 properties: vessel: type: string @@ -2302,6 +2517,7 @@ workstation: title: StopStir_Goal type: object result: + description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -2374,9 +2590,10 @@ workstation: label: To Vessel result: {} schema: - description: '' + description: ROS Action Transfer 的 JSON Schema properties: feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_status: type: string @@ -2391,6 +2608,7 @@ workstation: title: Transfer_Feedback type: object goal: + description: Action 目标 - 从客户端发送到服务器 properties: amount: type: string @@ -2428,6 +2646,7 @@ workstation: title: Transfer_Goal type: object result: + description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -2480,8 +2699,8 @@ workstation: data_type: resource handler_key: solvent label: Solvent - - data_key: vessel - data_source: executor + - data_key: filtrate_vessel + data_source: handle data_type: resource handler_key: filtrate_vessel label: Filtrate Vessel @@ -2491,16 +2710,17 @@ workstation: data_type: resource handler_key: VesselOut label: Vessel Out - - data_key: vessel + - data_key: filtrate_vessel data_source: executor data_type: resource handler_key: filtrate_vessel_out label: Filtrate Vessel result: {} schema: - description: '' + description: ROS Action WashSolid 的 JSON Schema properties: feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -2512,6 +2732,7 @@ workstation: title: WashSolid_Feedback type: object goal: + description: Action 目标 - 从客户端发送到服务器 properties: filtrate_vessel: type: string @@ -2546,6 +2767,7 @@ workstation: title: WashSolid_Goal type: object result: + description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -2679,4 +2901,3 @@ workstation: properties: {} required: [] type: object - version: 0.0.1 diff --git a/unilabos/ros/nodes/presets/protocol_node.py b/unilabos/ros/nodes/presets/protocol_node.py index d2eab27..5c8ffbd 100644 --- a/unilabos/ros/nodes/presets/protocol_node.py +++ b/unilabos/ros/nodes/presets/protocol_node.py @@ -211,7 +211,7 @@ class ROS2ProtocolNode(BaseROS2DeviceNode): # 逐步执行工作流 step_results = [] for i, action in enumerate(protocol_steps): - self.get_logger().info(f"Running step {i + 1}: {action}") + # self.get_logger().info(f"Running step {i + 1}: {action}") if isinstance(action, dict): # 如果是单个动作,直接执行 if action["action_name"] == "wait": diff --git a/unilabos_msgs/CMakeLists.txt b/unilabos_msgs/CMakeLists.txt index 7e8a146..b2c1bc7 100644 --- a/unilabos_msgs/CMakeLists.txt +++ b/unilabos_msgs/CMakeLists.txt @@ -41,6 +41,7 @@ set(action_files "action/WashSolid.action" "action/Filter.action" "action/Add.action" + "action/AddSolid.action" "action/Centrifuge.action" "action/Crystallize.action" "action/Purge.action" diff --git a/unilabos_msgs/action/Add.action b/unilabos_msgs/action/Add.action index de06c6a..021199a 100644 --- a/unilabos_msgs/action/Add.action +++ b/unilabos_msgs/action/Add.action @@ -1,14 +1,19 @@ # Goal - 添加试剂的目标参数 -string vessel # 目标容器 -string reagent # 试剂名称 -float64 volume # 体积 (可选) -float64 mass # 质量 (可选) -string amount # 数量描述 (可选) -float64 time # 添加时间 (可选) -bool stir # 是否搅拌 -float64 stir_speed # 搅拌速度 (可选) -bool viscous # 是否为粘性液体 -string purpose # 添加目的 (可选) +string vessel # 目标容器(必需) +string reagent # 试剂名称(必需) +string volume # 体积(如 "2.7 mL",可选) +string mass # 质量(如 "19.3 g",可选) +string amount # 数量描述(可选) +string time # 添加时间(如 "1 h", "20 min",可选) +bool stir # 是否搅拌(可选) +float64 stir_speed # 搅拌速度 (RPM,可选) +bool viscous # 是否为粘性液体(可选) +string purpose # 添加目的(可选) +string event # 事件标识(如 'A', 'B',可选) +string mol # 摩尔数(如 '0.28 mol', '16.2 mmol',可选) +string rate_spec # 速率规格(如 'portionwise', 'dropwise',可选) +string equiv # 当量(如 '1.1',可选) +string ratio # 比例(如 '1:1',可选) --- # Result - 操作结果 bool success # 操作是否成功 diff --git a/unilabos_msgs/action/AddSolid.action b/unilabos_msgs/action/AddSolid.action new file mode 100644 index 0000000..8812441 --- /dev/null +++ b/unilabos_msgs/action/AddSolid.action @@ -0,0 +1,15 @@ +# Goal - 固体加样操作的目标参数 +string vessel # 目标容器(必需) +string reagent # 试剂名称(必需) +string mass # 质量字符串(如 "2.9 g",可选) +string mol # 摩尔数字符串(如 "0.12 mol",可选) +string purpose # 添加目的(可选) +--- +# Result - 操作结果 +bool success # 操作是否成功 +string message # 结果消息 +string return_info # 返回信息 +--- +# Feedback - 实时反馈 +string current_status # 当前状态描述 +float64 progress # 进度百分比 (0-100) \ No newline at end of file diff --git a/unilabos_msgs/action/Dissolve.action b/unilabos_msgs/action/Dissolve.action index 6b860d0..f070a61 100644 --- a/unilabos_msgs/action/Dissolve.action +++ b/unilabos_msgs/action/Dissolve.action @@ -1,14 +1,21 @@ -string vessel # 装有要溶解物质的容器名称 -string solvent # 用于溶解物质的溶剂名称 -float64 volume # 溶剂的体积,可选参数 -string amount # 要溶解物质的量,可选参数 -float64 temp # 溶解时的温度,可选参数 -float64 time # 溶解的时间,可选参数 -float64 stir_speed # 搅拌速度,可选参数 +# Goal - 溶解操作的目标参数 +string vessel # 装有要溶解物质的容器名称(必需) +string solvent # 用于溶解物质的溶剂名称(可选) +string volume # 溶剂的体积(如 "10 mL",可选) +string amount # 要溶解物质的量描述(可选) +string temp # 溶解时的温度(如 "60 °C", "room temperature",可选) +string time # 溶解的时间(如 "30 min", "1 h",可选) +float64 stir_speed # 搅拌速度(可选,默认300 RPM) +string mass # 物质质量(如 "2.9 g",可选) +string mol # 物质摩尔数(如 "0.12 mol",可选) +string reagent # 试剂名称(可选) +string event # 事件标识(如 'A', 'B',可选) --- +# Result - 操作结果 bool success # 操作是否成功 string message # 结果消息 string return_info --- +# Feedback - 实时反馈 string status # 当前状态描述 float64 progress # 进度百分比 (0-100) \ No newline at end of file diff --git a/unilabos_msgs/action/EvacuateAndRefill.action b/unilabos_msgs/action/EvacuateAndRefill.action index 22ffc65..461cb28 100644 --- a/unilabos_msgs/action/EvacuateAndRefill.action +++ b/unilabos_msgs/action/EvacuateAndRefill.action @@ -1,7 +1,6 @@ -# Organic +# Organic Synthesis Station EvacuateAndRefill Action string vessel string gas -int32 repeats --- string return_info bool success diff --git a/unilabos_msgs/action/Evaporate.action b/unilabos_msgs/action/Evaporate.action index 45887f2..9cecb62 100644 --- a/unilabos_msgs/action/Evaporate.action +++ b/unilabos_msgs/action/Evaporate.action @@ -1,9 +1,10 @@ -# Organic -string vessel -float64 pressure -float64 temp -float64 time -float64 stir_speed +# Organic Synthesis Station Evaporate Action +string vessel # 目标容器 +float64 pressure # 真空度 +float64 temp # 温度 +string time # 🔧 蒸发时间(支持带单位,如"3 min","180",默认秒) +float64 stir_speed # 旋转速度 +string solvent # 溶剂名称 --- string return_info bool success diff --git a/unilabos_msgs/action/Filter.action b/unilabos_msgs/action/Filter.action index 564df1a..42a8913 100644 --- a/unilabos_msgs/action/Filter.action +++ b/unilabos_msgs/action/Filter.action @@ -1,11 +1,11 @@ # Goal - 过滤操作的目标参数 -string vessel # 过滤容器 -string filtrate_vessel # 滤液容器 (可选) -bool stir # 是否搅拌 -float64 stir_speed # 搅拌速度 (可选) -float64 temp # 温度 (可选,摄氏度) -bool continue_heatchill # 是否继续加热冷却 -float64 volume # 过滤体积 (可选) +string vessel # 过滤容器(必需) +string filtrate_vessel # 滤液容器(可选) +bool stir # 是否搅拌(默认false) +float64 stir_speed # 搅拌速度(默认0.0) +float64 temp # 温度(默认25.0) +bool continue_heatchill # 是否继续加热冷却(默认false) +float64 volume # 过滤体积(默认0.0) --- # Result - 操作结果 bool success # 操作是否成功 diff --git a/unilabos_msgs/action/HeatChill.action b/unilabos_msgs/action/HeatChill.action index 87ebf52..1e7025e 100644 --- a/unilabos_msgs/action/HeatChill.action +++ b/unilabos_msgs/action/HeatChill.action @@ -1,12 +1,19 @@ -# Organic -string vessel -float64 temp -float64 time -bool stir -float64 stir_speed -string purpose +# Goal - 加热冷却操作的目标参数 +string vessel # 加热容器名称(必需) +float64 temp # 目标温度(可选,默认25.0) +string time # 🔧 加热时间(支持带单位,如"5 min","300",默认秒) +string temp_spec # 温度规格(可选) +string time_spec # 时间规格(可选) +string pressure # 压力规格(可选,不做特殊处理) +string reflux_solvent # 回流溶剂名称(可选,不做特殊处理) +bool stir # 是否搅拌(可选,默认false) +float64 stir_speed # 搅拌速度(可选,默认300.0) +string purpose # 操作目的(可选) --- +# Result - 操作结果 +bool success # 操作是否成功 +string message # 结果消息 string return_info -bool success --- -string status \ No newline at end of file +# Feedback - 实时反馈 +string status # 当前状态描述 \ No newline at end of file diff --git a/unilabos_msgs/action/PumpTransfer.action b/unilabos_msgs/action/PumpTransfer.action index 69d22b6..c8ca445 100644 --- a/unilabos_msgs/action/PumpTransfer.action +++ b/unilabos_msgs/action/PumpTransfer.action @@ -9,6 +9,11 @@ string rinsing_solvent float64 rinsing_volume int32 rinsing_repeats bool solid +float64 flowrate +float64 transfer_flowrate +string rate_spec +string event +string through --- string return_info bool success diff --git a/unilabos_msgs/action/Recrystallize.action b/unilabos_msgs/action/Recrystallize.action index fe727e8..2ae42bf 100644 --- a/unilabos_msgs/action/Recrystallize.action +++ b/unilabos_msgs/action/Recrystallize.action @@ -1,9 +1,9 @@ # Request -string ratio -string solvent1 -string solvent2 -string vessel -float64 volume +string ratio # 溶剂比例(如"1:1","3:7") +string solvent1 # 第一种溶剂 +string solvent2 # 第二种溶剂 +string vessel # 目标容器 +string volume # 🔧 总体积(支持带单位,如"100 mL","50",默认mL) --- # Result bool success diff --git a/unilabos_msgs/action/RunColumn.action b/unilabos_msgs/action/RunColumn.action index 3fba948..1f8e9ba 100644 --- a/unilabos_msgs/action/RunColumn.action +++ b/unilabos_msgs/action/RunColumn.action @@ -1,10 +1,19 @@ -string from_vessel # 源容器的名称,即样品起始所在的容器 -string to_vessel # 目标容器的名称,分离后的样品要到达的容器 -string column # 所使用的柱子的名称 +# Goal - 柱层析操作的目标参数 +string from_vessel # 源容器的名称,即样品起始所在的容器(必需) +string to_vessel # 目标容器的名称,分离后的样品要到达的容器(必需) +string column # 所使用的柱子的名称(必需) +string rf # Rf值(可选) +string pct1 # 第一种溶剂百分比(如 "40 %",可选) +string pct2 # 第二种溶剂百分比(如 "50 %",可选) +string solvent1 # 第一种溶剂名称(可选) +string solvent2 # 第二种溶剂名称(可选) +string ratio # 溶剂比例(如 "5:95",可选) --- +# Result - 操作结果 bool success # 操作是否成功 string message # 结果消息 string return_info --- +# Feedback - 实时反馈 string status # 当前状态描述 float64 progress # 进度百分比 (0-100) \ No newline at end of file diff --git a/unilabos_msgs/action/Separate.action b/unilabos_msgs/action/Separate.action index fe8976a..fc185b6 100644 --- a/unilabos_msgs/action/Separate.action +++ b/unilabos_msgs/action/Separate.action @@ -1,22 +1,27 @@ -# Organic -string purpose # 'wash' or 'extract'. 'wash' means that product phase will not be the added solvent phase, 'extract' means product phase will be the added solvent phase. If no solvent is added just use 'extract'. -string product_phase # 'top' or 'bottom'. Phase that product will be in. -string from_vessel #Contents of from_vessel are transferred to separation_vessel and separation is performed. -string separation_vessel # Vessel in which separation of phases will be carried out. -string to_vessel # Vessel to send product phase to. -string waste_phase_to_vessel # Optional. Vessel to send waste phase to. -string solvent # Optional. Solvent to add to separation vessel after contents of from_vessel has been transferred to create two phases. -float64 solvent_volume # Optional. Volume of solvent to add. -string through # Optional. Solid chemical to send product phase through on way to to_vessel, e.g. 'celite'. -int32 repeats # Optional. Number of separations to perform. -float64 stir_time # Optional. Time stir for after adding solvent, before separation of phases. -float64 stir_speed # Optional. Speed to stir at after adding solvent, before separation of phases. -float64 settling_time # Optional. Time +# Goal - 分离操作的目标参数 +string vessel # 分离容器名称(XDL参数,必需) +string purpose # 分离目的 ('wash', 'extract', 'separate',可选) +string product_phase # 产物相 ('top', 'bottom',可选) +string from_vessel # 源容器(可选) +string separation_vessel # 分离容器(与vessel同义,可选) +string to_vessel # 目标容器(可选) +string waste_phase_to_vessel # 废相目标容器(可选) +string product_vessel # 产物收集容器(XDL参数,可选) +string waste_vessel # 废液收集容器(XDL参数,可选) +string solvent # 溶剂名称(可选) +string solvent_volume # 溶剂体积(如 "200 mL",可选) +string volume # 体积规格(XDL参数,如 "?",可选) +string through # 通过材料(如 'celite',可选) +int32 repeats # 重复次数(可选,默认1) +float64 stir_time # 搅拌时间(可选,默认30秒) +float64 stir_speed # 搅拌速度(可选,默认300 RPM) +float64 settling_time # 沉降时间(可选,默认300秒) --- +# Result - 操作结果 +bool success # 操作是否成功 +string message # 结果消息 string return_info -bool success --- -string status -string current_device -builtin_interfaces/Duration time_spent -builtin_interfaces/Duration time_remaining +# Feedback - 实时反馈 +string status # 当前状态描述 +float64 progress # 进度百分比 (0-100) diff --git a/unilabos_msgs/action/Stir.action b/unilabos_msgs/action/Stir.action index 9542f9d..e3e5580 100644 --- a/unilabos_msgs/action/Stir.action +++ b/unilabos_msgs/action/Stir.action @@ -1,9 +1,16 @@ -# Organic -float64 stir_time -float64 stir_speed -float64 settling_time +# Goal - 搅拌操作的目标参数 +string vessel # 搅拌容器名称(必需) +string time # 🔧 搅拌时间(如 "0.5 h", "30 min", "300",默认秒) +string event # 事件标识(如 "A", "B") +string time_spec # 时间规格(如 "several minutes") +float64 stir_time # 解析后的搅拌时间(秒) +float64 stir_speed # 搅拌速度(默认200.0) +string settling_time # 🔧 沉降时间(支持带单位,默认秒) --- +# Result - 操作结果 +bool success # 操作是否成功 +string message # 结果消息 string return_info -bool success --- -string status \ No newline at end of file +# Feedback - 实时反馈 +string status # 当前状态描述 \ No newline at end of file diff --git a/unilabos_msgs/action/WashSolid.action b/unilabos_msgs/action/WashSolid.action index cb57e5c..281ca4c 100644 --- a/unilabos_msgs/action/WashSolid.action +++ b/unilabos_msgs/action/WashSolid.action @@ -1,16 +1,23 @@ -string vessel # 装有固体物质的容器名称 -string solvent # 用于清洗固体的溶剂名称 -float64 volume # 清洗溶剂的体积 -string filtrate_vessel # 滤液要收集到的容器名称,可选参数 -float64 temp # 清洗时的温度,可选参数 -bool stir # 是否在清洗过程中搅拌,默认为 False -float64 stir_speed # 搅拌速度,可选参数 -float64 time # 清洗的时间,可选参数 -int32 repeats # 清洗操作的重复次数,默认为 1 +# Goal - 固体清洗操作的目标参数 +string vessel # 装有固体的容器名称(必需) +string solvent # 清洗溶剂名称(必需) +string volume # 🔧 体积(支持数字和带单位的字符串,如"100 mL","?") +string filtrate_vessel # 滤液收集容器(可选,默认"") +float64 temp # 清洗温度(可选,默认25.0) +bool stir # 是否搅拌(可选,默认false) +float64 stir_speed # 搅拌速度(可选,默认0.0) +string time # 🔧 清洗时间(支持带单位,如"5 min","300 s",默认秒) +int32 repeats # 重复次数(与repeats_spec二选一) +string volume_spec # 体积规格(优先级高于volume) +string repeats_spec # 重复次数规格(优先级高于repeats) +string mass # 固体质量描述(可选) +string event # 事件标识符(可选) --- -bool success # 操作是否成功 -string message # 结果消息 +# Result - 操作结果 +bool success # 操作是否成功 +string message # 结果消息 string return_info --- -string status # 当前状态描述 -float64 progress # 进度百分比 (0-100) \ No newline at end of file +# Feedback - 实时反馈 +string status # 当前状态描述 +float64 progress # 进度百分比 (0-100) \ No newline at end of file From c5efa5aa26f08634a9730984d77d28c59ccf5df8 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Wed, 16 Jul 2025 11:16:26 +0800 Subject: [PATCH 43/96] =?UTF-8?q?=E4=BF=AE=E5=A4=8Daction=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E6=97=B6=E7=9A=84=E6=8A=A5=E9=94=99=EF=BC=8C=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E6=B3=A8=E5=86=8C=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- unilabos/registry/devices/mock_devices.yaml | 83 +----- .../devices/organic_miscellaneous.yaml | 21 +- unilabos/registry/devices/pump_and_valve.yaml | 2 +- unilabos/registry/devices/temperature.yaml | 21 +- unilabos/registry/devices/virtual_device.yaml | 245 ++++----------- unilabos/registry/devices/work_station.yaml | 280 +++--------------- unilabos/registry/registry.py | 3 +- 7 files changed, 99 insertions(+), 556 deletions(-) diff --git a/unilabos/registry/devices/mock_devices.yaml b/unilabos/registry/devices/mock_devices.yaml index 461fc73..5bfe5d7 100644 --- a/unilabos/registry/devices/mock_devices.yaml +++ b/unilabos/registry/devices/mock_devices.yaml @@ -539,15 +539,11 @@ mock_heater: time: time vessel: vessel goal_default: - pressure: '' purpose: '' - reflux_solvent: '' stir: false stir_speed: 0.0 temp: 0.0 - temp_spec: '' time: 0.0 - time_spec: '' vessel: '' handles: [] result: @@ -565,34 +561,22 @@ mock_heater: type: object goal: properties: - pressure: - type: string purpose: type: string - reflux_solvent: - type: string stir: type: boolean stir_speed: type: number temp: type: number - temp_spec: - type: string time: type: number - time_spec: - type: string vessel: type: string required: - vessel - temp - time - - temp_spec - - time_spec - - pressure - - reflux_solvent - stir - stir_speed - purpose @@ -600,16 +584,13 @@ mock_heater: type: object result: properties: - message: - type: string return_info: type: string success: type: boolean required: - - success - - message - return_info + - success title: HeatChill_Result type: object required: @@ -855,18 +836,13 @@ mock_pump: volume: volume goal_default: amount: '' - event: '' - flowrate: 0.0 from_vessel: '' - rate_spec: '' rinsing_repeats: 0 rinsing_solvent: '' rinsing_volume: 0.0 solid: false - through: '' time: 0.0 to_vessel: '' - transfer_flowrate: 0.0 viscous: false volume: 0.0 handles: [] @@ -922,14 +898,8 @@ mock_pump: properties: amount: type: string - event: - type: string - flowrate: - type: number from_vessel: type: string - rate_spec: - type: string rinsing_repeats: maximum: 2147483647 minimum: -2147483648 @@ -940,14 +910,10 @@ mock_pump: type: number solid: type: boolean - through: - type: string time: type: number to_vessel: type: string - transfer_flowrate: - type: number viscous: type: boolean volume: @@ -963,11 +929,6 @@ mock_pump: - rinsing_volume - rinsing_repeats - solid - - flowrate - - transfer_flowrate - - rate_spec - - event - - through title: PumpTransfer_Goal type: object result: @@ -1558,7 +1519,6 @@ mock_separator: goal_default: from_vessel: '' product_phase: '' - product_vessel: '' purpose: '' repeats: 0 separation_vessel: '' @@ -1569,10 +1529,7 @@ mock_separator: stir_time: 0.0 through: '' to_vessel: '' - vessel: '' - volume: '' waste_phase_to_vessel: '' - waste_vessel: '' handles: [] result: success: success @@ -1628,8 +1585,6 @@ mock_separator: type: string product_phase: type: string - product_vessel: - type: string purpose: type: string repeats: @@ -1652,14 +1607,8 @@ mock_separator: type: string to_vessel: type: string - vessel: - type: string - volume: - type: string waste_phase_to_vessel: type: string - waste_vessel: - type: string required: - purpose - product_phase @@ -1674,24 +1623,17 @@ mock_separator: - stir_time - stir_speed - settling_time - - vessel - - volume - - product_vessel - - waste_vessel title: Separate_Goal type: object result: properties: - message: - type: string return_info: type: string success: type: boolean required: - - success - - message - return_info + - success title: Separate_Result type: object required: @@ -2468,13 +2410,9 @@ mock_stirrer_new: stir_speed: stir_speed stir_time: stir_time goal_default: - event: '' settling_time: 0.0 stir_speed: 0.0 stir_time: 0.0 - time: '' - time_spec: '' - vessel: '' handles: [] result: success: success @@ -2491,25 +2429,13 @@ mock_stirrer_new: type: object goal: properties: - event: - type: string settling_time: type: number stir_speed: type: number stir_time: type: number - time: - type: string - time_spec: - type: string - vessel: - type: string required: - - vessel - - time - - event - - time_spec - stir_time - stir_speed - settling_time @@ -2517,16 +2443,13 @@ mock_stirrer_new: type: object result: properties: - message: - type: string return_info: type: string success: type: boolean required: - - success - - message - return_info + - success title: Stir_Result type: object required: diff --git a/unilabos/registry/devices/organic_miscellaneous.yaml b/unilabos/registry/devices/organic_miscellaneous.yaml index 3ac61fc..aca63df 100644 --- a/unilabos/registry/devices/organic_miscellaneous.yaml +++ b/unilabos/registry/devices/organic_miscellaneous.yaml @@ -242,13 +242,9 @@ separator.homemade: stir_speed: stir_speed stir_time: stir_time, goal_default: - event: '' settling_time: 0.0 stir_speed: 0.0 stir_time: 0.0 - time: '' - time_spec: '' - vessel: '' handles: [] result: success: success @@ -265,25 +261,13 @@ separator.homemade: type: object goal: properties: - event: - type: string settling_time: type: number stir_speed: type: number stir_time: type: number - time: - type: string - time_spec: - type: string - vessel: - type: string required: - - vessel - - time - - event - - time_spec - stir_time - stir_speed - settling_time @@ -291,16 +275,13 @@ separator.homemade: type: object result: properties: - message: - type: string return_info: type: string success: type: boolean required: - - success - - message - return_info + - success title: Stir_Result type: object required: diff --git a/unilabos/registry/devices/pump_and_valve.yaml b/unilabos/registry/devices/pump_and_valve.yaml index 18fbd14..8d13551 100644 --- a/unilabos/registry/devices/pump_and_valve.yaml +++ b/unilabos/registry/devices/pump_and_valve.yaml @@ -68,7 +68,7 @@ solenoid_valve: handles: [] result: {} schema: - description: open的参数schema + description: '' properties: feedback: {} goal: diff --git a/unilabos/registry/devices/temperature.yaml b/unilabos/registry/devices/temperature.yaml index fe4ad5b..2da45fd 100644 --- a/unilabos/registry/devices/temperature.yaml +++ b/unilabos/registry/devices/temperature.yaml @@ -259,15 +259,11 @@ heaterstirrer.dalong: time: time vessel: vessel goal_default: - pressure: '' purpose: '' - reflux_solvent: '' stir: false stir_speed: 0.0 temp: 0.0 - temp_spec: '' time: 0.0 - time_spec: '' vessel: '' handles: [] result: @@ -285,34 +281,22 @@ heaterstirrer.dalong: type: object goal: properties: - pressure: - type: string purpose: type: string - reflux_solvent: - type: string stir: type: boolean stir_speed: type: number temp: type: number - temp_spec: - type: string time: type: number - time_spec: - type: string vessel: type: string required: - vessel - temp - time - - temp_spec - - time_spec - - pressure - - reflux_solvent - stir - stir_speed - purpose @@ -320,16 +304,13 @@ heaterstirrer.dalong: type: object result: properties: - message: - type: string return_info: type: string success: type: boolean required: - - success - - message - return_info + - success title: HeatChill_Result type: object required: diff --git a/unilabos/registry/devices/virtual_device.yaml b/unilabos/registry/devices/virtual_device.yaml index 0a263b4..2ad2c5b 100644 --- a/unilabos/registry/devices/virtual_device.yaml +++ b/unilabos/registry/devices/virtual_device.yaml @@ -248,12 +248,6 @@ virtual_column: goal_default: column: '' from_vessel: '' - pct1: '' - pct2: '' - ratio: '' - rf: '' - solvent1: '' - solvent2: '' to_vessel: '' handles: [] result: @@ -280,30 +274,12 @@ virtual_column: type: string from_vessel: type: string - pct1: - type: string - pct2: - type: string - ratio: - type: string - rf: - type: string - solvent1: - type: string - solvent2: - type: string to_vessel: type: string required: - from_vessel - to_vessel - column - - rf - - pct1 - - pct2 - - solvent1 - - solvent2 - - ratio title: RunColumn_Goal type: object result: @@ -331,7 +307,9 @@ virtual_column: column_length: float column_state: str current_flow_rate: float + current_phase: str current_status: str + final_volume: float max_flow_rate: float processed_volume: float progress: float @@ -375,8 +353,12 @@ virtual_column: type: string current_flow_rate: type: number + current_phase: + type: string current_status: type: string + final_volume: + type: number max_flow_rate: type: number processed_volume: @@ -395,6 +377,8 @@ virtual_column: - processed_volume - progress - current_status + - current_phase + - final_volume type: object version: 0.0.1 virtual_filter: @@ -885,15 +869,11 @@ virtual_heatchill: time: time vessel: vessel goal_default: - pressure: '' purpose: '' - reflux_solvent: '' stir: false stir_speed: 0.0 temp: 0.0 - temp_spec: '' time: 0.0 - time_spec: '' vessel: '' handles: [] result: @@ -911,34 +891,22 @@ virtual_heatchill: type: object goal: properties: - pressure: - type: string purpose: type: string - reflux_solvent: - type: string stir: type: boolean stir_speed: type: number temp: type: number - temp_spec: - type: string time: type: number - time_spec: - type: string vessel: type: string required: - vessel - temp - time - - temp_spec - - time_spec - - pressure - - reflux_solvent - stir - stir_speed - purpose @@ -946,16 +914,13 @@ virtual_heatchill: type: object result: properties: - message: - type: string return_info: type: string success: type: boolean required: - - success - - message - return_info + - success title: HeatChill_Result type: object required: @@ -1066,7 +1031,11 @@ virtual_heatchill: module: unilabos.devices.virtual.virtual_heatchill:VirtualHeatChill status_types: is_stirring: bool + max_stir_speed: float + max_temp: float + min_temp: float operation_mode: str + progress: float remaining_time: float status: str stir_speed: float @@ -1095,8 +1064,16 @@ virtual_heatchill: properties: is_stirring: type: boolean + max_stir_speed: + type: number + max_temp: + type: number + min_temp: + type: number operation_mode: type: string + progress: + type: number remaining_time: type: number status: @@ -1109,6 +1086,10 @@ virtual_heatchill: - is_stirring - stir_speed - remaining_time + - progress + - max_temp + - min_temp + - max_stir_speed type: object version: 0.0.1 virtual_multiway_valve: @@ -1209,7 +1190,7 @@ virtual_multiway_valve: handles: [] result: {} schema: - description: open的参数schema + description: '' properties: feedback: {} goal: @@ -1673,18 +1654,13 @@ virtual_pump: volume: volume goal_default: amount: '' - event: '' - flowrate: 0.0 from_vessel: '' - rate_spec: '' rinsing_repeats: 0 rinsing_solvent: '' rinsing_volume: 0.0 solid: false - through: '' time: 0.0 to_vessel: '' - transfer_flowrate: 0.0 viscous: false volume: 0.0 handles: [] @@ -1740,14 +1716,8 @@ virtual_pump: properties: amount: type: string - event: - type: string - flowrate: - type: number from_vessel: type: string - rate_spec: - type: string rinsing_repeats: maximum: 2147483647 minimum: -2147483648 @@ -1758,14 +1728,10 @@ virtual_pump: type: number solid: type: boolean - through: - type: string time: type: number to_vessel: type: string - transfer_flowrate: - type: number viscous: type: boolean volume: @@ -1781,11 +1747,6 @@ virtual_pump: - rinsing_volume - rinsing_repeats - solid - - flowrate - - transfer_flowrate - - rate_spec - - event - - through title: PumpTransfer_Goal type: object result: @@ -1916,8 +1877,8 @@ virtual_rotavap: type: UniLabJsonCommandAsync evaporate: feedback: - status: status current_device: current_device + status: status goal: pressure: pressure stir_speed: stir_speed @@ -1926,7 +1887,6 @@ virtual_rotavap: vessel: vessel goal_default: pressure: 0.0 - solvent: '' stir_speed: 0.0 temp: 0.0 time: 0.0 @@ -1985,8 +1945,6 @@ virtual_rotavap: properties: pressure: type: number - solvent: - type: string stir_speed: type: number temp: @@ -2001,7 +1959,6 @@ virtual_rotavap: - temp - time - stir_speed - - solvent title: Evaporate_Goal type: object result: @@ -2172,7 +2129,6 @@ virtual_separator: goal_default: from_vessel: '' product_phase: '' - product_vessel: '' purpose: '' repeats: 0 separation_vessel: '' @@ -2183,10 +2139,7 @@ virtual_separator: stir_time: 0.0 through: '' to_vessel: '' - vessel: '' - volume: '' waste_phase_to_vessel: '' - waste_vessel: '' handles: [] result: message: message @@ -2243,8 +2196,6 @@ virtual_separator: type: string product_phase: type: string - product_vessel: - type: string purpose: type: string repeats: @@ -2267,14 +2218,8 @@ virtual_separator: type: string to_vessel: type: string - vessel: - type: string - volume: - type: string waste_phase_to_vessel: type: string - waste_vessel: - type: string required: - purpose - product_phase @@ -2289,24 +2234,17 @@ virtual_separator: - stir_time - stir_speed - settling_time - - vessel - - volume - - product_vessel - - waste_vessel title: Separate_Goal type: object result: properties: - message: - type: string return_info: type: string success: type: boolean required: - - success - - message - return_info + - success title: Separate_Result type: object required: @@ -2465,26 +2403,6 @@ virtual_solenoid_valve: title: is_closed参数 type: object type: UniLabJsonCommand - auto-open: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: open的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: open参数 - type: object - type: UniLabJsonCommandAsync auto-reset: feedback: {} goal: {} @@ -2505,53 +2423,6 @@ virtual_solenoid_valve: title: reset参数 type: object type: UniLabJsonCommandAsync - auto-set_state: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: set_state的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: set_state参数 - type: object - type: UniLabJsonCommandAsync - auto-set_valve_position: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: set_valve_position的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: [] - type: object - result: {} - required: - - goal - title: set_valve_position参数 - type: object - type: UniLabJsonCommandAsync auto-toggle: feedback: {} goal: {} @@ -2576,13 +2447,12 @@ virtual_solenoid_valve: feedback: {} goal: command: CLOSED - goal_default: - command: '' + goal_default: {} handles: [] result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2614,7 +2484,7 @@ virtual_solenoid_valve: handles: [] result: {} schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2648,7 +2518,7 @@ virtual_solenoid_valve: handles: [] result: {} schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2687,15 +2557,18 @@ virtual_solenoid_valve: command: '' handles: [] result: - success: success message: message + success: success valve_position: valve_position schema: description: '' properties: feedback: - properties: {} - required: [] + properties: + status: + type: string + required: + - status title: SendCmd_Feedback type: object goal: @@ -2708,15 +2581,13 @@ virtual_solenoid_valve: type: object result: properties: + return_info: + type: string success: type: boolean - message: - type: string - valve_position: - type: string required: + - return_info - success - - message title: SendCmd_Result type: object required: @@ -2779,6 +2650,7 @@ virtual_solenoid_valve: - valve_position - state type: object + version: 0.0.1 virtual_stirrer: class: action_value_mappings: @@ -2894,13 +2766,9 @@ virtual_stirrer: stir_speed: stir_speed stir_time: stir_time goal_default: - event: '' settling_time: 0.0 stir_speed: 0.0 stir_time: 0.0 - time: '' - time_spec: '' - vessel: '' handles: [] result: success: success @@ -2917,25 +2785,13 @@ virtual_stirrer: type: object goal: properties: - event: - type: string settling_time: type: number stir_speed: type: number stir_time: type: number - time: - type: string - time_spec: - type: string - vessel: - type: string required: - - vessel - - time - - event - - time_spec - stir_time - stir_speed - settling_time @@ -2943,16 +2799,13 @@ virtual_stirrer: type: object result: properties: - message: - type: string return_info: type: string success: type: boolean required: - - success - - message - return_info + - success title: Stir_Result type: object required: @@ -3015,7 +2868,10 @@ virtual_stirrer: status_types: current_speed: float current_vessel: str + device_info: dict is_stirring: bool + max_speed: float + min_speed: float operation_mode: str remaining_time: float status: str @@ -3046,8 +2902,14 @@ virtual_stirrer: type: number current_vessel: type: string + device_info: + type: object is_stirring: type: boolean + max_speed: + type: number + min_speed: + type: number operation_mode: type: string remaining_time: @@ -3061,6 +2923,9 @@ virtual_stirrer: - current_speed - is_stirring - remaining_time + - max_speed + - min_speed + - device_info type: object version: 0.0.1 virtual_transfer_pump: diff --git a/unilabos/registry/devices/work_station.yaml b/unilabos/registry/devices/work_station.yaml index 91ea9bd..5e5279d 100644 --- a/unilabos/registry/devices/work_station.yaml +++ b/unilabos/registry/devices/work_station.yaml @@ -54,10 +54,9 @@ workstation: handles: [] result: {} schema: - description: ROS Action AGVTransfer 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -66,7 +65,6 @@ workstation: title: AGVTransfer_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: from_repo: properties: @@ -226,7 +224,6 @@ workstation: title: AGVTransfer_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -257,13 +254,8 @@ workstation: volume: volume goal_default: amount: '' - equiv: '' - event: '' mass: 0.0 - mol: '' purpose: '' - rate_spec: '' - ratio: '' reagent: '' stir: false stir_speed: 0.0 @@ -291,10 +283,9 @@ workstation: label: Vessel result: {} schema: - description: ROS Action Add 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_status: type: string @@ -306,24 +297,13 @@ workstation: title: Add_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: amount: type: string - equiv: - type: string - event: - type: string mass: type: number - mol: - type: string purpose: type: string - rate_spec: - type: string - ratio: - type: string reagent: type: string stir: @@ -349,15 +329,9 @@ workstation: - stir_speed - viscous - purpose - - event - - mol - - rate_spec - - equiv - - ratio title: Add_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -406,10 +380,9 @@ workstation: label: Vessel result: {} schema: - description: ROS Action AdjustPH 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -421,7 +394,6 @@ workstation: title: AdjustPH_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: ph_value: type: number @@ -436,7 +408,6 @@ workstation: title: AdjustPH_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -482,10 +453,9 @@ workstation: label: Vessel result: {} schema: - description: ROS Action Centrifuge 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_speed: type: number @@ -503,7 +473,6 @@ workstation: title: Centrifuge_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: speed: type: number @@ -521,7 +490,6 @@ workstation: title: Centrifuge_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -574,10 +542,9 @@ workstation: label: Vessel result: {} schema: - description: ROS Action Clean 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -621,7 +588,6 @@ workstation: title: Clean_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: repeats: maximum: 2147483647 @@ -644,7 +610,6 @@ workstation: title: Clean_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -694,10 +659,9 @@ workstation: label: Vessel result: {} schema: - description: ROS Action CleanVessel 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -709,7 +673,6 @@ workstation: title: CleanVessel_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: repeats: maximum: 2147483647 @@ -732,7 +695,6 @@ workstation: title: CleanVessel_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -763,9 +725,6 @@ workstation: volume: volume goal_default: amount: '' - mass: '' - mol: '' - reagent: '' solvent: '' stir_speed: 0.0 temp: 0.0 @@ -792,10 +751,9 @@ workstation: label: Vessel result: {} schema: - description: ROS Action Dissolve 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -807,16 +765,9 @@ workstation: title: Dissolve_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: amount: type: string - mass: - type: string - mol: - type: string - reagent: - type: string solvent: type: string stir_speed: @@ -837,13 +788,9 @@ workstation: - temp - time - stir_speed - - mass - - mol - - reagent title: Dissolve_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -885,10 +832,9 @@ workstation: label: Vessel result: {} schema: - description: ROS Action Dry 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -900,7 +846,6 @@ workstation: title: Dry_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: compound: type: string @@ -912,7 +857,6 @@ workstation: title: Dry_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -938,6 +882,7 @@ workstation: vessel: vessel goal_default: gas: '' + repeats: 0 vessel: '' handles: input: @@ -954,10 +899,9 @@ workstation: label: Vessel result: {} schema: - description: ROS Action EvacuateAndRefill 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -1001,19 +945,22 @@ workstation: title: EvacuateAndRefill_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: gas: type: string + repeats: + maximum: 2147483647 + minimum: -2147483648 + type: integer vessel: type: string required: - vessel - gas + - repeats title: EvacuateAndRefill_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1040,7 +987,6 @@ workstation: vessel: vessel goal_default: pressure: 0.0 - solvent: '' stir_speed: 0.0 temp: 0.0 time: 0.0 @@ -1060,10 +1006,9 @@ workstation: label: Evaporation Vessel result: {} schema: - description: ROS Action Evaporate 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -1107,12 +1052,9 @@ workstation: title: Evaporate_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: pressure: type: number - solvent: - type: string stir_speed: type: number temp: @@ -1127,11 +1069,9 @@ workstation: - temp - time - stir_speed - - solvent title: Evaporate_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1190,10 +1130,9 @@ workstation: label: Filtrate Vessel result: {} schema: - description: ROS Action Filter 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_status: type: string @@ -1211,7 +1150,6 @@ workstation: title: Filter_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: continue_heatchill: type: boolean @@ -1238,7 +1176,6 @@ workstation: title: Filter_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -1305,10 +1242,9 @@ workstation: label: To Vessel result: {} schema: - description: ROS Action FilterThrough 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -1320,7 +1256,6 @@ workstation: title: FilterThrough_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: eluting_repeats: maximum: 2147483647 @@ -1349,7 +1284,6 @@ workstation: title: FilterThrough_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -1382,15 +1316,11 @@ workstation: time_spec: time_spec vessel: vessel goal_default: - pressure: '' purpose: '' - reflux_solvent: '' stir: false stir_speed: 0.0 temp: 0.0 - temp_spec: '' time: 0.0 - time_spec: '' vessel: '' handles: input: @@ -1407,10 +1337,9 @@ workstation: label: Vessel result: {} schema: - description: ROS Action HeatChill 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -1419,54 +1348,37 @@ workstation: title: HeatChill_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: - pressure: - type: string purpose: type: string - reflux_solvent: - type: string stir: type: boolean stir_speed: type: number temp: type: number - temp_spec: - type: string time: type: number - time_spec: - type: string vessel: type: string required: - vessel - temp - time - - temp_spec - - time_spec - - pressure - - reflux_solvent - stir - stir_speed - purpose title: HeatChill_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: - message: - type: string return_info: type: string success: type: boolean required: - - success - - message - return_info + - success title: HeatChill_Result type: object required: @@ -1499,10 +1411,9 @@ workstation: label: Vessel result: {} schema: - description: ROS Action HeatChillStart 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -1511,7 +1422,6 @@ workstation: title: HeatChillStart_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: purpose: type: string @@ -1526,7 +1436,6 @@ workstation: title: HeatChillStart_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1563,10 +1472,9 @@ workstation: label: Vessel result: {} schema: - description: ROS Action HeatChillStop 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -1575,7 +1483,6 @@ workstation: title: HeatChillStop_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: vessel: type: string @@ -1584,7 +1491,6 @@ workstation: title: HeatChillStop_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1625,10 +1531,9 @@ workstation: label: Vessel result: {} schema: - description: ROS Action Hydrogenate 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -1640,7 +1545,6 @@ workstation: title: Hydrogenate_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: temp: type: string @@ -1655,7 +1559,6 @@ workstation: title: Hydrogenate_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -1694,18 +1597,13 @@ workstation: volume: volume goal_default: amount: '' - event: '' - flowrate: 0.0 from_vessel: '' - rate_spec: '' rinsing_repeats: 0 rinsing_solvent: '' rinsing_volume: 0.0 solid: false - through: '' time: 0.0 to_vessel: '' - transfer_flowrate: 0.0 viscous: false volume: 0.0 handles: @@ -1738,10 +1636,9 @@ workstation: label: To Vessel result: {} schema: - description: ROS Action PumpTransfer 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -1785,18 +1682,11 @@ workstation: title: PumpTransfer_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: amount: type: string - event: - type: string - flowrate: - type: number from_vessel: type: string - rate_spec: - type: string rinsing_repeats: maximum: 2147483647 minimum: -2147483648 @@ -1807,14 +1697,10 @@ workstation: type: number solid: type: boolean - through: - type: string time: type: number to_vessel: type: string - transfer_flowrate: - type: number viscous: type: boolean volume: @@ -1830,15 +1716,9 @@ workstation: - rinsing_volume - rinsing_repeats - solid - - flowrate - - transfer_flowrate - - rate_spec - - event - - through title: PumpTransfer_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1893,10 +1773,9 @@ workstation: label: Vessel result: {} schema: - description: ROS Action Recrystallize 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -1908,7 +1787,6 @@ workstation: title: Recrystallize_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: ratio: type: string @@ -1929,7 +1807,6 @@ workstation: title: Recrystallize_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -1964,10 +1841,9 @@ workstation: output: [] result: {} schema: - description: ROS Action ResetHandling 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -1979,7 +1855,6 @@ workstation: title: ResetHandling_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: solvent: type: string @@ -1988,7 +1863,6 @@ workstation: title: ResetHandling_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -2016,12 +1890,6 @@ workstation: goal_default: column: '' from_vessel: '' - pct1: '' - pct2: '' - ratio: '' - rf: '' - solvent1: '' - solvent2: '' to_vessel: '' handles: input: @@ -2048,10 +1916,9 @@ workstation: label: To Vessel result: {} schema: - description: ROS Action RunColumn 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -2063,40 +1930,20 @@ workstation: title: RunColumn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: column: type: string from_vessel: type: string - pct1: - type: string - pct2: - type: string - ratio: - type: string - rf: - type: string - solvent1: - type: string - solvent2: - type: string to_vessel: type: string required: - from_vessel - to_vessel - column - - rf - - pct1 - - pct2 - - solvent1 - - solvent2 - - ratio title: RunColumn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -2134,7 +1981,6 @@ workstation: goal_default: from_vessel: '' product_phase: '' - product_vessel: '' purpose: '' repeats: 0 separation_vessel: '' @@ -2145,10 +1991,7 @@ workstation: stir_time: 0.0 through: '' to_vessel: '' - vessel: '' - volume: '' waste_phase_to_vessel: '' - waste_vessel: '' handles: input: - data_key: vessel @@ -2179,10 +2022,9 @@ workstation: label: To Vessel result: {} schema: - description: ROS Action Separate 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -2226,14 +2068,11 @@ workstation: title: Separate_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: from_vessel: type: string product_phase: type: string - product_vessel: - type: string purpose: type: string repeats: @@ -2256,14 +2095,8 @@ workstation: type: string to_vessel: type: string - vessel: - type: string - volume: - type: string waste_phase_to_vessel: type: string - waste_vessel: - type: string required: - purpose - product_phase @@ -2278,25 +2111,17 @@ workstation: - stir_time - stir_speed - settling_time - - vessel - - volume - - product_vessel - - waste_vessel title: Separate_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: - message: - type: string return_info: type: string success: type: boolean required: - - success - - message - return_info + - success title: Separate_Result type: object required: @@ -2329,10 +2154,9 @@ workstation: label: Vessel result: {} schema: - description: ROS Action StartStir 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_speed: type: number @@ -2347,7 +2171,6 @@ workstation: title: StartStir_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: purpose: type: string @@ -2362,7 +2185,6 @@ workstation: title: StartStir_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -2392,13 +2214,9 @@ workstation: time_spec: time_spec vessel: vessel goal_default: - event: '' settling_time: 0.0 stir_speed: 0.0 stir_time: 0.0 - time: '' - time_spec: '' - vessel: '' handles: input: - data_key: vessel @@ -2414,10 +2232,9 @@ workstation: label: Vessel result: {} schema: - description: ROS Action Stir 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -2426,45 +2243,28 @@ workstation: title: Stir_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: - event: - type: string settling_time: type: number stir_speed: type: number stir_time: type: number - time: - type: string - time_spec: - type: string - vessel: - type: string required: - - vessel - - time - - event - - time_spec - stir_time - stir_speed - settling_time title: Stir_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: - message: - type: string return_info: type: string success: type: boolean required: - - success - - message - return_info + - success title: Stir_Result type: object required: @@ -2493,10 +2293,9 @@ workstation: label: Vessel result: {} schema: - description: ROS Action StopStir 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_status: type: string @@ -2508,7 +2307,6 @@ workstation: title: StopStir_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: vessel: type: string @@ -2517,7 +2315,6 @@ workstation: title: StopStir_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -2590,10 +2387,9 @@ workstation: label: To Vessel result: {} schema: - description: ROS Action Transfer 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_status: type: string @@ -2608,7 +2404,6 @@ workstation: title: Transfer_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: amount: type: string @@ -2646,7 +2441,6 @@ workstation: title: Transfer_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -2717,10 +2511,9 @@ workstation: label: Filtrate Vessel result: {} schema: - description: ROS Action WashSolid 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -2732,7 +2525,6 @@ workstation: title: WashSolid_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: filtrate_vessel: type: string @@ -2767,7 +2559,6 @@ workstation: title: WashSolid_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -2901,3 +2692,4 @@ workstation: properties: {} required: [] type: object + version: 0.0.1 diff --git a/unilabos/registry/registry.py b/unilabos/registry/registry.py index f496e0f..a62351c 100644 --- a/unilabos/registry/registry.py +++ b/unilabos/registry/registry.py @@ -438,7 +438,8 @@ class Registry: # 恢复原有的description信息(auto开头的不修改) for action_name, description in old_descriptions.items(): - device_config["class"]["action_value_mappings"][action_name]["schema"]["description"] = description + if action_name in device_config["class"]["action_value_mappings"]: # 有一些会被删除 + device_config["class"]["action_value_mappings"][action_name]["schema"]["description"] = description device_config["init_param_schema"] = {} device_config["init_param_schema"]["config"] = self._generate_unilab_json_command_schema( enhanced_info["init_params"], "__init__" From 23cf713a8055dade91caaecc4d8d2165ce70a28e Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Wed, 16 Jul 2025 12:52:35 +0800 Subject: [PATCH 44/96] Update prcxi.py --- .../liquid_handler_abstract.py | 307 +++++++++++++----- .../devices/liquid_handling/prcxi/prcxi.py | 59 +++- 2 files changed, 265 insertions(+), 101 deletions(-) diff --git a/unilabos/devices/liquid_handling/liquid_handler_abstract.py b/unilabos/devices/liquid_handling/liquid_handler_abstract.py index dc8757b..045f5a1 100644 --- a/unilabos/devices/liquid_handling/liquid_handler_abstract.py +++ b/unilabos/devices/liquid_handling/liquid_handler_abstract.py @@ -119,46 +119,114 @@ class LiquidHandlerAbstract(LiquidHandler): else: if len(asp_vols) != len(targets): raise ValueError(f"Length of `asp_vols` {len(asp_vols)} must match `targets` {len(targets)}.") - tip = next(self.current_tip) - await self.pick_up_tips(tip) + + # 首先应该对任务分组,然后每次1个/8个进行操作处理 + if len(use_channels) == 1: + tip = [] + for _ in range(len(use_channels)): + tip.extend(next(self.current_tip)) + await self.pick_up_tips(tip) - for _ in range(len(targets)): - await self.aspirate( - resources=reagent_sources, - vols=[asp_vols[_]], - use_channels=use_channels, - 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, - blow_out_air_volume=[blow_out_air_volume[0]] if blow_out_air_volume else None, - spread=spread, - ) - if delays is not None: - await self.custom_delay(seconds=delays[0]) - await self.dispense( - resources=[targets[_]], - vols=[dis_vols[_]], - use_channels=use_channels, - flow_rates=[flow_rates[1]] if flow_rates else None, - offsets=[offsets[1]] if offsets else None, - blow_out_air_volume=[blow_out_air_volume[1]] if blow_out_air_volume else None, - liquid_height=[liquid_height[1]] if liquid_height else None, - spread=spread, - ) - if delays is not None: - await self.custom_delay(seconds=delays[1]) - await self.mix( - targets=targets[_], - mix_time=mix_time, - 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, - ) - if delays is not None: - await self.custom_delay(seconds=delays[1]) - await self.touch_tip(targets[_]) - await self.discard_tips() + for _ in range(len(targets)): + await self.aspirate( + resources=reagent_sources, + vols=[asp_vols[_]], + use_channels=use_channels, + 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, + blow_out_air_volume=[blow_out_air_volume[0]] if blow_out_air_volume else None, + spread=spread, + ) + if delays is not None: + await self.custom_delay(seconds=delays[0]) + await self.dispense( + resources=[targets[_]], + vols=[dis_vols[_]], + use_channels=use_channels, + flow_rates=[flow_rates[1]] if flow_rates else None, + offsets=[offsets[1]] if offsets else None, + blow_out_air_volume=[blow_out_air_volume[1]] if blow_out_air_volume else None, + liquid_height=[liquid_height[1]] if liquid_height else None, + spread=spread, + ) + if delays is not None: + await self.custom_delay(seconds=delays[1]) + await self.mix( + targets=targets[_], + mix_time=mix_time, + 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, + ) + if delays is not None: + await self.custom_delay(seconds=delays[1]) + await self.touch_tip(targets[_]) + await self.discard_tips() + elif len(use_channels) == 8: + tip = [] + for _ in range(len(use_channels)): + tip.extend(next(self.current_tip)) + await self.pick_up_tips(tip) + + # 对于8个的情况,需要判断此时任务是不是能被8通道移液站来成功处理 + if len(targets) % 8 != 0: + raise ValueError(f"Length of `targets` {len(targets)} must be a multiple of 8 for 8-channel mode.") + + # 8个8个来取任务序列 + + for i in range(0, len(targets), 8): + # 取出8个任务 + current_targets = targets[i:i + 8] + current_reagent_sources = reagent_sources[i:i + 8] + current_asp_vols = asp_vols[i:i + 8] + current_dis_vols = dis_vols[i:i + 8] + current_asp_flow_rates = flow_rates[i:i + 8] if flow_rates else [None] * 8 + current_dis_flow_rates = flow_rates[i+8 :i + 16] if flow_rates else [None] * 8 + current_asp_offset = offsets[i:i + 8] if offsets else [None] * 8 + current_dis_offset = offsets[i+8 :i + 16] if offsets else [None] * 8 + current_asp_liquid_height = liquid_height[i:i + 8] if liquid_height else [None] * 8 + current_dis_liquid_height = liquid_height[i+8 :i + 16] if liquid_height else [None] * 8 + current_asp_blow_out_air_volume = blow_out_air_volume[i:i + 8] if blow_out_air_volume else [None] * 8 + current_dis_blow_out_air_volume = blow_out_air_volume[i+8 :i + 16] if blow_out_air_volume else [None] * 8 + + await self.aspirate( + resources=current_reagent_sources, + vols=current_asp_vols, + use_channels=use_channels, + flow_rates=current_asp_flow_rates, + offsets=current_asp_offset, + liquid_height=current_asp_liquid_height, + blow_out_air_volume=current_asp_blow_out_air_volume, + spread=spread, + ) + if delays is not None: + await self.custom_delay(seconds=delays[0]) + await self.dispense( + resources=current_targets, + vols=current_dis_vols, + use_channels=use_channels, + flow_rates=current_dis_flow_rates, + offsets=current_dis_offset, + liquid_height=current_dis_liquid_height, + blow_out_air_volume=current_dis_blow_out_air_volume, + spread=spread, + ) + if delays is not None: + await self.custom_delay(seconds=delays[1]) + + await self.mix( + targets=current_targets, + mix_time=mix_time, + 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, + ) + if delays is not None: + await self.custom_delay(seconds=delays[1]) + #await self.touch_tip(current_targets) except Exception as e: traceback.print_exc() @@ -208,56 +276,126 @@ class LiquidHandlerAbstract(LiquidHandler): """ try: - # ------------------------------------------------------------------ - # 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 - ): - tip = next(tip_iter) + if len(asp_vols) != len(targets): + raise ValueError(f"Length of `asp_vols` {len(asp_vols)} must match `targets` {len(targets)}.") + + # 首先应该对任务分组,然后每次1个/8个进行操作处理 + if len(use_channels) == 1: + tip = [] + for _ in range(len(use_channels)): + tip.extend(next(self.current_tip)) await self.pick_up_tips(tip) - # Aspirate from source - await self.aspirate( - resources=[src], - vols=[asp_vol], - use_channels=use_channels, - flow_rates=[asp_flow_rate], - offsets=offsets, - liquid_height=liquid_height, - blow_out_air_volume=blow_out_air_volume, - spread=spread, - ) - self.custom_delay(seconds=delays[0] if delays else 0) - # Dispense into target - await self.dispense( - resources=[tgt], - vols=[dis_vol], - use_channels=use_channels, - flow_rates=[dis_flow_rate], - offsets=offsets, - liquid_height=liquid_height, - blow_out_air_volume=blow_out_air_volume, - spread=spread, - ) - await self.mix( - targets=[tgt], - mix_time=mix_times[0] if mix_times else None, - mix_vol=mix_vol[0] if mix_vol else None, - mix_rate=mix_rate[0] if mix_rate else None, - ) - if touch_tip: - await self.touch_tip(tgt) + + for _ in range(len(targets)): + await self.aspirate( + resources=sources, + vols=[asp_vols[_]], + use_channels=use_channels, + flow_rates=[asp_flow_rates[0]] if asp_flow_rates else None, + 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, + ) + if delays is not None: + await self.custom_delay(seconds=delays[0]) + await self.dispense( + resources=[targets[_]], + vols=[dis_vols[_]], + use_channels=use_channels, + flow_rates=[dis_flow_rates[1]] if dis_flow_rates else None, + offsets=[offsets[1]] if offsets else None, + blow_out_air_volume=[blow_out_air_volume[1]] if blow_out_air_volume else None, + liquid_height=[liquid_height[1]] if liquid_height else None, + spread=spread, + ) + if delays is not None: + await self.custom_delay(seconds=delays[1]) + await self.mix( + targets=targets[_], + mix_time=mix_times, + 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, + ) + if delays is not None: + await self.custom_delay(seconds=delays[1]) + await self.touch_tip(targets[_]) await self.discard_tips() - except Exception as exc: - raise RuntimeError(f"Liquid transfer failed: {exc}") from exc + elif len(use_channels) == 8: + tip = [] + for _ in range(len(use_channels)): + tip.extend(next(self.current_tip)) + await self.pick_up_tips(tip) + + # 对于8个的情况,需要判断此时任务是不是能被8通道移液站来成功处理 + if len(targets) % 8 != 0: + raise ValueError(f"Length of `targets` {len(targets)} must be a multiple of 8 for 8-channel mode.") + + # 8个8个来取任务序列 + + for i in range(0, len(targets), 8): + # 取出8个任务 + current_targets = targets[i:i + 8] + current_reagent_sources = sources[i:i + 8] + current_asp_vols = asp_vols[i:i + 8] + current_dis_vols = dis_vols[i:i + 8] + current_asp_flow_rates = asp_flow_rates[i:i + 8] + current_asp_offset = offsets[i:i + 8] if offsets else [None] * 8 + current_dis_offset = offsets[i+8 :i + 16] if offsets else [None] * 8 + current_asp_liquid_height = liquid_height[i:i + 8] if liquid_height else [None] * 8 + current_dis_liquid_height = liquid_height[i+8 :i + 16] if liquid_height else [None] * 8 + current_asp_blow_out_air_volume = blow_out_air_volume[i:i + 8] if blow_out_air_volume else [None] * 8 + current_dis_blow_out_air_volume = blow_out_air_volume[i+8 :i + 16] if blow_out_air_volume else [None] * 8 + current_dis_flow_rates = dis_flow_rates[i:i + 8] if dis_flow_rates else [None] * 8 + + await self.aspirate( + resources=current_reagent_sources, + vols=current_asp_vols, + use_channels=use_channels, + flow_rates=current_asp_flow_rates, + offsets=current_asp_offset, + blow_out_air_volume=current_asp_blow_out_air_volume, + liquid_height=current_asp_liquid_height, + spread=spread, + ) + + if delays is not None: + await self.custom_delay(seconds=delays[0]) + await self.dispense( + resources=current_targets, + vols=current_dis_vols, + use_channels=use_channels, + flow_rates=current_dis_flow_rates, + offsets=current_dis_offset, + blow_out_air_volume=current_dis_blow_out_air_volume, + liquid_height=current_dis_liquid_height, + spread=spread, + ) + if delays is not None: + await self.custom_delay(seconds=delays[1]) + + await self.mix( + targets=current_targets, + mix_time=mix_times, + 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, + ) + if delays is not None: + await self.custom_delay(seconds=delays[1]) + + #await self.touch_tip(current_targets) + except Exception as e: + traceback.print_exc() + raise RuntimeError(f"Liquid addition failed: {e}") from e + # --------------------------------------------------------------- # Helper utilities @@ -339,6 +477,7 @@ class LiquidHandlerAbstract(LiquidHandler): def set_tiprack(self, tip_racks: Sequence[TipRack]): """Set the tip racks for the liquid handler.""" + self.tip_racks = tip_racks tip_iter = self.iter_tips(tip_racks) self.current_tip = tip_iter diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index 56bd12e..0d68654 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -392,7 +392,7 @@ class PRCXI9300Backend(LiquidHandlerBackend): async def pick_up_tips(self, ops: List[Pickup], use_channels: List[int] = None): """Pick up tips from the specified resource.""" - + if len(ops) != 8: raise ValueError(f"PRCXI9300Backend pick_up_tips: Expected 8 pickups, got {len(ops)}") @@ -430,7 +430,6 @@ class PRCXI9300Backend(LiquidHandlerBackend): ) self.steps_todo_list.append(step) - async def drop_tips(self, ops: List[Drop], use_channels: List[int] = None): """Pick up tips from the specified resource.""" @@ -569,6 +568,7 @@ class PRCXI9300Backend(LiquidHandlerBackend): hole_numbers="1,2,3,4,5,6,7,8", ) self.steps_todo_list.append(step) + async def dispense(self, ops: List[SingleChannelDispense], use_channels: List[int] = None): @@ -1027,26 +1027,51 @@ if __name__ == "__main__": handler.set_tiprack([tip_rack]) # Set the tip rack for the handler asyncio.run(handler.setup()) # Initialize the handler and setup the connection asyncio.run(handler.create_protocol(protocol_name="Test Protocol")) # Initialize the backend and setup the connection - asyncio.run(handler.pick_up_tips(tip_rack.children[:8],[0,1,2,3,4,5,6,7])) - asyncio.run(handler.aspirate(well_containers.children[:8],[50]*8, [0,1,2,3,4,5,6,7])) - asyncio.run(handler.dispense(well_containers.children[:8],[50]*8,[0,1,2,3,4,5,6,7])) - asyncio.run(handler.drop_tips(tip_rack.children[8:16],[0,1,2,3,4,5,6,7])) - asyncio.run(handler.mix(well_containers.children[:8], mix_time=3, mix_vol=50, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) - print(json.dumps(handler._unilabos_backend.steps_todo_list, indent=2)) # Print matrix info + # asyncio.run(handler.pick_up_tips(tip_rack.children[:8],[0,1,2,3,4,5,6,7])) + # asyncio.run(handler.aspirate(well_containers.children[:8],[50]*8, [0,1,2,3,4,5,6,7])) + # asyncio.run(handler.dispense(well_containers.children[:8],[50]*8,[0,1,2,3,4,5,6,7])) + # asyncio.run(handler.drop_tips(tip_rack.children[8:16],[0,1,2,3,4,5,6,7])) + # asyncio.run(handler.mix(well_containers.children[:8], mix_time=3, mix_vol=50, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) + #print(json.dumps(handler._unilabos_backend.steps_todo_list, indent=2)) # Print matrix info asyncio.run(handler.add_liquid( - asp_vols=[100]*8, - dis_vols=[100]*8, - reagent_sources=well_containers.children[-8:], - targets=well_containers.children[:8], + asp_vols=[100]*16, + dis_vols=[100]*16, + reagent_sources=well_containers.children[-16:], + targets=well_containers.children[:16], use_channels=[0, 1, 2, 3, 4, 5, 6, 7], - flow_rates=[None] * 8, - offsets=[Coordinate(0, 0, 0)] * 8, - liquid_height=[None] * 8, - blow_out_air_volume=[None] * 8, + flow_rates=[None] * 16, + offsets=[Coordinate(0, 0, 0)] * 16, + liquid_height=[None] * 16, + blow_out_air_volume=[None] * 16, + delays=None, + mix_time=3, + mix_vol=50, spread="wide", )) + + # asyncio.run(handler.transfer_liquid( + # asp_vols=[100]*16, + # dis_vols=[100]*16, + # tip_racks=[tip_rack], + # sources=well_containers.children[-16:], + # targets=well_containers.children[:16], + # use_channels=[0, 1, 2, 3, 4, 5, 6, 7], + # offsets=[Coordinate(0, 0, 0)] * 32, + # asp_flow_rates=[None] * 16, + # dis_flow_rates=[None] * 16, + # liquid_height=[None] * 32, + # blow_out_air_volume=[None] * 32, + # mix_times=3, + # mix_vol=50, + # spread="wide", + # )) + print(json.dumps(handler._unilabos_backend.steps_todo_list, indent=2)) # Print matrix info # input("pick_up_tips add step") - asyncio.run(handler.run_protocol()) # Run the protocol + #asyncio.run(handler.run_protocol()) # Run the protocol # input("Running protocol...") # input("Press Enter to continue...") # Wait for user input before proceeding # print("PRCXI9300Handler initialized with deck and host settings.") + + + +# 但是怎么丢tip?这个需要手动设置一下? \ No newline at end of file From 71f6deda6b751c537a5c9260b5cc1b2411a20b8a Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Wed, 16 Jul 2025 18:22:02 +0800 Subject: [PATCH 45/96] Update prcxi.py --- .../liquid_handler_abstract.py | 136 ++++++++++++------ .../devices/liquid_handling/prcxi/prcxi.py | 37 +++-- 2 files changed, 120 insertions(+), 53 deletions(-) diff --git a/unilabos/devices/liquid_handling/liquid_handler_abstract.py b/unilabos/devices/liquid_handling/liquid_handler_abstract.py index 045f5a1..9795dc8 100644 --- a/unilabos/devices/liquid_handling/liquid_handler_abstract.py +++ b/unilabos/devices/liquid_handling/liquid_handler_abstract.py @@ -48,43 +48,99 @@ class LiquidHandlerAbstract(LiquidHandler): 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 - else: - if len(vols) != len(sources): - raise ValueError("Length of `vols` must match `sources`.") - - for src, vol in zip(sources, vols): - await self.move_to(src, dis_to_top=top[0] if top else 0) - tip = next(self.current_tip) + pass # This mode is not verified. + else: + # 首先应该对任务分组,然后每次1个/8个进行操作处理 + if len(use_channels) == 1: + tip = [] + for _ in range(len(use_channels)): + tip.extend(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 - 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, - blow_out_air_volume=blow_out_air_volume[0] if blow_out_air_volume else None, - spread=spread, - ) - 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 + + for _ in range(len(waste_liquid)): + await self.aspirate( + resources=sources, + vols=[vols[_]], + use_channels=use_channels, + 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, + blow_out_air_volume=[blow_out_air_volume[0]] if blow_out_air_volume else None, + spread=spread, + ) + if delays is not None: + await self.custom_delay(seconds=delays[0]) + await self.dispense( + resources=[waste_liquid[_]], + vols=[vols[_]], + use_channels=use_channels, + flow_rates=[flow_rates[1]] if flow_rates else None, + offsets=[offsets[1]] if offsets else None, + blow_out_air_volume=[blow_out_air_volume[1]] if blow_out_air_volume else None, + liquid_height=[liquid_height[1]] if liquid_height else None, + spread=spread, + ) + await self.discard_tips() + elif len(use_channels) == 8: + tip = [] + for _ in range(len(use_channels)): + tip.extend(next(self.current_tip)) + await self.pick_up_tips(tip) + + # 对于8个的情况,需要判断此时任务是不是能被8通道移液站来成功处理 + if len(sources) % 8 != 0: + raise ValueError(f"Length of `sources` {len(sources)} must be a multiple of 8 for 8-channel mode.") + + # 8个8个来取任务序列 + + for i in range(0, len(sources), 8): + # 取出8个任务 + current_targets = waste_liquid[i:i + 8] + current_reagent_sources = sources[i:i + 8] + current_asp_vols = vols[i:i + 8] + current_dis_vols = vols[i:i + 8] + current_asp_flow_rates = flow_rates[i:i + 8] if flow_rates else [None] * 8 + current_dis_flow_rates = flow_rates[-i*8-8:len(flow_rates)-i*8] if flow_rates else [None] * 8 + current_asp_offset = offsets[i:i + 8] if offsets else [None] * 8 + current_dis_offset = offsets[-i*8-8:len(offsets)-i*8] if offsets else [None] * 8 + current_asp_liquid_height = liquid_height[i:i + 8] if liquid_height else [None] * 8 + current_dis_liquid_height = liquid_height[-i*8-8:len(liquid_height)-i*8] if liquid_height else [None] * 8 + current_asp_blow_out_air_volume = blow_out_air_volume[i:i + 8] if blow_out_air_volume else [None] * 8 + current_dis_blow_out_air_volume = blow_out_air_volume[-i*8-8:len(blow_out_air_volume)-i*8] if blow_out_air_volume else [None] * 8 + + await self.aspirate( + resources=current_reagent_sources, + vols=current_asp_vols, + use_channels=use_channels, + flow_rates=current_asp_flow_rates, + offsets=current_asp_offset, + liquid_height=current_asp_liquid_height, + blow_out_air_volume=current_asp_blow_out_air_volume, + spread=spread, + ) + if delays is not None: + await self.custom_delay(seconds=delays[0]) + await self.dispense( + resources=current_targets, + vols=current_dis_vols, + use_channels=use_channels, + flow_rates=current_dis_flow_rates, + offsets=current_dis_offset, + liquid_height=current_dis_liquid_height, + blow_out_air_volume=current_dis_blow_out_air_volume, + spread=spread, + ) + if delays is not None: + await self.custom_delay(seconds=delays[1]) + + #await self.touch_tip(current_targets) except Exception as e: - raise RuntimeError(f"Liquid removal failed: {e}") from e + traceback.print_exc() + raise RuntimeError(f"Liquid addition failed: {e}") from e # --------------------------------------------------------------- # ADD LIQUID ----------------------------------------------------- @@ -183,14 +239,14 @@ class LiquidHandlerAbstract(LiquidHandler): current_asp_vols = asp_vols[i:i + 8] current_dis_vols = dis_vols[i:i + 8] current_asp_flow_rates = flow_rates[i:i + 8] if flow_rates else [None] * 8 - current_dis_flow_rates = flow_rates[i+8 :i + 16] if flow_rates else [None] * 8 + current_dis_flow_rates = flow_rates[-i*8-8:len(flow_rates)-i*8] if flow_rates else [None] * 8 current_asp_offset = offsets[i:i + 8] if offsets else [None] * 8 - current_dis_offset = offsets[i+8 :i + 16] if offsets else [None] * 8 + current_dis_offset = offsets[-i*8-8:len(offsets)-i*8] if offsets else [None] * 8 current_asp_liquid_height = liquid_height[i:i + 8] if liquid_height else [None] * 8 - current_dis_liquid_height = liquid_height[i+8 :i + 16] if liquid_height else [None] * 8 + current_dis_liquid_height = liquid_height[-i*8-8:len(liquid_height)-i*8] if liquid_height else [None] * 8 current_asp_blow_out_air_volume = blow_out_air_volume[i:i + 8] if blow_out_air_volume else [None] * 8 - current_dis_blow_out_air_volume = blow_out_air_volume[i+8 :i + 16] if blow_out_air_volume else [None] * 8 - + current_dis_blow_out_air_volume = blow_out_air_volume[-i*8-8:len(blow_out_air_volume)-i*8] if blow_out_air_volume else [None] * 8 + await self.aspirate( resources=current_reagent_sources, vols=current_asp_vols, @@ -347,11 +403,11 @@ class LiquidHandlerAbstract(LiquidHandler): current_dis_vols = dis_vols[i:i + 8] current_asp_flow_rates = asp_flow_rates[i:i + 8] current_asp_offset = offsets[i:i + 8] if offsets else [None] * 8 - current_dis_offset = offsets[i+8 :i + 16] if offsets else [None] * 8 + current_dis_offset = offsets[-i*8-8:len(offsets)-i*8] if offsets else [None] * 8 current_asp_liquid_height = liquid_height[i:i + 8] if liquid_height else [None] * 8 - current_dis_liquid_height = liquid_height[i+8 :i + 16] if liquid_height else [None] * 8 + current_dis_liquid_height = liquid_height[-i*8-8:len(liquid_height)-i*8] if liquid_height else [None] * 8 current_asp_blow_out_air_volume = blow_out_air_volume[i:i + 8] if blow_out_air_volume else [None] * 8 - current_dis_blow_out_air_volume = blow_out_air_volume[i+8 :i + 16] if blow_out_air_volume else [None] * 8 + current_dis_blow_out_air_volume = blow_out_air_volume[-i*8-8:len(blow_out_air_volume)-i*8] if blow_out_air_volume else [None] * 8 current_dis_flow_rates = dis_flow_rates[i:i + 8] if dis_flow_rates else [None] * 8 await self.aspirate( diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index 0d68654..75dd31a 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -1033,22 +1033,33 @@ if __name__ == "__main__": # asyncio.run(handler.drop_tips(tip_rack.children[8:16],[0,1,2,3,4,5,6,7])) # asyncio.run(handler.mix(well_containers.children[:8], mix_time=3, mix_vol=50, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) #print(json.dumps(handler._unilabos_backend.steps_todo_list, indent=2)) # Print matrix info - asyncio.run(handler.add_liquid( - asp_vols=[100]*16, - dis_vols=[100]*16, - reagent_sources=well_containers.children[-16:], - targets=well_containers.children[:16], + # asyncio.run(handler.add_liquid( + # asp_vols=[100]*16, + # dis_vols=[100]*16, + # reagent_sources=well_containers.children[-16:], + # targets=well_containers.children[:16], + # use_channels=[0, 1, 2, 3, 4, 5, 6, 7], + # flow_rates=[None] * 32, + # offsets=[Coordinate(0, 0, 0)] * 32, + # liquid_height=[None] * 16, + # blow_out_air_volume=[None] * 16, + # delays=None, + # mix_time=3, + # mix_vol=50, + # spread="wide", + # )) + + asyncio.run(handler.remove_liquid( + vols=[100]*16, + sources=well_containers.children[-16:], + waste_liquid=well_containers.children[:16], # 这个有些奇怪,但是好像也只能这么写 use_channels=[0, 1, 2, 3, 4, 5, 6, 7], - flow_rates=[None] * 16, - offsets=[Coordinate(0, 0, 0)] * 16, - liquid_height=[None] * 16, - blow_out_air_volume=[None] * 16, - delays=None, - mix_time=3, - mix_vol=50, + flow_rates=[None] * 32, + offsets=[Coordinate(0, 0, 0)] * 32, + liquid_height=[None] * 32, + blow_out_air_volume=[None] * 32, spread="wide", )) - # asyncio.run(handler.transfer_liquid( # asp_vols=[100]*16, # dis_vols=[100]*16, From 9c4fdd800192cafc197cda1e306b1016abcc12be Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Wed, 16 Jul 2025 20:07:23 +0800 Subject: [PATCH 46/96] =?UTF-8?q?=E6=96=B0=E5=A2=9Esimulator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../liquid_handler_abstract.py | 553 +++++++++++++++++- .../devices/liquid_handling/prcxi/prcxi.py | 4 +- 2 files changed, 543 insertions(+), 14 deletions(-) diff --git a/unilabos/devices/liquid_handling/liquid_handler_abstract.py b/unilabos/devices/liquid_handling/liquid_handler_abstract.py index 9795dc8..cf4a625 100644 --- a/unilabos/devices/liquid_handling/liquid_handler_abstract.py +++ b/unilabos/devices/liquid_handling/liquid_handler_abstract.py @@ -1,18 +1,547 @@ from __future__ import annotations import traceback -from typing import List, Sequence, Optional, Literal, Union, Iterator +from typing import List, Sequence, Optional, Literal, Union, Iterator, Dict, Any, Callable, Set import asyncio import time -from pylabrobot.liquid_handling import LiquidHandler -from pylabrobot.resources import Resource, TipRack, Container, Coordinate, Well +from pylabrobot.liquid_handling import LiquidHandler, LiquidHandlerBackend, LiquidHandlerChatterboxBackend, Strictness +from pylabrobot.liquid_handling.liquid_handler import TipPresenceProbingMethod +from pylabrobot.liquid_handling.standard import GripDirection +from pylabrobot.resources import ( + Resource, + TipRack, + Container, + Coordinate, + Well, + Deck, + TipSpot, + Plate, + ResourceStack, + ResourceHolder, + Lid, + Trash, + Tip, +) -class LiquidHandlerAbstract(LiquidHandler): +class LiquidHandlerMiddleware(LiquidHandler): + def __init__(self, backend: LiquidHandlerBackend, deck: Deck, simulator: bool = False): + self._simulator = simulator + if simulator: + self._simulate_backend = LiquidHandlerChatterboxBackend(8) + self._simulate_handler = LiquidHandlerAbstract(self._simulate_backend, deck, False) + super().__init__(backend, deck) + + async def setup(self, **backend_kwargs): + if self._simulator: + await self._simulate_handler.setup(**backend_kwargs) + return await super().setup(**backend_kwargs) + + def serialize_state(self) -> Dict[str, Any]: + if self._simulator: + self._simulate_handler.serialize_state() + return super().serialize_state() + + def load_state(self, state: Dict[str, Any]): + if self._simulator: + self._simulate_handler.load_state(state) + super().load_state(state) + + def update_head_state(self, state: Dict[int, Optional[Tip]]): + if self._simulator: + self._simulate_handler.update_head_state(state) + super().update_head_state(state) + + def clear_head_state(self): + if self._simulator: + self._simulate_handler.clear_head_state() + super().clear_head_state() + + def _run_async_in_thread(self, func, *args, **kwargs): + super()._run_async_in_thread(func, *args, **kwargs) + + def _send_assigned_resource_to_backend(self, resource: Resource): + if self._simulator: + self._simulate_handler._send_assigned_resource_to_backend(resource) + super()._send_assigned_resource_to_backend(resource) + + def _send_unassigned_resource_to_backend(self, resource: Resource): + if self._simulator: + self._simulate_handler._send_unassigned_resource_to_backend(resource) + super()._send_unassigned_resource_to_backend(resource) + + def summary(self): + if self._simulator: + self._simulate_handler.summary() + super().summary() + + def _assert_positions_unique(self, positions: List[str]): + super()._assert_positions_unique(positions) + + def _assert_resources_exist(self, resources: Sequence[Resource]): + super()._assert_resources_exist(resources) + + def _check_args( + self, method: Callable, backend_kwargs: Dict[str, Any], default: Set[str], strictness: Strictness + ) -> Set[str]: + return super()._check_args(method, backend_kwargs, default, strictness) + + def _make_sure_channels_exist(self, channels: List[int]): + super()._make_sure_channels_exist(channels) + + def _format_param(self, value: Any) -> Any: + return super()._format_param(value) + + def _log_command(self, name: str, **kwargs) -> None: + super()._log_command(name, **kwargs) + + async def pick_up_tips( + self, + tip_spots: List[TipSpot], + use_channels: Optional[List[int]] = None, + offsets: Optional[List[Coordinate]] = None, + **backend_kwargs, + ): + if self._simulator: + await self._simulate_handler.pick_up_tips(tip_spots, use_channels, offsets, **backend_kwargs) + return await super().pick_up_tips(tip_spots, use_channels, offsets, **backend_kwargs) + + async def drop_tips( + self, + tip_spots: Sequence[Union[TipSpot, Trash]], + use_channels: Optional[List[int]] = None, + offsets: Optional[List[Coordinate]] = None, + allow_nonzero_volume: bool = False, + **backend_kwargs, + ): + if self._simulator: + await self._simulate_handler.drop_tips( + tip_spots, use_channels, offsets, allow_nonzero_volume, **backend_kwargs + ) + return await super().drop_tips(tip_spots, use_channels, offsets, allow_nonzero_volume, **backend_kwargs) + + async def return_tips( + self, use_channels: Optional[list[int]] = None, allow_nonzero_volume: bool = False, **backend_kwargs + ): + if self._simulator: + await self._simulate_handler.return_tips(use_channels, allow_nonzero_volume, **backend_kwargs) + return await super().return_tips(use_channels, allow_nonzero_volume, **backend_kwargs) + + async def discard_tips( + self, + use_channels: Optional[List[int]] = None, + allow_nonzero_volume: bool = True, + offsets: Optional[List[Coordinate]] = None, + **backend_kwargs, + ): + if self._simulator: + await self._simulate_handler.discard_tips(use_channels, allow_nonzero_volume, offsets, **backend_kwargs) + return await super().discard_tips(use_channels, allow_nonzero_volume, offsets, **backend_kwargs) + + def _check_containers(self, resources: Sequence[Resource]): + super()._check_containers(resources) + + async def aspirate( + self, + resources: Sequence[Container], + vols: List[float], + use_channels: Optional[List[int]] = None, + flow_rates: Optional[List[Optional[float]]] = None, + offsets: Optional[List[Coordinate]] = None, + liquid_height: Optional[List[Optional[float]]] = None, + blow_out_air_volume: Optional[List[Optional[float]]] = None, + spread: Literal["wide", "tight", "custom"] = "wide", + **backend_kwargs, + ): + if self._simulator: + await self._simulate_handler.aspirate( + resources, + vols, + use_channels, + flow_rates, + offsets, + liquid_height, + blow_out_air_volume, + spread, + **backend_kwargs, + ) + return await super().aspirate( + resources, + vols, + use_channels, + flow_rates, + offsets, + liquid_height, + blow_out_air_volume, + spread, + **backend_kwargs, + ) + + async def dispense( + self, + resources: Sequence[Container], + vols: List[float], + use_channels: Optional[List[int]] = None, + flow_rates: Optional[List[Optional[float]]] = None, + offsets: Optional[List[Coordinate]] = None, + liquid_height: Optional[List[Optional[float]]] = None, + blow_out_air_volume: Optional[List[Optional[float]]] = None, + spread: Literal["wide", "tight", "custom"] = "wide", + **backend_kwargs, + ): + if self._simulator: + await self._simulate_handler.dispense( + resources, + vols, + use_channels, + flow_rates, + offsets, + liquid_height, + blow_out_air_volume, + spread, + **backend_kwargs, + ) + return await super().dispense( + resources, + vols, + use_channels, + flow_rates, + offsets, + liquid_height, + blow_out_air_volume, + spread, + **backend_kwargs, + ) + + async def transfer( + self, + source: Well, + targets: List[Well], + source_vol: Optional[float] = None, + ratios: Optional[List[float]] = None, + target_vols: Optional[List[float]] = None, + aspiration_flow_rate: Optional[float] = None, + dispense_flow_rates: Optional[List[Optional[float]]] = None, + **backend_kwargs, + ): + if self._simulator: + await self._simulate_handler.transfer( + source, + targets, + source_vol, + ratios, + target_vols, + aspiration_flow_rate, + dispense_flow_rates, + **backend_kwargs, + ) + return await super().transfer( + source, + targets, + source_vol, + ratios, + target_vols, + aspiration_flow_rate, + dispense_flow_rates, + **backend_kwargs, + ) + + def use_channels(self, channels: List[int]): + if self._simulator: + self._simulate_handler.use_channels(channels) + return super().use_channels(channels) + + async def pick_up_tips96(self, tip_rack: TipRack, offset: Coordinate = Coordinate.zero(), **backend_kwargs): + if self._simulator: + await self._simulate_handler.pick_up_tips96(tip_rack, offset, **backend_kwargs) + return await super().pick_up_tips96(tip_rack, offset, **backend_kwargs) + + async def drop_tips96( + self, + resource: Union[TipRack, Trash], + offset: Coordinate = Coordinate.zero(), + allow_nonzero_volume: bool = False, + **backend_kwargs, + ): + if self._simulator: + await self._simulate_handler.drop_tips96(resource, offset, allow_nonzero_volume, **backend_kwargs) + return await super().drop_tips96(resource, offset, allow_nonzero_volume, **backend_kwargs) + + def _get_96_head_origin_tip_rack(self) -> Optional[TipRack]: + return super()._get_96_head_origin_tip_rack() + + async def return_tips96(self, allow_nonzero_volume: bool = False, **backend_kwargs): + if self._simulator: + await self._simulate_handler.return_tips96(allow_nonzero_volume, **backend_kwargs) + return await super().return_tips96(allow_nonzero_volume, **backend_kwargs) + + async def discard_tips96(self, allow_nonzero_volume: bool = True, **backend_kwargs): + if self._simulator: + await self._simulate_handler.discard_tips96(allow_nonzero_volume, **backend_kwargs) + return await super().discard_tips96(allow_nonzero_volume, **backend_kwargs) + + async def aspirate96( + self, + resource: Union[Plate, Container, List[Well]], + volume: float, + offset: Coordinate = Coordinate.zero(), + flow_rate: Optional[float] = None, + blow_out_air_volume: Optional[float] = None, + **backend_kwargs, + ): + if self._simulator: + await self._simulate_handler.aspirate96( + resource, volume, offset, flow_rate, blow_out_air_volume, **backend_kwargs + ) + return await super().aspirate96(resource, volume, offset, flow_rate, blow_out_air_volume, **backend_kwargs) + + async def dispense96( + self, + resource: Union[Plate, Container, List[Well]], + volume: float, + offset: Coordinate = Coordinate.zero(), + flow_rate: Optional[float] = None, + blow_out_air_volume: Optional[float] = None, + **backend_kwargs, + ): + if self._simulator: + await self._simulate_handler.dispense96( + resource, volume, offset, flow_rate, blow_out_air_volume, **backend_kwargs + ) + return await super().dispense96(resource, volume, offset, flow_rate, blow_out_air_volume, **backend_kwargs) + + async def stamp( + self, + source: Plate, + target: Plate, + volume: float, + aspiration_flow_rate: Optional[float] = None, + dispense_flow_rate: Optional[float] = None, + ): + if self._simulator: + await self._simulate_handler.stamp(source, target, volume, aspiration_flow_rate, dispense_flow_rate) + return await super().stamp(source, target, volume, aspiration_flow_rate, dispense_flow_rate) + + async def pick_up_resource( + self, + resource: Resource, + offset: Coordinate = Coordinate.zero(), + pickup_distance_from_top: float = 0, + direction: GripDirection = GripDirection.FRONT, + **backend_kwargs, + ): + if self._simulator: + await self._simulate_handler.pick_up_resource( + resource, offset, pickup_distance_from_top, direction, **backend_kwargs + ) + return await super().pick_up_resource(resource, offset, pickup_distance_from_top, direction, **backend_kwargs) + + async def move_picked_up_resource( + self, + to: Coordinate, + offset: Coordinate = Coordinate.zero(), + direction: Optional[GripDirection] = None, + **backend_kwargs, + ): + if self._simulator: + await self._simulate_handler.move_picked_up_resource(to, offset, direction, **backend_kwargs) + return await super().move_picked_up_resource(to, offset, direction, **backend_kwargs) + + async def drop_resource( + self, + destination: Union[ResourceStack, ResourceHolder, Resource, Coordinate], + offset: Coordinate = Coordinate.zero(), + direction: GripDirection = GripDirection.FRONT, + **backend_kwargs, + ): + if self._simulator: + await self._simulate_handler.drop_resource(destination, offset, direction, **backend_kwargs) + return await super().drop_resource(destination, offset, direction, **backend_kwargs) + + async def move_resource( + self, + resource: Resource, + to: Union[ResourceStack, ResourceHolder, Resource, Coordinate], + intermediate_locations: Optional[List[Coordinate]] = None, + pickup_offset: Coordinate = Coordinate.zero(), + destination_offset: Coordinate = Coordinate.zero(), + pickup_distance_from_top: float = 0, + pickup_direction: GripDirection = GripDirection.FRONT, + drop_direction: GripDirection = GripDirection.FRONT, + **backend_kwargs, + ): + if self._simulator: + await self._simulate_handler.move_resource( + resource, + to, + intermediate_locations, + pickup_offset, + destination_offset, + pickup_distance_from_top, + pickup_direction, + drop_direction, + **backend_kwargs, + ) + return await super().move_resource( + resource, + to, + intermediate_locations, + pickup_offset, + destination_offset, + pickup_distance_from_top, + pickup_direction, + drop_direction, + **backend_kwargs, + ) + + async def move_lid( + self, + lid: Lid, + to: Union[Plate, ResourceStack, Coordinate], + intermediate_locations: Optional[List[Coordinate]] = None, + pickup_offset: Coordinate = Coordinate.zero(), + destination_offset: Coordinate = Coordinate.zero(), + pickup_direction: GripDirection = GripDirection.FRONT, + drop_direction: GripDirection = GripDirection.FRONT, + pickup_distance_from_top: float = 5.7 - 3.33, + **backend_kwargs, + ): + if self._simulator: + await self._simulate_handler.move_lid( + lid, + to, + intermediate_locations, + pickup_offset, + destination_offset, + pickup_direction, + drop_direction, + pickup_distance_from_top, + **backend_kwargs, + ) + return await super().move_lid( + lid, + to, + intermediate_locations, + pickup_offset, + destination_offset, + pickup_direction, + drop_direction, + pickup_distance_from_top, + **backend_kwargs, + ) + + async def move_plate( + self, + plate: Plate, + to: Union[ResourceStack, ResourceHolder, Resource, Coordinate], + intermediate_locations: Optional[List[Coordinate]] = None, + pickup_offset: Coordinate = Coordinate.zero(), + destination_offset: Coordinate = Coordinate.zero(), + drop_direction: GripDirection = GripDirection.FRONT, + pickup_direction: GripDirection = GripDirection.FRONT, + pickup_distance_from_top: float = 13.2 - 3.33, + **backend_kwargs, + ): + if self._simulator: + await self._simulate_handler.move_plate( + plate, + to, + intermediate_locations, + pickup_offset, + destination_offset, + drop_direction, + pickup_direction, + pickup_distance_from_top, + **backend_kwargs, + ) + return await super().move_plate( + plate, + to, + intermediate_locations, + pickup_offset, + destination_offset, + drop_direction, + pickup_direction, + pickup_distance_from_top, + **backend_kwargs, + ) + + def serialize(self): + if self._simulator: + self._simulate_handler.serialize() + return super().serialize() + + @classmethod + def deserialize(cls, data: dict, allow_marshal: bool = False) -> LiquidHandler: + return super().deserialize(data, allow_marshal) + + @classmethod + def load(cls, path: str) -> LiquidHandler: + return super().load(path) + + async def prepare_for_manual_channel_operation(self, channel: int): + if self._simulator: + await self._simulate_handler.prepare_for_manual_channel_operation(channel) + return await super().prepare_for_manual_channel_operation(channel) + + async def move_channel_x(self, channel: int, x: float): + if self._simulator: + await self._simulate_handler.move_channel_x(channel, x) + return await super().move_channel_x(channel, x) + + async def move_channel_y(self, channel: int, y: float): + if self._simulator: + await self._simulate_handler.move_channel_y(channel, y) + return await super().move_channel_y(channel, y) + + async def move_channel_z(self, channel: int, z: float): + if self._simulator: + await self._simulate_handler.move_channel_z(channel, z) + return await super().move_channel_z(channel, z) + + def assign_child_resource(self, resource: Resource, location: Optional[Coordinate], reassign: bool = True): + if self._simulator: + self._simulate_handler.assign_child_resource(resource, location, reassign) + pass + + async def probe_tip_presence_via_pickup( + self, tip_spots: List[TipSpot], use_channels: Optional[List[int]] = None + ) -> Dict[str, bool]: + if self._simulator: + await self._simulate_handler.probe_tip_presence_via_pickup(tip_spots, use_channels) + return await super().probe_tip_presence_via_pickup(tip_spots, use_channels) + + async def probe_tip_inventory( + self, + tip_spots: List[TipSpot], + probing_fn: Optional[TipPresenceProbingMethod] = None, + use_channels: Optional[List[int]] = None, + ) -> Dict[str, bool]: + if self._simulator: + await self._simulate_handler.probe_tip_inventory(tip_spots, probing_fn, use_channels) + return await super().probe_tip_inventory(tip_spots, probing_fn, use_channels) + + async def consolidate_tip_inventory(self, tip_racks: List[TipRack], use_channels: Optional[List[int]] = None): + if self._simulator: + await self._simulate_handler.consolidate_tip_inventory(tip_racks, use_channels) + return await super().consolidate_tip_inventory(tip_racks, use_channels) + + +class LiquidHandlerAbstract(LiquidHandlerMiddleware): """Extended LiquidHandler with additional operations.""" + def __init__(self, backend: LiquidHandlerBackend, deck: Deck, simulator: bool): + """Initialize a LiquidHandler. + + Args: + backend: Backend to use. + deck: Deck to use. + """ + self._simulator = simulator + super().__init__(backend, deck, simulator) + # --------------------------------------------------------------- # REMOVE LIQUID -------------------------------------------------- # --------------------------------------------------------------- @@ -52,7 +581,7 @@ class LiquidHandlerAbstract(LiquidHandler): try: if is_96_well: pass # This mode is not verified. - else: + else: # 首先应该对任务分组,然后每次1个/8个进行操作处理 if len(use_channels) == 1: tip = [] @@ -175,7 +704,7 @@ class LiquidHandlerAbstract(LiquidHandler): else: if len(asp_vols) != len(targets): raise ValueError(f"Length of `asp_vols` {len(asp_vols)} must match `targets` {len(targets)}.") - + # 首先应该对任务分组,然后每次1个/8个进行操作处理 if len(use_channels) == 1: tip = [] @@ -229,7 +758,7 @@ class LiquidHandlerAbstract(LiquidHandler): # 对于8个的情况,需要判断此时任务是不是能被8通道移液站来成功处理 if len(targets) % 8 != 0: raise ValueError(f"Length of `targets` {len(targets)} must be a multiple of 8 for 8-channel mode.") - + # 8个8个来取任务序列 for i in range(0, len(targets), 8): @@ -337,7 +866,7 @@ class LiquidHandlerAbstract(LiquidHandler): else: if len(asp_vols) != len(targets): raise ValueError(f"Length of `asp_vols` {len(asp_vols)} must match `targets` {len(targets)}.") - + # 首先应该对任务分组,然后每次1个/8个进行操作处理 if len(use_channels) == 1: tip = [] @@ -392,7 +921,7 @@ class LiquidHandlerAbstract(LiquidHandler): # 对于8个的情况,需要判断此时任务是不是能被8通道移液站来成功处理 if len(targets) % 8 != 0: raise ValueError(f"Length of `targets` {len(targets)} must be a multiple of 8 for 8-channel mode.") - + # 8个8个来取任务序列 for i in range(0, len(targets), 8): @@ -401,7 +930,7 @@ class LiquidHandlerAbstract(LiquidHandler): current_reagent_sources = sources[i:i + 8] current_asp_vols = asp_vols[i:i + 8] current_dis_vols = dis_vols[i:i + 8] - current_asp_flow_rates = asp_flow_rates[i:i + 8] + current_asp_flow_rates = asp_flow_rates[i:i + 8] current_asp_offset = offsets[i:i + 8] if offsets else [None] * 8 current_dis_offset = offsets[-i*8-8:len(offsets)-i*8] if offsets else [None] * 8 current_asp_liquid_height = liquid_height[i:i + 8] if liquid_height else [None] * 8 @@ -420,7 +949,7 @@ class LiquidHandlerAbstract(LiquidHandler): liquid_height=current_asp_liquid_height, spread=spread, ) - + if delays is not None: await self.custom_delay(seconds=delays[0]) await self.dispense( @@ -446,7 +975,7 @@ class LiquidHandlerAbstract(LiquidHandler): ) if delays is not None: await self.custom_delay(seconds=delays[1]) - + #await self.touch_tip(current_targets) except Exception as e: traceback.print_exc() diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index 75dd31a..122607b 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -14,7 +14,7 @@ from pylabrobot.liquid_handling import ( SingleChannelDispense, PickupTipRack, DropTipRack, - MultiHeadAspirationPlate, + MultiHeadAspirationPlate, ChatterBoxBackend, LiquidHandlerChatterboxBackend, ) from pylabrobot.liquid_handling.standard import ( MultiHeadAspirationContainer, @@ -105,7 +105,7 @@ class PRCXI9300Handler(LiquidHandlerAbstract): WorkTablets(Number=count, Code=f"T{count}", Material=child._unilabos_state["Material"]) ) self._unilabos_backend = PRCXI9300Backend(tablets_info, host, port, timeout, setup, debug) - super().__init__(backend=self._unilabos_backend, deck=deck) + super().__init__(backend=self._unilabos_backend, deck=deck, simulator=True) async def create_protocol( self, From 604d82140d37d82fee6ca18701bc8c0a81a92782 Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Wed, 16 Jul 2025 21:04:58 +0800 Subject: [PATCH 47/96] Update prcxi.py --- .../liquid_handler_abstract.py | 10 ++- .../devices/liquid_handling/prcxi/prcxi.py | 77 +++++++++++++------ 2 files changed, 61 insertions(+), 26 deletions(-) diff --git a/unilabos/devices/liquid_handling/liquid_handler_abstract.py b/unilabos/devices/liquid_handling/liquid_handler_abstract.py index cf4a625..1742048 100644 --- a/unilabos/devices/liquid_handling/liquid_handler_abstract.py +++ b/unilabos/devices/liquid_handling/liquid_handler_abstract.py @@ -531,6 +531,7 @@ class LiquidHandlerMiddleware(LiquidHandler): class LiquidHandlerAbstract(LiquidHandlerMiddleware): """Extended LiquidHandler with additional operations.""" + support_touch_tip = True def __init__(self, backend: LiquidHandlerBackend, deck: Deck, simulator: bool): """Initialize a LiquidHandler. @@ -748,7 +749,7 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): if delays is not None: await self.custom_delay(seconds=delays[1]) await self.touch_tip(targets[_]) - await self.discard_tips() + elif len(use_channels) == 8: tip = [] for _ in range(len(use_channels)): @@ -811,7 +812,8 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): ) if delays is not None: await self.custom_delay(seconds=delays[1]) - #await self.touch_tip(current_targets) + await self.touch_tip(current_targets) + await self.discard_tips() except Exception as e: traceback.print_exc() @@ -1002,7 +1004,11 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): print(f"Current time: {time.strftime('%H:%M:%S')}") async def touch_tip(self, targets: Sequence[Container]): + """Touch the tip to the side of the well.""" + + if not self.support_touch_tip: + return await self.aspirate( resources=[targets], vols=[0], diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index 122607b..077597d 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -87,7 +87,31 @@ class PRCXI9300Container(Plate): return data +class PRCXI9300Trash(Trash): + """PRCXI 9300 的专用 Trash 类,继承自 Trash。 + + 该类定义了 PRCXI 9300 的工作台布局和槽位信息。 + """ + + def __init__(self, name: str, size_x: float, size_y: float, size_z: float, category: str): + super().__init__(name, size_x, size_y, size_z, category=category) + self._unilabos_state = {} + + def load_state(self, state: Dict[str, Any]) -> None: + """从给定的状态加载工作台信息。""" + #super().load_state(state) + self._unilabos_state = state + + def serialize_state(self) -> Dict[str, Dict[str, Any]]: + data = super().serialize_state() + data.update(self._unilabos_state) + return data + + + + class PRCXI9300Handler(LiquidHandlerAbstract): + support_touch_tip = False @property def reset_ok(self) -> bool: """检查设备是否已重置成功。""" @@ -434,6 +458,9 @@ class PRCXI9300Backend(LiquidHandlerBackend): """Pick up tips from the specified resource.""" + print('111'*500) + + if len(ops) != 8: raise ValueError(f"PRCXI9300Backend drop_tips: Expected 8 pickups, got {len(ops)}") @@ -1001,7 +1028,7 @@ if __name__ == "__main__": "uuid": "57b1e4711e9e4a32b529f3132fc5931f", } }) - plate6 = PRCXI9300Container(name="plateT6", size_x=50, size_y=50, size_z=10, category="plate") + plate6 = PRCXI9300Trash(name="trash", size_x=50, size_y=50, size_z=10, category="trash") plate6.load_state({ "Material": { "uuid": "57b1e4711e9e4a32b529f3132fc5931f", @@ -1009,13 +1036,15 @@ if __name__ == "__main__": }) from pylabrobot.resources.opentrons.tip_racks import tipone_96_tiprack_200ul - from pylabrobot.resources.opentrons.plates import corning_96_wellplate_360ul_flat + from pylabrobot.resources.opentrons.plates import corning_96_wellplate_360ul_flat + tip_rack = tipone_96_tiprack_200ul("TipRack") well_containers = corning_96_wellplate_360ul_flat("Plate") # from pprint import pprint # pprint(well_containers.children) plate1.assign_child_resource(tip_rack, location=Coordinate(0, 0, 0)) plate2.assign_child_resource(well_containers, location=Coordinate(0, 0, 0)) + deck.assign_child_resource(plate1, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate2, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate3, location=Coordinate(0, 0, 0)) @@ -1033,33 +1062,33 @@ if __name__ == "__main__": # asyncio.run(handler.drop_tips(tip_rack.children[8:16],[0,1,2,3,4,5,6,7])) # asyncio.run(handler.mix(well_containers.children[:8], mix_time=3, mix_vol=50, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) #print(json.dumps(handler._unilabos_backend.steps_todo_list, indent=2)) # Print matrix info - # asyncio.run(handler.add_liquid( - # asp_vols=[100]*16, - # dis_vols=[100]*16, - # reagent_sources=well_containers.children[-16:], - # targets=well_containers.children[:16], - # use_channels=[0, 1, 2, 3, 4, 5, 6, 7], - # flow_rates=[None] * 32, - # offsets=[Coordinate(0, 0, 0)] * 32, - # liquid_height=[None] * 16, - # blow_out_air_volume=[None] * 16, - # delays=None, - # mix_time=3, - # mix_vol=50, - # spread="wide", - # )) - - asyncio.run(handler.remove_liquid( - vols=[100]*16, - sources=well_containers.children[-16:], - waste_liquid=well_containers.children[:16], # 这个有些奇怪,但是好像也只能这么写 + asyncio.run(handler.add_liquid( + asp_vols=[100]*16, + dis_vols=[100]*16, + reagent_sources=well_containers.children[-16:], + targets=well_containers.children[:16], use_channels=[0, 1, 2, 3, 4, 5, 6, 7], flow_rates=[None] * 32, offsets=[Coordinate(0, 0, 0)] * 32, - liquid_height=[None] * 32, - blow_out_air_volume=[None] * 32, + liquid_height=[None] * 16, + blow_out_air_volume=[None] * 16, + delays=None, + mix_time=3, + mix_vol=50, spread="wide", )) + + # asyncio.run(handler.remove_liquid( + # vols=[100]*16, + # sources=well_containers.children[-16:], + # waste_liquid=well_containers.children[:16], # 这个有些奇怪,但是好像也只能这么写 + # use_channels=[0, 1, 2, 3, 4, 5, 6, 7], + # flow_rates=[None] * 32, + # offsets=[Coordinate(0, 0, 0)] * 32, + # liquid_height=[None] * 32, + # blow_out_air_volume=[None] * 32, + # spread="wide", + # )) # asyncio.run(handler.transfer_liquid( # asp_vols=[100]*16, # dis_vols=[100]*16, From f90be189261bc305c99cc3adce185de880b1b960 Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Wed, 16 Jul 2025 21:34:25 +0800 Subject: [PATCH 48/96] Update trash --- .../liquid_handler_abstract.py | 9 +++--- .../devices/liquid_handling/prcxi/prcxi.py | 32 +++++++++++++++++-- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/unilabos/devices/liquid_handling/liquid_handler_abstract.py b/unilabos/devices/liquid_handling/liquid_handler_abstract.py index 1742048..cda5a90 100644 --- a/unilabos/devices/liquid_handling/liquid_handler_abstract.py +++ b/unilabos/devices/liquid_handling/liquid_handler_abstract.py @@ -665,8 +665,8 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): ) if delays is not None: await self.custom_delay(seconds=delays[1]) - - #await self.touch_tip(current_targets) + await self.touch_tip(current_targets) + await self.discard_tips() except Exception as e: traceback.print_exc() @@ -977,8 +977,9 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): ) if delays is not None: await self.custom_delay(seconds=delays[1]) - - #await self.touch_tip(current_targets) + await self.touch_tip(current_targets) + await self.discard_tips() + except Exception as e: traceback.print_exc() raise RuntimeError(f"Liquid addition failed: {e}") from e diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index 077597d..52e2ca2 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -458,8 +458,34 @@ class PRCXI9300Backend(LiquidHandlerBackend): """Pick up tips from the specified resource.""" - print('111'*500) + plate = ops[0].resource.parent.parent + deck = plate.parent + plate_index = deck.children.index(plate) + + if deck.children[plate_index].name == "trash": + step = self.api_client.UnLoad( + "Left", + dosage=0, + plate_no=plate_index+1, + is_whole_plate=False, + hole_row=1, + hole_col=2,# 强制投放第二列了 + blending_times=0, + balance_height=0, + plate_or_hole=f"H{hole_col}-8,T{PlateNo}", + hole_numbers="1,2,3,4,5,6,7,8", + ) + self.steps_todo_list.append(step) + + + return + + # 判断是不是个trash? + # if all(isinstance(op.resource, Trash) for op in ops): + # print("All drop operations are for trash.") + # await self.discard_tips() + # return if len(ops) != 8: raise ValueError(f"PRCXI9300Backend drop_tips: Expected 8 pickups, got {len(ops)}") @@ -1056,10 +1082,10 @@ if __name__ == "__main__": handler.set_tiprack([tip_rack]) # Set the tip rack for the handler asyncio.run(handler.setup()) # Initialize the handler and setup the connection asyncio.run(handler.create_protocol(protocol_name="Test Protocol")) # Initialize the backend and setup the connection - # asyncio.run(handler.pick_up_tips(tip_rack.children[:8],[0,1,2,3,4,5,6,7])) + #asyncio.run(handler.pick_up_tips(tip_rack.children[:8],[0,1,2,3,4,5,6,7])) # asyncio.run(handler.aspirate(well_containers.children[:8],[50]*8, [0,1,2,3,4,5,6,7])) # asyncio.run(handler.dispense(well_containers.children[:8],[50]*8,[0,1,2,3,4,5,6,7])) - # asyncio.run(handler.drop_tips(tip_rack.children[8:16],[0,1,2,3,4,5,6,7])) + #asyncio.run(handler.drop_tips(tip_rack.children[8:16],[0,1,2,3,4,5,6,7])) # asyncio.run(handler.mix(well_containers.children[:8], mix_time=3, mix_vol=50, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) #print(json.dumps(handler._unilabos_backend.steps_todo_list, indent=2)) # Print matrix info asyncio.run(handler.add_liquid( From e793ff6aa232c8f85f9c01b8a10dabea0c54dec8 Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Wed, 16 Jul 2025 22:38:59 +0800 Subject: [PATCH 49/96] Update prcxi.py --- unilabos/devices/liquid_handling/prcxi/prcxi.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index 52e2ca2..d08d979 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -108,8 +108,6 @@ class PRCXI9300Trash(Trash): return data - - class PRCXI9300Handler(LiquidHandlerAbstract): support_touch_tip = False @property From 3584e92a1ede683defa9edf0ea27b45a64dd576f Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Wed, 16 Jul 2025 22:39:02 +0800 Subject: [PATCH 50/96] Update prcxi.py --- unilabos/devices/liquid_handling/prcxi/prcxi.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index d08d979..c977ff5 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -106,8 +106,7 @@ class PRCXI9300Trash(Trash): data = super().serialize_state() data.update(self._unilabos_state) return data - - + class PRCXI9300Handler(LiquidHandlerAbstract): support_touch_tip = False @property From 46b7ce292bca170210b4823bd2bf7b0890c5274c Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Wed, 16 Jul 2025 23:28:46 +0800 Subject: [PATCH 51/96] Update for discard tips --- .../liquid_handler_abstract.py | 29 ++++++++------- .../devices/liquid_handling/prcxi/prcxi.py | 35 ++++++++++--------- 2 files changed, 34 insertions(+), 30 deletions(-) diff --git a/unilabos/devices/liquid_handling/liquid_handler_abstract.py b/unilabos/devices/liquid_handling/liquid_handler_abstract.py index cda5a90..3582c59 100644 --- a/unilabos/devices/liquid_handling/liquid_handler_abstract.py +++ b/unilabos/devices/liquid_handling/liquid_handler_abstract.py @@ -628,6 +628,10 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): for i in range(0, len(sources), 8): # 取出8个任务 + tip = [] + for _ in range(len(use_channels)): + tip.extend(next(self.current_tip)) + await self.pick_up_tips(tip) current_targets = waste_liquid[i:i + 8] current_reagent_sources = sources[i:i + 8] current_asp_vols = vols[i:i + 8] @@ -666,7 +670,7 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): if delays is not None: await self.custom_delay(seconds=delays[1]) await self.touch_tip(current_targets) - await self.discard_tips() + await self.discard_tips() except Exception as e: traceback.print_exc() @@ -751,10 +755,6 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): await self.touch_tip(targets[_]) elif len(use_channels) == 8: - tip = [] - for _ in range(len(use_channels)): - tip.extend(next(self.current_tip)) - await self.pick_up_tips(tip) # 对于8个的情况,需要判断此时任务是不是能被8通道移液站来成功处理 if len(targets) % 8 != 0: @@ -763,7 +763,10 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): # 8个8个来取任务序列 for i in range(0, len(targets), 8): - # 取出8个任务 + tip = [] + for _ in range(len(use_channels)): + tip.extend(next(self.current_tip)) + await self.pick_up_tips(tip) current_targets = targets[i:i + 8] current_reagent_sources = reagent_sources[i:i + 8] current_asp_vols = asp_vols[i:i + 8] @@ -813,7 +816,8 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): if delays is not None: await self.custom_delay(seconds=delays[1]) await self.touch_tip(current_targets) - await self.discard_tips() + await self.discard_tips() + except Exception as e: traceback.print_exc() @@ -915,11 +919,6 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): await self.discard_tips() elif len(use_channels) == 8: - tip = [] - for _ in range(len(use_channels)): - tip.extend(next(self.current_tip)) - await self.pick_up_tips(tip) - # 对于8个的情况,需要判断此时任务是不是能被8通道移液站来成功处理 if len(targets) % 8 != 0: raise ValueError(f"Length of `targets` {len(targets)} must be a multiple of 8 for 8-channel mode.") @@ -928,6 +927,10 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): for i in range(0, len(targets), 8): # 取出8个任务 + tip = [] + for _ in range(len(use_channels)): + tip.extend(next(self.current_tip)) + await self.pick_up_tips(tip) current_targets = targets[i:i + 8] current_reagent_sources = sources[i:i + 8] current_asp_vols = asp_vols[i:i + 8] @@ -978,7 +981,7 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): if delays is not None: await self.custom_delay(seconds=delays[1]) await self.touch_tip(current_targets) - await self.discard_tips() + await self.discard_tips() except Exception as e: traceback.print_exc() diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index c977ff5..b9a410f 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -1051,7 +1051,7 @@ if __name__ == "__main__": "uuid": "57b1e4711e9e4a32b529f3132fc5931f", } }) - plate6 = PRCXI9300Trash(name="trash", size_x=50, size_y=50, size_z=10, category="trash") + plate6 = PRCXI9300Trash(name="trash", size_x=50, size_y=500, size_z=10, category="trash") plate6.load_state({ "Material": { "uuid": "57b1e4711e9e4a32b529f3132fc5931f", @@ -1079,27 +1079,28 @@ if __name__ == "__main__": handler.set_tiprack([tip_rack]) # Set the tip rack for the handler asyncio.run(handler.setup()) # Initialize the handler and setup the connection asyncio.run(handler.create_protocol(protocol_name="Test Protocol")) # Initialize the backend and setup the connection - #asyncio.run(handler.pick_up_tips(tip_rack.children[:8],[0,1,2,3,4,5,6,7])) + asyncio.run(handler.pick_up_tips(tip_rack.children[:8],[0,1,2,3,4,5,6,7])) # asyncio.run(handler.aspirate(well_containers.children[:8],[50]*8, [0,1,2,3,4,5,6,7])) # asyncio.run(handler.dispense(well_containers.children[:8],[50]*8,[0,1,2,3,4,5,6,7])) #asyncio.run(handler.drop_tips(tip_rack.children[8:16],[0,1,2,3,4,5,6,7])) + asyncio.run(handler.discard_tips()) # asyncio.run(handler.mix(well_containers.children[:8], mix_time=3, mix_vol=50, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) #print(json.dumps(handler._unilabos_backend.steps_todo_list, indent=2)) # Print matrix info - asyncio.run(handler.add_liquid( - asp_vols=[100]*16, - dis_vols=[100]*16, - reagent_sources=well_containers.children[-16:], - targets=well_containers.children[:16], - use_channels=[0, 1, 2, 3, 4, 5, 6, 7], - flow_rates=[None] * 32, - offsets=[Coordinate(0, 0, 0)] * 32, - liquid_height=[None] * 16, - blow_out_air_volume=[None] * 16, - delays=None, - mix_time=3, - mix_vol=50, - spread="wide", - )) + # asyncio.run(handler.add_liquid( + # asp_vols=[100]*16, + # dis_vols=[100]*16, + # reagent_sources=well_containers.children[-16:], + # targets=well_containers.children[:16], + # use_channels=[0, 1, 2, 3, 4, 5, 6, 7], + # flow_rates=[None] * 32, + # offsets=[Coordinate(0, 0, 0)] * 32, + # liquid_height=[None] * 16, + # blow_out_air_volume=[None] * 16, + # delays=None, + # mix_time=3, + # mix_vol=50, + # spread="wide", + # )) # asyncio.run(handler.remove_liquid( # vols=[100]*16, From 31f59dc2aa578f968f7da5373015b8a4adc2cfcd Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Thu, 17 Jul 2025 14:38:50 +0800 Subject: [PATCH 52/96] Update prcxi.py --- .../devices/liquid_handling/prcxi/prcxi.py | 39 ++++++++----------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index b9a410f..6204075 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -478,11 +478,6 @@ class PRCXI9300Backend(LiquidHandlerBackend): return - # 判断是不是个trash? - # if all(isinstance(op.resource, Trash) for op in ops): - # print("All drop operations are for trash.") - # await self.discard_tips() - # return if len(ops) != 8: raise ValueError(f"PRCXI9300Backend drop_tips: Expected 8 pickups, got {len(ops)}") @@ -1079,28 +1074,28 @@ if __name__ == "__main__": handler.set_tiprack([tip_rack]) # Set the tip rack for the handler asyncio.run(handler.setup()) # Initialize the handler and setup the connection asyncio.run(handler.create_protocol(protocol_name="Test Protocol")) # Initialize the backend and setup the connection - asyncio.run(handler.pick_up_tips(tip_rack.children[:8],[0,1,2,3,4,5,6,7])) + # asyncio.run(handler.pick_up_tips(tip_rack.children[:8],[0,1,2,3,4,5,6,7])) # asyncio.run(handler.aspirate(well_containers.children[:8],[50]*8, [0,1,2,3,4,5,6,7])) # asyncio.run(handler.dispense(well_containers.children[:8],[50]*8,[0,1,2,3,4,5,6,7])) #asyncio.run(handler.drop_tips(tip_rack.children[8:16],[0,1,2,3,4,5,6,7])) - asyncio.run(handler.discard_tips()) + # asyncio.run(handler.discard_tips()) # asyncio.run(handler.mix(well_containers.children[:8], mix_time=3, mix_vol=50, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) #print(json.dumps(handler._unilabos_backend.steps_todo_list, indent=2)) # Print matrix info - # asyncio.run(handler.add_liquid( - # asp_vols=[100]*16, - # dis_vols=[100]*16, - # reagent_sources=well_containers.children[-16:], - # targets=well_containers.children[:16], - # use_channels=[0, 1, 2, 3, 4, 5, 6, 7], - # flow_rates=[None] * 32, - # offsets=[Coordinate(0, 0, 0)] * 32, - # liquid_height=[None] * 16, - # blow_out_air_volume=[None] * 16, - # delays=None, - # mix_time=3, - # mix_vol=50, - # spread="wide", - # )) + asyncio.run(handler.add_liquid( + asp_vols=[100]*16, + dis_vols=[100]*16, + reagent_sources=well_containers.children[-16:], + targets=well_containers.children[:16], + use_channels=[0, 1, 2, 3, 4, 5, 6, 7], + flow_rates=[None] * 32, + offsets=[Coordinate(0, 0, 0)] * 32, + liquid_height=[None] * 16, + blow_out_air_volume=[None] * 16, + delays=None, + mix_time=3, + mix_vol=50, + spread="wide", + )) # asyncio.run(handler.remove_liquid( # vols=[100]*16, From aaf33a88784eb171e9a925707430f37dd3c4187e Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Thu, 17 Jul 2025 20:54:11 +0800 Subject: [PATCH 53/96] Update PRCXI --- .../liquid_handler_abstract.py | 3 ++- .../devices/liquid_handling/prcxi/prcxi.py | 21 +++++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/unilabos/devices/liquid_handling/liquid_handler_abstract.py b/unilabos/devices/liquid_handling/liquid_handler_abstract.py index 3582c59..253c2fb 100644 --- a/unilabos/devices/liquid_handling/liquid_handler_abstract.py +++ b/unilabos/devices/liquid_handling/liquid_handler_abstract.py @@ -715,8 +715,8 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): tip = [] for _ in range(len(use_channels)): tip.extend(next(self.current_tip)) - await self.pick_up_tips(tip) + await self.pick_up_tips(tip) for _ in range(len(targets)): await self.aspirate( resources=reagent_sources, @@ -740,6 +740,7 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): liquid_height=[liquid_height[1]] if liquid_height else None, spread=spread, ) + if delays is not None: await self.custom_delay(seconds=delays[1]) await self.mix( diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index 6204075..e828d98 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -109,6 +109,7 @@ class PRCXI9300Trash(Trash): class PRCXI9300Handler(LiquidHandlerAbstract): support_touch_tip = False + @property def reset_ok(self) -> bool: """检查设备是否已重置成功。""" @@ -455,7 +456,6 @@ class PRCXI9300Backend(LiquidHandlerBackend): """Pick up tips from the specified resource.""" - plate = ops[0].resource.parent.parent deck = plate.parent plate_index = deck.children.index(plate) @@ -474,8 +474,6 @@ class PRCXI9300Backend(LiquidHandlerBackend): hole_numbers="1,2,3,4,5,6,7,8", ) self.steps_todo_list.append(step) - - return @@ -1001,12 +999,15 @@ class PRCXI9300Api: if __name__ == "__main__": # Example usage + # from pylabrobot.resources import set_volume_tracking + # from pylabrobot.resources import set_tip_tracking + # set_tip_tracking(True) deck = PRCXI9300Deck(name="PRCXI Deck", size_x=100, size_y=100, size_z=100) plate1 = PRCXI9300Container(name="rackT1", size_x=50, size_y=50, size_z=10, category="plate") plate1.load_state({ "Material": { "uuid": "80652665f6a54402b2408d50b40398df", - "Code": "ZX-001-1000", + "Co#de": "ZX-001-1000", "Name": "1000μL Tip头", "SummaryName": "1000μL Tip头", "PipetteHeight": 100, @@ -1070,16 +1071,24 @@ if __name__ == "__main__": deck.assign_child_resource(plate5, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate6, location=Coordinate(0, 0, 0)) + print(plate2) + # plate_2_liquids = [[(None, 500)]]*96 + + # plate2.set_well_liquids(plate_2_liquids) + + handler = PRCXI9300Handler(deck=deck, host="192.168.3.9", port=9999, timeout=10.0, setup=False, debug=True) handler.set_tiprack([tip_rack]) # Set the tip rack for the handler asyncio.run(handler.setup()) # Initialize the handler and setup the connection asyncio.run(handler.create_protocol(protocol_name="Test Protocol")) # Initialize the backend and setup the connection # asyncio.run(handler.pick_up_tips(tip_rack.children[:8],[0,1,2,3,4,5,6,7])) + # asyncio.run(handler.aspirate(well_containers.children[:8],[50]*8, [0,1,2,3,4,5,6,7])) # asyncio.run(handler.dispense(well_containers.children[:8],[50]*8,[0,1,2,3,4,5,6,7])) - #asyncio.run(handler.drop_tips(tip_rack.children[8:16],[0,1,2,3,4,5,6,7])) + # asyncio.run(handler.drop_tips(tip_rack.children[8:16],[0,1,2,3,4,5,6,7])) # asyncio.run(handler.discard_tips()) - # asyncio.run(handler.mix(well_containers.children[:8], mix_time=3, mix_vol=50, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) + # asyncio.run(handler.mix(well_containers.children[:8 + # ], mix_time=3, mix_vol=50, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) #print(json.dumps(handler._unilabos_backend.steps_todo_list, indent=2)) # Print matrix info asyncio.run(handler.add_liquid( asp_vols=[100]*16, From 0466b57e0a164be0bc005941f4fa5b7ece8fe9b4 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Thu, 17 Jul 2025 21:53:25 +0800 Subject: [PATCH 54/96] =?UTF-8?q?=E6=9B=B4=E6=96=B0axis=E7=AD=89=E5=8F=82?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/experiments/prcxi.json | 9934 ++++++++++++++++- unilabos-linux-64.yaml | 3 +- unilabos-osx-64.yaml | 3 +- unilabos-osx-arm64.yaml | 3 +- unilabos-win64.yaml | 1 + unilabos/app/controler.py | 1 + .../liquid_handler_abstract.py | 14 +- .../devices/liquid_handling/prcxi/prcxi.py | 168 +- unilabos/resources/graphio.py | 16 +- unilabos/ros/msgs/message_converter.py | 2 +- unilabos/ros/nodes/base_device_node.py | 2 +- unilabos/utils/log.py | 4 +- 12 files changed, 9992 insertions(+), 159 deletions(-) diff --git a/test/experiments/prcxi.json b/test/experiments/prcxi.json index b483a3a..30c78b9 100644 --- a/test/experiments/prcxi.json +++ b/test/experiments/prcxi.json @@ -13,23 +13,26 @@ }, "config": { "deck": { - "_resource_child_name": "deck", + "_resource_child_name": "PRCXI_Deck", "_resource_type": "unilabos.devices.liquid_handling.prcxi.prcxi:PRCXI9300Deck" }, "host": "192.168.3.9", "port": 9999, "timeout": 10.0, + "axis": "Right", + "channel_num": 1, "setup": false, - "debug": true + "debug": true, + "matrix_id": "fd383e6d-2d0e-40b5-9c01-1b2870b1f1b1" }, "data": {}, "children": [ - "deck" + "PRCXI_Deck" ] }, { - "id": "deck", - "name": "deck", + "id": "PRCXI_Deck", + "name": "PRCXI_Deck", "sample_id": null, "children": [ "rackT1", @@ -37,10 +40,10 @@ "plateT3", "rackT4", "plateT5", - "plateT6" + "trash" ], - "parent": "PRCXI", - "type": "device", + "parent": null, + "type": "deck", "class": "", "position": { "x": 0, @@ -48,7 +51,18 @@ "z": 0 }, "config": { - "type": "PRCXI9300Deck" + "type": "PRCXI9300Deck", + "size_x": 100, + "size_y": 100, + "size_z": 100, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "deck", + "barcode": null }, "data": {} }, @@ -56,9 +70,11 @@ "id": "rackT1", "name": "rackT1", "sample_id": null, - "children": [], - "parent": "deck", - "type": "device", + "children": [ + "TipRack" + ], + "parent": "PRCXI Deck", + "type": "plate", "class": "", "position": { "x": 0, @@ -67,9 +83,19 @@ }, "config": { "type": "PRCXI9300Container", - "size_x": 120.98, - "size_y": 82.12, - "size_z": 50.3 + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} }, "data": { "Material": { @@ -82,13 +108,5712 @@ } } }, + { + "id": "TipRack", + "name": "TipRack", + "sample_id": null, + "children": [ + "TipRack_A1", + "TipRack_B1", + "TipRack_C1", + "TipRack_D1", + "TipRack_E1", + "TipRack_F1", + "TipRack_G1", + "TipRack_H1", + "TipRack_A2", + "TipRack_B2", + "TipRack_C2", + "TipRack_D2", + "TipRack_E2", + "TipRack_F2", + "TipRack_G2", + "TipRack_H2", + "TipRack_A3", + "TipRack_B3", + "TipRack_C3", + "TipRack_D3", + "TipRack_E3", + "TipRack_F3", + "TipRack_G3", + "TipRack_H3", + "TipRack_A4", + "TipRack_B4", + "TipRack_C4", + "TipRack_D4", + "TipRack_E4", + "TipRack_F4", + "TipRack_G4", + "TipRack_H4", + "TipRack_A5", + "TipRack_B5", + "TipRack_C5", + "TipRack_D5", + "TipRack_E5", + "TipRack_F5", + "TipRack_G5", + "TipRack_H5", + "TipRack_A6", + "TipRack_B6", + "TipRack_C6", + "TipRack_D6", + "TipRack_E6", + "TipRack_F6", + "TipRack_G6", + "TipRack_H6", + "TipRack_A7", + "TipRack_B7", + "TipRack_C7", + "TipRack_D7", + "TipRack_E7", + "TipRack_F7", + "TipRack_G7", + "TipRack_H7", + "TipRack_A8", + "TipRack_B8", + "TipRack_C8", + "TipRack_D8", + "TipRack_E8", + "TipRack_F8", + "TipRack_G8", + "TipRack_H8", + "TipRack_A9", + "TipRack_B9", + "TipRack_C9", + "TipRack_D9", + "TipRack_E9", + "TipRack_F9", + "TipRack_G9", + "TipRack_H9", + "TipRack_A10", + "TipRack_B10", + "TipRack_C10", + "TipRack_D10", + "TipRack_E10", + "TipRack_F10", + "TipRack_G10", + "TipRack_H10", + "TipRack_A11", + "TipRack_B11", + "TipRack_C11", + "TipRack_D11", + "TipRack_E11", + "TipRack_F11", + "TipRack_G11", + "TipRack_H11", + "TipRack_A12", + "TipRack_B12", + "TipRack_C12", + "TipRack_D12", + "TipRack_E12", + "TipRack_F12", + "TipRack_G12", + "TipRack_H12" + ], + "parent": "rackT1", + "type": "container", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "TipRack", + "size_x": 127.76, + "size_y": 85.48, + "size_z": 63.9, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_rack", + "model": "TipOne 96 Tip Rack 200 µL", + "barcode": null, + "ordering": { + "A1": "TipRack_A1", + "B1": "TipRack_B1", + "C1": "TipRack_C1", + "D1": "TipRack_D1", + "E1": "TipRack_E1", + "F1": "TipRack_F1", + "G1": "TipRack_G1", + "H1": "TipRack_H1", + "A2": "TipRack_A2", + "B2": "TipRack_B2", + "C2": "TipRack_C2", + "D2": "TipRack_D2", + "E2": "TipRack_E2", + "F2": "TipRack_F2", + "G2": "TipRack_G2", + "H2": "TipRack_H2", + "A3": "TipRack_A3", + "B3": "TipRack_B3", + "C3": "TipRack_C3", + "D3": "TipRack_D3", + "E3": "TipRack_E3", + "F3": "TipRack_F3", + "G3": "TipRack_G3", + "H3": "TipRack_H3", + "A4": "TipRack_A4", + "B4": "TipRack_B4", + "C4": "TipRack_C4", + "D4": "TipRack_D4", + "E4": "TipRack_E4", + "F4": "TipRack_F4", + "G4": "TipRack_G4", + "H4": "TipRack_H4", + "A5": "TipRack_A5", + "B5": "TipRack_B5", + "C5": "TipRack_C5", + "D5": "TipRack_D5", + "E5": "TipRack_E5", + "F5": "TipRack_F5", + "G5": "TipRack_G5", + "H5": "TipRack_H5", + "A6": "TipRack_A6", + "B6": "TipRack_B6", + "C6": "TipRack_C6", + "D6": "TipRack_D6", + "E6": "TipRack_E6", + "F6": "TipRack_F6", + "G6": "TipRack_G6", + "H6": "TipRack_H6", + "A7": "TipRack_A7", + "B7": "TipRack_B7", + "C7": "TipRack_C7", + "D7": "TipRack_D7", + "E7": "TipRack_E7", + "F7": "TipRack_F7", + "G7": "TipRack_G7", + "H7": "TipRack_H7", + "A8": "TipRack_A8", + "B8": "TipRack_B8", + "C8": "TipRack_C8", + "D8": "TipRack_D8", + "E8": "TipRack_E8", + "F8": "TipRack_F8", + "G8": "TipRack_G8", + "H8": "TipRack_H8", + "A9": "TipRack_A9", + "B9": "TipRack_B9", + "C9": "TipRack_C9", + "D9": "TipRack_D9", + "E9": "TipRack_E9", + "F9": "TipRack_F9", + "G9": "TipRack_G9", + "H9": "TipRack_H9", + "A10": "TipRack_A10", + "B10": "TipRack_B10", + "C10": "TipRack_C10", + "D10": "TipRack_D10", + "E10": "TipRack_E10", + "F10": "TipRack_F10", + "G10": "TipRack_G10", + "H10": "TipRack_H10", + "A11": "TipRack_A11", + "B11": "TipRack_B11", + "C11": "TipRack_C11", + "D11": "TipRack_D11", + "E11": "TipRack_E11", + "F11": "TipRack_F11", + "G11": "TipRack_G11", + "H11": "TipRack_H11", + "A12": "TipRack_A12", + "B12": "TipRack_B12", + "C12": "TipRack_C12", + "D12": "TipRack_D12", + "E12": "TipRack_E12", + "F12": "TipRack_F12", + "G12": "TipRack_G12", + "H12": "TipRack_H12" + } + }, + "data": {} + }, + { + "id": "TipRack_A1", + "name": "TipRack_A1", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 11.4275, + "y": 69.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_B1", + "name": "TipRack_B1", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 11.4275, + "y": 60.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_C1", + "name": "TipRack_C1", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 11.4275, + "y": 51.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_D1", + "name": "TipRack_D1", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 11.4275, + "y": 42.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_E1", + "name": "TipRack_E1", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 11.4275, + "y": 33.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_F1", + "name": "TipRack_F1", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 11.4275, + "y": 24.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_G1", + "name": "TipRack_G1", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 11.4275, + "y": 15.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_H1", + "name": "TipRack_H1", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 11.4275, + "y": 6.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_A2", + "name": "TipRack_A2", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 20.4275, + "y": 69.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_B2", + "name": "TipRack_B2", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 20.4275, + "y": 60.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_C2", + "name": "TipRack_C2", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 20.4275, + "y": 51.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_D2", + "name": "TipRack_D2", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 20.4275, + "y": 42.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_E2", + "name": "TipRack_E2", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 20.4275, + "y": 33.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_F2", + "name": "TipRack_F2", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 20.4275, + "y": 24.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_G2", + "name": "TipRack_G2", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 20.4275, + "y": 15.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_H2", + "name": "TipRack_H2", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 20.4275, + "y": 6.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_A3", + "name": "TipRack_A3", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 29.4275, + "y": 69.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_B3", + "name": "TipRack_B3", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 29.4275, + "y": 60.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_C3", + "name": "TipRack_C3", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 29.4275, + "y": 51.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_D3", + "name": "TipRack_D3", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 29.4275, + "y": 42.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_E3", + "name": "TipRack_E3", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 29.4275, + "y": 33.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_F3", + "name": "TipRack_F3", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 29.4275, + "y": 24.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_G3", + "name": "TipRack_G3", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 29.4275, + "y": 15.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_H3", + "name": "TipRack_H3", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 29.4275, + "y": 6.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_A4", + "name": "TipRack_A4", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 38.4275, + "y": 69.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_B4", + "name": "TipRack_B4", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 38.4275, + "y": 60.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_C4", + "name": "TipRack_C4", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 38.4275, + "y": 51.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_D4", + "name": "TipRack_D4", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 38.4275, + "y": 42.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_E4", + "name": "TipRack_E4", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 38.4275, + "y": 33.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_F4", + "name": "TipRack_F4", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 38.4275, + "y": 24.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_G4", + "name": "TipRack_G4", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 38.4275, + "y": 15.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_H4", + "name": "TipRack_H4", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 38.4275, + "y": 6.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_A5", + "name": "TipRack_A5", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 47.4275, + "y": 69.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_B5", + "name": "TipRack_B5", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 47.4275, + "y": 60.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_C5", + "name": "TipRack_C5", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 47.4275, + "y": 51.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_D5", + "name": "TipRack_D5", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 47.4275, + "y": 42.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_E5", + "name": "TipRack_E5", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 47.4275, + "y": 33.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_F5", + "name": "TipRack_F5", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 47.4275, + "y": 24.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_G5", + "name": "TipRack_G5", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 47.4275, + "y": 15.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_H5", + "name": "TipRack_H5", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 47.4275, + "y": 6.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_A6", + "name": "TipRack_A6", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 56.4275, + "y": 69.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_B6", + "name": "TipRack_B6", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 56.4275, + "y": 60.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_C6", + "name": "TipRack_C6", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 56.4275, + "y": 51.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_D6", + "name": "TipRack_D6", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 56.4275, + "y": 42.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_E6", + "name": "TipRack_E6", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 56.4275, + "y": 33.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_F6", + "name": "TipRack_F6", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 56.4275, + "y": 24.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_G6", + "name": "TipRack_G6", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 56.4275, + "y": 15.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_H6", + "name": "TipRack_H6", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 56.4275, + "y": 6.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_A7", + "name": "TipRack_A7", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 65.4275, + "y": 69.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_B7", + "name": "TipRack_B7", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 65.4275, + "y": 60.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_C7", + "name": "TipRack_C7", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 65.4275, + "y": 51.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_D7", + "name": "TipRack_D7", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 65.4275, + "y": 42.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_E7", + "name": "TipRack_E7", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 65.4275, + "y": 33.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_F7", + "name": "TipRack_F7", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 65.4275, + "y": 24.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_G7", + "name": "TipRack_G7", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 65.4275, + "y": 15.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_H7", + "name": "TipRack_H7", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 65.4275, + "y": 6.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_A8", + "name": "TipRack_A8", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 74.4275, + "y": 69.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_B8", + "name": "TipRack_B8", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 74.4275, + "y": 60.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_C8", + "name": "TipRack_C8", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 74.4275, + "y": 51.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_D8", + "name": "TipRack_D8", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 74.4275, + "y": 42.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_E8", + "name": "TipRack_E8", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 74.4275, + "y": 33.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_F8", + "name": "TipRack_F8", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 74.4275, + "y": 24.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_G8", + "name": "TipRack_G8", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 74.4275, + "y": 15.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_H8", + "name": "TipRack_H8", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 74.4275, + "y": 6.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_A9", + "name": "TipRack_A9", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 83.4275, + "y": 69.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_B9", + "name": "TipRack_B9", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 83.4275, + "y": 60.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_C9", + "name": "TipRack_C9", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 83.4275, + "y": 51.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_D9", + "name": "TipRack_D9", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 83.4275, + "y": 42.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_E9", + "name": "TipRack_E9", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 83.4275, + "y": 33.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_F9", + "name": "TipRack_F9", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 83.4275, + "y": 24.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_G9", + "name": "TipRack_G9", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 83.4275, + "y": 15.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_H9", + "name": "TipRack_H9", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 83.4275, + "y": 6.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_A10", + "name": "TipRack_A10", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 92.4275, + "y": 69.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_B10", + "name": "TipRack_B10", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 92.4275, + "y": 60.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_C10", + "name": "TipRack_C10", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 92.4275, + "y": 51.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_D10", + "name": "TipRack_D10", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 92.4275, + "y": 42.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_E10", + "name": "TipRack_E10", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 92.4275, + "y": 33.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_F10", + "name": "TipRack_F10", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 92.4275, + "y": 24.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_G10", + "name": "TipRack_G10", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 92.4275, + "y": 15.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_H10", + "name": "TipRack_H10", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 92.4275, + "y": 6.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_A11", + "name": "TipRack_A11", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 101.4275, + "y": 69.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_B11", + "name": "TipRack_B11", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 101.4275, + "y": 60.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_C11", + "name": "TipRack_C11", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 101.4275, + "y": 51.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_D11", + "name": "TipRack_D11", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 101.4275, + "y": 42.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_E11", + "name": "TipRack_E11", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 101.4275, + "y": 33.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_F11", + "name": "TipRack_F11", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 101.4275, + "y": 24.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_G11", + "name": "TipRack_G11", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 101.4275, + "y": 15.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_H11", + "name": "TipRack_H11", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 101.4275, + "y": 6.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_A12", + "name": "TipRack_A12", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 110.4275, + "y": 69.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_B12", + "name": "TipRack_B12", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 110.4275, + "y": 60.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_C12", + "name": "TipRack_C12", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 110.4275, + "y": 51.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_D12", + "name": "TipRack_D12", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 110.4275, + "y": 42.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_E12", + "name": "TipRack_E12", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 110.4275, + "y": 33.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_F12", + "name": "TipRack_F12", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 110.4275, + "y": 24.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_G12", + "name": "TipRack_G12", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 110.4275, + "y": 15.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, + { + "id": "TipRack_H12", + "name": "TipRack_H12", + "sample_id": null, + "children": [], + "parent": "TipRack", + "type": "container", + "class": "", + "position": { + "x": 110.4275, + "y": 6.9875, + "z": 53.36 + }, + "config": { + "type": "TipSpot", + "size_x": 4.525, + "size_y": 4.525, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + }, + "data": { + "tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + }, + "tip_state": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + }, + "pending_tip": { + "type": "Tip", + "total_tip_length": 50.93, + "has_filter": false, + "maximal_volume": 200.0, + "fitting_depth": 6.1 + } + } + }, { "id": "plateT2", "name": "plateT2", "sample_id": null, - "children": [], - "parent": "deck", - "type": "device", + "children": [ + "Plate" + ], + "parent": "PRCXI Deck", + "type": "plate", "class": "", "position": { "x": 0, @@ -97,9 +5822,19 @@ }, "config": { "type": "PRCXI9300Container", - "size_x": 120.98, - "size_y": 82.12, - "size_z": 50.3 + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} }, "data": { "Material": { @@ -107,13 +5842,4078 @@ } } }, + { + "id": "Plate", + "name": "Plate", + "sample_id": null, + "children": [ + "Plate_A1", + "Plate_B1", + "Plate_C1", + "Plate_D1", + "Plate_E1", + "Plate_F1", + "Plate_G1", + "Plate_H1", + "Plate_A2", + "Plate_B2", + "Plate_C2", + "Plate_D2", + "Plate_E2", + "Plate_F2", + "Plate_G2", + "Plate_H2", + "Plate_A3", + "Plate_B3", + "Plate_C3", + "Plate_D3", + "Plate_E3", + "Plate_F3", + "Plate_G3", + "Plate_H3", + "Plate_A4", + "Plate_B4", + "Plate_C4", + "Plate_D4", + "Plate_E4", + "Plate_F4", + "Plate_G4", + "Plate_H4", + "Plate_A5", + "Plate_B5", + "Plate_C5", + "Plate_D5", + "Plate_E5", + "Plate_F5", + "Plate_G5", + "Plate_H5", + "Plate_A6", + "Plate_B6", + "Plate_C6", + "Plate_D6", + "Plate_E6", + "Plate_F6", + "Plate_G6", + "Plate_H6", + "Plate_A7", + "Plate_B7", + "Plate_C7", + "Plate_D7", + "Plate_E7", + "Plate_F7", + "Plate_G7", + "Plate_H7", + "Plate_A8", + "Plate_B8", + "Plate_C8", + "Plate_D8", + "Plate_E8", + "Plate_F8", + "Plate_G8", + "Plate_H8", + "Plate_A9", + "Plate_B9", + "Plate_C9", + "Plate_D9", + "Plate_E9", + "Plate_F9", + "Plate_G9", + "Plate_H9", + "Plate_A10", + "Plate_B10", + "Plate_C10", + "Plate_D10", + "Plate_E10", + "Plate_F10", + "Plate_G10", + "Plate_H10", + "Plate_A11", + "Plate_B11", + "Plate_C11", + "Plate_D11", + "Plate_E11", + "Plate_F11", + "Plate_G11", + "Plate_H11", + "Plate_A12", + "Plate_B12", + "Plate_C12", + "Plate_D12", + "Plate_E12", + "Plate_F12", + "Plate_G12", + "Plate_H12" + ], + "parent": "plateT2", + "type": "plate", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "Plate", + "size_x": 127.76, + "size_y": 85.47, + "size_z": 14.22, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": "Corning 96 Well Plate 360 µL Flat", + "barcode": null, + "ordering": { + "A1": "Plate_A1", + "B1": "Plate_B1", + "C1": "Plate_C1", + "D1": "Plate_D1", + "E1": "Plate_E1", + "F1": "Plate_F1", + "G1": "Plate_G1", + "H1": "Plate_H1", + "A2": "Plate_A2", + "B2": "Plate_B2", + "C2": "Plate_C2", + "D2": "Plate_D2", + "E2": "Plate_E2", + "F2": "Plate_F2", + "G2": "Plate_G2", + "H2": "Plate_H2", + "A3": "Plate_A3", + "B3": "Plate_B3", + "C3": "Plate_C3", + "D3": "Plate_D3", + "E3": "Plate_E3", + "F3": "Plate_F3", + "G3": "Plate_G3", + "H3": "Plate_H3", + "A4": "Plate_A4", + "B4": "Plate_B4", + "C4": "Plate_C4", + "D4": "Plate_D4", + "E4": "Plate_E4", + "F4": "Plate_F4", + "G4": "Plate_G4", + "H4": "Plate_H4", + "A5": "Plate_A5", + "B5": "Plate_B5", + "C5": "Plate_C5", + "D5": "Plate_D5", + "E5": "Plate_E5", + "F5": "Plate_F5", + "G5": "Plate_G5", + "H5": "Plate_H5", + "A6": "Plate_A6", + "B6": "Plate_B6", + "C6": "Plate_C6", + "D6": "Plate_D6", + "E6": "Plate_E6", + "F6": "Plate_F6", + "G6": "Plate_G6", + "H6": "Plate_H6", + "A7": "Plate_A7", + "B7": "Plate_B7", + "C7": "Plate_C7", + "D7": "Plate_D7", + "E7": "Plate_E7", + "F7": "Plate_F7", + "G7": "Plate_G7", + "H7": "Plate_H7", + "A8": "Plate_A8", + "B8": "Plate_B8", + "C8": "Plate_C8", + "D8": "Plate_D8", + "E8": "Plate_E8", + "F8": "Plate_F8", + "G8": "Plate_G8", + "H8": "Plate_H8", + "A9": "Plate_A9", + "B9": "Plate_B9", + "C9": "Plate_C9", + "D9": "Plate_D9", + "E9": "Plate_E9", + "F9": "Plate_F9", + "G9": "Plate_G9", + "H9": "Plate_H9", + "A10": "Plate_A10", + "B10": "Plate_B10", + "C10": "Plate_C10", + "D10": "Plate_D10", + "E10": "Plate_E10", + "F10": "Plate_F10", + "G10": "Plate_G10", + "H10": "Plate_H10", + "A11": "Plate_A11", + "B11": "Plate_B11", + "C11": "Plate_C11", + "D11": "Plate_D11", + "E11": "Plate_E11", + "F11": "Plate_F11", + "G11": "Plate_G11", + "H11": "Plate_H11", + "A12": "Plate_A12", + "B12": "Plate_B12", + "C12": "Plate_C12", + "D12": "Plate_D12", + "E12": "Plate_E12", + "F12": "Plate_F12", + "G12": "Plate_G12", + "H12": "Plate_H12" + } + }, + "data": {} + }, + { + "id": "Plate_A1", + "name": "Plate_A1", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_B1", + "name": "Plate_B1", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_C1", + "name": "Plate_C1", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_D1", + "name": "Plate_D1", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_E1", + "name": "Plate_E1", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_F1", + "name": "Plate_F1", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_G1", + "name": "Plate_G1", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_H1", + "name": "Plate_H1", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_A2", + "name": "Plate_A2", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_B2", + "name": "Plate_B2", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_C2", + "name": "Plate_C2", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_D2", + "name": "Plate_D2", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_E2", + "name": "Plate_E2", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_F2", + "name": "Plate_F2", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_G2", + "name": "Plate_G2", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_H2", + "name": "Plate_H2", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_A3", + "name": "Plate_A3", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_B3", + "name": "Plate_B3", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_C3", + "name": "Plate_C3", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_D3", + "name": "Plate_D3", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_E3", + "name": "Plate_E3", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_F3", + "name": "Plate_F3", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_G3", + "name": "Plate_G3", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_H3", + "name": "Plate_H3", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_A4", + "name": "Plate_A4", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_B4", + "name": "Plate_B4", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_C4", + "name": "Plate_C4", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_D4", + "name": "Plate_D4", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_E4", + "name": "Plate_E4", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_F4", + "name": "Plate_F4", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_G4", + "name": "Plate_G4", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_H4", + "name": "Plate_H4", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_A5", + "name": "Plate_A5", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_B5", + "name": "Plate_B5", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_C5", + "name": "Plate_C5", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_D5", + "name": "Plate_D5", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_E5", + "name": "Plate_E5", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_F5", + "name": "Plate_F5", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_G5", + "name": "Plate_G5", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_H5", + "name": "Plate_H5", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_A6", + "name": "Plate_A6", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_B6", + "name": "Plate_B6", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_C6", + "name": "Plate_C6", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_D6", + "name": "Plate_D6", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_E6", + "name": "Plate_E6", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_F6", + "name": "Plate_F6", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_G6", + "name": "Plate_G6", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_H6", + "name": "Plate_H6", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_A7", + "name": "Plate_A7", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_B7", + "name": "Plate_B7", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_C7", + "name": "Plate_C7", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_D7", + "name": "Plate_D7", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_E7", + "name": "Plate_E7", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_F7", + "name": "Plate_F7", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_G7", + "name": "Plate_G7", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_H7", + "name": "Plate_H7", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_A8", + "name": "Plate_A8", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_B8", + "name": "Plate_B8", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_C8", + "name": "Plate_C8", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_D8", + "name": "Plate_D8", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_E8", + "name": "Plate_E8", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_F8", + "name": "Plate_F8", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_G8", + "name": "Plate_G8", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_H8", + "name": "Plate_H8", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_A9", + "name": "Plate_A9", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_B9", + "name": "Plate_B9", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_C9", + "name": "Plate_C9", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_D9", + "name": "Plate_D9", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_E9", + "name": "Plate_E9", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_F9", + "name": "Plate_F9", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_G9", + "name": "Plate_G9", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_H9", + "name": "Plate_H9", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_A10", + "name": "Plate_A10", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_B10", + "name": "Plate_B10", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_C10", + "name": "Plate_C10", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_D10", + "name": "Plate_D10", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_E10", + "name": "Plate_E10", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_F10", + "name": "Plate_F10", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_G10", + "name": "Plate_G10", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_H10", + "name": "Plate_H10", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_A11", + "name": "Plate_A11", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_B11", + "name": "Plate_B11", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_C11", + "name": "Plate_C11", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_D11", + "name": "Plate_D11", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_E11", + "name": "Plate_E11", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_F11", + "name": "Plate_F11", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_G11", + "name": "Plate_G11", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_H11", + "name": "Plate_H11", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_A12", + "name": "Plate_A12", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_B12", + "name": "Plate_B12", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_C12", + "name": "Plate_C12", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_D12", + "name": "Plate_D12", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_E12", + "name": "Plate_E12", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_F12", + "name": "Plate_F12", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_G12", + "name": "Plate_G12", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "Plate_H12", + "name": "Plate_H12", + "sample_id": null, + "children": [], + "parent": "Plate", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, { "id": "plateT3", "name": "plateT3", "sample_id": null, "children": [], - "parent": "deck", - "type": "device", + "parent": "PRCXI Deck", + "type": "plate", "class": "", "position": { "x": 0, @@ -122,9 +9922,19 @@ }, "config": { "type": "PRCXI9300Container", - "size_x": 120.98, - "size_y": 82.12, - "size_z": 50.3 + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} }, "data": { "Material": { @@ -137,8 +9947,8 @@ "name": "rackT4", "sample_id": null, "children": [], - "parent": "deck", - "type": "device", + "parent": "PRCXI Deck", + "type": "plate", "class": "", "position": { "x": 0, @@ -147,9 +9957,19 @@ }, "config": { "type": "PRCXI9300Container", - "size_x": 120.98, - "size_y": 82.12, - "size_z": 50.3 + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} }, "data": { "Material": { @@ -167,8 +9987,8 @@ "name": "plateT5", "sample_id": null, "children": [], - "parent": "deck", - "type": "device", + "parent": "PRCXI Deck", + "type": "plate", "class": "", "position": { "x": 0, @@ -177,9 +9997,19 @@ }, "config": { "type": "PRCXI9300Container", - "size_x": 120.98, - "size_y": 82.12, - "size_z": 50.3 + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} }, "data": { "Material": { @@ -188,12 +10018,12 @@ } }, { - "id": "plateT6", - "name": "plateT6", + "id": "trash", + "name": "trash", "sample_id": null, "children": [], - "parent": "deck", - "type": "device", + "parent": "PRCXI Deck", + "type": "container", "class": "", "position": { "x": 0, @@ -201,12 +10031,28 @@ "z": 0 }, "config": { - "type": "PRCXI9300Container", - "size_x": 120.98, - "size_y": 82.12, - "size_z": 50.3 + "type": "PRCXI9300Trash", + "size_x": 50, + "size_y": 500, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "trash", + "model": null, + "barcode": null, + "max_volume": "Infinity", + "material_z_thickness": 0, + "compute_volume_from_height": null, + "compute_height_from_volume": null }, "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [], "Material": { "uuid": "57b1e4711e9e4a32b529f3132fc5931f" } diff --git a/unilabos-linux-64.yaml b/unilabos-linux-64.yaml index d2f6df1..5a94764 100644 --- a/unilabos-linux-64.yaml +++ b/unilabos-linux-64.yaml @@ -63,4 +63,5 @@ dependencies: # ilab equipments # - ros-humble-unilabos-msgs - pip: - - paho-mqtt \ No newline at end of file + - paho-mqtt + - opentrons_shared_data \ No newline at end of file diff --git a/unilabos-osx-64.yaml b/unilabos-osx-64.yaml index 72ffb4c..1c6db8d 100644 --- a/unilabos-osx-64.yaml +++ b/unilabos-osx-64.yaml @@ -62,4 +62,5 @@ dependencies: # ilab equipments # - ros-humble-unilabos-msgs - pip: - - paho-mqtt \ No newline at end of file + - paho-mqtt + - opentrons_shared_data \ No newline at end of file diff --git a/unilabos-osx-arm64.yaml b/unilabos-osx-arm64.yaml index 391e818..8f40130 100644 --- a/unilabos-osx-arm64.yaml +++ b/unilabos-osx-arm64.yaml @@ -65,4 +65,5 @@ dependencies: # ilab equipments # - ros-humble-unilabos-msgs - pip: - - paho-mqtt \ No newline at end of file + - paho-mqtt + - opentrons_shared_data \ No newline at end of file diff --git a/unilabos-win64.yaml b/unilabos-win64.yaml index 93f6332..bb4e832 100644 --- a/unilabos-win64.yaml +++ b/unilabos-win64.yaml @@ -66,6 +66,7 @@ dependencies: #- crcmod - pip: - paho-mqtt + - opentrons_shared_data # driver #- ur-rtde # set PYTHONUTF8=1 #- pyautogui diff --git a/unilabos/app/controler.py b/unilabos/app/controler.py index 7a74691..d23470f 100644 --- a/unilabos/app/controler.py +++ b/unilabos/app/controler.py @@ -39,6 +39,7 @@ def job_add(req: JobAddReq) -> JobData: HostNode.get_instance().send_goal(req.device_id, action_type=action_type, action_name=action_name, action_kwargs=action_args, goal_uuid=req.job_id, server_info=req.server_info) except Exception as e: for bridge in HostNode.get_instance().bridges: + traceback.print_exc() if hasattr(bridge, "publish_job_status"): bridge.publish_job_status({}, req.job_id, "failed", serialize_result_info(traceback.format_exc(), False, {})) return JobData(jobId=req.job_id) diff --git a/unilabos/devices/liquid_handling/liquid_handler_abstract.py b/unilabos/devices/liquid_handling/liquid_handler_abstract.py index 253c2fb..b11c008 100644 --- a/unilabos/devices/liquid_handling/liquid_handler_abstract.py +++ b/unilabos/devices/liquid_handling/liquid_handler_abstract.py @@ -27,10 +27,10 @@ from pylabrobot.resources import ( class LiquidHandlerMiddleware(LiquidHandler): - def __init__(self, backend: LiquidHandlerBackend, deck: Deck, simulator: bool = False): + def __init__(self, backend: LiquidHandlerBackend, deck: Deck, simulator: bool = False, channel_num: int = 8): self._simulator = simulator if simulator: - self._simulate_backend = LiquidHandlerChatterboxBackend(8) + self._simulate_backend = LiquidHandlerChatterboxBackend(channel_num) self._simulate_handler = LiquidHandlerAbstract(self._simulate_backend, deck, False) super().__init__(backend, deck) @@ -533,7 +533,7 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): """Extended LiquidHandler with additional operations.""" support_touch_tip = True - def __init__(self, backend: LiquidHandlerBackend, deck: Deck, simulator: bool): + def __init__(self, backend: LiquidHandlerBackend, deck: Deck, simulator: bool, channel_num:int = 8): """Initialize a LiquidHandler. Args: @@ -541,7 +541,7 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): deck: Deck to use. """ self._simulator = simulator - super().__init__(backend, deck, simulator) + super().__init__(backend, deck, simulator, channel_num) # --------------------------------------------------------------- # REMOVE LIQUID -------------------------------------------------- @@ -584,7 +584,7 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): pass # This mode is not verified. else: # 首先应该对任务分组,然后每次1个/8个进行操作处理 - if len(use_channels) == 1: + if len(use_channels) == 1 and self.backend.num_channels == 1: tip = [] for _ in range(len(use_channels)): tip.extend(next(self.current_tip)) @@ -614,7 +614,7 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): spread=spread, ) await self.discard_tips() - elif len(use_channels) == 8: + elif len(use_channels) == 8 and self.backend.num_channels == 8: tip = [] for _ in range(len(use_channels)): tip.extend(next(self.current_tip)) @@ -818,7 +818,7 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): await self.custom_delay(seconds=delays[1]) await self.touch_tip(current_targets) await self.discard_tips() - + except Exception as e: traceback.print_exc() diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index e828d98..c069574 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -72,8 +72,8 @@ class PRCXI9300Container(Plate): 该类定义了 PRCXI 9300 的工作台布局和槽位信息。 """ - def __init__(self, name: str, size_x: float, size_y: float, size_z: float, category: str): - super().__init__(name, size_x, size_y, size_z, category=category, ordering=collections.OrderedDict()) + def __init__(self, name: str, size_x: float, size_y: float, size_z: float, category: str, ordering: collections.OrderedDict): + super().__init__(name, size_x, size_y, size_z, category=category, ordering=ordering) self._unilabos_state = {} def load_state(self, state: Dict[str, Any]) -> None: @@ -93,8 +93,11 @@ class PRCXI9300Trash(Trash): 该类定义了 PRCXI 9300 的工作台布局和槽位信息。 """ - def __init__(self, name: str, size_x: float, size_y: float, size_z: float, category: str): - super().__init__(name, size_x, size_y, size_z, category=category) + def __init__(self, name: str, size_x: float, size_y: float, size_z: float, category: str, **kwargs): + if name != "trash": + name = "trash" + print("PRCXI9300Trash name must be 'trash', using 'trash' instead.") + super().__init__(name, size_x, size_y, size_z, category=category, **kwargs) self._unilabos_state = {} def load_state(self, state: Dict[str, Any]) -> None: @@ -117,7 +120,7 @@ class PRCXI9300Handler(LiquidHandlerAbstract): return True return self._unilabos_backend.is_reset_ok - def __init__(self, deck: Deck, host: str, port: int, timeout: float, setup=True, debug=False): + def __init__(self, deck: Deck, host: str, port: int, timeout: float, channel_num=8, axis="Left", setup=True, debug=False, matrix_id=""): tablets_info = [] count = 0 for child in deck.children: @@ -126,8 +129,8 @@ class PRCXI9300Handler(LiquidHandlerAbstract): tablets_info.append( WorkTablets(Number=count, Code=f"T{count}", Material=child._unilabos_state["Material"]) ) - self._unilabos_backend = PRCXI9300Backend(tablets_info, host, port, timeout, setup, debug) - super().__init__(backend=self._unilabos_backend, deck=deck, simulator=True) + self._unilabos_backend = PRCXI9300Backend(tablets_info, host, port, timeout, channel_num, axis, setup, debug, matrix_id) + super().__init__(backend=self._unilabos_backend, deck=deck, simulator=True, channel_num=channel_num) async def create_protocol( self, @@ -351,14 +354,18 @@ class PRCXI9300Backend(LiquidHandlerBackend): host: str = "127.0.0.1", port: int = 9999, timeout: float = 10.0, + channel_num: int=8, + axis: str="Left", setup=True, debug=False, + matrix_id="", ) -> None: super().__init__() self.tablets_info = tablets_info - self.api_client = PRCXI9300Api(host, port, timeout, debug) + self.matrix_id = matrix_id + self.api_client = PRCXI9300Api(host, port, timeout, axis, debug) self.host, self.port, self.timeout = host, port, timeout - self._num_channels = 8 + self._num_channels = channel_num self._execute_setup = setup self.debug = debug @@ -376,12 +383,18 @@ class PRCXI9300Backend(LiquidHandlerBackend): WorkTablets=self.tablets_info, ) #print(json.dumps(self.matrix_info, indent=2)) - res = self.api_client.add_WorkTablet_Matrix(self.matrix_info) - assert res["Success"], f"Failed to create matrix: {res.get('Message', 'Unknown error')}" - print(f"PRCXI9300Backend created matrix with ID: {self.matrix_info['MatrixId']}, result: {res}") - solution_id = self.api_client.add_solution( - f"protocol_{run_time}", self.matrix_info["MatrixId"], self.steps_todo_list - ) + if not len(self.matrix_id): + res = self.api_client.add_WorkTablet_Matrix(self.matrix_info) + assert res["Success"], f"Failed to create matrix: {res.get('Message', 'Unknown error')}" + print(f"PRCXI9300Backend created matrix with ID: {self.matrix_info['MatrixId']}, result: {res}") + solution_id = self.api_client.add_solution( + f"protocol_{run_time}", self.matrix_info["MatrixId"], self.steps_todo_list + ) + else: + print(f"PRCXI9300Backend using predefined worktable {self.matrix_id}, skipping matrix creation.") + solution_id = self.api_client.add_solution( + f"protocol_{run_time}", self.matrix_id, self.steps_todo_list + ) print(f"PRCXI9300Backend created solution with ID: {solution_id}") self.api_client.load_solution(solution_id) return self.api_client.start() @@ -438,22 +451,12 @@ class PRCXI9300Backend(LiquidHandlerBackend): PlateNo = plate_indexes[0] + 1 hole_col = tip_columns[0] + 1 - step = self.api_client.Load( - "Left", - dosage=0, - plate_no=PlateNo, - is_whole_plate=False, - hole_row=1, - hole_col=hole_col, - blending_times=0, - balance_height=0, - plate_or_hole=f"H{hole_col}-8,T{PlateNo}", - hole_numbers="1,2,3,4,5,6,7,8", - ) + step = self.api_client.Load(dosage=0, plate_no=PlateNo, is_whole_plate=False, hole_row=1, hole_col=hole_col, + blending_times=0, balance_height=0, plate_or_hole=f"H{hole_col}-8,T{PlateNo}", + hole_numbers="1,2,3,4,5,6,7,8") self.steps_todo_list.append(step) async def drop_tips(self, ops: List[Drop], use_channels: List[int] = None): - """Pick up tips from the specified resource.""" plate = ops[0].resource.parent.parent @@ -462,7 +465,6 @@ class PRCXI9300Backend(LiquidHandlerBackend): if deck.children[plate_index].name == "trash": step = self.api_client.UnLoad( - "Left", dosage=0, plate_no=plate_index+1, is_whole_plate=False, @@ -475,7 +477,7 @@ class PRCXI9300Backend(LiquidHandlerBackend): ) self.steps_todo_list.append(step) return - + if len(ops) != 8: raise ValueError(f"PRCXI9300Backend drop_tips: Expected 8 pickups, got {len(ops)}") @@ -598,18 +600,9 @@ class PRCXI9300Backend(LiquidHandlerBackend): PlateNo = plate_indexes[0] + 1 hole_col = tip_columns[0] + 1 - step = self.api_client.Imbibing( - "Left", - dosage=int(volumes[0]), - plate_no=PlateNo, - is_whole_plate=False, - hole_row=1, - hole_col=hole_col, - blending_times=0, - balance_height=0, - plate_or_hole=f"H{hole_col}-8,T{PlateNo}", - hole_numbers="1,2,3,4,5,6,7,8", - ) + step = self.api_client.Imbibing(dosage=int(volumes[0]), plate_no=PlateNo, is_whole_plate=False, hole_row=1, + hole_col=hole_col, blending_times=0, balance_height=0, + plate_or_hole=f"H{hole_col}-8,T{PlateNo}", hole_numbers="1,2,3,4,5,6,7,8") self.steps_todo_list.append(step) @@ -694,9 +687,10 @@ class PRCXI9300Backend(LiquidHandlerBackend): class PRCXI9300Api: - def __init__(self, host: str = "127.0.0.1", port: int = 9999, timeout: float = 10.0, debug: bool = False) -> None: + def __init__(self, host: str = "127.0.0.1", port: int = 9999, timeout: float = 10.0, axis="Left", debug: bool = False) -> None: self.host, self.port, self.timeout = host, port, timeout self.debug = debug + self.axis = axis @staticmethod def _len_prefix(n: int) -> bytes: @@ -763,8 +757,10 @@ class PRCXI9300Api: """GetErrorCode""" return self.call("IAutomation", "GetErrorCode") - def get_reset_status(self) -> Optional[str]: + def get_reset_status(self) -> bool: """GetErrorCode""" + if self.debug: + return True res = self.call("IAutomation", "GetResetStatus") return not res @@ -801,27 +797,12 @@ class PRCXI9300Api: def add_WorkTablet_Matrix(self, matrix: MatrixInfo): return self.call("IMatrix", "AddWorkTabletMatrix", [matrix]) - def Load( - self, - axis: str, - dosage: int, - plate_no: int, - is_whole_plate: bool, - hole_row: int, - hole_col: int, - blending_times: int, - balance_height: int, - plate_or_hole: str, - hole_numbers: str, - assist_fun1: str = "", - assist_fun2: str = "", - assist_fun3: str = "", - assist_fun4: str = "", - assist_fun5: str = "", - liquid_method: str = "NormalDispense", - ) -> Dict[str, Any]: + def Load(self, dosage: int, plate_no: int, is_whole_plate: bool, hole_row: int, hole_col: int, blending_times: int, + balance_height: int, plate_or_hole: str, hole_numbers: str, assist_fun1: str = "", assist_fun2: str = "", + assist_fun3: str = "", assist_fun4: str = "", assist_fun5: str = "", + liquid_method: str = "NormalDispense") -> Dict[str, Any]: return { - "StepAxis": axis, + "StepAxis": self.axis, "Function": "Load", "DosageNum": dosage, "PlateNo": plate_no, @@ -840,27 +821,12 @@ class PRCXI9300Api: "LiquidDispensingMethod": liquid_method, } - def Imbibing( - self, - axis: str, - dosage: int, - plate_no: int, - is_whole_plate: bool, - hole_row: int, - hole_col: int, - blending_times: int, - balance_height: int, - plate_or_hole: str, - hole_numbers: str, - assist_fun1: str = "", - assist_fun2: str = "", - assist_fun3: str = "", - assist_fun4: str = "", - assist_fun5: str = "", - liquid_method: str = "NormalDispense", - ) -> Dict[str, Any]: + def Imbibing(self, dosage: int, plate_no: int, is_whole_plate: bool, hole_row: int, hole_col: int, + blending_times: int, balance_height: int, plate_or_hole: str, hole_numbers: str, assist_fun1: str = "", + assist_fun2: str = "", assist_fun3: str = "", assist_fun4: str = "", assist_fun5: str = "", + liquid_method: str = "NormalDispense") -> Dict[str, Any]: return { - "StepAxis": axis, + "StepAxis": self.axis, "Function": "Imbibing", "DosageNum": dosage, "PlateNo": plate_no, @@ -881,7 +847,6 @@ class PRCXI9300Api: def Tapping( self, - axis: str, dosage: int, plate_no: int, is_whole_plate: bool, @@ -899,7 +864,7 @@ class PRCXI9300Api: liquid_method: str = "NormalDispense", ) -> Dict[str, Any]: return { - "StepAxis": axis, + "StepAxis": self.axis, "Function": "Tapping", "DosageNum": dosage, "PlateNo": plate_no, @@ -920,7 +885,6 @@ class PRCXI9300Api: def Blending( self, - axis: str, dosage: int, plate_no: int, is_whole_plate: bool, @@ -938,7 +902,7 @@ class PRCXI9300Api: liquid_method: str = "NormalDispense", ) -> Dict[str, Any]: return { - "StepAxis": axis, + "StepAxis": self.axis, "Function": "Blending", "DosageNum": dosage, "PlateNo": plate_no, @@ -959,7 +923,6 @@ class PRCXI9300Api: def UnLoad( self, - axis: str, dosage: int, plate_no: int, is_whole_plate: bool, @@ -977,7 +940,7 @@ class PRCXI9300Api: liquid_method: str = "NormalDispense", ) -> Dict[str, Any]: return { - "StepAxis": axis, + "StepAxis": self.axis, "Function": "UnLoad", "DosageNum": dosage, "PlateNo": plate_no, @@ -999,11 +962,11 @@ class PRCXI9300Api: if __name__ == "__main__": # Example usage - # from pylabrobot.resources import set_volume_tracking - # from pylabrobot.resources import set_tip_tracking - # set_tip_tracking(True) - deck = PRCXI9300Deck(name="PRCXI Deck", size_x=100, size_y=100, size_z=100) - plate1 = PRCXI9300Container(name="rackT1", size_x=50, size_y=50, size_z=10, category="plate") + # 1. 用导出的json,给每个T1 T2板子设定相应的物料,如果是孔板和枪头盒,要对应区分 + # 2. 设计一个单点动作流程,可以跑 + # 3. + deck = PRCXI9300Deck(name="PRCXI_Deck", size_x=100, size_y=100, size_z=100) + plate1 = PRCXI9300Container(name="rackT1", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) plate1.load_state({ "Material": { "uuid": "80652665f6a54402b2408d50b40398df", @@ -1015,21 +978,21 @@ if __name__ == "__main__": } }) - plate2 = PRCXI9300Container(name="plateT2", size_x=50, size_y=50, size_z=10, category="plate") + plate2 = PRCXI9300Container(name="plateT2", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) plate2.load_state({ "Material": { "uuid": "57b1e4711e9e4a32b529f3132fc5931f", } }) - plate3 = PRCXI9300Container(name="plateT3", size_x=50, size_y=50, size_z=10, category="plate") + plate3 = PRCXI9300Container(name="plateT3", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) plate3.load_state({ "Material": { "uuid": "57b1e4711e9e4a32b529f3132fc5931f", } }) - plate4 = PRCXI9300Container(name="rackT4", size_x=50, size_y=50, size_z=10, category="plate") + plate4 = PRCXI9300Container(name="rackT4", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) plate4.load_state({ "Material": { "uuid": "80652665f6a54402b2408d50b40398df", @@ -1041,7 +1004,7 @@ if __name__ == "__main__": } }) - plate5 = PRCXI9300Container(name="plateT5", size_x=50, size_y=50, size_z=10, category="plate") + plate5 = PRCXI9300Container(name="plateT5", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) plate5.load_state({ "Material": { "uuid": "57b1e4711e9e4a32b529f3132fc5931f", @@ -1077,9 +1040,14 @@ if __name__ == "__main__": # plate2.set_well_liquids(plate_2_liquids) - handler = PRCXI9300Handler(deck=deck, host="192.168.3.9", port=9999, timeout=10.0, setup=False, debug=True) + handler = PRCXI9300Handler(deck=deck, host="192.168.3.9", port=9999, timeout=10.0, setup=False, debug=True, matrix_id="fd383e6d-2d0e-40b5-9c01-1b2870b1f1b1") handler.set_tiprack([tip_rack]) # Set the tip rack for the handler asyncio.run(handler.setup()) # Initialize the handler and setup the connection + from pylabrobot.resources import set_volume_tracking + + # from pylabrobot.resources import set_tip_tracking + set_volume_tracking(enabled=True) + plate2.set_well_liquids([("Water", 100)] * plate2.num_items) asyncio.run(handler.create_protocol(protocol_name="Test Protocol")) # Initialize the backend and setup the connection # asyncio.run(handler.pick_up_tips(tip_rack.children[:8],[0,1,2,3,4,5,6,7])) diff --git a/unilabos/resources/graphio.py b/unilabos/resources/graphio.py index 3ed2e36..956e7fb 100644 --- a/unilabos/resources/graphio.py +++ b/unilabos/resources/graphio.py @@ -429,6 +429,20 @@ def resource_ulab_to_plr(resource: dict, plr_model=False) -> "ResourcePLR": def resource_plr_to_ulab(resource_plr: "ResourcePLR", parent_name: str = None): + def replace_plr_type_to_ulab(source: str): + replace_info = { + "plate": "plate", + "well": "well", + "tip_spot": "container", + "trash": "container", + "deck": "deck", + "tip_rack": "container", + } + if source in replace_info: + return replace_info[source] + else: + print("转换pylabrobot的时候,出现未知类型", source) + return "container" def resource_plr_to_ulab_inner(d: dict, all_states: dict) -> dict: r = { "id": d["name"], @@ -436,7 +450,7 @@ def resource_plr_to_ulab(resource_plr: "ResourcePLR", parent_name: str = None): "sample_id": None, "children": [resource_plr_to_ulab_inner(child, all_states) for child in d["children"]], "parent": d["parent_name"] if d["parent_name"] else parent_name if parent_name else None, - "type": "device", # FIXME plr自带的type是python class name + "type": replace_plr_type_to_ulab(d.get("category")), # FIXME plr自带的type是python class name "class": d.get("class", ""), "position": ( {"x": d["location"]["x"], "y": d["location"]["y"], "z": d["location"]["z"]} diff --git a/unilabos/ros/msgs/message_converter.py b/unilabos/ros/msgs/message_converter.py index 230ad1f..932ff60 100644 --- a/unilabos/ros/msgs/message_converter.py +++ b/unilabos/ros/msgs/message_converter.py @@ -367,7 +367,7 @@ def convert_to_ros_msg(ros_msg_type: Union[Type, Any], obj: Any) -> Any: logger.warning(f"Not Supported type: {td}") setattr(ros_msg, key, []) # FIXME elif "array.array" in str(type(attr)): - if attr.typecode == "f": + if attr.typecode == "f" or attr.typecode == "d": setattr(ros_msg, key, [float(i) for i in value]) else: setattr(ros_msg, key, value) diff --git a/unilabos/ros/nodes/base_device_node.py b/unilabos/ros/nodes/base_device_node.py index b226edc..3589bd4 100644 --- a/unilabos/ros/nodes/base_device_node.py +++ b/unilabos/ros/nodes/base_device_node.py @@ -660,7 +660,7 @@ class BaseROS2DeviceNode(Node, Generic[T]): if len(action_kwargs[k]) > 1: for i in action_kwargs[k]: r = ResourceGet.Request() - r.id = i["id"] + r.id = i["id"] # splash optional r.with_children = True response = await self._resource_clients["resource_get"].call_async(r) current_resources.extend(response.resources) diff --git a/unilabos/utils/log.py b/unilabos/utils/log.py index eb04fd0..61c95a1 100644 --- a/unilabos/utils/log.py +++ b/unilabos/utils/log.py @@ -148,7 +148,7 @@ def configure_logger(): """配置日志记录器""" # 获取根日志记录器 root_logger = logging.getLogger() - root_logger.setLevel(logging.INFO) # 修改为DEBUG以显示所有级别 + root_logger.setLevel(logging.DEBUG) # 修改为DEBUG以显示所有级别 # 移除已存在的处理器 for handler in root_logger.handlers[:]: @@ -156,7 +156,7 @@ def configure_logger(): # 创建控制台处理器 console_handler = logging.StreamHandler() - console_handler.setLevel(logging.INFO) # 修改为DEBUG以显示所有级别 + console_handler.setLevel(logging.DEBUG) # 修改为DEBUG以显示所有级别 # 使用自定义的颜色格式化器 color_formatter = ColoredFormatter() From 3f7b991dd978ae2e7b257ebec5f916c6923c3be2 Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Thu, 17 Jul 2025 22:36:45 +0800 Subject: [PATCH 55/96] Update 9320 --- .../devices/liquid_handling/prcxi/prcxi.py | 292 ++++++++++++++++-- 1 file changed, 262 insertions(+), 30 deletions(-) diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index c069574..ee7c0a9 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -961,71 +961,303 @@ class PRCXI9300Api: if __name__ == "__main__": + # # Example usage + # # 1. 用导出的json,给每个T1 T2板子设定相应的物料,如果是孔板和枪头盒,要对应区分 + # # 2. 设计一个单点动作流程,可以跑 + # # 3. + # deck = PRCXI9300Deck(name="PRCXI_Deck", size_x=100, size_y=100, size_z=100) + # plate1 = PRCXI9300Container(name="rackT1", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) + # plate1.load_state({ + # "Material": { + # "uuid": "80652665f6a54402b2408d50b40398df", + # "Co#de": "ZX-001-1000", + # "Name": "1000μL Tip头", + # "SummaryName": "1000μL Tip头", + # "PipetteHeight": 100, + # "materialEnum": 1 + # } + # }) + + # plate2 = PRCXI9300Container(name="plateT2", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) + # plate2.load_state({ + # "Material": { + # "uuid": "57b1e4711e9e4a32b529f3132fc5931f", + # } + # }) + + # plate3 = PRCXI9300Container(name="plateT3", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) + # plate3.load_state({ + # "Material": { + # "uuid": "57b1e4711e9e4a32b529f3132fc5931f", + # } + # }) + + # plate4 = PRCXI9300Container(name="rackT4", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) + # plate4.load_state({ + # "Material": { + # "uuid": "80652665f6a54402b2408d50b40398df", + # "Code": "ZX-001-1000", + # "Name": "1000μL Tip头", + # "SummaryName": "1000μL Tip头", + # "PipetteHeight": 100, + # "materialEnum": 1 + # } + # }) + + # plate5 = PRCXI9300Container(name="plateT5", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) + # plate5.load_state({ + # "Material": { + # "uuid": "57b1e4711e9e4a32b529f3132fc5931f", + # } + # }) + # plate6 = PRCXI9300Trash(name="trash", size_x=50, size_y=500, size_z=10, category="trash") + # plate6.load_state({ + # "Material": { + # "uuid": "57b1e4711e9e4a32b529f3132fc5931f", + # } + # }) + + # from pylabrobot.resources.opentrons.tip_racks import tipone_96_tiprack_200ul + # from pylabrobot.resources.opentrons.plates import corning_96_wellplate_360ul_flat + + # tip_rack = tipone_96_tiprack_200ul("TipRack") + # well_containers = corning_96_wellplate_360ul_flat("Plate") + # # from pprint import pprint + # # pprint(well_containers.children) + # plate1.assign_child_resource(tip_rack, location=Coordinate(0, 0, 0)) + # plate2.assign_child_resource(well_containers, location=Coordinate(0, 0, 0)) + + # deck.assign_child_resource(plate1, location=Coordinate(0, 0, 0)) + # deck.assign_child_resource(plate2, location=Coordinate(0, 0, 0)) + # deck.assign_child_resource(plate3, location=Coordinate(0, 0, 0)) + # deck.assign_child_resource(plate4, location=Coordinate(0, 0, 0)) + # deck.assign_child_resource(plate5, location=Coordinate(0, 0, 0)) + # deck.assign_child_resource(plate6, location=Coordinate(0, 0, 0)) + + # print(plate2) + # # plate_2_liquids = [[(None, 500)]]*96 + + # # plate2.set_well_liquids(plate_2_liquids) + + + # handler = PRCXI9300Handler(deck=deck, host="192.168.3.9", port=9999, timeout=10.0, setup=False, debug=True, matrix_id="fd383e6d-2d0e-40b5-9c01-1b2870b1f1b1") + # handler.set_tiprack([tip_rack]) # Set the tip rack for the handler + # asyncio.run(handler.setup()) # Initialize the handler and setup the connection + # from pylabrobot.resources import set_volume_tracking + + # # from pylabrobot.resources import set_tip_tracking + # set_volume_tracking(enabled=True) + # plate2.set_well_liquids([("Water", 100)] * plate2.num_items) + # asyncio.run(handler.create_protocol(protocol_name="Test Protocol")) # Initialize the backend and setup the connection + # # asyncio.run(handler.pick_up_tips(tip_rack.children[:8],[0,1,2,3,4,5,6,7])) + + # # asyncio.run(handler.aspirate(well_containers.children[:8],[50]*8, [0,1,2,3,4,5,6,7])) + # # asyncio.run(handler.dispense(well_containers.children[:8],[50]*8,[0,1,2,3,4,5,6,7])) + # # asyncio.run(handler.drop_tips(tip_rack.children[8:16],[0,1,2,3,4,5,6,7])) + # # asyncio.run(handler.discard_tips()) + # # asyncio.run(handler.mix(well_containers.children[:8 + # # ], mix_time=3, mix_vol=50, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) + # #print(json.dumps(handler._unilabos_backend.steps_todo_list, indent=2)) # Print matrix info + # asyncio.run(handler.add_liquid( + # asp_vols=[100]*16, + # dis_vols=[100]*16, + # reagent_sources=well_containers.children[-16:], + # targets=well_containers.children[:16], + # use_channels=[0, 1, 2, 3, 4, 5, 6, 7], + # flow_rates=[None] * 32, + # offsets=[Coordinate(0, 0, 0)] * 32, + # liquid_height=[None] * 16, + # blow_out_air_volume=[None] * 16, + # delays=None, + # mix_time=3, + # mix_vol=50, + # spread="wide", + # )) + + # # asyncio.run(handler.remove_liquid( + # # vols=[100]*16, + # # sources=well_containers.children[-16:], + # # waste_liquid=well_containers.children[:16], # 这个有些奇怪,但是好像也只能这么写 + # # use_channels=[0, 1, 2, 3, 4, 5, 6, 7], + # # flow_rates=[None] * 32, + # # offsets=[Coordinate(0, 0, 0)] * 32, + # # liquid_height=[None] * 32, + # # blow_out_air_volume=[None] * 32, + # # spread="wide", + # # )) + # # asyncio.run(handler.transfer_liquid( + # # asp_vols=[100]*16, + # # dis_vols=[100]*16, + # # tip_racks=[tip_rack], + # # sources=well_containers.children[-16:], + # # targets=well_containers.children[:16], + # # use_channels=[0, 1, 2, 3, 4, 5, 6, 7], + # # offsets=[Coordinate(0, 0, 0)] * 32, + # # asp_flow_rates=[None] * 16, + # # dis_flow_rates=[None] * 16, + # # liquid_height=[None] * 32, + # # blow_out_air_volume=[None] * 32, + # # mix_times=3, + # # mix_vol=50, + # # spread="wide", + # # )) + # print(json.dumps(handler._unilabos_backend.steps_todo_list, indent=2)) # Print matrix info + # # input("pick_up_tips add step") + # #asyncio.run(handler.run_protocol()) # Run the protocol + # # input("Running protocol...") + # # input("Press Enter to continue...") # Wait for user input before proceeding + # # print("PRCXI9300Handler initialized with deck and host settings.") + + + + + + + + + + + + + + + + + + + + + + + + + # Example usage # 1. 用导出的json,给每个T1 T2板子设定相应的物料,如果是孔板和枪头盒,要对应区分 # 2. 设计一个单点动作流程,可以跑 # 3. deck = PRCXI9300Deck(name="PRCXI_Deck", size_x=100, size_y=100, size_z=100) - plate1 = PRCXI9300Container(name="rackT1", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) + plate1 = PRCXI9300Container(name="HPLCPlateT1", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) plate1.load_state({ "Material": { - "uuid": "80652665f6a54402b2408d50b40398df", - "Co#de": "ZX-001-1000", - "Name": "1000μL Tip头", - "SummaryName": "1000μL Tip头", - "PipetteHeight": 100, - "materialEnum": 1 + "uuid": "548bbc3df0d4447586f2c19d2c0c0c55", + "Code": "HPLC01", + "Name": "HPLC料盘" } }) plate2 = PRCXI9300Container(name="plateT2", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) plate2.load_state({ "Material": { - "uuid": "57b1e4711e9e4a32b529f3132fc5931f", + "uuid": "04211a2dc93547fe9bf6121eac533650" } }) + + #储液槽 plate3 = PRCXI9300Container(name="plateT3", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) plate3.load_state({ "Material": { - "uuid": "57b1e4711e9e4a32b529f3132fc5931f", + "uuid": "04211a2dc93547fe9bf6121eac533650" } }) - plate4 = PRCXI9300Container(name="rackT4", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) + plate4 = PRCXI9300Trash(name="trash", size_x=50, size_y=50, size_z=10, category="trash", ordering=collections.OrderedDict()) plate4.load_state({ "Material": { - "uuid": "80652665f6a54402b2408d50b40398df", - "Code": "ZX-001-1000", - "Name": "1000μL Tip头", - "SummaryName": "1000μL Tip头", - "PipetteHeight": 100, - "materialEnum": 1 + "uuid": "730067cf07ae43849ddf4034299030e9" } }) plate5 = PRCXI9300Container(name="plateT5", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) plate5.load_state({ "Material": { - "uuid": "57b1e4711e9e4a32b529f3132fc5931f", + "uuid": "04211a2dc93547fe9bf6121eac533650" } }) - plate6 = PRCXI9300Trash(name="trash", size_x=50, size_y=500, size_z=10, category="trash") + + plate6 = PRCXI9300Container(name="plateT6", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) plate6.load_state({ + "Material": { + "uuid": "04211a2dc93547fe9bf6121eac533650" + } + }) + + plate7 = PRCXI9300Container(name="plateT7", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) + plate7.load_state({ + "Material": { + "uuid": "04211a2dc93547fe9bf6121eac533650" + } + }) + + plate8 = PRCXI9300Container(name="rackT8", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) + plate8.load_state({ + "Material": { + "uuid": "068b3815e36b4a72a59bae017011b29f", + "Code": "ZX-001-10+", + "Name": "10μL加长 Tip头" + } + }) + + plate9 = PRCXI9300Container(name="plateT9", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) + plate9.load_state({ + "Material": { + "uuid": "04211a2dc93547fe9bf6121eac533650" + } + }) + + plate10 = PRCXI9300Container(name="plateT10", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) + plate10.load_state({ + "Material": { + "uuid": "04211a2dc93547fe9bf6121eac533650" + } + }) + + + + plate11 = PRCXI9300Container(name="plateT11", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) + plate11.load_state({ "Material": { "uuid": "57b1e4711e9e4a32b529f3132fc5931f", } }) - from pylabrobot.resources.opentrons.tip_racks import tipone_96_tiprack_200ul - from pylabrobot.resources.opentrons.plates import corning_96_wellplate_360ul_flat - tip_rack = tipone_96_tiprack_200ul("TipRack") - well_containers = corning_96_wellplate_360ul_flat("Plate") + plate12 = PRCXI9300Container(name="plateT12", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) + plate12.load_state({ + "Material": { + "uuid": "04211a2dc93547fe9bf6121eac533650" + } + }) + + + plate13 = PRCXI9300Container(name="plateT13", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) + plate13.load_state({ + "Material": { + "uuid": "04211a2dc93547fe9bf6121eac533650" + } + }) + + from pylabrobot.resources.opentrons.tip_racks import tipone_96_tiprack_200ul,opentrons_96_tiprack_10ul + from pylabrobot.resources.opentrons.plates import corning_96_wellplate_360ul_flat, nest_96_wellplate_2ml_deep + + tip_rack = opentrons_96_tiprack_10ul("TipRack") + well_containers = nest_96_wellplate_2ml_deep("Plate") # from pprint import pprint # pprint(well_containers.children) - plate1.assign_child_resource(tip_rack, location=Coordinate(0, 0, 0)) + plate1.assign_child_resource(well_containers, location=Coordinate(0, 0, 0)) plate2.assign_child_resource(well_containers, location=Coordinate(0, 0, 0)) + plate3.assign_child_resource(well_containers, location=Coordinate(0, 0, 0)) + plate4.assign_child_resource(well_containers, location=Coordinate(0, 0, 0)) + plate5.assign_child_resource(well_containers, location=Coordinate(0, 0, 0)) + plate6.assign_child_resource(well_containers, location=Coordinate(0, 0, 0)) + plate7.assign_child_resource(well_containers, location=Coordinate(0, 0, 0)) + plate8.assign_child_resource(tip_rack, location=Coordinate(0, 0, 0)) + plate9.assign_child_resource(well_containers, location=Coordinate(0, 0, 0)) + plate10.assign_child_resource(well_containers, location=Coordinate(0, 0, 0)) + plate11.assign_child_resource(well_containers, location=Coordinate(0, 0, 0)) + plate12.assign_child_resource(well_containers, location=Coordinate(0, 0, 0)) + plate13.assign_child_resource(well_containers, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate1, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate2, location=Coordinate(0, 0, 0)) @@ -1033,11 +1265,14 @@ if __name__ == "__main__": deck.assign_child_resource(plate4, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate5, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate6, location=Coordinate(0, 0, 0)) + deck.assign_child_resource(plate7, location=Coordinate(0, 0, 0)) + deck.assign_child_resource(plate8, location=Coordinate(0, 0, 0)) + deck.assign_child_resource(plate9, location=Coordinate(0, 0, 0)) + deck.assign_child_resource(plate10, location=Coordinate(0, 0, 0)) + deck.assign_child_resource(plate11, location=Coordinate(0, 0, 0)) + deck.assign_child_resource(plate12, location=Coordinate(0, 0, 0)) + deck.assign_child_resource(plate13, location=Coordinate(0, 0, 0)) - print(plate2) - # plate_2_liquids = [[(None, 500)]]*96 - - # plate2.set_well_liquids(plate_2_liquids) handler = PRCXI9300Handler(deck=deck, host="192.168.3.9", port=9999, timeout=10.0, setup=False, debug=True, matrix_id="fd383e6d-2d0e-40b5-9c01-1b2870b1f1b1") @@ -1108,6 +1343,3 @@ if __name__ == "__main__": # input("Press Enter to continue...") # Wait for user input before proceeding # print("PRCXI9300Handler initialized with deck and host settings.") - - -# 但是怎么丢tip?这个需要手动设置一下? \ No newline at end of file From 743ec8839ded6dcb6ca0c539e500f3f2ebe79eb0 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Thu, 17 Jul 2025 23:01:30 +0800 Subject: [PATCH 56/96] get_well_container&get_tip_rack --- .../devices/liquid_handling/prcxi/prcxi.py | 99 ++++++++++--------- 1 file changed, 54 insertions(+), 45 deletions(-) diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index ee7c0a9..55ae969 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -66,14 +66,14 @@ class PRCXI9300Deck(Deck): self.slots = [None] * 6 # PRCXI 9300 有 6 个槽位 -class PRCXI9300Container(Plate): +class PRCXI9300Container(Plate, TipRack): """PRCXI 9300 的专用 Deck 类,继承自 Deck。 该类定义了 PRCXI 9300 的工作台布局和槽位信息。 """ - def __init__(self, name: str, size_x: float, size_y: float, size_z: float, category: str, ordering: collections.OrderedDict): - super().__init__(name, size_x, size_y, size_z, category=category, ordering=ordering) + def __init__(self, name: str, size_x: float, size_y: float, size_z: float, category: str, ordering: collections.OrderedDict, model: Optional[str] = None,): + super().__init__(name, size_x, size_y, size_z, category=category, ordering=ordering, model=model) self._unilabos_state = {} def load_state(self, state: Dict[str, Any]) -> None: @@ -1018,7 +1018,7 @@ if __name__ == "__main__": # }) # from pylabrobot.resources.opentrons.tip_racks import tipone_96_tiprack_200ul - # from pylabrobot.resources.opentrons.plates import corning_96_wellplate_360ul_flat + # from pylabrobot.resources.opentrons.plates import corning_96_wellplate_360ul_flat # tip_rack = tipone_96_tiprack_200ul("TipRack") # well_containers = corning_96_wellplate_360ul_flat("Plate") @@ -1034,7 +1034,7 @@ if __name__ == "__main__": # deck.assign_child_resource(plate5, location=Coordinate(0, 0, 0)) # deck.assign_child_resource(plate6, location=Coordinate(0, 0, 0)) - # print(plate2) + # print(plate2) # # plate_2_liquids = [[(None, 500)]]*96 # # plate2.set_well_liquids(plate_2_liquids) @@ -1108,43 +1108,12 @@ if __name__ == "__main__": # # input("Press Enter to continue...") # Wait for user input before proceeding # # print("PRCXI9300Handler initialized with deck and host settings.") - - - - - - - - - - - - - - - - - - - - - - - - # Example usage # 1. 用导出的json,给每个T1 T2板子设定相应的物料,如果是孔板和枪头盒,要对应区分 # 2. 设计一个单点动作流程,可以跑 # 3. deck = PRCXI9300Deck(name="PRCXI_Deck", size_x=100, size_y=100, size_z=100) - plate1 = PRCXI9300Container(name="HPLCPlateT1", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) - plate1.load_state({ - "Material": { - "uuid": "548bbc3df0d4447586f2c19d2c0c0c55", - "Code": "HPLC01", - "Name": "HPLC料盘" - } - }) + plate2 = PRCXI9300Container(name="plateT2", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) plate2.load_state({ @@ -1152,7 +1121,7 @@ if __name__ == "__main__": "uuid": "04211a2dc93547fe9bf6121eac533650" } }) - + #储液槽 plate3 = PRCXI9300Container(name="plateT3", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) @@ -1241,8 +1210,44 @@ if __name__ == "__main__": from pylabrobot.resources.opentrons.tip_racks import tipone_96_tiprack_200ul,opentrons_96_tiprack_10ul from pylabrobot.resources.opentrons.plates import corning_96_wellplate_360ul_flat, nest_96_wellplate_2ml_deep - tip_rack = opentrons_96_tiprack_10ul("TipRack") - well_containers = nest_96_wellplate_2ml_deep("Plate") + + def get_well_container(name: str) -> PRCXI9300Container: + well_containers = corning_96_wellplate_360ul_flat(name).serialize() + plate = PRCXI9300Container(name=name, size_x=50, size_y=50, size_z=10, category="plate", + ordering=collections.OrderedDict()) + plate_serialized = plate.serialize() + plate_serialized["parent_name"] = deck.name + well_containers.update({k: v for k, v in plate_serialized.items() if k not in ["children"]}) + new_plate: PRCXI9300Container = PRCXI9300Container.deserialize(well_containers) + return new_plate + + def get_tip_rack(name: str) -> PRCXI9300Container: + tip_racks = opentrons_96_tiprack_10ul("name").serialize() + tip_rack = PRCXI9300Container(name=name, size_x=50, size_y=50, size_z=10, category="tip_rack", + ordering=collections.OrderedDict()) + tip_rack_serialized = tip_rack.serialize() + tip_rack_serialized["parent_name"] = deck.name + tip_racks.update({k: v for k, v in tip_rack_serialized.items() if k not in ["children"]}) + new_tip_rack: PRCXI9300Container = PRCXI9300Container.deserialize(tip_racks) + return new_tip_rack + + plate1 = get_well_container("HPLCPlateT1") + plate1.load_state({ + "Material": { + "uuid": "548bbc3df0d4447586f2c19d2c0c0c55", + "Code": "HPLC01", + "Name": "HPLC料盘" + } + }) + + plate2 = get_well_container("HPLCPlateT1") + plate2.load_state({ + "Material": { + "uuid": "548bbc3df0d4447586f2c19d2c0c0c55", + "Code": "HPLC01", + "Name": "HPLC料盘" + } + }) # from pprint import pprint # pprint(well_containers.children) plate1.assign_child_resource(well_containers, location=Coordinate(0, 0, 0)) @@ -1260,7 +1265,9 @@ if __name__ == "__main__": plate13.assign_child_resource(well_containers, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate1, location=Coordinate(0, 0, 0)) - deck.assign_child_resource(plate2, location=Coordinate(0, 0, 0)) + + + deck.assign_child_resource(plate3, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate4, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate5, location=Coordinate(0, 0, 0)) @@ -1279,10 +1286,12 @@ if __name__ == "__main__": handler.set_tiprack([tip_rack]) # Set the tip rack for the handler asyncio.run(handler.setup()) # Initialize the handler and setup the connection from pylabrobot.resources import set_volume_tracking - # from pylabrobot.resources import set_tip_tracking set_volume_tracking(enabled=True) - plate2.set_well_liquids([("Water", 100)] * plate2.num_items) + + plate1.set_well_liquids([("Water", 100)] * plate1.num_items) + + asyncio.run(handler.create_protocol(protocol_name="Test Protocol")) # Initialize the backend and setup the connection # asyncio.run(handler.pick_up_tips(tip_rack.children[:8],[0,1,2,3,4,5,6,7])) @@ -1296,8 +1305,8 @@ if __name__ == "__main__": asyncio.run(handler.add_liquid( asp_vols=[100]*16, dis_vols=[100]*16, - reagent_sources=well_containers.children[-16:], - targets=well_containers.children[:16], + reagent_sources=final_plate_2.children[-16:], + targets=final_plate_2.children[:16], use_channels=[0, 1, 2, 3, 4, 5, 6, 7], flow_rates=[None] * 32, offsets=[Coordinate(0, 0, 0)] * 32, From 2d30fb79c12770fb7ed71f4681f407a801f812cb Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Thu, 17 Jul 2025 23:02:08 +0800 Subject: [PATCH 57/96] update --- unilabos/devices/liquid_handling/prcxi/prcxi.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index ee7c0a9..7f8f5aa 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -1213,8 +1213,6 @@ if __name__ == "__main__": } }) - - plate11 = PRCXI9300Container(name="plateT11", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) plate11.load_state({ "Material": { @@ -1273,9 +1271,7 @@ if __name__ == "__main__": deck.assign_child_resource(plate12, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate13, location=Coordinate(0, 0, 0)) - - - handler = PRCXI9300Handler(deck=deck, host="192.168.3.9", port=9999, timeout=10.0, setup=False, debug=True, matrix_id="fd383e6d-2d0e-40b5-9c01-1b2870b1f1b1") + handler = PRCXI9300Handler(deck=deck, host="10.181.102.13", port=9999, timeout=10.0, setup=False, debug=True, matrix_id="fd383e6d-2d0e-40b5-9c01-1b2870b1f1b1") handler.set_tiprack([tip_rack]) # Set the tip rack for the handler asyncio.run(handler.setup()) # Initialize the handler and setup the connection from pylabrobot.resources import set_volume_tracking From 6eaa8e1c63089e988daf865534b91da01b584f70 Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Thu, 17 Jul 2025 23:23:37 +0800 Subject: [PATCH 58/96] Update 9320 --- .../devices/liquid_handling/prcxi/prcxi.py | 256 ++++++++---------- 1 file changed, 120 insertions(+), 136 deletions(-) diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index 4a779c6..c9d3930 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -1114,101 +1114,9 @@ if __name__ == "__main__": # 3. deck = PRCXI9300Deck(name="PRCXI_Deck", size_x=100, size_y=100, size_z=100) - - plate2 = PRCXI9300Container(name="plateT2", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) - plate2.load_state({ - "Material": { - "uuid": "04211a2dc93547fe9bf6121eac533650" - } - }) - - #储液槽 - - plate3 = PRCXI9300Container(name="plateT3", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) - plate3.load_state({ - "Material": { - "uuid": "04211a2dc93547fe9bf6121eac533650" - } - }) - - plate4 = PRCXI9300Trash(name="trash", size_x=50, size_y=50, size_z=10, category="trash", ordering=collections.OrderedDict()) - plate4.load_state({ - "Material": { - "uuid": "730067cf07ae43849ddf4034299030e9" - } - }) - - plate5 = PRCXI9300Container(name="plateT5", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) - plate5.load_state({ - "Material": { - "uuid": "04211a2dc93547fe9bf6121eac533650" - } - }) - - plate6 = PRCXI9300Container(name="plateT6", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) - plate6.load_state({ - "Material": { - "uuid": "04211a2dc93547fe9bf6121eac533650" - } - }) - - plate7 = PRCXI9300Container(name="plateT7", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) - plate7.load_state({ - "Material": { - "uuid": "04211a2dc93547fe9bf6121eac533650" - } - }) - - plate8 = PRCXI9300Container(name="rackT8", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) - plate8.load_state({ - "Material": { - "uuid": "068b3815e36b4a72a59bae017011b29f", - "Code": "ZX-001-10+", - "Name": "10μL加长 Tip头" - } - }) - - plate9 = PRCXI9300Container(name="plateT9", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) - plate9.load_state({ - "Material": { - "uuid": "04211a2dc93547fe9bf6121eac533650" - } - }) - - plate10 = PRCXI9300Container(name="plateT10", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) - plate10.load_state({ - "Material": { - "uuid": "04211a2dc93547fe9bf6121eac533650" - } - }) - - plate11 = PRCXI9300Container(name="plateT11", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) - plate11.load_state({ - "Material": { - "uuid": "57b1e4711e9e4a32b529f3132fc5931f", - } - }) - - - plate12 = PRCXI9300Container(name="plateT12", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) - plate12.load_state({ - "Material": { - "uuid": "04211a2dc93547fe9bf6121eac533650" - } - }) - - - plate13 = PRCXI9300Container(name="plateT13", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) - plate13.load_state({ - "Material": { - "uuid": "04211a2dc93547fe9bf6121eac533650" - } - }) - from pylabrobot.resources.opentrons.tip_racks import tipone_96_tiprack_200ul,opentrons_96_tiprack_10ul from pylabrobot.resources.opentrons.plates import corning_96_wellplate_360ul_flat, nest_96_wellplate_2ml_deep - def get_well_container(name: str) -> PRCXI9300Container: well_containers = corning_96_wellplate_360ul_flat(name).serialize() plate = PRCXI9300Container(name=name, size_x=50, size_y=50, size_z=10, category="plate", @@ -1238,36 +1146,113 @@ if __name__ == "__main__": } }) - plate2 = get_well_container("HPLCPlateT1") + plate2 = get_well_container("PlateT2") plate2.load_state({ "Material": { - "uuid": "548bbc3df0d4447586f2c19d2c0c0c55", - "Code": "HPLC01", - "Name": "HPLC料盘" + "uuid": "04211a2dc93547fe9bf6121eac533650", } }) + + plate3 = get_well_container("PlateT3") + plate3.load_state({ + "Material": { + "uuid": "04211a2dc93547fe9bf6121eac533650", + } + }) + + trash = PRCXI9300Trash(name="trash", size_x=50, size_y=50, size_z=10, category="trash", ordering=collections.OrderedDict()) + trash.load_state({ + "Material": { + "uuid": "730067cf07ae43849ddf4034299030e9" + } + }) + + plate5 = get_well_container("PlateT5") + plate5.load_state({ + "Material": { + "uuid": "04211a2dc93547fe9bf6121eac533650", + } + }) + + plate6 = get_well_container("PlateT6") + plate6.load_state({ + "Material": { + "uuid": "04211a2dc93547fe9bf6121eac533650" + } + }) + + plate7 = PRCXI9300Container(name="plateT7", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) + plate7.load_state({ + "Material": { + "uuid": "04211a2dc93547fe9bf6121eac533650" + } + }) + + plate8 = get_well_container("RackT8") + plate8.load_state({ + "Material": { + "uuid": "068b3815e36b4a72a59bae017011b29f", + "Code": "ZX-001-10+", + "Name": "10μL加长 Tip头" + } + }) + + plate9 = get_well_container("PlateT9") + plate9.load_state({ + "Material": { + "uuid": "04211a2dc93547fe9bf6121eac533650" + } + }) + + plate10 = get_well_container("PlateT10") + plate10.load_state({ + "Material": { + "uuid": "04211a2dc93547fe9bf6121eac533650" + } + }) + + plate11 = get_well_container("PlateT11") + plate11.load_state({ + "Material": { + "uuid": "57b1e4711e9e4a32b529f3132fc5931f", + } + }) + + + plate12 = get_well_container("PlateT12") + plate12.load_state({ + "Material": { + "uuid": "04211a2dc93547fe9bf6121eac533650" + } + }) + + + plate13 = get_well_container("PlateT13") + plate13.load_state({ + "Material": { + "uuid": "04211a2dc93547fe9bf6121eac533650" + } + }) + # from pprint import pprint # pprint(well_containers.children) - plate1.assign_child_resource(well_containers, location=Coordinate(0, 0, 0)) - plate2.assign_child_resource(well_containers, location=Coordinate(0, 0, 0)) - plate3.assign_child_resource(well_containers, location=Coordinate(0, 0, 0)) - plate4.assign_child_resource(well_containers, location=Coordinate(0, 0, 0)) - plate5.assign_child_resource(well_containers, location=Coordinate(0, 0, 0)) - plate6.assign_child_resource(well_containers, location=Coordinate(0, 0, 0)) - plate7.assign_child_resource(well_containers, location=Coordinate(0, 0, 0)) - plate8.assign_child_resource(tip_rack, location=Coordinate(0, 0, 0)) - plate9.assign_child_resource(well_containers, location=Coordinate(0, 0, 0)) - plate10.assign_child_resource(well_containers, location=Coordinate(0, 0, 0)) - plate11.assign_child_resource(well_containers, location=Coordinate(0, 0, 0)) - plate12.assign_child_resource(well_containers, location=Coordinate(0, 0, 0)) - plate13.assign_child_resource(well_containers, location=Coordinate(0, 0, 0)) + plate1.assign_child_resource(plate1, location=Coordinate(0, 0, 0)) + plate2.assign_child_resource(plate2, location=Coordinate(0, 0, 0)) + plate3.assign_child_resource(plate3, location=Coordinate(0, 0, 0)) + trash.assign_child_resource(trash, location=Coordinate(0, 0, 0)) + plate5.assign_child_resource(plate5, location=Coordinate(0, 0, 0)) + plate6.assign_child_resource(plate6, location=Coordinate(0, 0, 0)) + plate7.assign_child_resource(plate7, location=Coordinate(0, 0, 0)) + plate8.assign_child_resource(plate8, location=Coordinate(0, 0, 0)) + plate9.assign_child_resource(plate9, location=Coordinate(0, 0, 0)) + plate10.assign_child_resource(plate10, location=Coordinate(0, 0, 0)) + plate11.assign_child_resource(plate11, location=Coordinate(0, 0, 0)) + plate12.assign_child_resource(plate12, location=Coordinate(0, 0, 0)) + plate13.assign_child_resource(plate13, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate1, location=Coordinate(0, 0, 0)) - - - deck.assign_child_resource(plate3, location=Coordinate(0, 0, 0)) - deck.assign_child_resource(plate4, location=Coordinate(0, 0, 0)) + deck.assign_child_resource(trash, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate5, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate6, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate7, location=Coordinate(0, 0, 0)) @@ -1279,40 +1264,39 @@ if __name__ == "__main__": deck.assign_child_resource(plate13, location=Coordinate(0, 0, 0)) handler = PRCXI9300Handler(deck=deck, host="10.181.102.13", port=9999, timeout=10.0, setup=False, debug=True, matrix_id="fd383e6d-2d0e-40b5-9c01-1b2870b1f1b1") - handler.set_tiprack([tip_rack]) # Set the tip rack for the handler + handler.set_tiprack([plate8]) # Set the tip rack for the handler asyncio.run(handler.setup()) # Initialize the handler and setup the connection from pylabrobot.resources import set_volume_tracking # from pylabrobot.resources import set_tip_tracking set_volume_tracking(enabled=True) - plate1.set_well_liquids([("Water", 100)] * plate1.num_items) - + plate8.set_well_liquids([("Water", 100) if (i % 8 == 0 and i // 8 < 6) else (None, 100) for i in range(96)]) # Set liquids for every 8 wells in plate8 asyncio.run(handler.create_protocol(protocol_name="Test Protocol")) # Initialize the backend and setup the connection - # asyncio.run(handler.pick_up_tips(tip_rack.children[:8],[0,1,2,3,4,5,6,7])) - - # asyncio.run(handler.aspirate(well_containers.children[:8],[50]*8, [0,1,2,3,4,5,6,7])) - # asyncio.run(handler.dispense(well_containers.children[:8],[50]*8,[0,1,2,3,4,5,6,7])) - # asyncio.run(handler.drop_tips(tip_rack.children[8:16],[0,1,2,3,4,5,6,7])) + asyncio.run(handler.pick_up_tips(plate8.children[3],[1])) + asyncio.run(handler.aspirate(plate11.children[1],[10], [1])) + asyncio.run(handler.dispense(plate1.children[3],[10],[1])) + asyncio.run(handler.mix(plate1.children[3], mix_time=3, mix_vol=5, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) + asyncio.run(handler.discard_tips()) # asyncio.run(handler.discard_tips()) # asyncio.run(handler.mix(well_containers.children[:8 # ], mix_time=3, mix_vol=50, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) #print(json.dumps(handler._unilabos_backend.steps_todo_list, indent=2)) # Print matrix info - asyncio.run(handler.add_liquid( - asp_vols=[100]*16, - dis_vols=[100]*16, - reagent_sources=final_plate_2.children[-16:], - targets=final_plate_2.children[:16], - use_channels=[0, 1, 2, 3, 4, 5, 6, 7], - flow_rates=[None] * 32, - offsets=[Coordinate(0, 0, 0)] * 32, - liquid_height=[None] * 16, - blow_out_air_volume=[None] * 16, - delays=None, - mix_time=3, - mix_vol=50, - spread="wide", - )) + # asyncio.run(handler.add_liquid( + # asp_vols=[100]*16, + # dis_vols=[100]*16, + # reagent_sources=final_plate_2.children[-16:], + # targets=final_plate_2.children[:16], + # use_channels=[0, 1, 2, 3, 4, 5, 6, 7], + # flow_rates=[None] * 32, + # offsets=[Coordinate(0, 0, 0)] * 32, + # liquid_height=[None] * 16, + # blow_out_air_volume=[None] * 16, + # delays=None, + # mix_time=3, + # mix_vol=50, + # spread="wide", + # )) # asyncio.run(handler.remove_liquid( # vols=[100]*16, From 89808285ed6bd09be72abdee64730a037ea4a88d Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Thu, 17 Jul 2025 23:44:59 +0800 Subject: [PATCH 59/96] update --- .../devices/liquid_handling/prcxi/prcxi.py | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index c9d3930..804d746 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -427,10 +427,7 @@ class PRCXI9300Backend(LiquidHandlerBackend): async def pick_up_tips(self, ops: List[Pickup], use_channels: List[int] = None): """Pick up tips from the specified resource.""" - - if len(ops) != 8: - raise ValueError(f"PRCXI9300Backend pick_up_tips: Expected 8 pickups, got {len(ops)}") - + plate_indexes = [] for op in ops: plate = op.resource.parent.parent @@ -451,7 +448,10 @@ class PRCXI9300Backend(LiquidHandlerBackend): PlateNo = plate_indexes[0] + 1 hole_col = tip_columns[0] + 1 - step = self.api_client.Load(dosage=0, plate_no=PlateNo, is_whole_plate=False, hole_row=1, hole_col=hole_col, + if self.channel_num == 1: + hole_row = tipspot_index % 8 + 1 + + step = self.api_client.Load(dosage=0, plate_no=PlateNo, is_whole_plate=False, hole_row=hole_row, hole_col=hole_col, blending_times=0, balance_height=0, plate_or_hole=f"H{hole_col}-8,T{PlateNo}", hole_numbers="1,2,3,4,5,6,7,8") self.steps_todo_list.append(step) @@ -571,9 +571,6 @@ class PRCXI9300Backend(LiquidHandlerBackend): """Aspirate liquid from the specified resources.""" - if len(ops) != 8: - raise ValueError(f"PRCXI9300Backend aspirate: Expected 8 aspirate, got {len(ops)}") - plate_indexes = [] for op in ops: plate = op.resource.parent.parent @@ -600,7 +597,10 @@ class PRCXI9300Backend(LiquidHandlerBackend): PlateNo = plate_indexes[0] + 1 hole_col = tip_columns[0] + 1 - step = self.api_client.Imbibing(dosage=int(volumes[0]), plate_no=PlateNo, is_whole_plate=False, hole_row=1, + if self.channel_num == 1: + hole_row = tipspot_index % 8 + 1 + + step = self.api_client.Imbibing(dosage=int(volumes[0]), plate_no=PlateNo, is_whole_plate=False, hole_row=hole_row, hole_col=hole_col, blending_times=0, balance_height=0, plate_or_hole=f"H{hole_col}-8,T{PlateNo}", hole_numbers="1,2,3,4,5,6,7,8") self.steps_todo_list.append(step) @@ -611,9 +611,6 @@ class PRCXI9300Backend(LiquidHandlerBackend): """Dispense liquid into the specified resources.""" - if len(ops) != 8: - raise ValueError(f"PRCXI9300Backend dispense: Expected 8 dispense, got {len(ops)}") - plate_indexes = [] for op in ops: plate = op.resource.parent.parent @@ -640,12 +637,15 @@ class PRCXI9300Backend(LiquidHandlerBackend): PlateNo = plate_indexes[0] + 1 hole_col = tip_columns[0] + 1 + if self.channel_num == 1: + hole_row = tipspot_index % 8 + 1 + step = self.api_client.Tapping( "Left", dosage=int(volumes[0]), plate_no=PlateNo, is_whole_plate=False, - hole_row=1, + hole_row=hole_row, hole_col=hole_col, blending_times=0, balance_height=0, @@ -1278,6 +1278,7 @@ if __name__ == "__main__": asyncio.run(handler.dispense(plate1.children[3],[10],[1])) asyncio.run(handler.mix(plate1.children[3], mix_time=3, mix_vol=5, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) asyncio.run(handler.discard_tips()) + # asyncio.run(handler.discard_tips()) # asyncio.run(handler.mix(well_containers.children[:8 # ], mix_time=3, mix_vol=50, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) From f0de653e77848b2f79f3e5c79b14ec7d1d868121 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Thu, 17 Jul 2025 23:45:54 +0800 Subject: [PATCH 60/96] deck --- test/experiments/prcxi.json | 15871 +++++++++------- .../devices/liquid_handling/prcxi/prcxi.py | 66 +- 2 files changed, 9515 insertions(+), 6422 deletions(-) diff --git a/test/experiments/prcxi.json b/test/experiments/prcxi.json index 30c78b9..8926b82 100644 --- a/test/experiments/prcxi.json +++ b/test/experiments/prcxi.json @@ -35,14 +35,12 @@ "name": "PRCXI_Deck", "sample_id": null, "children": [ - "rackT1", - "plateT2", - "plateT3", - "rackT4", - "plateT5", - "trash" + "HPLCPlateT1", + "trash", + "RackT8", + "PlateT11" ], - "parent": null, + "parent": "lh_PRCXI_Deck", "type": "deck", "class": "", "position": { @@ -67,13 +65,108 @@ "data": {} }, { - "id": "rackT1", - "name": "rackT1", + "id": "HPLCPlateT1", + "name": "HPLCPlateT1", "sample_id": null, "children": [ - "TipRack" + "HPLCPlateT1_A1", + "HPLCPlateT1_B1", + "HPLCPlateT1_C1", + "HPLCPlateT1_D1", + "HPLCPlateT1_E1", + "HPLCPlateT1_F1", + "HPLCPlateT1_G1", + "HPLCPlateT1_H1", + "HPLCPlateT1_A2", + "HPLCPlateT1_B2", + "HPLCPlateT1_C2", + "HPLCPlateT1_D2", + "HPLCPlateT1_E2", + "HPLCPlateT1_F2", + "HPLCPlateT1_G2", + "HPLCPlateT1_H2", + "HPLCPlateT1_A3", + "HPLCPlateT1_B3", + "HPLCPlateT1_C3", + "HPLCPlateT1_D3", + "HPLCPlateT1_E3", + "HPLCPlateT1_F3", + "HPLCPlateT1_G3", + "HPLCPlateT1_H3", + "HPLCPlateT1_A4", + "HPLCPlateT1_B4", + "HPLCPlateT1_C4", + "HPLCPlateT1_D4", + "HPLCPlateT1_E4", + "HPLCPlateT1_F4", + "HPLCPlateT1_G4", + "HPLCPlateT1_H4", + "HPLCPlateT1_A5", + "HPLCPlateT1_B5", + "HPLCPlateT1_C5", + "HPLCPlateT1_D5", + "HPLCPlateT1_E5", + "HPLCPlateT1_F5", + "HPLCPlateT1_G5", + "HPLCPlateT1_H5", + "HPLCPlateT1_A6", + "HPLCPlateT1_B6", + "HPLCPlateT1_C6", + "HPLCPlateT1_D6", + "HPLCPlateT1_E6", + "HPLCPlateT1_F6", + "HPLCPlateT1_G6", + "HPLCPlateT1_H6", + "HPLCPlateT1_A7", + "HPLCPlateT1_B7", + "HPLCPlateT1_C7", + "HPLCPlateT1_D7", + "HPLCPlateT1_E7", + "HPLCPlateT1_F7", + "HPLCPlateT1_G7", + "HPLCPlateT1_H7", + "HPLCPlateT1_A8", + "HPLCPlateT1_B8", + "HPLCPlateT1_C8", + "HPLCPlateT1_D8", + "HPLCPlateT1_E8", + "HPLCPlateT1_F8", + "HPLCPlateT1_G8", + "HPLCPlateT1_H8", + "HPLCPlateT1_A9", + "HPLCPlateT1_B9", + "HPLCPlateT1_C9", + "HPLCPlateT1_D9", + "HPLCPlateT1_E9", + "HPLCPlateT1_F9", + "HPLCPlateT1_G9", + "HPLCPlateT1_H9", + "HPLCPlateT1_A10", + "HPLCPlateT1_B10", + "HPLCPlateT1_C10", + "HPLCPlateT1_D10", + "HPLCPlateT1_E10", + "HPLCPlateT1_F10", + "HPLCPlateT1_G10", + "HPLCPlateT1_H10", + "HPLCPlateT1_A11", + "HPLCPlateT1_B11", + "HPLCPlateT1_C11", + "HPLCPlateT1_D11", + "HPLCPlateT1_E11", + "HPLCPlateT1_F11", + "HPLCPlateT1_G11", + "HPLCPlateT1_H11", + "HPLCPlateT1_A12", + "HPLCPlateT1_B12", + "HPLCPlateT1_C12", + "HPLCPlateT1_D12", + "HPLCPlateT1_E12", + "HPLCPlateT1_F12", + "HPLCPlateT1_G12", + "HPLCPlateT1_H12" ], - "parent": "PRCXI Deck", + "parent": "PRCXI_Deck", "type": "plate", "class": "", "position": { @@ -99,5980 +192,18 @@ }, "data": { "Material": { - "uuid": "80652665f6a54402b2408d50b40398df", - "Code": "ZX-001-1000", - "Name": "1000μL Tip头", - "SummaryName": "1000μL Tip头", - "PipetteHeight": 100, - "materialEnum": 1 + "uuid": "548bbc3df0d4447586f2c19d2c0c0c55", + "Code": "HPLC01", + "Name": "HPLC料盘" } } }, { - "id": "TipRack", - "name": "TipRack", - "sample_id": null, - "children": [ - "TipRack_A1", - "TipRack_B1", - "TipRack_C1", - "TipRack_D1", - "TipRack_E1", - "TipRack_F1", - "TipRack_G1", - "TipRack_H1", - "TipRack_A2", - "TipRack_B2", - "TipRack_C2", - "TipRack_D2", - "TipRack_E2", - "TipRack_F2", - "TipRack_G2", - "TipRack_H2", - "TipRack_A3", - "TipRack_B3", - "TipRack_C3", - "TipRack_D3", - "TipRack_E3", - "TipRack_F3", - "TipRack_G3", - "TipRack_H3", - "TipRack_A4", - "TipRack_B4", - "TipRack_C4", - "TipRack_D4", - "TipRack_E4", - "TipRack_F4", - "TipRack_G4", - "TipRack_H4", - "TipRack_A5", - "TipRack_B5", - "TipRack_C5", - "TipRack_D5", - "TipRack_E5", - "TipRack_F5", - "TipRack_G5", - "TipRack_H5", - "TipRack_A6", - "TipRack_B6", - "TipRack_C6", - "TipRack_D6", - "TipRack_E6", - "TipRack_F6", - "TipRack_G6", - "TipRack_H6", - "TipRack_A7", - "TipRack_B7", - "TipRack_C7", - "TipRack_D7", - "TipRack_E7", - "TipRack_F7", - "TipRack_G7", - "TipRack_H7", - "TipRack_A8", - "TipRack_B8", - "TipRack_C8", - "TipRack_D8", - "TipRack_E8", - "TipRack_F8", - "TipRack_G8", - "TipRack_H8", - "TipRack_A9", - "TipRack_B9", - "TipRack_C9", - "TipRack_D9", - "TipRack_E9", - "TipRack_F9", - "TipRack_G9", - "TipRack_H9", - "TipRack_A10", - "TipRack_B10", - "TipRack_C10", - "TipRack_D10", - "TipRack_E10", - "TipRack_F10", - "TipRack_G10", - "TipRack_H10", - "TipRack_A11", - "TipRack_B11", - "TipRack_C11", - "TipRack_D11", - "TipRack_E11", - "TipRack_F11", - "TipRack_G11", - "TipRack_H11", - "TipRack_A12", - "TipRack_B12", - "TipRack_C12", - "TipRack_D12", - "TipRack_E12", - "TipRack_F12", - "TipRack_G12", - "TipRack_H12" - ], - "parent": "rackT1", - "type": "container", - "class": "", - "position": { - "x": 0, - "y": 0, - "z": 0 - }, - "config": { - "type": "TipRack", - "size_x": 127.76, - "size_y": 85.48, - "size_z": 63.9, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_rack", - "model": "TipOne 96 Tip Rack 200 µL", - "barcode": null, - "ordering": { - "A1": "TipRack_A1", - "B1": "TipRack_B1", - "C1": "TipRack_C1", - "D1": "TipRack_D1", - "E1": "TipRack_E1", - "F1": "TipRack_F1", - "G1": "TipRack_G1", - "H1": "TipRack_H1", - "A2": "TipRack_A2", - "B2": "TipRack_B2", - "C2": "TipRack_C2", - "D2": "TipRack_D2", - "E2": "TipRack_E2", - "F2": "TipRack_F2", - "G2": "TipRack_G2", - "H2": "TipRack_H2", - "A3": "TipRack_A3", - "B3": "TipRack_B3", - "C3": "TipRack_C3", - "D3": "TipRack_D3", - "E3": "TipRack_E3", - "F3": "TipRack_F3", - "G3": "TipRack_G3", - "H3": "TipRack_H3", - "A4": "TipRack_A4", - "B4": "TipRack_B4", - "C4": "TipRack_C4", - "D4": "TipRack_D4", - "E4": "TipRack_E4", - "F4": "TipRack_F4", - "G4": "TipRack_G4", - "H4": "TipRack_H4", - "A5": "TipRack_A5", - "B5": "TipRack_B5", - "C5": "TipRack_C5", - "D5": "TipRack_D5", - "E5": "TipRack_E5", - "F5": "TipRack_F5", - "G5": "TipRack_G5", - "H5": "TipRack_H5", - "A6": "TipRack_A6", - "B6": "TipRack_B6", - "C6": "TipRack_C6", - "D6": "TipRack_D6", - "E6": "TipRack_E6", - "F6": "TipRack_F6", - "G6": "TipRack_G6", - "H6": "TipRack_H6", - "A7": "TipRack_A7", - "B7": "TipRack_B7", - "C7": "TipRack_C7", - "D7": "TipRack_D7", - "E7": "TipRack_E7", - "F7": "TipRack_F7", - "G7": "TipRack_G7", - "H7": "TipRack_H7", - "A8": "TipRack_A8", - "B8": "TipRack_B8", - "C8": "TipRack_C8", - "D8": "TipRack_D8", - "E8": "TipRack_E8", - "F8": "TipRack_F8", - "G8": "TipRack_G8", - "H8": "TipRack_H8", - "A9": "TipRack_A9", - "B9": "TipRack_B9", - "C9": "TipRack_C9", - "D9": "TipRack_D9", - "E9": "TipRack_E9", - "F9": "TipRack_F9", - "G9": "TipRack_G9", - "H9": "TipRack_H9", - "A10": "TipRack_A10", - "B10": "TipRack_B10", - "C10": "TipRack_C10", - "D10": "TipRack_D10", - "E10": "TipRack_E10", - "F10": "TipRack_F10", - "G10": "TipRack_G10", - "H10": "TipRack_H10", - "A11": "TipRack_A11", - "B11": "TipRack_B11", - "C11": "TipRack_C11", - "D11": "TipRack_D11", - "E11": "TipRack_E11", - "F11": "TipRack_F11", - "G11": "TipRack_G11", - "H11": "TipRack_H11", - "A12": "TipRack_A12", - "B12": "TipRack_B12", - "C12": "TipRack_C12", - "D12": "TipRack_D12", - "E12": "TipRack_E12", - "F12": "TipRack_F12", - "G12": "TipRack_G12", - "H12": "TipRack_H12" - } - }, - "data": {} - }, - { - "id": "TipRack_A1", - "name": "TipRack_A1", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 11.4275, - "y": 69.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_B1", - "name": "TipRack_B1", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 11.4275, - "y": 60.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_C1", - "name": "TipRack_C1", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 11.4275, - "y": 51.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_D1", - "name": "TipRack_D1", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 11.4275, - "y": 42.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_E1", - "name": "TipRack_E1", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 11.4275, - "y": 33.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_F1", - "name": "TipRack_F1", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 11.4275, - "y": 24.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_G1", - "name": "TipRack_G1", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 11.4275, - "y": 15.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_H1", - "name": "TipRack_H1", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 11.4275, - "y": 6.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_A2", - "name": "TipRack_A2", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 20.4275, - "y": 69.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_B2", - "name": "TipRack_B2", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 20.4275, - "y": 60.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_C2", - "name": "TipRack_C2", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 20.4275, - "y": 51.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_D2", - "name": "TipRack_D2", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 20.4275, - "y": 42.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_E2", - "name": "TipRack_E2", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 20.4275, - "y": 33.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_F2", - "name": "TipRack_F2", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 20.4275, - "y": 24.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_G2", - "name": "TipRack_G2", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 20.4275, - "y": 15.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_H2", - "name": "TipRack_H2", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 20.4275, - "y": 6.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_A3", - "name": "TipRack_A3", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 29.4275, - "y": 69.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_B3", - "name": "TipRack_B3", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 29.4275, - "y": 60.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_C3", - "name": "TipRack_C3", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 29.4275, - "y": 51.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_D3", - "name": "TipRack_D3", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 29.4275, - "y": 42.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_E3", - "name": "TipRack_E3", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 29.4275, - "y": 33.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_F3", - "name": "TipRack_F3", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 29.4275, - "y": 24.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_G3", - "name": "TipRack_G3", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 29.4275, - "y": 15.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_H3", - "name": "TipRack_H3", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 29.4275, - "y": 6.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_A4", - "name": "TipRack_A4", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 38.4275, - "y": 69.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_B4", - "name": "TipRack_B4", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 38.4275, - "y": 60.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_C4", - "name": "TipRack_C4", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 38.4275, - "y": 51.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_D4", - "name": "TipRack_D4", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 38.4275, - "y": 42.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_E4", - "name": "TipRack_E4", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 38.4275, - "y": 33.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_F4", - "name": "TipRack_F4", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 38.4275, - "y": 24.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_G4", - "name": "TipRack_G4", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 38.4275, - "y": 15.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_H4", - "name": "TipRack_H4", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 38.4275, - "y": 6.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_A5", - "name": "TipRack_A5", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 47.4275, - "y": 69.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_B5", - "name": "TipRack_B5", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 47.4275, - "y": 60.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_C5", - "name": "TipRack_C5", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 47.4275, - "y": 51.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_D5", - "name": "TipRack_D5", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 47.4275, - "y": 42.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_E5", - "name": "TipRack_E5", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 47.4275, - "y": 33.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_F5", - "name": "TipRack_F5", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 47.4275, - "y": 24.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_G5", - "name": "TipRack_G5", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 47.4275, - "y": 15.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_H5", - "name": "TipRack_H5", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 47.4275, - "y": 6.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_A6", - "name": "TipRack_A6", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 56.4275, - "y": 69.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_B6", - "name": "TipRack_B6", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 56.4275, - "y": 60.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_C6", - "name": "TipRack_C6", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 56.4275, - "y": 51.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_D6", - "name": "TipRack_D6", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 56.4275, - "y": 42.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_E6", - "name": "TipRack_E6", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 56.4275, - "y": 33.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_F6", - "name": "TipRack_F6", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 56.4275, - "y": 24.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_G6", - "name": "TipRack_G6", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 56.4275, - "y": 15.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_H6", - "name": "TipRack_H6", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 56.4275, - "y": 6.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_A7", - "name": "TipRack_A7", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 65.4275, - "y": 69.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_B7", - "name": "TipRack_B7", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 65.4275, - "y": 60.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_C7", - "name": "TipRack_C7", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 65.4275, - "y": 51.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_D7", - "name": "TipRack_D7", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 65.4275, - "y": 42.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_E7", - "name": "TipRack_E7", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 65.4275, - "y": 33.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_F7", - "name": "TipRack_F7", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 65.4275, - "y": 24.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_G7", - "name": "TipRack_G7", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 65.4275, - "y": 15.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_H7", - "name": "TipRack_H7", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 65.4275, - "y": 6.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_A8", - "name": "TipRack_A8", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 74.4275, - "y": 69.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_B8", - "name": "TipRack_B8", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 74.4275, - "y": 60.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_C8", - "name": "TipRack_C8", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 74.4275, - "y": 51.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_D8", - "name": "TipRack_D8", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 74.4275, - "y": 42.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_E8", - "name": "TipRack_E8", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 74.4275, - "y": 33.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_F8", - "name": "TipRack_F8", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 74.4275, - "y": 24.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_G8", - "name": "TipRack_G8", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 74.4275, - "y": 15.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_H8", - "name": "TipRack_H8", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 74.4275, - "y": 6.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_A9", - "name": "TipRack_A9", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 83.4275, - "y": 69.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_B9", - "name": "TipRack_B9", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 83.4275, - "y": 60.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_C9", - "name": "TipRack_C9", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 83.4275, - "y": 51.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_D9", - "name": "TipRack_D9", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 83.4275, - "y": 42.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_E9", - "name": "TipRack_E9", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 83.4275, - "y": 33.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_F9", - "name": "TipRack_F9", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 83.4275, - "y": 24.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_G9", - "name": "TipRack_G9", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 83.4275, - "y": 15.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_H9", - "name": "TipRack_H9", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 83.4275, - "y": 6.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_A10", - "name": "TipRack_A10", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 92.4275, - "y": 69.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_B10", - "name": "TipRack_B10", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 92.4275, - "y": 60.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_C10", - "name": "TipRack_C10", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 92.4275, - "y": 51.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_D10", - "name": "TipRack_D10", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 92.4275, - "y": 42.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_E10", - "name": "TipRack_E10", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 92.4275, - "y": 33.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_F10", - "name": "TipRack_F10", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 92.4275, - "y": 24.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_G10", - "name": "TipRack_G10", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 92.4275, - "y": 15.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_H10", - "name": "TipRack_H10", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 92.4275, - "y": 6.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_A11", - "name": "TipRack_A11", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 101.4275, - "y": 69.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_B11", - "name": "TipRack_B11", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 101.4275, - "y": 60.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_C11", - "name": "TipRack_C11", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 101.4275, - "y": 51.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_D11", - "name": "TipRack_D11", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 101.4275, - "y": 42.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_E11", - "name": "TipRack_E11", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 101.4275, - "y": 33.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_F11", - "name": "TipRack_F11", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 101.4275, - "y": 24.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_G11", - "name": "TipRack_G11", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 101.4275, - "y": 15.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_H11", - "name": "TipRack_H11", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 101.4275, - "y": 6.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_A12", - "name": "TipRack_A12", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 110.4275, - "y": 69.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_B12", - "name": "TipRack_B12", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 110.4275, - "y": 60.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_C12", - "name": "TipRack_C12", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 110.4275, - "y": 51.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_D12", - "name": "TipRack_D12", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 110.4275, - "y": 42.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_E12", - "name": "TipRack_E12", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 110.4275, - "y": 33.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_F12", - "name": "TipRack_F12", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 110.4275, - "y": 24.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_G12", - "name": "TipRack_G12", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 110.4275, - "y": 15.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "TipRack_H12", - "name": "TipRack_H12", - "sample_id": null, - "children": [], - "parent": "TipRack", - "type": "container", - "class": "", - "position": { - "x": 110.4275, - "y": 6.9875, - "z": 53.36 - }, - "config": { - "type": "TipSpot", - "size_x": 4.525, - "size_y": 4.525, - "size_z": 0, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "tip_spot", - "model": null, - "barcode": null, - "prototype_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - }, - "data": { - "tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - }, - "tip_state": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] - }, - "pending_tip": { - "type": "Tip", - "total_tip_length": 50.93, - "has_filter": false, - "maximal_volume": 200.0, - "fitting_depth": 6.1 - } - } - }, - { - "id": "plateT2", - "name": "plateT2", - "sample_id": null, - "children": [ - "Plate" - ], - "parent": "PRCXI Deck", - "type": "plate", - "class": "", - "position": { - "x": 0, - "y": 0, - "z": 0 - }, - "config": { - "type": "PRCXI9300Container", - "size_x": 50, - "size_y": 50, - "size_z": 10, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "plate", - "model": null, - "barcode": null, - "ordering": {} - }, - "data": { - "Material": { - "uuid": "57b1e4711e9e4a32b529f3132fc5931f" - } - } - }, - { - "id": "Plate", - "name": "Plate", - "sample_id": null, - "children": [ - "Plate_A1", - "Plate_B1", - "Plate_C1", - "Plate_D1", - "Plate_E1", - "Plate_F1", - "Plate_G1", - "Plate_H1", - "Plate_A2", - "Plate_B2", - "Plate_C2", - "Plate_D2", - "Plate_E2", - "Plate_F2", - "Plate_G2", - "Plate_H2", - "Plate_A3", - "Plate_B3", - "Plate_C3", - "Plate_D3", - "Plate_E3", - "Plate_F3", - "Plate_G3", - "Plate_H3", - "Plate_A4", - "Plate_B4", - "Plate_C4", - "Plate_D4", - "Plate_E4", - "Plate_F4", - "Plate_G4", - "Plate_H4", - "Plate_A5", - "Plate_B5", - "Plate_C5", - "Plate_D5", - "Plate_E5", - "Plate_F5", - "Plate_G5", - "Plate_H5", - "Plate_A6", - "Plate_B6", - "Plate_C6", - "Plate_D6", - "Plate_E6", - "Plate_F6", - "Plate_G6", - "Plate_H6", - "Plate_A7", - "Plate_B7", - "Plate_C7", - "Plate_D7", - "Plate_E7", - "Plate_F7", - "Plate_G7", - "Plate_H7", - "Plate_A8", - "Plate_B8", - "Plate_C8", - "Plate_D8", - "Plate_E8", - "Plate_F8", - "Plate_G8", - "Plate_H8", - "Plate_A9", - "Plate_B9", - "Plate_C9", - "Plate_D9", - "Plate_E9", - "Plate_F9", - "Plate_G9", - "Plate_H9", - "Plate_A10", - "Plate_B10", - "Plate_C10", - "Plate_D10", - "Plate_E10", - "Plate_F10", - "Plate_G10", - "Plate_H10", - "Plate_A11", - "Plate_B11", - "Plate_C11", - "Plate_D11", - "Plate_E11", - "Plate_F11", - "Plate_G11", - "Plate_H11", - "Plate_A12", - "Plate_B12", - "Plate_C12", - "Plate_D12", - "Plate_E12", - "Plate_F12", - "Plate_G12", - "Plate_H12" - ], - "parent": "plateT2", - "type": "plate", - "class": "", - "position": { - "x": 0, - "y": 0, - "z": 0 - }, - "config": { - "type": "Plate", - "size_x": 127.76, - "size_y": 85.47, - "size_z": 14.22, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "plate", - "model": "Corning 96 Well Plate 360 µL Flat", - "barcode": null, - "ordering": { - "A1": "Plate_A1", - "B1": "Plate_B1", - "C1": "Plate_C1", - "D1": "Plate_D1", - "E1": "Plate_E1", - "F1": "Plate_F1", - "G1": "Plate_G1", - "H1": "Plate_H1", - "A2": "Plate_A2", - "B2": "Plate_B2", - "C2": "Plate_C2", - "D2": "Plate_D2", - "E2": "Plate_E2", - "F2": "Plate_F2", - "G2": "Plate_G2", - "H2": "Plate_H2", - "A3": "Plate_A3", - "B3": "Plate_B3", - "C3": "Plate_C3", - "D3": "Plate_D3", - "E3": "Plate_E3", - "F3": "Plate_F3", - "G3": "Plate_G3", - "H3": "Plate_H3", - "A4": "Plate_A4", - "B4": "Plate_B4", - "C4": "Plate_C4", - "D4": "Plate_D4", - "E4": "Plate_E4", - "F4": "Plate_F4", - "G4": "Plate_G4", - "H4": "Plate_H4", - "A5": "Plate_A5", - "B5": "Plate_B5", - "C5": "Plate_C5", - "D5": "Plate_D5", - "E5": "Plate_E5", - "F5": "Plate_F5", - "G5": "Plate_G5", - "H5": "Plate_H5", - "A6": "Plate_A6", - "B6": "Plate_B6", - "C6": "Plate_C6", - "D6": "Plate_D6", - "E6": "Plate_E6", - "F6": "Plate_F6", - "G6": "Plate_G6", - "H6": "Plate_H6", - "A7": "Plate_A7", - "B7": "Plate_B7", - "C7": "Plate_C7", - "D7": "Plate_D7", - "E7": "Plate_E7", - "F7": "Plate_F7", - "G7": "Plate_G7", - "H7": "Plate_H7", - "A8": "Plate_A8", - "B8": "Plate_B8", - "C8": "Plate_C8", - "D8": "Plate_D8", - "E8": "Plate_E8", - "F8": "Plate_F8", - "G8": "Plate_G8", - "H8": "Plate_H8", - "A9": "Plate_A9", - "B9": "Plate_B9", - "C9": "Plate_C9", - "D9": "Plate_D9", - "E9": "Plate_E9", - "F9": "Plate_F9", - "G9": "Plate_G9", - "H9": "Plate_H9", - "A10": "Plate_A10", - "B10": "Plate_B10", - "C10": "Plate_C10", - "D10": "Plate_D10", - "E10": "Plate_E10", - "F10": "Plate_F10", - "G10": "Plate_G10", - "H10": "Plate_H10", - "A11": "Plate_A11", - "B11": "Plate_B11", - "C11": "Plate_C11", - "D11": "Plate_D11", - "E11": "Plate_E11", - "F11": "Plate_F11", - "G11": "Plate_G11", - "H11": "Plate_H11", - "A12": "Plate_A12", - "B12": "Plate_B12", - "C12": "Plate_C12", - "D12": "Plate_D12", - "E12": "Plate_E12", - "F12": "Plate_F12", - "G12": "Plate_G12", - "H12": "Plate_H12" - } - }, - "data": {} - }, - { - "id": "Plate_A1", - "name": "Plate_A1", + "id": "HPLCPlateT1_A1", + "name": "HPLCPlateT1_A1", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -6108,11 +239,11 @@ } }, { - "id": "Plate_B1", - "name": "Plate_B1", + "id": "HPLCPlateT1_B1", + "name": "HPLCPlateT1_B1", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -6148,11 +279,11 @@ } }, { - "id": "Plate_C1", - "name": "Plate_C1", + "id": "HPLCPlateT1_C1", + "name": "HPLCPlateT1_C1", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -6188,11 +319,11 @@ } }, { - "id": "Plate_D1", - "name": "Plate_D1", + "id": "HPLCPlateT1_D1", + "name": "HPLCPlateT1_D1", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -6228,11 +359,11 @@ } }, { - "id": "Plate_E1", - "name": "Plate_E1", + "id": "HPLCPlateT1_E1", + "name": "HPLCPlateT1_E1", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -6268,11 +399,11 @@ } }, { - "id": "Plate_F1", - "name": "Plate_F1", + "id": "HPLCPlateT1_F1", + "name": "HPLCPlateT1_F1", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -6308,11 +439,11 @@ } }, { - "id": "Plate_G1", - "name": "Plate_G1", + "id": "HPLCPlateT1_G1", + "name": "HPLCPlateT1_G1", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -6348,11 +479,11 @@ } }, { - "id": "Plate_H1", - "name": "Plate_H1", + "id": "HPLCPlateT1_H1", + "name": "HPLCPlateT1_H1", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -6388,11 +519,11 @@ } }, { - "id": "Plate_A2", - "name": "Plate_A2", + "id": "HPLCPlateT1_A2", + "name": "HPLCPlateT1_A2", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -6428,11 +559,11 @@ } }, { - "id": "Plate_B2", - "name": "Plate_B2", + "id": "HPLCPlateT1_B2", + "name": "HPLCPlateT1_B2", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -6468,11 +599,11 @@ } }, { - "id": "Plate_C2", - "name": "Plate_C2", + "id": "HPLCPlateT1_C2", + "name": "HPLCPlateT1_C2", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -6508,11 +639,11 @@ } }, { - "id": "Plate_D2", - "name": "Plate_D2", + "id": "HPLCPlateT1_D2", + "name": "HPLCPlateT1_D2", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -6548,11 +679,11 @@ } }, { - "id": "Plate_E2", - "name": "Plate_E2", + "id": "HPLCPlateT1_E2", + "name": "HPLCPlateT1_E2", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -6588,11 +719,11 @@ } }, { - "id": "Plate_F2", - "name": "Plate_F2", + "id": "HPLCPlateT1_F2", + "name": "HPLCPlateT1_F2", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -6628,11 +759,11 @@ } }, { - "id": "Plate_G2", - "name": "Plate_G2", + "id": "HPLCPlateT1_G2", + "name": "HPLCPlateT1_G2", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -6668,11 +799,11 @@ } }, { - "id": "Plate_H2", - "name": "Plate_H2", + "id": "HPLCPlateT1_H2", + "name": "HPLCPlateT1_H2", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -6708,11 +839,11 @@ } }, { - "id": "Plate_A3", - "name": "Plate_A3", + "id": "HPLCPlateT1_A3", + "name": "HPLCPlateT1_A3", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -6748,11 +879,11 @@ } }, { - "id": "Plate_B3", - "name": "Plate_B3", + "id": "HPLCPlateT1_B3", + "name": "HPLCPlateT1_B3", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -6788,11 +919,11 @@ } }, { - "id": "Plate_C3", - "name": "Plate_C3", + "id": "HPLCPlateT1_C3", + "name": "HPLCPlateT1_C3", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -6828,11 +959,11 @@ } }, { - "id": "Plate_D3", - "name": "Plate_D3", + "id": "HPLCPlateT1_D3", + "name": "HPLCPlateT1_D3", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -6868,11 +999,11 @@ } }, { - "id": "Plate_E3", - "name": "Plate_E3", + "id": "HPLCPlateT1_E3", + "name": "HPLCPlateT1_E3", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -6908,11 +1039,11 @@ } }, { - "id": "Plate_F3", - "name": "Plate_F3", + "id": "HPLCPlateT1_F3", + "name": "HPLCPlateT1_F3", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -6948,11 +1079,11 @@ } }, { - "id": "Plate_G3", - "name": "Plate_G3", + "id": "HPLCPlateT1_G3", + "name": "HPLCPlateT1_G3", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -6988,11 +1119,11 @@ } }, { - "id": "Plate_H3", - "name": "Plate_H3", + "id": "HPLCPlateT1_H3", + "name": "HPLCPlateT1_H3", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -7028,11 +1159,11 @@ } }, { - "id": "Plate_A4", - "name": "Plate_A4", + "id": "HPLCPlateT1_A4", + "name": "HPLCPlateT1_A4", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -7068,11 +1199,11 @@ } }, { - "id": "Plate_B4", - "name": "Plate_B4", + "id": "HPLCPlateT1_B4", + "name": "HPLCPlateT1_B4", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -7108,11 +1239,11 @@ } }, { - "id": "Plate_C4", - "name": "Plate_C4", + "id": "HPLCPlateT1_C4", + "name": "HPLCPlateT1_C4", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -7148,11 +1279,11 @@ } }, { - "id": "Plate_D4", - "name": "Plate_D4", + "id": "HPLCPlateT1_D4", + "name": "HPLCPlateT1_D4", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -7188,11 +1319,11 @@ } }, { - "id": "Plate_E4", - "name": "Plate_E4", + "id": "HPLCPlateT1_E4", + "name": "HPLCPlateT1_E4", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -7228,11 +1359,11 @@ } }, { - "id": "Plate_F4", - "name": "Plate_F4", + "id": "HPLCPlateT1_F4", + "name": "HPLCPlateT1_F4", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -7268,11 +1399,11 @@ } }, { - "id": "Plate_G4", - "name": "Plate_G4", + "id": "HPLCPlateT1_G4", + "name": "HPLCPlateT1_G4", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -7308,11 +1439,11 @@ } }, { - "id": "Plate_H4", - "name": "Plate_H4", + "id": "HPLCPlateT1_H4", + "name": "HPLCPlateT1_H4", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -7348,11 +1479,11 @@ } }, { - "id": "Plate_A5", - "name": "Plate_A5", + "id": "HPLCPlateT1_A5", + "name": "HPLCPlateT1_A5", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -7388,11 +1519,11 @@ } }, { - "id": "Plate_B5", - "name": "Plate_B5", + "id": "HPLCPlateT1_B5", + "name": "HPLCPlateT1_B5", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -7428,11 +1559,11 @@ } }, { - "id": "Plate_C5", - "name": "Plate_C5", + "id": "HPLCPlateT1_C5", + "name": "HPLCPlateT1_C5", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -7468,11 +1599,11 @@ } }, { - "id": "Plate_D5", - "name": "Plate_D5", + "id": "HPLCPlateT1_D5", + "name": "HPLCPlateT1_D5", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -7508,11 +1639,11 @@ } }, { - "id": "Plate_E5", - "name": "Plate_E5", + "id": "HPLCPlateT1_E5", + "name": "HPLCPlateT1_E5", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -7548,11 +1679,11 @@ } }, { - "id": "Plate_F5", - "name": "Plate_F5", + "id": "HPLCPlateT1_F5", + "name": "HPLCPlateT1_F5", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -7588,11 +1719,11 @@ } }, { - "id": "Plate_G5", - "name": "Plate_G5", + "id": "HPLCPlateT1_G5", + "name": "HPLCPlateT1_G5", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -7628,11 +1759,11 @@ } }, { - "id": "Plate_H5", - "name": "Plate_H5", + "id": "HPLCPlateT1_H5", + "name": "HPLCPlateT1_H5", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -7668,11 +1799,11 @@ } }, { - "id": "Plate_A6", - "name": "Plate_A6", + "id": "HPLCPlateT1_A6", + "name": "HPLCPlateT1_A6", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -7708,11 +1839,11 @@ } }, { - "id": "Plate_B6", - "name": "Plate_B6", + "id": "HPLCPlateT1_B6", + "name": "HPLCPlateT1_B6", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -7748,11 +1879,11 @@ } }, { - "id": "Plate_C6", - "name": "Plate_C6", + "id": "HPLCPlateT1_C6", + "name": "HPLCPlateT1_C6", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -7788,11 +1919,11 @@ } }, { - "id": "Plate_D6", - "name": "Plate_D6", + "id": "HPLCPlateT1_D6", + "name": "HPLCPlateT1_D6", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -7828,11 +1959,11 @@ } }, { - "id": "Plate_E6", - "name": "Plate_E6", + "id": "HPLCPlateT1_E6", + "name": "HPLCPlateT1_E6", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -7868,11 +1999,11 @@ } }, { - "id": "Plate_F6", - "name": "Plate_F6", + "id": "HPLCPlateT1_F6", + "name": "HPLCPlateT1_F6", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -7908,11 +2039,11 @@ } }, { - "id": "Plate_G6", - "name": "Plate_G6", + "id": "HPLCPlateT1_G6", + "name": "HPLCPlateT1_G6", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -7948,11 +2079,11 @@ } }, { - "id": "Plate_H6", - "name": "Plate_H6", + "id": "HPLCPlateT1_H6", + "name": "HPLCPlateT1_H6", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -7988,11 +2119,11 @@ } }, { - "id": "Plate_A7", - "name": "Plate_A7", + "id": "HPLCPlateT1_A7", + "name": "HPLCPlateT1_A7", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -8028,11 +2159,11 @@ } }, { - "id": "Plate_B7", - "name": "Plate_B7", + "id": "HPLCPlateT1_B7", + "name": "HPLCPlateT1_B7", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -8068,11 +2199,11 @@ } }, { - "id": "Plate_C7", - "name": "Plate_C7", + "id": "HPLCPlateT1_C7", + "name": "HPLCPlateT1_C7", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -8108,11 +2239,11 @@ } }, { - "id": "Plate_D7", - "name": "Plate_D7", + "id": "HPLCPlateT1_D7", + "name": "HPLCPlateT1_D7", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -8148,11 +2279,11 @@ } }, { - "id": "Plate_E7", - "name": "Plate_E7", + "id": "HPLCPlateT1_E7", + "name": "HPLCPlateT1_E7", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -8188,11 +2319,11 @@ } }, { - "id": "Plate_F7", - "name": "Plate_F7", + "id": "HPLCPlateT1_F7", + "name": "HPLCPlateT1_F7", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -8228,11 +2359,11 @@ } }, { - "id": "Plate_G7", - "name": "Plate_G7", + "id": "HPLCPlateT1_G7", + "name": "HPLCPlateT1_G7", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -8268,11 +2399,11 @@ } }, { - "id": "Plate_H7", - "name": "Plate_H7", + "id": "HPLCPlateT1_H7", + "name": "HPLCPlateT1_H7", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -8308,11 +2439,11 @@ } }, { - "id": "Plate_A8", - "name": "Plate_A8", + "id": "HPLCPlateT1_A8", + "name": "HPLCPlateT1_A8", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -8348,11 +2479,11 @@ } }, { - "id": "Plate_B8", - "name": "Plate_B8", + "id": "HPLCPlateT1_B8", + "name": "HPLCPlateT1_B8", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -8388,11 +2519,11 @@ } }, { - "id": "Plate_C8", - "name": "Plate_C8", + "id": "HPLCPlateT1_C8", + "name": "HPLCPlateT1_C8", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -8428,11 +2559,11 @@ } }, { - "id": "Plate_D8", - "name": "Plate_D8", + "id": "HPLCPlateT1_D8", + "name": "HPLCPlateT1_D8", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -8468,11 +2599,11 @@ } }, { - "id": "Plate_E8", - "name": "Plate_E8", + "id": "HPLCPlateT1_E8", + "name": "HPLCPlateT1_E8", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -8508,11 +2639,11 @@ } }, { - "id": "Plate_F8", - "name": "Plate_F8", + "id": "HPLCPlateT1_F8", + "name": "HPLCPlateT1_F8", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -8548,11 +2679,11 @@ } }, { - "id": "Plate_G8", - "name": "Plate_G8", + "id": "HPLCPlateT1_G8", + "name": "HPLCPlateT1_G8", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -8588,11 +2719,11 @@ } }, { - "id": "Plate_H8", - "name": "Plate_H8", + "id": "HPLCPlateT1_H8", + "name": "HPLCPlateT1_H8", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -8628,11 +2759,11 @@ } }, { - "id": "Plate_A9", - "name": "Plate_A9", + "id": "HPLCPlateT1_A9", + "name": "HPLCPlateT1_A9", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -8668,11 +2799,11 @@ } }, { - "id": "Plate_B9", - "name": "Plate_B9", + "id": "HPLCPlateT1_B9", + "name": "HPLCPlateT1_B9", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -8708,11 +2839,11 @@ } }, { - "id": "Plate_C9", - "name": "Plate_C9", + "id": "HPLCPlateT1_C9", + "name": "HPLCPlateT1_C9", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -8748,11 +2879,11 @@ } }, { - "id": "Plate_D9", - "name": "Plate_D9", + "id": "HPLCPlateT1_D9", + "name": "HPLCPlateT1_D9", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -8788,11 +2919,11 @@ } }, { - "id": "Plate_E9", - "name": "Plate_E9", + "id": "HPLCPlateT1_E9", + "name": "HPLCPlateT1_E9", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -8828,11 +2959,11 @@ } }, { - "id": "Plate_F9", - "name": "Plate_F9", + "id": "HPLCPlateT1_F9", + "name": "HPLCPlateT1_F9", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -8868,11 +2999,11 @@ } }, { - "id": "Plate_G9", - "name": "Plate_G9", + "id": "HPLCPlateT1_G9", + "name": "HPLCPlateT1_G9", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -8908,11 +3039,11 @@ } }, { - "id": "Plate_H9", - "name": "Plate_H9", + "id": "HPLCPlateT1_H9", + "name": "HPLCPlateT1_H9", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -8948,11 +3079,11 @@ } }, { - "id": "Plate_A10", - "name": "Plate_A10", + "id": "HPLCPlateT1_A10", + "name": "HPLCPlateT1_A10", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -8988,11 +3119,11 @@ } }, { - "id": "Plate_B10", - "name": "Plate_B10", + "id": "HPLCPlateT1_B10", + "name": "HPLCPlateT1_B10", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -9028,11 +3159,11 @@ } }, { - "id": "Plate_C10", - "name": "Plate_C10", + "id": "HPLCPlateT1_C10", + "name": "HPLCPlateT1_C10", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -9068,11 +3199,11 @@ } }, { - "id": "Plate_D10", - "name": "Plate_D10", + "id": "HPLCPlateT1_D10", + "name": "HPLCPlateT1_D10", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -9108,11 +3239,11 @@ } }, { - "id": "Plate_E10", - "name": "Plate_E10", + "id": "HPLCPlateT1_E10", + "name": "HPLCPlateT1_E10", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -9148,11 +3279,11 @@ } }, { - "id": "Plate_F10", - "name": "Plate_F10", + "id": "HPLCPlateT1_F10", + "name": "HPLCPlateT1_F10", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -9188,11 +3319,11 @@ } }, { - "id": "Plate_G10", - "name": "Plate_G10", + "id": "HPLCPlateT1_G10", + "name": "HPLCPlateT1_G10", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -9228,11 +3359,11 @@ } }, { - "id": "Plate_H10", - "name": "Plate_H10", + "id": "HPLCPlateT1_H10", + "name": "HPLCPlateT1_H10", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -9268,11 +3399,11 @@ } }, { - "id": "Plate_A11", - "name": "Plate_A11", + "id": "HPLCPlateT1_A11", + "name": "HPLCPlateT1_A11", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -9308,11 +3439,11 @@ } }, { - "id": "Plate_B11", - "name": "Plate_B11", + "id": "HPLCPlateT1_B11", + "name": "HPLCPlateT1_B11", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -9348,11 +3479,11 @@ } }, { - "id": "Plate_C11", - "name": "Plate_C11", + "id": "HPLCPlateT1_C11", + "name": "HPLCPlateT1_C11", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -9388,11 +3519,11 @@ } }, { - "id": "Plate_D11", - "name": "Plate_D11", + "id": "HPLCPlateT1_D11", + "name": "HPLCPlateT1_D11", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -9428,11 +3559,11 @@ } }, { - "id": "Plate_E11", - "name": "Plate_E11", + "id": "HPLCPlateT1_E11", + "name": "HPLCPlateT1_E11", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -9468,11 +3599,11 @@ } }, { - "id": "Plate_F11", - "name": "Plate_F11", + "id": "HPLCPlateT1_F11", + "name": "HPLCPlateT1_F11", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -9508,11 +3639,11 @@ } }, { - "id": "Plate_G11", - "name": "Plate_G11", + "id": "HPLCPlateT1_G11", + "name": "HPLCPlateT1_G11", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -9548,11 +3679,11 @@ } }, { - "id": "Plate_H11", - "name": "Plate_H11", + "id": "HPLCPlateT1_H11", + "name": "HPLCPlateT1_H11", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -9588,11 +3719,11 @@ } }, { - "id": "Plate_A12", - "name": "Plate_A12", + "id": "HPLCPlateT1_A12", + "name": "HPLCPlateT1_A12", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -9628,11 +3759,11 @@ } }, { - "id": "Plate_B12", - "name": "Plate_B12", + "id": "HPLCPlateT1_B12", + "name": "HPLCPlateT1_B12", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -9668,11 +3799,11 @@ } }, { - "id": "Plate_C12", - "name": "Plate_C12", + "id": "HPLCPlateT1_C12", + "name": "HPLCPlateT1_C12", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -9708,11 +3839,11 @@ } }, { - "id": "Plate_D12", - "name": "Plate_D12", + "id": "HPLCPlateT1_D12", + "name": "HPLCPlateT1_D12", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -9748,11 +3879,11 @@ } }, { - "id": "Plate_E12", - "name": "Plate_E12", + "id": "HPLCPlateT1_E12", + "name": "HPLCPlateT1_E12", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -9788,11 +3919,11 @@ } }, { - "id": "Plate_F12", - "name": "Plate_F12", + "id": "HPLCPlateT1_F12", + "name": "HPLCPlateT1_F12", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -9828,11 +3959,11 @@ } }, { - "id": "Plate_G12", - "name": "Plate_G12", + "id": "HPLCPlateT1_G12", + "name": "HPLCPlateT1_G12", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -9868,11 +3999,11 @@ } }, { - "id": "Plate_H12", - "name": "Plate_H12", + "id": "HPLCPlateT1_H12", + "name": "HPLCPlateT1_H12", "sample_id": null, "children": [], - "parent": "Plate", + "parent": "HPLCPlateT1", "type": "well", "class": "", "position": { @@ -9907,122 +4038,12 @@ "liquid_history": [] } }, - { - "id": "plateT3", - "name": "plateT3", - "sample_id": null, - "children": [], - "parent": "PRCXI Deck", - "type": "plate", - "class": "", - "position": { - "x": 0, - "y": 0, - "z": 0 - }, - "config": { - "type": "PRCXI9300Container", - "size_x": 50, - "size_y": 50, - "size_z": 10, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "plate", - "model": null, - "barcode": null, - "ordering": {} - }, - "data": { - "Material": { - "uuid": "57b1e4711e9e4a32b529f3132fc5931f" - } - } - }, - { - "id": "rackT4", - "name": "rackT4", - "sample_id": null, - "children": [], - "parent": "PRCXI Deck", - "type": "plate", - "class": "", - "position": { - "x": 0, - "y": 0, - "z": 0 - }, - "config": { - "type": "PRCXI9300Container", - "size_x": 50, - "size_y": 50, - "size_z": 10, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "plate", - "model": null, - "barcode": null, - "ordering": {} - }, - "data": { - "Material": { - "uuid": "80652665f6a54402b2408d50b40398df", - "Code": "ZX-001-1000", - "Name": "1000μL Tip头", - "SummaryName": "1000μL Tip头", - "PipetteHeight": 100, - "materialEnum": 1 - } - } - }, - { - "id": "plateT5", - "name": "plateT5", - "sample_id": null, - "children": [], - "parent": "PRCXI Deck", - "type": "plate", - "class": "", - "position": { - "x": 0, - "y": 0, - "z": 0 - }, - "config": { - "type": "PRCXI9300Container", - "size_x": 50, - "size_y": 50, - "size_z": 10, - "rotation": { - "x": 0, - "y": 0, - "z": 0, - "type": "Rotation" - }, - "category": "plate", - "model": null, - "barcode": null, - "ordering": {} - }, - "data": { - "Material": { - "uuid": "57b1e4711e9e4a32b529f3132fc5931f" - } - } - }, { "id": "trash", "name": "trash", "sample_id": null, "children": [], - "parent": "PRCXI Deck", + "parent": "PRCXI_Deck", "type": "container", "class": "", "position": { @@ -10033,7 +4054,7 @@ "config": { "type": "PRCXI9300Trash", "size_x": 50, - "size_y": 500, + "size_y": 50, "size_z": 10, "rotation": { "x": 0, @@ -10053,10 +4074,9108 @@ "liquids": [], "pending_liquids": [], "liquid_history": [], + "Material": { + "uuid": "730067cf07ae43849ddf4034299030e9" + } + } + }, + { + "id": "RackT8", + "name": "RackT8", + "sample_id": null, + "children": [ + "RackT8_A1", + "RackT8_B1", + "RackT8_C1", + "RackT8_D1", + "RackT8_E1", + "RackT8_F1", + "RackT8_G1", + "RackT8_H1", + "RackT8_A2", + "RackT8_B2", + "RackT8_C2", + "RackT8_D2", + "RackT8_E2", + "RackT8_F2", + "RackT8_G2", + "RackT8_H2", + "RackT8_A3", + "RackT8_B3", + "RackT8_C3", + "RackT8_D3", + "RackT8_E3", + "RackT8_F3", + "RackT8_G3", + "RackT8_H3", + "RackT8_A4", + "RackT8_B4", + "RackT8_C4", + "RackT8_D4", + "RackT8_E4", + "RackT8_F4", + "RackT8_G4", + "RackT8_H4", + "RackT8_A5", + "RackT8_B5", + "RackT8_C5", + "RackT8_D5", + "RackT8_E5", + "RackT8_F5", + "RackT8_G5", + "RackT8_H5", + "RackT8_A6", + "RackT8_B6", + "RackT8_C6", + "RackT8_D6", + "RackT8_E6", + "RackT8_F6", + "RackT8_G6", + "RackT8_H6", + "RackT8_A7", + "RackT8_B7", + "RackT8_C7", + "RackT8_D7", + "RackT8_E7", + "RackT8_F7", + "RackT8_G7", + "RackT8_H7", + "RackT8_A8", + "RackT8_B8", + "RackT8_C8", + "RackT8_D8", + "RackT8_E8", + "RackT8_F8", + "RackT8_G8", + "RackT8_H8", + "RackT8_A9", + "RackT8_B9", + "RackT8_C9", + "RackT8_D9", + "RackT8_E9", + "RackT8_F9", + "RackT8_G9", + "RackT8_H9", + "RackT8_A10", + "RackT8_B10", + "RackT8_C10", + "RackT8_D10", + "RackT8_E10", + "RackT8_F10", + "RackT8_G10", + "RackT8_H10", + "RackT8_A11", + "RackT8_B11", + "RackT8_C11", + "RackT8_D11", + "RackT8_E11", + "RackT8_F11", + "RackT8_G11", + "RackT8_H11", + "RackT8_A12", + "RackT8_B12", + "RackT8_C12", + "RackT8_D12", + "RackT8_E12", + "RackT8_F12", + "RackT8_G12", + "RackT8_H12" + ], + "parent": "PRCXI_Deck", + "type": "plate", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} + }, + "data": { + "Material": { + "uuid": "068b3815e36b4a72a59bae017011b29f", + "Code": "ZX-001-10+", + "Name": "10μL加长 Tip头" + } + } + }, + { + "id": "RackT8_A1", + "name": "RackT8_A1", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_B1", + "name": "RackT8_B1", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_C1", + "name": "RackT8_C1", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_D1", + "name": "RackT8_D1", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_E1", + "name": "RackT8_E1", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_F1", + "name": "RackT8_F1", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_G1", + "name": "RackT8_G1", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_H1", + "name": "RackT8_H1", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_A2", + "name": "RackT8_A2", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_B2", + "name": "RackT8_B2", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_C2", + "name": "RackT8_C2", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_D2", + "name": "RackT8_D2", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_E2", + "name": "RackT8_E2", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_F2", + "name": "RackT8_F2", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_G2", + "name": "RackT8_G2", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_H2", + "name": "RackT8_H2", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_A3", + "name": "RackT8_A3", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_B3", + "name": "RackT8_B3", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_C3", + "name": "RackT8_C3", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_D3", + "name": "RackT8_D3", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_E3", + "name": "RackT8_E3", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_F3", + "name": "RackT8_F3", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_G3", + "name": "RackT8_G3", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_H3", + "name": "RackT8_H3", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_A4", + "name": "RackT8_A4", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_B4", + "name": "RackT8_B4", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_C4", + "name": "RackT8_C4", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_D4", + "name": "RackT8_D4", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_E4", + "name": "RackT8_E4", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_F4", + "name": "RackT8_F4", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_G4", + "name": "RackT8_G4", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_H4", + "name": "RackT8_H4", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_A5", + "name": "RackT8_A5", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_B5", + "name": "RackT8_B5", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_C5", + "name": "RackT8_C5", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_D5", + "name": "RackT8_D5", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_E5", + "name": "RackT8_E5", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_F5", + "name": "RackT8_F5", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_G5", + "name": "RackT8_G5", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_H5", + "name": "RackT8_H5", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_A6", + "name": "RackT8_A6", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_B6", + "name": "RackT8_B6", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_C6", + "name": "RackT8_C6", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_D6", + "name": "RackT8_D6", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_E6", + "name": "RackT8_E6", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_F6", + "name": "RackT8_F6", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_G6", + "name": "RackT8_G6", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_H6", + "name": "RackT8_H6", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_A7", + "name": "RackT8_A7", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_B7", + "name": "RackT8_B7", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_C7", + "name": "RackT8_C7", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_D7", + "name": "RackT8_D7", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_E7", + "name": "RackT8_E7", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_F7", + "name": "RackT8_F7", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_G7", + "name": "RackT8_G7", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_H7", + "name": "RackT8_H7", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_A8", + "name": "RackT8_A8", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_B8", + "name": "RackT8_B8", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_C8", + "name": "RackT8_C8", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_D8", + "name": "RackT8_D8", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_E8", + "name": "RackT8_E8", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_F8", + "name": "RackT8_F8", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_G8", + "name": "RackT8_G8", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_H8", + "name": "RackT8_H8", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_A9", + "name": "RackT8_A9", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_B9", + "name": "RackT8_B9", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_C9", + "name": "RackT8_C9", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_D9", + "name": "RackT8_D9", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_E9", + "name": "RackT8_E9", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_F9", + "name": "RackT8_F9", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_G9", + "name": "RackT8_G9", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_H9", + "name": "RackT8_H9", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_A10", + "name": "RackT8_A10", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_B10", + "name": "RackT8_B10", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_C10", + "name": "RackT8_C10", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_D10", + "name": "RackT8_D10", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_E10", + "name": "RackT8_E10", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_F10", + "name": "RackT8_F10", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_G10", + "name": "RackT8_G10", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_H10", + "name": "RackT8_H10", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_A11", + "name": "RackT8_A11", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_B11", + "name": "RackT8_B11", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_C11", + "name": "RackT8_C11", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_D11", + "name": "RackT8_D11", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_E11", + "name": "RackT8_E11", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_F11", + "name": "RackT8_F11", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_G11", + "name": "RackT8_G11", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_H11", + "name": "RackT8_H11", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_A12", + "name": "RackT8_A12", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_B12", + "name": "RackT8_B12", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_C12", + "name": "RackT8_C12", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_D12", + "name": "RackT8_D12", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_E12", + "name": "RackT8_E12", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_F12", + "name": "RackT8_F12", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_G12", + "name": "RackT8_G12", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "RackT8_H12", + "name": "RackT8_H12", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "PlateT11", + "name": "PlateT11", + "sample_id": null, + "children": [ + "PlateT11_A1", + "PlateT11_B1", + "PlateT11_C1", + "PlateT11_D1", + "PlateT11_E1", + "PlateT11_F1", + "PlateT11_G1", + "PlateT11_H1", + "PlateT11_A2", + "PlateT11_B2", + "PlateT11_C2", + "PlateT11_D2", + "PlateT11_E2", + "PlateT11_F2", + "PlateT11_G2", + "PlateT11_H2", + "PlateT11_A3", + "PlateT11_B3", + "PlateT11_C3", + "PlateT11_D3", + "PlateT11_E3", + "PlateT11_F3", + "PlateT11_G3", + "PlateT11_H3", + "PlateT11_A4", + "PlateT11_B4", + "PlateT11_C4", + "PlateT11_D4", + "PlateT11_E4", + "PlateT11_F4", + "PlateT11_G4", + "PlateT11_H4", + "PlateT11_A5", + "PlateT11_B5", + "PlateT11_C5", + "PlateT11_D5", + "PlateT11_E5", + "PlateT11_F5", + "PlateT11_G5", + "PlateT11_H5", + "PlateT11_A6", + "PlateT11_B6", + "PlateT11_C6", + "PlateT11_D6", + "PlateT11_E6", + "PlateT11_F6", + "PlateT11_G6", + "PlateT11_H6", + "PlateT11_A7", + "PlateT11_B7", + "PlateT11_C7", + "PlateT11_D7", + "PlateT11_E7", + "PlateT11_F7", + "PlateT11_G7", + "PlateT11_H7", + "PlateT11_A8", + "PlateT11_B8", + "PlateT11_C8", + "PlateT11_D8", + "PlateT11_E8", + "PlateT11_F8", + "PlateT11_G8", + "PlateT11_H8", + "PlateT11_A9", + "PlateT11_B9", + "PlateT11_C9", + "PlateT11_D9", + "PlateT11_E9", + "PlateT11_F9", + "PlateT11_G9", + "PlateT11_H9", + "PlateT11_A10", + "PlateT11_B10", + "PlateT11_C10", + "PlateT11_D10", + "PlateT11_E10", + "PlateT11_F10", + "PlateT11_G10", + "PlateT11_H10", + "PlateT11_A11", + "PlateT11_B11", + "PlateT11_C11", + "PlateT11_D11", + "PlateT11_E11", + "PlateT11_F11", + "PlateT11_G11", + "PlateT11_H11", + "PlateT11_A12", + "PlateT11_B12", + "PlateT11_C12", + "PlateT11_D12", + "PlateT11_E12", + "PlateT11_F12", + "PlateT11_G12", + "PlateT11_H12" + ], + "parent": "PRCXI_Deck", + "type": "plate", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} + }, + "data": { "Material": { "uuid": "57b1e4711e9e4a32b529f3132fc5931f" } } + }, + { + "id": "PlateT11_A1", + "name": "PlateT11_A1", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + "Water", + 100 + ] + ], + "pending_liquids": [ + [ + "Water", + 100 + ] + ], + "liquid_history": [ + "Water" + ] + } + }, + { + "id": "PlateT11_B1", + "name": "PlateT11_B1", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C1", + "name": "PlateT11_C1", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D1", + "name": "PlateT11_D1", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E1", + "name": "PlateT11_E1", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F1", + "name": "PlateT11_F1", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G1", + "name": "PlateT11_G1", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H1", + "name": "PlateT11_H1", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_A2", + "name": "PlateT11_A2", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + "Water", + 100 + ] + ], + "pending_liquids": [ + [ + "Water", + 100 + ] + ], + "liquid_history": [ + "Water" + ] + } + }, + { + "id": "PlateT11_B2", + "name": "PlateT11_B2", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C2", + "name": "PlateT11_C2", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D2", + "name": "PlateT11_D2", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E2", + "name": "PlateT11_E2", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F2", + "name": "PlateT11_F2", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G2", + "name": "PlateT11_G2", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H2", + "name": "PlateT11_H2", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_A3", + "name": "PlateT11_A3", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + "Water", + 100 + ] + ], + "pending_liquids": [ + [ + "Water", + 100 + ] + ], + "liquid_history": [ + "Water" + ] + } + }, + { + "id": "PlateT11_B3", + "name": "PlateT11_B3", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C3", + "name": "PlateT11_C3", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D3", + "name": "PlateT11_D3", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E3", + "name": "PlateT11_E3", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F3", + "name": "PlateT11_F3", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G3", + "name": "PlateT11_G3", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H3", + "name": "PlateT11_H3", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_A4", + "name": "PlateT11_A4", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + "Water", + 100 + ] + ], + "pending_liquids": [ + [ + "Water", + 100 + ] + ], + "liquid_history": [ + "Water" + ] + } + }, + { + "id": "PlateT11_B4", + "name": "PlateT11_B4", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C4", + "name": "PlateT11_C4", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D4", + "name": "PlateT11_D4", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E4", + "name": "PlateT11_E4", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F4", + "name": "PlateT11_F4", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G4", + "name": "PlateT11_G4", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H4", + "name": "PlateT11_H4", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_A5", + "name": "PlateT11_A5", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + "Water", + 100 + ] + ], + "pending_liquids": [ + [ + "Water", + 100 + ] + ], + "liquid_history": [ + "Water" + ] + } + }, + { + "id": "PlateT11_B5", + "name": "PlateT11_B5", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C5", + "name": "PlateT11_C5", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D5", + "name": "PlateT11_D5", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E5", + "name": "PlateT11_E5", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F5", + "name": "PlateT11_F5", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G5", + "name": "PlateT11_G5", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H5", + "name": "PlateT11_H5", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_A6", + "name": "PlateT11_A6", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + "Water", + 100 + ] + ], + "pending_liquids": [ + [ + "Water", + 100 + ] + ], + "liquid_history": [ + "Water" + ] + } + }, + { + "id": "PlateT11_B6", + "name": "PlateT11_B6", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C6", + "name": "PlateT11_C6", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D6", + "name": "PlateT11_D6", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E6", + "name": "PlateT11_E6", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F6", + "name": "PlateT11_F6", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G6", + "name": "PlateT11_G6", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H6", + "name": "PlateT11_H6", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_A7", + "name": "PlateT11_A7", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_B7", + "name": "PlateT11_B7", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C7", + "name": "PlateT11_C7", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D7", + "name": "PlateT11_D7", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E7", + "name": "PlateT11_E7", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F7", + "name": "PlateT11_F7", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G7", + "name": "PlateT11_G7", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H7", + "name": "PlateT11_H7", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_A8", + "name": "PlateT11_A8", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_B8", + "name": "PlateT11_B8", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C8", + "name": "PlateT11_C8", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D8", + "name": "PlateT11_D8", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E8", + "name": "PlateT11_E8", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F8", + "name": "PlateT11_F8", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G8", + "name": "PlateT11_G8", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H8", + "name": "PlateT11_H8", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_A9", + "name": "PlateT11_A9", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_B9", + "name": "PlateT11_B9", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C9", + "name": "PlateT11_C9", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D9", + "name": "PlateT11_D9", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E9", + "name": "PlateT11_E9", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F9", + "name": "PlateT11_F9", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G9", + "name": "PlateT11_G9", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H9", + "name": "PlateT11_H9", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_A10", + "name": "PlateT11_A10", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_B10", + "name": "PlateT11_B10", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C10", + "name": "PlateT11_C10", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D10", + "name": "PlateT11_D10", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E10", + "name": "PlateT11_E10", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F10", + "name": "PlateT11_F10", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G10", + "name": "PlateT11_G10", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H10", + "name": "PlateT11_H10", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_A11", + "name": "PlateT11_A11", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_B11", + "name": "PlateT11_B11", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C11", + "name": "PlateT11_C11", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D11", + "name": "PlateT11_D11", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E11", + "name": "PlateT11_E11", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F11", + "name": "PlateT11_F11", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G11", + "name": "PlateT11_G11", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H11", + "name": "PlateT11_H11", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_A12", + "name": "PlateT11_A12", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_B12", + "name": "PlateT11_B12", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C12", + "name": "PlateT11_C12", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D12", + "name": "PlateT11_D12", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E12", + "name": "PlateT11_E12", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F12", + "name": "PlateT11_F12", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G12", + "name": "PlateT11_G12", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H12", + "name": "PlateT11_H12", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } } ], "links": [] diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index 804d746..5be20a3 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -503,7 +503,6 @@ class PRCXI9300Backend(LiquidHandlerBackend): hole_col = tip_columns[0] + 1 step = self.api_client.UnLoad( - "Left", dosage=0, plate_no=PlateNo, is_whole_plate=False, @@ -554,7 +553,6 @@ class PRCXI9300Backend(LiquidHandlerBackend): hole_col = tip_columns[0] + 1 assert mix_time > 0 step = self.api_client.Blending( - "Left", dosage=mix_vol, plate_no=PlateNo, is_whole_plate=False, @@ -641,7 +639,6 @@ class PRCXI9300Backend(LiquidHandlerBackend): hole_row = tipspot_index % 8 + 1 step = self.api_client.Tapping( - "Left", dosage=int(volumes[0]), plate_no=PlateNo, is_whole_plate=False, @@ -963,8 +960,9 @@ class PRCXI9300Api: if __name__ == "__main__": # # Example usage # # 1. 用导出的json,给每个T1 T2板子设定相应的物料,如果是孔板和枪头盒,要对应区分 - # # 2. 设计一个单点动作流程,可以跑 - # # 3. + # # 2. backend需要支持num channel为1的情况 + # # 3. 设计一个单点动作流程,可以跑 + # # 4. # deck = PRCXI9300Deck(name="PRCXI_Deck", size_x=100, size_y=100, size_z=100) # plate1 = PRCXI9300Container(name="rackT1", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) # plate1.load_state({ @@ -1145,49 +1143,42 @@ if __name__ == "__main__": "Name": "HPLC料盘" } }) - plate2 = get_well_container("PlateT2") plate2.load_state({ "Material": { "uuid": "04211a2dc93547fe9bf6121eac533650", } }) - plate3 = get_well_container("PlateT3") plate3.load_state({ "Material": { "uuid": "04211a2dc93547fe9bf6121eac533650", } }) - - trash = PRCXI9300Trash(name="trash", size_x=50, size_y=50, size_z=10, category="trash", ordering=collections.OrderedDict()) + trash = PRCXI9300Trash(name="trash", size_x=50, size_y=50, size_z=10, category="trash") trash.load_state({ "Material": { "uuid": "730067cf07ae43849ddf4034299030e9" } }) - plate5 = get_well_container("PlateT5") plate5.load_state({ "Material": { "uuid": "04211a2dc93547fe9bf6121eac533650", } }) - plate6 = get_well_container("PlateT6") plate6.load_state({ "Material": { "uuid": "04211a2dc93547fe9bf6121eac533650" } }) - plate7 = PRCXI9300Container(name="plateT7", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) plate7.load_state({ "Material": { "uuid": "04211a2dc93547fe9bf6121eac533650" } }) - plate8 = get_well_container("RackT8") plate8.load_state({ "Material": { @@ -1196,72 +1187,49 @@ if __name__ == "__main__": "Name": "10μL加长 Tip头" } }) - plate9 = get_well_container("PlateT9") plate9.load_state({ "Material": { "uuid": "04211a2dc93547fe9bf6121eac533650" } }) - plate10 = get_well_container("PlateT10") plate10.load_state({ "Material": { "uuid": "04211a2dc93547fe9bf6121eac533650" } }) - plate11 = get_well_container("PlateT11") plate11.load_state({ "Material": { "uuid": "57b1e4711e9e4a32b529f3132fc5931f", } }) - - plate12 = get_well_container("PlateT12") plate12.load_state({ "Material": { "uuid": "04211a2dc93547fe9bf6121eac533650" } }) - - plate13 = get_well_container("PlateT13") plate13.load_state({ "Material": { "uuid": "04211a2dc93547fe9bf6121eac533650" } }) - - # from pprint import pprint - # pprint(well_containers.children) - plate1.assign_child_resource(plate1, location=Coordinate(0, 0, 0)) - plate2.assign_child_resource(plate2, location=Coordinate(0, 0, 0)) - plate3.assign_child_resource(plate3, location=Coordinate(0, 0, 0)) - trash.assign_child_resource(trash, location=Coordinate(0, 0, 0)) - plate5.assign_child_resource(plate5, location=Coordinate(0, 0, 0)) - plate6.assign_child_resource(plate6, location=Coordinate(0, 0, 0)) - plate7.assign_child_resource(plate7, location=Coordinate(0, 0, 0)) - plate8.assign_child_resource(plate8, location=Coordinate(0, 0, 0)) - plate9.assign_child_resource(plate9, location=Coordinate(0, 0, 0)) - plate10.assign_child_resource(plate10, location=Coordinate(0, 0, 0)) - plate11.assign_child_resource(plate11, location=Coordinate(0, 0, 0)) - plate12.assign_child_resource(plate12, location=Coordinate(0, 0, 0)) - plate13.assign_child_resource(plate13, location=Coordinate(0, 0, 0)) - deck.assign_child_resource(plate1, location=Coordinate(0, 0, 0)) - deck.assign_child_resource(plate3, location=Coordinate(0, 0, 0)) + # deck.assign_child_resource(plate2, location=Coordinate(0, 0, 0)) + # deck.assign_child_resource(plate3, location=Coordinate(0, 0, 0)) deck.assign_child_resource(trash, location=Coordinate(0, 0, 0)) - deck.assign_child_resource(plate5, location=Coordinate(0, 0, 0)) - deck.assign_child_resource(plate6, location=Coordinate(0, 0, 0)) - deck.assign_child_resource(plate7, location=Coordinate(0, 0, 0)) + # deck.assign_child_resource(plate5, location=Coordinate(0, 0, 0)) + # deck.assign_child_resource(plate6, location=Coordinate(0, 0, 0)) + # deck.assign_child_resource(plate7, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate8, location=Coordinate(0, 0, 0)) - deck.assign_child_resource(plate9, location=Coordinate(0, 0, 0)) - deck.assign_child_resource(plate10, location=Coordinate(0, 0, 0)) + # deck.assign_child_resource(plate9, location=Coordinate(0, 0, 0)) + # deck.assign_child_resource(plate10, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate11, location=Coordinate(0, 0, 0)) - deck.assign_child_resource(plate12, location=Coordinate(0, 0, 0)) - deck.assign_child_resource(plate13, location=Coordinate(0, 0, 0)) + # deck.assign_child_resource(plate12, location=Coordinate(0, 0, 0)) + # deck.assign_child_resource(plate13, location=Coordinate(0, 0, 0)) handler = PRCXI9300Handler(deck=deck, host="10.181.102.13", port=9999, timeout=10.0, setup=False, debug=True, matrix_id="fd383e6d-2d0e-40b5-9c01-1b2870b1f1b1") handler.set_tiprack([plate8]) # Set the tip rack for the handler @@ -1270,7 +1238,13 @@ if __name__ == "__main__": # from pylabrobot.resources import set_tip_tracking set_volume_tracking(enabled=True) - plate8.set_well_liquids([("Water", 100) if (i % 8 == 0 and i // 8 < 6) else (None, 100) for i in range(96)]) # Set liquids for every 8 wells in plate8 + plate11.set_well_liquids([("Water", 100) if (i % 8 == 0 and i // 8 < 6) else (None, 100) for i in range(96)]) # Set liquids for every 8 wells in plate8 + + from unilabos.resources.graphio import * + + A = tree_to_list([resource_plr_to_ulab(deck)]) + with open("deck.json", "w", encoding="utf-8") as f: + json.dump(A, f, indent=4, ensure_ascii=False) asyncio.run(handler.create_protocol(protocol_name="Test Protocol")) # Initialize the backend and setup the connection asyncio.run(handler.pick_up_tips(plate8.children[3],[1])) From 0dc11542fbf518977ee9fcc2307f2ccd34838344 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Thu, 17 Jul 2025 23:53:41 +0800 Subject: [PATCH 61/96] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E8=A1=A8&=E5=A2=9E=E5=8A=A0=E8=B5=84=E6=BA=90=EF=BC=8Cparent?= =?UTF-8?q?=E5=BA=94=E4=B8=BAresources=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- unilabos/registry/devices/liquid_handler.yaml | 15 +++++++++++++++ unilabos/registry/registry.py | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/unilabos/registry/devices/liquid_handler.yaml b/unilabos/registry/devices/liquid_handler.yaml index 3812043..99380aa 100644 --- a/unilabos/registry/devices/liquid_handler.yaml +++ b/unilabos/registry/devices/liquid_handler.yaml @@ -4469,11 +4469,17 @@ liquid_handler: properties: backend: type: string + channel_num: + default: 8 + type: integer deck: type: string + simulator: + type: boolean required: - backend - deck + - simulator type: object data: properties: {} @@ -6845,6 +6851,12 @@ liquid_handler.prcxi: init_param_schema: config: properties: + axis: + default: Left + type: string + channel_num: + default: 8 + type: string debug: default: false type: string @@ -6852,6 +6864,9 @@ liquid_handler.prcxi: type: string host: type: string + matrix_id: + default: '' + type: string port: type: integer setup: diff --git a/unilabos/registry/registry.py b/unilabos/registry/registry.py index a62351c..5fedfdb 100644 --- a/unilabos/registry/registry.py +++ b/unilabos/registry/registry.py @@ -105,7 +105,7 @@ class Registry: "placeholder_keys": { "res_id": "unilabos_resources", # 将当前实验室的全部物料id作为下拉框可选择 "device_id": "unilabos_devices", # 将当前实验室的全部设备id作为下拉框可选择 - "parent": "unilabos_devices", # 将当前实验室的全部设备id作为下拉框可选择 + "parent": "unilabos_resources", # 将当前实验室的全部物料id作为下拉框可选择 }, }, "test_latency": { From 9a8d50bbf31fc39ee71be6c54715e56cb28673a1 Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Fri, 18 Jul 2025 00:14:33 +0800 Subject: [PATCH 62/96] Update 9320 --- .../devices/liquid_handling/prcxi/deck.json | 13245 ++++++++++++++++ .../devices/liquid_handling/prcxi/prcxi.py | 60 +- 2 files changed, 13274 insertions(+), 31 deletions(-) create mode 100644 unilabos/devices/liquid_handling/prcxi/deck.json diff --git a/unilabos/devices/liquid_handling/prcxi/deck.json b/unilabos/devices/liquid_handling/prcxi/deck.json new file mode 100644 index 0000000..4025b26 --- /dev/null +++ b/unilabos/devices/liquid_handling/prcxi/deck.json @@ -0,0 +1,13245 @@ +[ + { + "id": "PRCXI_Deck", + "name": "PRCXI_Deck", + "sample_id": null, + "children": [ + "HPLCPlateT1", + "trash", + "RackT8", + "PlateT11" + ], + "parent": "lh_PRCXI_Deck", + "type": "deck", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Deck", + "size_x": 100, + "size_y": 100, + "size_z": 100, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "deck", + "barcode": null + }, + "data": {} + }, + { + "id": "HPLCPlateT1", + "name": "HPLCPlateT1", + "sample_id": null, + "children": [ + "HPLCPlateT1_A1", + "HPLCPlateT1_B1", + "HPLCPlateT1_C1", + "HPLCPlateT1_D1", + "HPLCPlateT1_E1", + "HPLCPlateT1_F1", + "HPLCPlateT1_G1", + "HPLCPlateT1_H1", + "HPLCPlateT1_A2", + "HPLCPlateT1_B2", + "HPLCPlateT1_C2", + "HPLCPlateT1_D2", + "HPLCPlateT1_E2", + "HPLCPlateT1_F2", + "HPLCPlateT1_G2", + "HPLCPlateT1_H2", + "HPLCPlateT1_A3", + "HPLCPlateT1_B3", + "HPLCPlateT1_C3", + "HPLCPlateT1_D3", + "HPLCPlateT1_E3", + "HPLCPlateT1_F3", + "HPLCPlateT1_G3", + "HPLCPlateT1_H3", + "HPLCPlateT1_A4", + "HPLCPlateT1_B4", + "HPLCPlateT1_C4", + "HPLCPlateT1_D4", + "HPLCPlateT1_E4", + "HPLCPlateT1_F4", + "HPLCPlateT1_G4", + "HPLCPlateT1_H4", + "HPLCPlateT1_A5", + "HPLCPlateT1_B5", + "HPLCPlateT1_C5", + "HPLCPlateT1_D5", + "HPLCPlateT1_E5", + "HPLCPlateT1_F5", + "HPLCPlateT1_G5", + "HPLCPlateT1_H5", + "HPLCPlateT1_A6", + "HPLCPlateT1_B6", + "HPLCPlateT1_C6", + "HPLCPlateT1_D6", + "HPLCPlateT1_E6", + "HPLCPlateT1_F6", + "HPLCPlateT1_G6", + "HPLCPlateT1_H6", + "HPLCPlateT1_A7", + "HPLCPlateT1_B7", + "HPLCPlateT1_C7", + "HPLCPlateT1_D7", + "HPLCPlateT1_E7", + "HPLCPlateT1_F7", + "HPLCPlateT1_G7", + "HPLCPlateT1_H7", + "HPLCPlateT1_A8", + "HPLCPlateT1_B8", + "HPLCPlateT1_C8", + "HPLCPlateT1_D8", + "HPLCPlateT1_E8", + "HPLCPlateT1_F8", + "HPLCPlateT1_G8", + "HPLCPlateT1_H8", + "HPLCPlateT1_A9", + "HPLCPlateT1_B9", + "HPLCPlateT1_C9", + "HPLCPlateT1_D9", + "HPLCPlateT1_E9", + "HPLCPlateT1_F9", + "HPLCPlateT1_G9", + "HPLCPlateT1_H9", + "HPLCPlateT1_A10", + "HPLCPlateT1_B10", + "HPLCPlateT1_C10", + "HPLCPlateT1_D10", + "HPLCPlateT1_E10", + "HPLCPlateT1_F10", + "HPLCPlateT1_G10", + "HPLCPlateT1_H10", + "HPLCPlateT1_A11", + "HPLCPlateT1_B11", + "HPLCPlateT1_C11", + "HPLCPlateT1_D11", + "HPLCPlateT1_E11", + "HPLCPlateT1_F11", + "HPLCPlateT1_G11", + "HPLCPlateT1_H11", + "HPLCPlateT1_A12", + "HPLCPlateT1_B12", + "HPLCPlateT1_C12", + "HPLCPlateT1_D12", + "HPLCPlateT1_E12", + "HPLCPlateT1_F12", + "HPLCPlateT1_G12", + "HPLCPlateT1_H12" + ], + "parent": "PRCXI_Deck", + "type": "plate", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} + }, + "data": { + "Material": { + "uuid": "548bbc3df0d4447586f2c19d2c0c0c55", + "Code": "HPLC01", + "Name": "HPLC料盘" + } + } + }, + { + "id": "HPLCPlateT1_A1", + "name": "HPLCPlateT1_A1", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_B1", + "name": "HPLCPlateT1_B1", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_C1", + "name": "HPLCPlateT1_C1", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_D1", + "name": "HPLCPlateT1_D1", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_E1", + "name": "HPLCPlateT1_E1", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_F1", + "name": "HPLCPlateT1_F1", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_G1", + "name": "HPLCPlateT1_G1", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_H1", + "name": "HPLCPlateT1_H1", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_A2", + "name": "HPLCPlateT1_A2", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_B2", + "name": "HPLCPlateT1_B2", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_C2", + "name": "HPLCPlateT1_C2", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_D2", + "name": "HPLCPlateT1_D2", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_E2", + "name": "HPLCPlateT1_E2", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_F2", + "name": "HPLCPlateT1_F2", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_G2", + "name": "HPLCPlateT1_G2", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_H2", + "name": "HPLCPlateT1_H2", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_A3", + "name": "HPLCPlateT1_A3", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_B3", + "name": "HPLCPlateT1_B3", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_C3", + "name": "HPLCPlateT1_C3", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_D3", + "name": "HPLCPlateT1_D3", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_E3", + "name": "HPLCPlateT1_E3", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_F3", + "name": "HPLCPlateT1_F3", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_G3", + "name": "HPLCPlateT1_G3", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_H3", + "name": "HPLCPlateT1_H3", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_A4", + "name": "HPLCPlateT1_A4", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_B4", + "name": "HPLCPlateT1_B4", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_C4", + "name": "HPLCPlateT1_C4", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_D4", + "name": "HPLCPlateT1_D4", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_E4", + "name": "HPLCPlateT1_E4", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_F4", + "name": "HPLCPlateT1_F4", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_G4", + "name": "HPLCPlateT1_G4", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_H4", + "name": "HPLCPlateT1_H4", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_A5", + "name": "HPLCPlateT1_A5", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_B5", + "name": "HPLCPlateT1_B5", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_C5", + "name": "HPLCPlateT1_C5", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_D5", + "name": "HPLCPlateT1_D5", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_E5", + "name": "HPLCPlateT1_E5", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_F5", + "name": "HPLCPlateT1_F5", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_G5", + "name": "HPLCPlateT1_G5", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_H5", + "name": "HPLCPlateT1_H5", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_A6", + "name": "HPLCPlateT1_A6", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_B6", + "name": "HPLCPlateT1_B6", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_C6", + "name": "HPLCPlateT1_C6", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_D6", + "name": "HPLCPlateT1_D6", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_E6", + "name": "HPLCPlateT1_E6", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_F6", + "name": "HPLCPlateT1_F6", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_G6", + "name": "HPLCPlateT1_G6", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_H6", + "name": "HPLCPlateT1_H6", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_A7", + "name": "HPLCPlateT1_A7", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_B7", + "name": "HPLCPlateT1_B7", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_C7", + "name": "HPLCPlateT1_C7", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_D7", + "name": "HPLCPlateT1_D7", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_E7", + "name": "HPLCPlateT1_E7", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_F7", + "name": "HPLCPlateT1_F7", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_G7", + "name": "HPLCPlateT1_G7", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_H7", + "name": "HPLCPlateT1_H7", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_A8", + "name": "HPLCPlateT1_A8", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_B8", + "name": "HPLCPlateT1_B8", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_C8", + "name": "HPLCPlateT1_C8", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_D8", + "name": "HPLCPlateT1_D8", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_E8", + "name": "HPLCPlateT1_E8", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_F8", + "name": "HPLCPlateT1_F8", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_G8", + "name": "HPLCPlateT1_G8", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_H8", + "name": "HPLCPlateT1_H8", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_A9", + "name": "HPLCPlateT1_A9", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_B9", + "name": "HPLCPlateT1_B9", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_C9", + "name": "HPLCPlateT1_C9", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_D9", + "name": "HPLCPlateT1_D9", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_E9", + "name": "HPLCPlateT1_E9", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_F9", + "name": "HPLCPlateT1_F9", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_G9", + "name": "HPLCPlateT1_G9", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_H9", + "name": "HPLCPlateT1_H9", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_A10", + "name": "HPLCPlateT1_A10", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_B10", + "name": "HPLCPlateT1_B10", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_C10", + "name": "HPLCPlateT1_C10", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_D10", + "name": "HPLCPlateT1_D10", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_E10", + "name": "HPLCPlateT1_E10", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_F10", + "name": "HPLCPlateT1_F10", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_G10", + "name": "HPLCPlateT1_G10", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_H10", + "name": "HPLCPlateT1_H10", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_A11", + "name": "HPLCPlateT1_A11", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_B11", + "name": "HPLCPlateT1_B11", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_C11", + "name": "HPLCPlateT1_C11", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_D11", + "name": "HPLCPlateT1_D11", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_E11", + "name": "HPLCPlateT1_E11", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_F11", + "name": "HPLCPlateT1_F11", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_G11", + "name": "HPLCPlateT1_G11", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_H11", + "name": "HPLCPlateT1_H11", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_A12", + "name": "HPLCPlateT1_A12", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_B12", + "name": "HPLCPlateT1_B12", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_C12", + "name": "HPLCPlateT1_C12", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_D12", + "name": "HPLCPlateT1_D12", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_E12", + "name": "HPLCPlateT1_E12", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_F12", + "name": "HPLCPlateT1_F12", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_G12", + "name": "HPLCPlateT1_G12", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_H12", + "name": "HPLCPlateT1_H12", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "trash", + "name": "trash", + "sample_id": null, + "children": [], + "parent": "PRCXI_Deck", + "type": "container", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Trash", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "trash", + "model": null, + "barcode": null, + "max_volume": "Infinity", + "material_z_thickness": 0, + "compute_volume_from_height": null, + "compute_height_from_volume": null + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [], + "Material": { + "uuid": "730067cf07ae43849ddf4034299030e9" + } + } + }, + { + "id": "RackT8", + "name": "RackT8", + "sample_id": null, + "children": [ + "name_A1", + "name_B1", + "name_C1", + "name_D1", + "name_E1", + "name_F1", + "name_G1", + "name_H1", + "name_A2", + "name_B2", + "name_C2", + "name_D2", + "name_E2", + "name_F2", + "name_G2", + "name_H2", + "name_A3", + "name_B3", + "name_C3", + "name_D3", + "name_E3", + "name_F3", + "name_G3", + "name_H3", + "name_A4", + "name_B4", + "name_C4", + "name_D4", + "name_E4", + "name_F4", + "name_G4", + "name_H4", + "name_A5", + "name_B5", + "name_C5", + "name_D5", + "name_E5", + "name_F5", + "name_G5", + "name_H5", + "name_A6", + "name_B6", + "name_C6", + "name_D6", + "name_E6", + "name_F6", + "name_G6", + "name_H6", + "name_A7", + "name_B7", + "name_C7", + "name_D7", + "name_E7", + "name_F7", + "name_G7", + "name_H7", + "name_A8", + "name_B8", + "name_C8", + "name_D8", + "name_E8", + "name_F8", + "name_G8", + "name_H8", + "name_A9", + "name_B9", + "name_C9", + "name_D9", + "name_E9", + "name_F9", + "name_G9", + "name_H9", + "name_A10", + "name_B10", + "name_C10", + "name_D10", + "name_E10", + "name_F10", + "name_G10", + "name_H10", + "name_A11", + "name_B11", + "name_C11", + "name_D11", + "name_E11", + "name_F11", + "name_G11", + "name_H11", + "name_A12", + "name_B12", + "name_C12", + "name_D12", + "name_E12", + "name_F12", + "name_G12", + "name_H12" + ], + "parent": "PRCXI_Deck", + "type": "container", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_rack", + "model": null, + "barcode": null, + "ordering": {} + }, + "data": { + "Material": { + "uuid": "068b3815e36b4a72a59bae017011b29f", + "Code": "ZX-001-10+", + "Name": "10μL加长 Tip头" + } + } + }, + { + "id": "name_A1", + "name": "name_A1", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 13.224, + "y": 73.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_B1", + "name": "name_B1", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 13.224, + "y": 64.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_C1", + "name": "name_C1", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 13.224, + "y": 55.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_D1", + "name": "name_D1", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 13.224, + "y": 46.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_E1", + "name": "name_E1", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 13.224, + "y": 37.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_F1", + "name": "name_F1", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 13.224, + "y": 28.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_G1", + "name": "name_G1", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 13.224, + "y": 19.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_H1", + "name": "name_H1", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 13.224, + "y": 10.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_A2", + "name": "name_A2", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 22.224, + "y": 73.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_B2", + "name": "name_B2", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 22.224, + "y": 64.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_C2", + "name": "name_C2", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 22.224, + "y": 55.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_D2", + "name": "name_D2", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 22.224, + "y": 46.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_E2", + "name": "name_E2", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 22.224, + "y": 37.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_F2", + "name": "name_F2", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 22.224, + "y": 28.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_G2", + "name": "name_G2", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 22.224, + "y": 19.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_H2", + "name": "name_H2", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 22.224, + "y": 10.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_A3", + "name": "name_A3", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 31.224, + "y": 73.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_B3", + "name": "name_B3", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 31.224, + "y": 64.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_C3", + "name": "name_C3", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 31.224, + "y": 55.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_D3", + "name": "name_D3", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 31.224, + "y": 46.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_E3", + "name": "name_E3", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 31.224, + "y": 37.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_F3", + "name": "name_F3", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 31.224, + "y": 28.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_G3", + "name": "name_G3", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 31.224, + "y": 19.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_H3", + "name": "name_H3", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 31.224, + "y": 10.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_A4", + "name": "name_A4", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 40.224, + "y": 73.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_B4", + "name": "name_B4", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 40.224, + "y": 64.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_C4", + "name": "name_C4", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 40.224, + "y": 55.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_D4", + "name": "name_D4", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 40.224, + "y": 46.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_E4", + "name": "name_E4", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 40.224, + "y": 37.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_F4", + "name": "name_F4", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 40.224, + "y": 28.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_G4", + "name": "name_G4", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 40.224, + "y": 19.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_H4", + "name": "name_H4", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 40.224, + "y": 10.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_A5", + "name": "name_A5", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 49.224, + "y": 73.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_B5", + "name": "name_B5", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 49.224, + "y": 64.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_C5", + "name": "name_C5", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 49.224, + "y": 55.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_D5", + "name": "name_D5", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 49.224, + "y": 46.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_E5", + "name": "name_E5", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 49.224, + "y": 37.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_F5", + "name": "name_F5", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 49.224, + "y": 28.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_G5", + "name": "name_G5", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 49.224, + "y": 19.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_H5", + "name": "name_H5", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 49.224, + "y": 10.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_A6", + "name": "name_A6", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 58.224, + "y": 73.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_B6", + "name": "name_B6", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 58.224, + "y": 64.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_C6", + "name": "name_C6", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 58.224, + "y": 55.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_D6", + "name": "name_D6", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 58.224, + "y": 46.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_E6", + "name": "name_E6", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 58.224, + "y": 37.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_F6", + "name": "name_F6", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 58.224, + "y": 28.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_G6", + "name": "name_G6", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 58.224, + "y": 19.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_H6", + "name": "name_H6", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 58.224, + "y": 10.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_A7", + "name": "name_A7", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 67.224, + "y": 73.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_B7", + "name": "name_B7", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 67.224, + "y": 64.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_C7", + "name": "name_C7", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 67.224, + "y": 55.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_D7", + "name": "name_D7", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 67.224, + "y": 46.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_E7", + "name": "name_E7", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 67.224, + "y": 37.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_F7", + "name": "name_F7", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 67.224, + "y": 28.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_G7", + "name": "name_G7", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 67.224, + "y": 19.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_H7", + "name": "name_H7", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 67.224, + "y": 10.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_A8", + "name": "name_A8", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 76.224, + "y": 73.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_B8", + "name": "name_B8", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 76.224, + "y": 64.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_C8", + "name": "name_C8", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 76.224, + "y": 55.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_D8", + "name": "name_D8", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 76.224, + "y": 46.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_E8", + "name": "name_E8", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 76.224, + "y": 37.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_F8", + "name": "name_F8", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 76.224, + "y": 28.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_G8", + "name": "name_G8", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 76.224, + "y": 19.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_H8", + "name": "name_H8", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 76.224, + "y": 10.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_A9", + "name": "name_A9", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 85.224, + "y": 73.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_B9", + "name": "name_B9", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 85.224, + "y": 64.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_C9", + "name": "name_C9", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 85.224, + "y": 55.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_D9", + "name": "name_D9", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 85.224, + "y": 46.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_E9", + "name": "name_E9", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 85.224, + "y": 37.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_F9", + "name": "name_F9", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 85.224, + "y": 28.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_G9", + "name": "name_G9", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 85.224, + "y": 19.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_H9", + "name": "name_H9", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 85.224, + "y": 10.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_A10", + "name": "name_A10", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 94.224, + "y": 73.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_B10", + "name": "name_B10", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 94.224, + "y": 64.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_C10", + "name": "name_C10", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 94.224, + "y": 55.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_D10", + "name": "name_D10", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 94.224, + "y": 46.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_E10", + "name": "name_E10", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 94.224, + "y": 37.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_F10", + "name": "name_F10", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 94.224, + "y": 28.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_G10", + "name": "name_G10", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 94.224, + "y": 19.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_H10", + "name": "name_H10", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 94.224, + "y": 10.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_A11", + "name": "name_A11", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 103.224, + "y": 73.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_B11", + "name": "name_B11", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 103.224, + "y": 64.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_C11", + "name": "name_C11", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 103.224, + "y": 55.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_D11", + "name": "name_D11", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 103.224, + "y": 46.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_E11", + "name": "name_E11", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 103.224, + "y": 37.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_F11", + "name": "name_F11", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 103.224, + "y": 28.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_G11", + "name": "name_G11", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 103.224, + "y": 19.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_H11", + "name": "name_H11", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 103.224, + "y": 10.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_A12", + "name": "name_A12", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 112.224, + "y": 73.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_B12", + "name": "name_B12", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 112.224, + "y": 64.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_C12", + "name": "name_C12", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 112.224, + "y": 55.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_D12", + "name": "name_D12", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 112.224, + "y": 46.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_E12", + "name": "name_E12", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 112.224, + "y": 37.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_F12", + "name": "name_F12", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 112.224, + "y": 28.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_G12", + "name": "name_G12", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 112.224, + "y": 19.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_H12", + "name": "name_H12", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 112.224, + "y": 10.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "PlateT11", + "name": "PlateT11", + "sample_id": null, + "children": [ + "PlateT11_A1", + "PlateT11_B1", + "PlateT11_C1", + "PlateT11_D1", + "PlateT11_E1", + "PlateT11_F1", + "PlateT11_G1", + "PlateT11_H1", + "PlateT11_A2", + "PlateT11_B2", + "PlateT11_C2", + "PlateT11_D2", + "PlateT11_E2", + "PlateT11_F2", + "PlateT11_G2", + "PlateT11_H2", + "PlateT11_A3", + "PlateT11_B3", + "PlateT11_C3", + "PlateT11_D3", + "PlateT11_E3", + "PlateT11_F3", + "PlateT11_G3", + "PlateT11_H3", + "PlateT11_A4", + "PlateT11_B4", + "PlateT11_C4", + "PlateT11_D4", + "PlateT11_E4", + "PlateT11_F4", + "PlateT11_G4", + "PlateT11_H4", + "PlateT11_A5", + "PlateT11_B5", + "PlateT11_C5", + "PlateT11_D5", + "PlateT11_E5", + "PlateT11_F5", + "PlateT11_G5", + "PlateT11_H5", + "PlateT11_A6", + "PlateT11_B6", + "PlateT11_C6", + "PlateT11_D6", + "PlateT11_E6", + "PlateT11_F6", + "PlateT11_G6", + "PlateT11_H6", + "PlateT11_A7", + "PlateT11_B7", + "PlateT11_C7", + "PlateT11_D7", + "PlateT11_E7", + "PlateT11_F7", + "PlateT11_G7", + "PlateT11_H7", + "PlateT11_A8", + "PlateT11_B8", + "PlateT11_C8", + "PlateT11_D8", + "PlateT11_E8", + "PlateT11_F8", + "PlateT11_G8", + "PlateT11_H8", + "PlateT11_A9", + "PlateT11_B9", + "PlateT11_C9", + "PlateT11_D9", + "PlateT11_E9", + "PlateT11_F9", + "PlateT11_G9", + "PlateT11_H9", + "PlateT11_A10", + "PlateT11_B10", + "PlateT11_C10", + "PlateT11_D10", + "PlateT11_E10", + "PlateT11_F10", + "PlateT11_G10", + "PlateT11_H10", + "PlateT11_A11", + "PlateT11_B11", + "PlateT11_C11", + "PlateT11_D11", + "PlateT11_E11", + "PlateT11_F11", + "PlateT11_G11", + "PlateT11_H11", + "PlateT11_A12", + "PlateT11_B12", + "PlateT11_C12", + "PlateT11_D12", + "PlateT11_E12", + "PlateT11_F12", + "PlateT11_G12", + "PlateT11_H12" + ], + "parent": "PRCXI_Deck", + "type": "plate", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} + }, + "data": { + "Material": { + "uuid": "57b1e4711e9e4a32b529f3132fc5931f" + } + } + }, + { + "id": "PlateT11_A1", + "name": "PlateT11_A1", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + "Water", + 100 + ] + ], + "pending_liquids": [ + [ + "Water", + 100 + ] + ], + "liquid_history": [ + "Water" + ] + } + }, + { + "id": "PlateT11_B1", + "name": "PlateT11_B1", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C1", + "name": "PlateT11_C1", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D1", + "name": "PlateT11_D1", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E1", + "name": "PlateT11_E1", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F1", + "name": "PlateT11_F1", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G1", + "name": "PlateT11_G1", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H1", + "name": "PlateT11_H1", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_A2", + "name": "PlateT11_A2", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + "Water", + 100 + ] + ], + "pending_liquids": [ + [ + "Water", + 100 + ] + ], + "liquid_history": [ + "Water" + ] + } + }, + { + "id": "PlateT11_B2", + "name": "PlateT11_B2", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C2", + "name": "PlateT11_C2", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D2", + "name": "PlateT11_D2", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E2", + "name": "PlateT11_E2", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F2", + "name": "PlateT11_F2", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G2", + "name": "PlateT11_G2", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H2", + "name": "PlateT11_H2", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_A3", + "name": "PlateT11_A3", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + "Water", + 100 + ] + ], + "pending_liquids": [ + [ + "Water", + 100 + ] + ], + "liquid_history": [ + "Water" + ] + } + }, + { + "id": "PlateT11_B3", + "name": "PlateT11_B3", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C3", + "name": "PlateT11_C3", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D3", + "name": "PlateT11_D3", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E3", + "name": "PlateT11_E3", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F3", + "name": "PlateT11_F3", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G3", + "name": "PlateT11_G3", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H3", + "name": "PlateT11_H3", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_A4", + "name": "PlateT11_A4", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + "Water", + 100 + ] + ], + "pending_liquids": [ + [ + "Water", + 100 + ] + ], + "liquid_history": [ + "Water" + ] + } + }, + { + "id": "PlateT11_B4", + "name": "PlateT11_B4", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C4", + "name": "PlateT11_C4", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D4", + "name": "PlateT11_D4", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E4", + "name": "PlateT11_E4", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F4", + "name": "PlateT11_F4", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G4", + "name": "PlateT11_G4", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H4", + "name": "PlateT11_H4", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_A5", + "name": "PlateT11_A5", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + "Water", + 100 + ] + ], + "pending_liquids": [ + [ + "Water", + 100 + ] + ], + "liquid_history": [ + "Water" + ] + } + }, + { + "id": "PlateT11_B5", + "name": "PlateT11_B5", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C5", + "name": "PlateT11_C5", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D5", + "name": "PlateT11_D5", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E5", + "name": "PlateT11_E5", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F5", + "name": "PlateT11_F5", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G5", + "name": "PlateT11_G5", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H5", + "name": "PlateT11_H5", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_A6", + "name": "PlateT11_A6", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + "Water", + 100 + ] + ], + "pending_liquids": [ + [ + "Water", + 100 + ] + ], + "liquid_history": [ + "Water" + ] + } + }, + { + "id": "PlateT11_B6", + "name": "PlateT11_B6", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C6", + "name": "PlateT11_C6", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D6", + "name": "PlateT11_D6", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E6", + "name": "PlateT11_E6", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F6", + "name": "PlateT11_F6", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G6", + "name": "PlateT11_G6", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H6", + "name": "PlateT11_H6", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_A7", + "name": "PlateT11_A7", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_B7", + "name": "PlateT11_B7", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C7", + "name": "PlateT11_C7", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D7", + "name": "PlateT11_D7", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E7", + "name": "PlateT11_E7", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F7", + "name": "PlateT11_F7", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G7", + "name": "PlateT11_G7", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H7", + "name": "PlateT11_H7", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_A8", + "name": "PlateT11_A8", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_B8", + "name": "PlateT11_B8", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C8", + "name": "PlateT11_C8", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D8", + "name": "PlateT11_D8", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E8", + "name": "PlateT11_E8", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F8", + "name": "PlateT11_F8", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G8", + "name": "PlateT11_G8", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H8", + "name": "PlateT11_H8", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_A9", + "name": "PlateT11_A9", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_B9", + "name": "PlateT11_B9", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C9", + "name": "PlateT11_C9", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D9", + "name": "PlateT11_D9", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E9", + "name": "PlateT11_E9", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F9", + "name": "PlateT11_F9", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G9", + "name": "PlateT11_G9", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H9", + "name": "PlateT11_H9", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_A10", + "name": "PlateT11_A10", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_B10", + "name": "PlateT11_B10", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C10", + "name": "PlateT11_C10", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D10", + "name": "PlateT11_D10", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E10", + "name": "PlateT11_E10", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F10", + "name": "PlateT11_F10", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G10", + "name": "PlateT11_G10", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H10", + "name": "PlateT11_H10", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_A11", + "name": "PlateT11_A11", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_B11", + "name": "PlateT11_B11", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C11", + "name": "PlateT11_C11", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D11", + "name": "PlateT11_D11", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E11", + "name": "PlateT11_E11", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F11", + "name": "PlateT11_F11", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G11", + "name": "PlateT11_G11", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H11", + "name": "PlateT11_H11", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_A12", + "name": "PlateT11_A12", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_B12", + "name": "PlateT11_B12", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C12", + "name": "PlateT11_C12", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D12", + "name": "PlateT11_D12", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E12", + "name": "PlateT11_E12", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F12", + "name": "PlateT11_F12", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G12", + "name": "PlateT11_G12", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H12", + "name": "PlateT11_H12", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + } +] \ No newline at end of file diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index 5be20a3..a847b17 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -448,7 +448,7 @@ class PRCXI9300Backend(LiquidHandlerBackend): PlateNo = plate_indexes[0] + 1 hole_col = tip_columns[0] + 1 - if self.channel_num == 1: + if self._num_channels == 1: hole_row = tipspot_index % 8 + 1 step = self.api_client.Load(dosage=0, plate_no=PlateNo, is_whole_plate=False, hole_row=hole_row, hole_col=hole_col, @@ -459,29 +459,6 @@ class PRCXI9300Backend(LiquidHandlerBackend): async def drop_tips(self, ops: List[Drop], use_channels: List[int] = None): """Pick up tips from the specified resource.""" - plate = ops[0].resource.parent.parent - deck = plate.parent - plate_index = deck.children.index(plate) - - if deck.children[plate_index].name == "trash": - step = self.api_client.UnLoad( - dosage=0, - plate_no=plate_index+1, - is_whole_plate=False, - hole_row=1, - hole_col=2,# 强制投放第二列了 - blending_times=0, - balance_height=0, - plate_or_hole=f"H{hole_col}-8,T{PlateNo}", - hole_numbers="1,2,3,4,5,6,7,8", - ) - self.steps_todo_list.append(step) - return - - - if len(ops) != 8: - raise ValueError(f"PRCXI9300Backend drop_tips: Expected 8 pickups, got {len(ops)}") - plate_indexes = [] for op in ops: plate = op.resource.parent.parent @@ -502,11 +479,29 @@ class PRCXI9300Backend(LiquidHandlerBackend): PlateNo = plate_indexes[0] + 1 hole_col = tip_columns[0] + 1 + if deck.children[plate_index].name == "trash": + step = self.api_client.UnLoad( + dosage=0, + plate_no=PlateNo, + is_whole_plate=False, + hole_row=3, + hole_col=3, + blending_times=0, + balance_height=0, + plate_or_hole=f"H{hole_col}-8,T{PlateNo}", + hole_numbers="1,2,3,4,5,6,7,8", + ) + self.steps_todo_list.append(step) + return + + if self.channel_num == 1: + hole_row = tipspot_index % 8 + 1 + step = self.api_client.UnLoad( dosage=0, plate_no=PlateNo, is_whole_plate=False, - hole_row=1, + hole_row=hole_row, hole_col=hole_col, blending_times=0, balance_height=0, @@ -1179,7 +1174,7 @@ if __name__ == "__main__": "uuid": "04211a2dc93547fe9bf6121eac533650" } }) - plate8 = get_well_container("RackT8") + plate8 = get_tip_rack("RackT8") plate8.load_state({ "Material": { "uuid": "068b3815e36b4a72a59bae017011b29f", @@ -1231,7 +1226,10 @@ if __name__ == "__main__": # deck.assign_child_resource(plate12, location=Coordinate(0, 0, 0)) # deck.assign_child_resource(plate13, location=Coordinate(0, 0, 0)) - handler = PRCXI9300Handler(deck=deck, host="10.181.102.13", port=9999, timeout=10.0, setup=False, debug=True, matrix_id="fd383e6d-2d0e-40b5-9c01-1b2870b1f1b1") + handler = PRCXI9300Handler(deck=deck, host="10.181.102.13", port=9999, + timeout=10.0, setup=False, debug=True, + matrix_id="fd383e6d-2d0e-40b5-9c01-1b2870b1f1b1", + channel_num=1) handler.set_tiprack([plate8]) # Set the tip rack for the handler asyncio.run(handler.setup()) # Initialize the handler and setup the connection from pylabrobot.resources import set_volume_tracking @@ -1247,10 +1245,10 @@ if __name__ == "__main__": json.dump(A, f, indent=4, ensure_ascii=False) asyncio.run(handler.create_protocol(protocol_name="Test Protocol")) # Initialize the backend and setup the connection - asyncio.run(handler.pick_up_tips(plate8.children[3],[1])) - asyncio.run(handler.aspirate(plate11.children[1],[10], [1])) - asyncio.run(handler.dispense(plate1.children[3],[10],[1])) - asyncio.run(handler.mix(plate1.children[3], mix_time=3, mix_vol=5, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) + asyncio.run(handler.pick_up_tips([plate8.children[3]],[0])) + asyncio.run(handler.aspirate([plate11.children[2]],[10], [0])) + asyncio.run(handler.dispense([plate1.children[3]],[10],[0])) + asyncio.run(handler.mix([plate1.children[3]], mix_time=3, mix_vol=5, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) asyncio.run(handler.discard_tips()) # asyncio.run(handler.discard_tips()) From 06e6d3348c44687b465ccbae54af2c616a9de052 Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Fri, 18 Jul 2025 00:32:48 +0800 Subject: [PATCH 63/96] update --- unilabos/devices/liquid_handling/prcxi/prcxi.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index a847b17..1a61306 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -1244,9 +1244,10 @@ if __name__ == "__main__": with open("deck.json", "w", encoding="utf-8") as f: json.dump(A, f, indent=4, ensure_ascii=False) + print(plate11.get_item('A1').tracker.get_used_volume()) asyncio.run(handler.create_protocol(protocol_name="Test Protocol")) # Initialize the backend and setup the connection asyncio.run(handler.pick_up_tips([plate8.children[3]],[0])) - asyncio.run(handler.aspirate([plate11.children[2]],[10], [0])) + asyncio.run(handler.aspirate([plate11.children[0]],[10], [0])) asyncio.run(handler.dispense([plate1.children[3]],[10],[0])) asyncio.run(handler.mix([plate1.children[3]], mix_time=3, mix_vol=5, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) asyncio.run(handler.discard_tips()) From 0bd3025d73dd8235a6d785f1fe626a8217ab65f2 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Fri, 18 Jul 2025 02:38:12 +0800 Subject: [PATCH 64/96] =?UTF-8?q?=E6=96=B0=E5=A2=9Eset=20liquid=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../liquid_handler_abstract.py | 5 +++ .../devices/liquid_handling/prcxi/prcxi.py | 3 ++ unilabos/registry/devices/liquid_handler.yaml | 40 +++++++++++++++++++ .../action/LiquidHandlerSetLiquid.action | 6 +++ 4 files changed, 54 insertions(+) create mode 100644 unilabos_msgs/action/LiquidHandlerSetLiquid.action diff --git a/unilabos/devices/liquid_handling/liquid_handler_abstract.py b/unilabos/devices/liquid_handling/liquid_handler_abstract.py index b11c008..d7de9db 100644 --- a/unilabos/devices/liquid_handling/liquid_handler_abstract.py +++ b/unilabos/devices/liquid_handling/liquid_handler_abstract.py @@ -543,6 +543,11 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): self._simulator = simulator super().__init__(backend, deck, simulator, channel_num) + @classmethod + def set_liquid(self, wells: list[Well], liquid_names: list[str], volumes: list[float]): + """Set the liquid in a well.""" + for well, liquid_name, volume in zip(wells, liquid_names, volumes): + well.set_liquids([(liquid_name, volume)]) # type: ignore # --------------------------------------------------------------- # REMOVE LIQUID -------------------------------------------------- # --------------------------------------------------------------- diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index 1a61306..00b2972 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -132,6 +132,9 @@ class PRCXI9300Handler(LiquidHandlerAbstract): self._unilabos_backend = PRCXI9300Backend(tablets_info, host, port, timeout, channel_num, axis, setup, debug, matrix_id) super().__init__(backend=self._unilabos_backend, deck=deck, simulator=True, channel_num=channel_num) + def set_liquid(self, wells: list[Well], liquid_names: list[str], volumes: list[float]): + return super().set_liquid(wells, liquid_names, volumes) + async def create_protocol( self, protocol_name: str = "", diff --git a/unilabos/registry/devices/liquid_handler.yaml b/unilabos/registry/devices/liquid_handler.yaml index 99380aa..a33635c 100644 --- a/unilabos/registry/devices/liquid_handler.yaml +++ b/unilabos/registry/devices/liquid_handler.yaml @@ -6841,6 +6841,46 @@ liquid_handler.prcxi: title: LiquidHandlerPickUpTips type: object type: LiquidHandlerPickUpTips + set_liquid: + feedback: {} + goal: {} + goal_default: + liquid_names: [] + volumes: [] + wells: [] + handles: [] + placeholder_keys: + wells: unilabos_resources + result: {} + schema: + description: '' + properties: + feedback: {} + goal: + properties: + liquid_names: + items: + type: string + type: array + volumes: + items: + type: number + type: array + wells: + items: + type: object + type: array + required: + - wells + - liquid_names + - volumes + type: object + result: {} + required: + - goal + title: set_liquid参数 + type: object + type: LiquidHandlerSetLiquid module: unilabos.devices.liquid_handling.prcxi.prcxi:PRCXI9300Handler status_types: reset_ok: bool diff --git a/unilabos_msgs/action/LiquidHandlerSetLiquid.action b/unilabos_msgs/action/LiquidHandlerSetLiquid.action new file mode 100644 index 0000000..ca4827c --- /dev/null +++ b/unilabos_msgs/action/LiquidHandlerSetLiquid.action @@ -0,0 +1,6 @@ +Resource[] wells +string[] liquid_names +float64[] volumes +--- +string return_info +--- \ No newline at end of file From 5674e180fcfe3301c30097e233d44231f8615495 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Fri, 18 Jul 2025 02:51:15 +0800 Subject: [PATCH 65/96] =?UTF-8?q?=E6=96=B0=E5=A2=9Eset=20liquid=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- unilabos_msgs/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/unilabos_msgs/CMakeLists.txt b/unilabos_msgs/CMakeLists.txt index b2c1bc7..f8dd61c 100644 --- a/unilabos_msgs/CMakeLists.txt +++ b/unilabos_msgs/CMakeLists.txt @@ -64,6 +64,7 @@ set(action_files "action/LiquidHandlerPickUpTips96.action" "action/LiquidHandlerReturnTips.action" "action/LiquidHandlerReturnTips96.action" + "action/LiquidHandlerSetLiquid.action" "action/LiquidHandlerStamp.action" "action/LiquidHandlerTransfer.action" From 00ced4d412c431709e05b0e83612d5626c099e31 Mon Sep 17 00:00:00 2001 From: Kongchang Feng <2100011801@stu.pku.edu.cn> Date: Fri, 18 Jul 2025 03:19:03 +0800 Subject: [PATCH 66/96] action to resource & 0.9.12 (#64) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * action to resource & 0.9.12 * stir和adjustph的中的bug修不好 --- README.md | 2 +- README_zh.md | 2 +- recipes/ros-humble-unilabos-msgs/recipe.yaml | 2 +- recipes/unilabos/recipe.yaml | 2 +- setup.py | 2 +- unilabos/compile/add_protocol.py | 65 ++- unilabos/compile/adjustph_protocol.py | 107 ++++- unilabos/compile/clean_vessel_protocol.py | 138 +++++- unilabos/compile/dissolve_protocol.py | 151 ++++-- unilabos/compile/dry_protocol.py | 188 +++++++- .../compile/evacuateandrefill_protocol.py | 71 +-- unilabos/compile/evaporate_protocol.py | 136 +++++- unilabos/compile/filter_protocol.py | 150 +++++- unilabos/compile/heatchill_protocol.py | 82 ++-- unilabos/compile/hydrogenate_protocol.py | 147 ++++-- unilabos/compile/recrystallize_protocol.py | 145 ++++-- unilabos/compile/reset_handling_protocol.py | 272 ++++++++--- unilabos/compile/run_column_protocol.py | 440 ++++++++++++------ unilabos/compile/separate_protocol.py | 320 ++++++++----- unilabos/compile/stir_protocol.py | 269 +++++++++-- unilabos/compile/wash_solid_protocol.py | 366 ++++++++++++++- unilabos/messages/__init__.py | 66 +-- unilabos/registry/devices/virtual_device.yaml | 173 +++++++ unilabos/ros/msgs/message_converter.py | 57 ++- unilabos/ros/nodes/base_device_node.py | 16 +- unilabos/ros/nodes/presets/host_node.py | 2 +- unilabos/ros/nodes/presets/protocol_node.py | 78 +++- unilabos_msgs/action/Add.action | 2 +- unilabos_msgs/action/AddSolid.action | 2 +- unilabos_msgs/action/AdjustPH.action | 2 +- unilabos_msgs/action/Centrifuge.action | 2 +- unilabos_msgs/action/Clean.action | 2 +- unilabos_msgs/action/CleanVessel.action | 2 +- unilabos_msgs/action/Crystallize.action | 2 +- unilabos_msgs/action/Dissolve.action | 2 +- unilabos_msgs/action/Dry.action | 2 +- unilabos_msgs/action/EvacuateAndRefill.action | 2 +- unilabos_msgs/action/Evaporate.action | 2 +- unilabos_msgs/action/Filter.action | 4 +- unilabos_msgs/action/FilterThrough.action | 6 +- unilabos_msgs/action/HeatChill.action | 2 +- unilabos_msgs/action/HeatChillStart.action | 2 +- unilabos_msgs/action/HeatChillStop.action | 2 +- unilabos_msgs/action/Hydrogenate.action | 2 +- unilabos_msgs/action/PumpTransfer.action | 4 +- unilabos_msgs/action/Purge.action | 2 +- unilabos_msgs/action/Recrystallize.action | 2 +- unilabos_msgs/action/ResetHandling.action | 1 + unilabos_msgs/action/RunColumn.action | 4 +- unilabos_msgs/action/Separate.action | 14 +- unilabos_msgs/action/StartPurge.action | 2 +- unilabos_msgs/action/StartStir.action | 2 +- unilabos_msgs/action/Stir.action | 2 +- unilabos_msgs/action/StopPurge.action | 2 +- unilabos_msgs/action/StopStir.action | 2 +- unilabos_msgs/action/WashSolid.action | 4 +- 56 files changed, 2751 insertions(+), 779 deletions(-) diff --git a/README.md b/README.md index 918e6fa..8568fb3 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.10-xxxxx.tar.bz2 +conda install ros-humble-unilabos-msgs-0.9.12-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 4163853..75dbddf 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.11-xxxxx.tar.bz2 +conda install ros-humble-unilabos-msgs-0.9.12-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 5807be8..0ef4b2d 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.11 + version: 0.9.12 source: path: ../../unilabos_msgs folder: ros-humble-unilabos-msgs/src/work diff --git a/recipes/unilabos/recipe.yaml b/recipes/unilabos/recipe.yaml index 2f72c32..720824f 100644 --- a/recipes/unilabos/recipe.yaml +++ b/recipes/unilabos/recipe.yaml @@ -1,6 +1,6 @@ package: name: unilabos - version: "0.9.11" + version: "0.9.12" source: path: ../.. diff --git a/setup.py b/setup.py index 8a7eebd..6a4e5ef 100644 --- a/setup.py +++ b/setup.py @@ -4,7 +4,7 @@ package_name = 'unilabos' setup( name=package_name, - version='0.9.11', + version='0.9.12', packages=find_packages(), include_package_data=True, install_requires=['setuptools'], diff --git a/unilabos/compile/add_protocol.py b/unilabos/compile/add_protocol.py index c46befe..18497c1 100644 --- a/unilabos/compile/add_protocol.py +++ b/unilabos/compile/add_protocol.py @@ -311,7 +311,7 @@ def create_action_log(message: str, emoji: str = "📝") -> Dict[str, Any]: def generate_add_protocol( G: nx.DiGraph, - vessel: str, + vessel: dict, # 🔧 修改:现在接收字典类型的 vessel reagent: str, # 🔧 修复:所有参数都用 Union 类型,支持字符串和数值 volume: Union[str, float] = 0.0, @@ -334,6 +334,7 @@ def generate_add_protocol( 生成添加试剂协议 - 修复版 支持所有XDL参数和单位: + - vessel: Resource类型字典,包含id字段 - volume: "2.7 mL", "2.67 mL", "?" 或数值 - mass: "19.3 g", "4.5 g" 或数值 - time: "1 h", "20 min" 或数值(秒) @@ -343,11 +344,19 @@ def generate_add_protocol( - equiv: "1.1" - ratio: "?", "1:1" """ + + # 🔧 核心修改:从字典中提取容器ID + vessel_id = vessel["id"] + + # 🔧 修改:更新容器的液体体积(假设有 liquid_volume 字段) + if "data" in vessel and "liquid_volume" in vessel["data"]: + if isinstance(vessel["data"]["liquid_volume"], list) and len(vessel["data"]["liquid_volume"]) > 0: + vessel["data"]["liquid_volume"][0] -= parse_volume_input(volume) debug_print("=" * 60) debug_print("🚀 开始生成添加试剂协议") debug_print(f"📋 原始参数:") - debug_print(f" 🥼 vessel: '{vessel}'") + debug_print(f" 🥼 vessel: {vessel} (ID: {vessel_id})") debug_print(f" 🧪 reagent: '{reagent}'") debug_print(f" 📏 volume: {volume} (类型: {type(volume)})") debug_print(f" ⚖️ mass: {mass} (类型: {type(mass)})") @@ -363,18 +372,18 @@ def generate_add_protocol( # === 参数验证 === debug_print("🔍 步骤1: 参数验证...") - action_sequence.append(create_action_log(f"开始添加试剂 '{reagent}' 到容器 '{vessel}'", "🎬")) + action_sequence.append(create_action_log(f"开始添加试剂 '{reagent}' 到容器 '{vessel_id}'", "🎬")) - if not vessel: + if not vessel or not vessel_id: debug_print("❌ vessel 参数不能为空") raise ValueError("vessel 参数不能为空") if not reagent: debug_print("❌ reagent 参数不能为空") raise ValueError("reagent 参数不能为空") - if vessel not in G.nodes(): - debug_print(f"❌ 容器 '{vessel}' 不存在于系统中") - raise ValueError(f"容器 '{vessel}' 不存在于系统中") + if vessel_id not in G.nodes(): + debug_print(f"❌ 容器 '{vessel_id}' 不存在于系统中") + raise ValueError(f"容器 '{vessel_id}' 不存在于系统中") debug_print("✅ 基本参数验证通过") @@ -432,7 +441,7 @@ def generate_add_protocol( debug_print("🌪️ 准备启动搅拌...") action_sequence.append(create_action_log("准备启动搅拌器", "🌪️")) - stirrer_id = find_connected_stirrer(G, vessel) + stirrer_id = find_connected_stirrer(G, vessel_id) # 🔧 使用 vessel_id if stirrer_id: action_sequence.append(create_action_log(f"启动搅拌器 {stirrer_id} (速度: {stir_speed} rpm)", "🔄")) @@ -440,7 +449,7 @@ def generate_add_protocol( "device_id": stirrer_id, "action_name": "start_stir", "action_kwargs": { - "vessel": vessel, + "vessel": vessel_id, # 🔧 使用 vessel_id "stir_speed": stir_speed, "purpose": f"准备添加固体 {reagent}" } @@ -454,7 +463,7 @@ def generate_add_protocol( # 固体加样 add_kwargs = { - "vessel": vessel, + "vessel": vessel_id, # 🔧 使用 vessel_id "reagent": reagent, "purpose": purpose, "event": event, @@ -509,7 +518,7 @@ def generate_add_protocol( debug_print("🌪️ 准备启动搅拌...") action_sequence.append(create_action_log("准备启动搅拌器", "🌪️")) - stirrer_id = find_connected_stirrer(G, vessel) + stirrer_id = find_connected_stirrer(G, vessel_id) # 🔧 使用 vessel_id if stirrer_id: action_sequence.append(create_action_log(f"启动搅拌器 {stirrer_id} (速度: {stir_speed} rpm)", "🔄")) @@ -517,7 +526,7 @@ def generate_add_protocol( "device_id": stirrer_id, "action_name": "start_stir", "action_kwargs": { - "vessel": vessel, + "vessel": vessel_id, # 🔧 使用 vessel_id "stir_speed": stir_speed, "purpose": f"准备添加液体 {reagent}" } @@ -555,7 +564,7 @@ def generate_add_protocol( pump_actions = generate_pump_protocol_with_rinsing( G=G, from_vessel=reagent_vessel, - to_vessel=vessel, + to_vessel=vessel_id, # 🔧 使用 vessel_id volume=final_volume, amount=amount, time=final_time, @@ -594,7 +603,7 @@ def generate_add_protocol( debug_print(f"📋 处理总结:") debug_print(f" 🧪 试剂: {reagent}") debug_print(f" {add_emoji} 添加类型: {add_type}") - debug_print(f" 🥼 目标容器: {vessel}") + debug_print(f" 🥼 目标容器: {vessel_id}") if is_liquid: debug_print(f" 📏 体积: {final_volume}mL") if is_solid: @@ -603,7 +612,7 @@ def generate_add_protocol( debug_print("=" * 60) # 添加完成日志 - summary_msg = f"试剂添加协议完成: {reagent} → {vessel}" + summary_msg = f"试剂添加协议完成: {reagent} → {vessel_id}" if is_liquid: summary_msg += f" ({final_volume}mL)" if is_solid: @@ -614,11 +623,13 @@ def generate_add_protocol( return action_sequence # === 便捷函数 === +# 🔧 修改便捷函数的参数类型 -def add_liquid_volume(G: nx.DiGraph, vessel: str, reagent: str, volume: Union[str, float], +def add_liquid_volume(G: nx.DiGraph, vessel: dict, reagent: str, volume: Union[str, float], time: Union[str, float] = 0.0, rate_spec: str = "") -> List[Dict[str, Any]]: """添加指定体积的液体试剂""" - debug_print(f"💧 快速添加液体: {reagent} ({volume}) → {vessel}") + vessel_id = vessel["id"] + debug_print(f"💧 快速添加液体: {reagent} ({volume}) → {vessel_id}") return generate_add_protocol( G, vessel, reagent, volume=volume, @@ -626,30 +637,33 @@ def add_liquid_volume(G: nx.DiGraph, vessel: str, reagent: str, volume: Union[st rate_spec=rate_spec ) -def add_solid_mass(G: nx.DiGraph, vessel: str, reagent: str, mass: Union[str, float], +def add_solid_mass(G: nx.DiGraph, vessel: dict, reagent: str, mass: Union[str, float], event: str = "") -> List[Dict[str, Any]]: """添加指定质量的固体试剂""" - debug_print(f"🧂 快速添加固体: {reagent} ({mass}) → {vessel}") + vessel_id = vessel["id"] + debug_print(f"🧂 快速添加固体: {reagent} ({mass}) → {vessel_id}") return generate_add_protocol( G, vessel, reagent, mass=mass, event=event ) -def add_solid_moles(G: nx.DiGraph, vessel: str, reagent: str, mol: str, +def add_solid_moles(G: nx.DiGraph, vessel: dict, reagent: str, mol: str, event: str = "") -> List[Dict[str, Any]]: """按摩尔数添加固体试剂""" - debug_print(f"🧬 按摩尔数添加固体: {reagent} ({mol}) → {vessel}") + vessel_id = vessel["id"] + debug_print(f"🧬 按摩尔数添加固体: {reagent} ({mol}) → {vessel_id}") return generate_add_protocol( G, vessel, reagent, mol=mol, event=event ) -def add_dropwise_liquid(G: nx.DiGraph, vessel: str, reagent: str, volume: Union[str, float], +def add_dropwise_liquid(G: nx.DiGraph, vessel: dict, reagent: str, volume: Union[str, float], time: Union[str, float] = "20 min", event: str = "") -> List[Dict[str, Any]]: """滴加液体试剂""" - debug_print(f"💧 滴加液体: {reagent} ({volume}) → {vessel} (用时: {time})") + vessel_id = vessel["id"] + debug_print(f"💧 滴加液体: {reagent} ({volume}) → {vessel_id} (用时: {time})") return generate_add_protocol( G, vessel, reagent, volume=volume, @@ -658,10 +672,11 @@ def add_dropwise_liquid(G: nx.DiGraph, vessel: str, reagent: str, volume: Union[ event=event ) -def add_portionwise_solid(G: nx.DiGraph, vessel: str, reagent: str, mass: Union[str, float], +def add_portionwise_solid(G: nx.DiGraph, vessel: dict, reagent: str, mass: Union[str, float], time: Union[str, float] = "1 h", event: str = "") -> List[Dict[str, Any]]: """分批添加固体试剂""" - debug_print(f"🧂 分批添加固体: {reagent} ({mass}) → {vessel} (用时: {time})") + vessel_id = vessel["id"] + debug_print(f"🧂 分批添加固体: {reagent} ({mass}) → {vessel_id} (用时: {time})") return generate_add_protocol( G, vessel, reagent, mass=mass, diff --git a/unilabos/compile/adjustph_protocol.py b/unilabos/compile/adjustph_protocol.py index d8f1b1b..4d39e93 100644 --- a/unilabos/compile/adjustph_protocol.py +++ b/unilabos/compile/adjustph_protocol.py @@ -216,7 +216,7 @@ def calculate_reagent_volume(target_ph_value: float, reagent: str, vessel_volume def generate_adjust_ph_protocol( G: nx.DiGraph, - vessel: str, + vessel: dict, # 🔧 修改:从字符串改为字典类型 ph_value: float, reagent: str, **kwargs @@ -226,7 +226,7 @@ def generate_adjust_ph_protocol( Args: G: 有向图,节点为容器和设备 - vessel: 目标容器(需要调节pH的容器) + vessel: 目标容器字典(需要调节pH的容器) ph_value: 目标pH值(从XDL传入) reagent: 酸碱试剂名称(从XDL传入) **kwargs: 其他可选参数,使用默认值 @@ -235,10 +235,13 @@ def generate_adjust_ph_protocol( List[Dict[str, Any]]: 动作序列 """ + # 🔧 核心修改:从字典中提取容器ID + vessel_id = vessel["id"] + debug_print("=" * 60) debug_print("🧪 开始生成pH调节协议") debug_print(f"📋 原始参数:") - debug_print(f" 🥼 vessel: '{vessel}'") + debug_print(f" 🥼 vessel: {vessel} (ID: {vessel_id})") debug_print(f" 📊 ph_value: {ph_value}") debug_print(f" 🧪 reagent: '{reagent}'") debug_print(f" 📦 kwargs: {kwargs}") @@ -262,14 +265,14 @@ def generate_adjust_ph_protocol( # 开始处理 action_sequence.append(create_action_log(f"开始调节pH至 {ph_value}", "🧪")) - action_sequence.append(create_action_log(f"目标容器: {vessel}", "🥼")) + action_sequence.append(create_action_log(f"目标容器: {vessel_id}", "🥼")) action_sequence.append(create_action_log(f"使用试剂: {reagent}", "⚗️")) # 1. 验证目标容器存在 debug_print(f"🔍 步骤1: 验证目标容器...") - if vessel not in G.nodes(): - debug_print(f"❌ 目标容器 '{vessel}' 不存在于系统中") - raise ValueError(f"目标容器 '{vessel}' 不存在于系统中") + if vessel_id not in G.nodes(): + debug_print(f"❌ 目标容器 '{vessel_id}' 不存在于系统中") + raise ValueError(f"目标容器 '{vessel_id}' 不存在于系统中") debug_print(f"✅ 目标容器验证通过") action_sequence.append(create_action_log("目标容器验证通过", "✅")) @@ -293,7 +296,7 @@ def generate_adjust_ph_protocol( action_sequence.append(create_action_log("开始自动估算试剂体积", "🧮")) # 获取目标容器的体积信息 - vessel_data = G.nodes[vessel].get('data', {}) + vessel_data = G.nodes[vessel_id].get('data', {}) vessel_volume = vessel_data.get('max_volume', 100.0) # 默认100mL debug_print(f"📏 容器最大体积: {vessel_volume}mL") @@ -310,13 +313,13 @@ def generate_adjust_ph_protocol( action_sequence.append(create_action_log("验证转移路径...", "🛤️")) try: - path = nx.shortest_path(G, source=reagent_vessel, target=vessel) + path = nx.shortest_path(G, source=reagent_vessel, target=vessel_id) debug_print(f"✅ 找到路径: {' → '.join(path)}") action_sequence.append(create_action_log(f"找到转移路径: {' → '.join(path)}", "🛤️")) except nx.NetworkXNoPath: debug_print(f"❌ 无法找到转移路径") action_sequence.append(create_action_log("转移路径不存在", "❌")) - raise ValueError(f"从试剂容器 '{reagent_vessel}' 到目标容器 '{vessel}' 没有可用路径") + raise ValueError(f"从试剂容器 '{reagent_vessel}' 到目标容器 '{vessel_id}' 没有可用路径") # 5. 搅拌器设置 debug_print(f"🔍 步骤5: 搅拌器设置...") @@ -325,7 +328,7 @@ def generate_adjust_ph_protocol( action_sequence.append(create_action_log("准备启动搅拌器", "🌪️")) try: - stirrer_id = find_connected_stirrer(G, vessel) + stirrer_id = find_connected_stirrer(G, vessel_id) if stirrer_id: debug_print(f"✅ 找到搅拌器 {stirrer_id},启动搅拌") @@ -335,7 +338,7 @@ def generate_adjust_ph_protocol( "device_id": stirrer_id, "action_name": "start_stir", "action_kwargs": { - "vessel": vessel, + "vessel": vessel_id, "stir_speed": stir_speed, "purpose": f"pH调节: 启动搅拌,准备添加 {reagent}" } @@ -373,7 +376,7 @@ def generate_adjust_ph_protocol( pump_actions = generate_pump_protocol_with_rinsing( G=G, from_vessel=reagent_vessel, - to_vessel=vessel, + to_vessel=vessel_id, volume=volume, amount="", time=addition_time, @@ -390,6 +393,54 @@ def generate_adjust_ph_protocol( debug_print(f"✅ 泵协议生成完成,添加了 {len(pump_actions)} 个动作") action_sequence.append(create_action_log(f"试剂转移完成 ({len(pump_actions)} 个操作)", "✅")) + # 🔧 修复体积运算 - 试剂添加成功后更新容器液体体积 + debug_print(f"🔧 更新容器液体体积...") + if "data" in vessel and "liquid_volume" in vessel["data"]: + current_volume = vessel["data"]["liquid_volume"] + debug_print(f"📊 添加前容器体积: {current_volume}") + + # 处理不同的体积数据格式 + if isinstance(current_volume, list): + if len(current_volume) > 0: + # 增加体积(添加试剂) + vessel["data"]["liquid_volume"][0] += volume + debug_print(f"📊 添加后容器体积: {vessel['data']['liquid_volume'][0]:.2f}mL (+{volume:.2f}mL)") + else: + # 如果列表为空,创建新的体积记录 + vessel["data"]["liquid_volume"] = [volume] + debug_print(f"📊 初始化容器体积: {volume:.2f}mL") + elif isinstance(current_volume, (int, float)): + # 直接数值类型 + vessel["data"]["liquid_volume"] += volume + debug_print(f"📊 添加后容器体积: {vessel['data']['liquid_volume']:.2f}mL (+{volume:.2f}mL)") + else: + debug_print(f"⚠️ 未知的体积数据格式: {type(current_volume)}") + # 创建新的体积记录 + vessel["data"]["liquid_volume"] = volume + else: + debug_print(f"📊 容器无液体体积数据,创建新记录: {volume:.2f}mL") + # 确保vessel有data字段 + if "data" not in vessel: + vessel["data"] = {} + vessel["data"]["liquid_volume"] = volume + + # 🔧 同时更新图中的容器数据 + if vessel_id in G.nodes(): + vessel_node_data = G.nodes[vessel_id].get('data', {}) + current_node_volume = vessel_node_data.get('liquid_volume', 0.0) + + if isinstance(current_node_volume, list): + if len(current_node_volume) > 0: + G.nodes[vessel_id]['data']['liquid_volume'][0] += volume + else: + G.nodes[vessel_id]['data']['liquid_volume'] = [volume] + else: + G.nodes[vessel_id]['data']['liquid_volume'] = current_node_volume + volume + + debug_print(f"✅ 图节点体积数据已更新") + + action_sequence.append(create_action_log(f"容器体积已更新 (+{volume:.2f}mL)", "📊")) + except Exception as e: debug_print(f"❌ 生成泵协议时出错: {str(e)}") action_sequence.append(create_action_log(f"泵协议生成失败: {str(e)}", "❌")) @@ -439,18 +490,18 @@ def generate_adjust_ph_protocol( debug_print(f" 🧪 试剂: {reagent}") debug_print(f" 📏 体积: {volume:.2f}mL") debug_print(f" 📊 目标pH: {ph_value}") - debug_print(f" 🥼 目标容器: {vessel}") + debug_print(f" 🥼 目标容器: {vessel_id}") debug_print("=" * 60) # 添加完成日志 - summary_msg = f"pH调节协议完成: {vessel} → pH {ph_value} (使用 {volume:.2f}mL {reagent})" + summary_msg = f"pH调节协议完成: {vessel_id} → pH {ph_value} (使用 {volume:.2f}mL {reagent})" action_sequence.append(create_action_log(summary_msg, "🎉")) return action_sequence def generate_adjust_ph_protocol_stepwise( G: nx.DiGraph, - vessel: str, + vessel: dict, # 🔧 修改:从字符串改为字典类型 ph_value: float, reagent: str, max_volume: float = 10.0, @@ -461,7 +512,7 @@ def generate_adjust_ph_protocol_stepwise( Args: G: 网络图 - vessel: 目标容器 + vessel: 目标容器字典 ph_value: 目标pH值 reagent: 酸碱试剂 max_volume: 最大试剂体积 @@ -470,10 +521,13 @@ def generate_adjust_ph_protocol_stepwise( Returns: List[Dict[str, Any]]: 动作序列 """ + # 🔧 核心修改:从字典中提取容器ID + vessel_id = vessel["id"] + debug_print("=" * 60) debug_print(f"🔄 开始分步pH调节") debug_print(f"📋 分步参数:") - debug_print(f" 🥼 vessel: {vessel}") + debug_print(f" 🥼 vessel: {vessel} (ID: {vessel_id})") debug_print(f" 📊 ph_value: {ph_value}") debug_print(f" 🧪 reagent: {reagent}") debug_print(f" 📏 max_volume: {max_volume}mL") @@ -496,7 +550,7 @@ def generate_adjust_ph_protocol_stepwise( # 生成单步协议 step_actions = generate_adjust_ph_protocol( G=G, - vessel=vessel, + vessel=vessel, # 🔧 直接传递vessel字典 ph_value=ph_value, reagent=reagent, volume=step_volume, @@ -530,35 +584,38 @@ def generate_adjust_ph_protocol_stepwise( # 便捷函数:常用pH调节 def generate_acidify_protocol( G: nx.DiGraph, - vessel: str, + vessel: dict, # 🔧 修改:从字符串改为字典类型 target_ph: float = 2.0, acid: str = "hydrochloric acid" ) -> List[Dict[str, Any]]: """酸化协议""" - debug_print(f"🍋 生成酸化协议: {vessel} → pH {target_ph} (使用 {acid})") + vessel_id = vessel["id"] + debug_print(f"🍋 生成酸化协议: {vessel_id} → pH {target_ph} (使用 {acid})") return generate_adjust_ph_protocol( G, vessel, target_ph, acid ) def generate_basify_protocol( G: nx.DiGraph, - vessel: str, + vessel: dict, # 🔧 修改:从字符串改为字典类型 target_ph: float = 12.0, base: str = "sodium hydroxide" ) -> List[Dict[str, Any]]: """碱化协议""" - debug_print(f"🧂 生成碱化协议: {vessel} → pH {target_ph} (使用 {base})") + vessel_id = vessel["id"] + debug_print(f"🧂 生成碱化协议: {vessel_id} → pH {target_ph} (使用 {base})") return generate_adjust_ph_protocol( G, vessel, target_ph, base ) def generate_neutralize_protocol( G: nx.DiGraph, - vessel: str, + vessel: dict, # 🔧 修改:从字符串改为字典类型 reagent: str = "sodium hydroxide" ) -> List[Dict[str, Any]]: """中和协议(pH=7)""" - debug_print(f"⚖️ 生成中和协议: {vessel} → pH 7.0 (使用 {reagent})") + vessel_id = vessel["id"] + debug_print(f"⚖️ 生成中和协议: {vessel_id} → pH 7.0 (使用 {reagent})") return generate_adjust_ph_protocol( G, vessel, 7.0, reagent ) diff --git a/unilabos/compile/clean_vessel_protocol.py b/unilabos/compile/clean_vessel_protocol.py index 28abc95..b285056 100644 --- a/unilabos/compile/clean_vessel_protocol.py +++ b/unilabos/compile/clean_vessel_protocol.py @@ -145,7 +145,7 @@ def find_connected_heatchill(G: nx.DiGraph, vessel: str) -> str: def generate_clean_vessel_protocol( G: nx.DiGraph, - vessel: str, + vessel: dict, # 🔧 修改:从字符串改为字典类型 solvent: str, volume: float, temp: float, @@ -165,7 +165,7 @@ def generate_clean_vessel_protocol( Args: G: 有向图,节点为设备和容器,边为流体管道 - vessel: 要清洗的容器名称 + vessel: 要清洗的容器字典(包含id字段) solvent: 用于清洗的溶剂名称 volume: 每次清洗使用的溶剂体积 temp: 清洗时的温度 @@ -178,20 +178,23 @@ def generate_clean_vessel_protocol( ValueError: 当找不到必要的容器或设备时抛出异常 Examples: - clean_protocol = generate_clean_vessel_protocol(G, "main_reactor", "water", 100.0, 60.0, 2) + clean_protocol = generate_clean_vessel_protocol(G, {"id": "main_reactor"}, "water", 100.0, 60.0, 2) """ + # 🔧 核心修改:从字典中提取容器ID + vessel_id = vessel["id"] + action_sequence = [] print(f"CLEAN_VESSEL: 开始生成容器清洗协议") - print(f" - 目标容器: {vessel}") + print(f" - 目标容器: {vessel} (ID: {vessel_id})") print(f" - 清洗溶剂: {solvent}") print(f" - 清洗体积: {volume} mL") print(f" - 清洗温度: {temp}°C") print(f" - 重复次数: {repeats}") # 验证目标容器存在 - if vessel not in G.nodes(): - raise ValueError(f"目标容器 '{vessel}' 不存在于系统中") + if vessel_id not in G.nodes(): + raise ValueError(f"目标容器 '{vessel_id}' 不存在于系统中") # 查找溶剂容器 try: @@ -208,12 +211,23 @@ def generate_clean_vessel_protocol( raise ValueError(f"无法找到废液容器: {str(e)}") # 查找加热设备(可选) - heatchill_id = find_connected_heatchill(G, vessel) + heatchill_id = find_connected_heatchill(G, vessel_id) # 🔧 使用 vessel_id if heatchill_id: print(f"CLEAN_VESSEL: 找到加热设备: {heatchill_id}") else: print(f"CLEAN_VESSEL: 未找到加热设备,将在室温下清洗") + # 🔧 新增:记录清洗前的容器状态 + print(f"CLEAN_VESSEL: 记录清洗前容器状态...") + original_liquid_volume = 0.0 + if "data" in vessel and "liquid_volume" in vessel["data"]: + current_volume = vessel["data"]["liquid_volume"] + if isinstance(current_volume, list) and len(current_volume) > 0: + original_liquid_volume = current_volume[0] + elif isinstance(current_volume, (int, float)): + original_liquid_volume = current_volume + print(f"CLEAN_VESSEL: 清洗前液体体积: {original_liquid_volume:.2f}mL") + # 第一步:如果需要加热且有加热设备,启动加热 if temp > 25.0 and heatchill_id: print(f"CLEAN_VESSEL: 启动加热至 {temp}°C") @@ -221,7 +235,7 @@ def generate_clean_vessel_protocol( "device_id": heatchill_id, "action_name": "heat_chill_start", "action_kwargs": { - "vessel": vessel, + "vessel": vessel_id, # 🔧 使用 vessel_id "temp": temp, "purpose": f"cleaning with {solvent}" } @@ -240,18 +254,61 @@ def generate_clean_vessel_protocol( print(f"CLEAN_VESSEL: 执行第 {repeat + 1} 次清洗") # 2a. 使用 pump_protocol 将溶剂转移到目标容器 - print(f"CLEAN_VESSEL: 将 {volume} mL {solvent} 转移到 {vessel}") + print(f"CLEAN_VESSEL: 将 {volume} mL {solvent} 转移到 {vessel_id}") try: # 调用成熟的 pump_protocol 算法 add_solvent_actions = generate_pump_protocol( G=G, from_vessel=solvent_vessel, - to_vessel=vessel, + to_vessel=vessel_id, # 🔧 使用 vessel_id volume=volume, flowrate=2.5, # 适中的流速,避免飞溅 transfer_flowrate=2.5 ) action_sequence.extend(add_solvent_actions) + + # 🔧 新增:更新容器体积(添加清洗溶剂) + print(f"CLEAN_VESSEL: 更新容器体积 - 添加清洗溶剂 {volume:.2f}mL") + if "data" not in vessel: + vessel["data"] = {} + + if "liquid_volume" in vessel["data"]: + current_volume = vessel["data"]["liquid_volume"] + if isinstance(current_volume, list): + if len(current_volume) > 0: + vessel["data"]["liquid_volume"][0] += volume + print(f"CLEAN_VESSEL: 添加溶剂后体积: {vessel['data']['liquid_volume'][0]:.2f}mL (+{volume:.2f}mL)") + else: + vessel["data"]["liquid_volume"] = [volume] + print(f"CLEAN_VESSEL: 初始化清洗体积: {volume:.2f}mL") + elif isinstance(current_volume, (int, float)): + vessel["data"]["liquid_volume"] += volume + print(f"CLEAN_VESSEL: 添加溶剂后体积: {vessel['data']['liquid_volume']:.2f}mL (+{volume:.2f}mL)") + else: + vessel["data"]["liquid_volume"] = volume + print(f"CLEAN_VESSEL: 重置体积为: {volume:.2f}mL") + else: + vessel["data"]["liquid_volume"] = volume + print(f"CLEAN_VESSEL: 创建新体积记录: {volume:.2f}mL") + + # 🔧 同时更新图中的容器数据 + if vessel_id in G.nodes(): + if 'data' not in G.nodes[vessel_id]: + G.nodes[vessel_id]['data'] = {} + + vessel_node_data = G.nodes[vessel_id]['data'] + current_node_volume = vessel_node_data.get('liquid_volume', 0.0) + + if isinstance(current_node_volume, list): + if len(current_node_volume) > 0: + G.nodes[vessel_id]['data']['liquid_volume'][0] += volume + else: + G.nodes[vessel_id]['data']['liquid_volume'] = [volume] + else: + G.nodes[vessel_id]['data']['liquid_volume'] = current_node_volume + volume + + print(f"CLEAN_VESSEL: 图节点体积数据已更新") + except Exception as e: raise ValueError(f"无法将溶剂转移到容器: {str(e)}") @@ -265,18 +322,52 @@ def generate_clean_vessel_protocol( action_sequence.append(wait_action) # 2c. 使用 pump_protocol 将清洗液转移到废液容器 - print(f"CLEAN_VESSEL: 将清洗液从 {vessel} 转移到废液容器") + print(f"CLEAN_VESSEL: 将清洗液从 {vessel_id} 转移到废液容器") try: # 调用成熟的 pump_protocol 算法 remove_waste_actions = generate_pump_protocol( G=G, - from_vessel=vessel, + from_vessel=vessel_id, # 🔧 使用 vessel_id to_vessel=waste_vessel, volume=volume, flowrate=2.5, # 适中的流速 transfer_flowrate=2.5 ) action_sequence.extend(remove_waste_actions) + + # 🔧 新增:更新容器体积(移除清洗液) + print(f"CLEAN_VESSEL: 更新容器体积 - 移除清洗液 {volume:.2f}mL") + if "data" in vessel and "liquid_volume" in vessel["data"]: + current_volume = vessel["data"]["liquid_volume"] + if isinstance(current_volume, list): + if len(current_volume) > 0: + vessel["data"]["liquid_volume"][0] = max(0.0, vessel["data"]["liquid_volume"][0] - volume) + print(f"CLEAN_VESSEL: 移除清洗液后体积: {vessel['data']['liquid_volume'][0]:.2f}mL (-{volume:.2f}mL)") + else: + vessel["data"]["liquid_volume"] = [0.0] + print(f"CLEAN_VESSEL: 重置体积为0mL") + elif isinstance(current_volume, (int, float)): + vessel["data"]["liquid_volume"] = max(0.0, current_volume - volume) + print(f"CLEAN_VESSEL: 移除清洗液后体积: {vessel['data']['liquid_volume']:.2f}mL (-{volume:.2f}mL)") + else: + vessel["data"]["liquid_volume"] = 0.0 + print(f"CLEAN_VESSEL: 重置体积为0mL") + + # 🔧 同时更新图中的容器数据 + if vessel_id in G.nodes(): + vessel_node_data = G.nodes[vessel_id].get('data', {}) + current_node_volume = vessel_node_data.get('liquid_volume', 0.0) + + if isinstance(current_node_volume, list): + if len(current_node_volume) > 0: + G.nodes[vessel_id]['data']['liquid_volume'][0] = max(0.0, current_node_volume[0] - volume) + else: + G.nodes[vessel_id]['data']['liquid_volume'] = [0.0] + else: + G.nodes[vessel_id]['data']['liquid_volume'] = max(0.0, current_node_volume - volume) + + print(f"CLEAN_VESSEL: 图节点体积数据已更新") + except Exception as e: raise ValueError(f"无法将清洗液转移到废液容器: {str(e)}") @@ -296,13 +387,24 @@ def generate_clean_vessel_protocol( "device_id": heatchill_id, "action_name": "heat_chill_stop", "action_kwargs": { - "vessel": vessel + "vessel": vessel_id # 🔧 使用 vessel_id } } action_sequence.append(heatchill_stop_action) - print(f"CLEAN_VESSEL: 生成了 {len(action_sequence)} 个动作") - print(f"CLEAN_VESSEL: 清洗协议生成完成") + # 🔧 新增:清洗完成后的状态报告 + final_liquid_volume = 0.0 + if "data" in vessel and "liquid_volume" in vessel["data"]: + current_volume = vessel["data"]["liquid_volume"] + if isinstance(current_volume, list) and len(current_volume) > 0: + final_liquid_volume = current_volume[0] + elif isinstance(current_volume, (int, float)): + final_liquid_volume = current_volume + + print(f"CLEAN_VESSEL: 清洗完成") + print(f" - 清洗前体积: {original_liquid_volume:.2f}mL") + print(f" - 清洗后体积: {final_liquid_volume:.2f}mL") + print(f" - 生成了 {len(action_sequence)} 个动作") return action_sequence @@ -310,7 +412,7 @@ def generate_clean_vessel_protocol( # 便捷函数:常用清洗方案 def generate_quick_clean_protocol( G: nx.DiGraph, - vessel: str, + vessel: dict, # 🔧 修改:从字符串改为字典类型 solvent: str = "water", volume: float = 100.0 ) -> List[Dict[str, Any]]: @@ -320,7 +422,7 @@ def generate_quick_clean_protocol( def generate_thorough_clean_protocol( G: nx.DiGraph, - vessel: str, + vessel: dict, # 🔧 修改:从字符串改为字典类型 solvent: str = "water", volume: float = 150.0, temp: float = 60.0 @@ -331,7 +433,7 @@ def generate_thorough_clean_protocol( def generate_organic_clean_protocol( G: nx.DiGraph, - vessel: str, + vessel: dict, # 🔧 修改:从字符串改为字典类型 volume: float = 100.0 ) -> List[Dict[str, Any]]: """有机清洗:先用有机溶剂,再用水清洗""" diff --git a/unilabos/compile/dissolve_protocol.py b/unilabos/compile/dissolve_protocol.py index 065196e..7c7022d 100644 --- a/unilabos/compile/dissolve_protocol.py +++ b/unilabos/compile/dissolve_protocol.py @@ -408,7 +408,7 @@ def find_solid_dispenser(G: nx.DiGraph) -> str: def generate_dissolve_protocol( G: nx.DiGraph, - vessel: str, + vessel: dict, # 🔧 修改:从字符串改为字典类型 # 🔧 修复:按照checklist.md的DissolveProtocol参数 solvent: str = "", volume: Union[str, float] = 0.0, @@ -427,10 +427,11 @@ def generate_dissolve_protocol( 生成溶解操作的协议序列 - 增强版 🔧 修复要点: - 1. 添加action文件中的所有参数(mass, mol, reagent, event) - 2. 使用 **kwargs 接受所有额外参数,防止 unexpected keyword argument 错误 - 3. 支持固体溶解和液体溶解两种模式 - 4. 添加详细的emoji日志系统 + 1. 修改vessel参数类型为dict,并提取vessel_id + 2. 添加action文件中的所有参数(mass, mol, reagent, event) + 3. 使用 **kwargs 接受所有额外参数,防止 unexpected keyword argument 错误 + 4. 支持固体溶解和液体溶解两种模式 + 5. 添加详细的体积运算逻辑 支持两种溶解模式: 1. 液体溶解:指定 solvent + volume,使用pump protocol转移溶剂 @@ -444,10 +445,13 @@ def generate_dissolve_protocol( - mol: "0.12 mol", "16.2 mmol" """ + # 🔧 核心修改:从字典中提取容器ID + vessel_id = vessel["id"] + debug_print("=" * 60) debug_print("🧪 开始生成溶解协议") debug_print(f"📋 原始参数:") - debug_print(f" 🥼 vessel: '{vessel}'") + debug_print(f" 🥼 vessel: {vessel} (ID: {vessel_id})") debug_print(f" 💧 solvent: '{solvent}'") debug_print(f" 📏 volume: {volume} (类型: {type(volume)})") debug_print(f" ⚖️ mass: {mass} (类型: {type(mass)})") @@ -463,19 +467,30 @@ def generate_dissolve_protocol( # === 参数验证 === debug_print("🔍 步骤1: 参数验证...") - action_sequence.append(create_action_log(f"开始溶解操作 - 容器: {vessel}", "🎬")) + action_sequence.append(create_action_log(f"开始溶解操作 - 容器: {vessel_id}", "🎬")) - if not vessel: + if not vessel_id: debug_print("❌ vessel 参数不能为空") raise ValueError("vessel 参数不能为空") - if vessel not in G.nodes(): - debug_print(f"❌ 容器 '{vessel}' 不存在于系统中") - raise ValueError(f"容器 '{vessel}' 不存在于系统中") + if vessel_id not in G.nodes(): + debug_print(f"❌ 容器 '{vessel_id}' 不存在于系统中") + raise ValueError(f"容器 '{vessel_id}' 不存在于系统中") debug_print("✅ 基本参数验证通过") action_sequence.append(create_action_log("参数验证通过", "✅")) + # 🔧 新增:记录溶解前的容器状态 + debug_print("🔍 记录溶解前容器状态...") + original_liquid_volume = 0.0 + if "data" in vessel and "liquid_volume" in vessel["data"]: + current_volume = vessel["data"]["liquid_volume"] + if isinstance(current_volume, list) and len(current_volume) > 0: + original_liquid_volume = current_volume[0] + elif isinstance(current_volume, (int, float)): + original_liquid_volume = current_volume + debug_print(f"📊 溶解前液体体积: {original_liquid_volume:.2f}mL") + # === 🔧 关键修复:参数解析 === debug_print("🔍 步骤2: 参数解析...") action_sequence.append(create_action_log("正在解析溶解参数...", "🔍")) @@ -522,8 +537,8 @@ def generate_dissolve_protocol( action_sequence.append(create_action_log("正在查找相关设备...", "🔍")) # 查找加热搅拌器 - heatchill_id = find_connected_heatchill(G, vessel) - stirrer_id = find_connected_stirrer(G, vessel) + heatchill_id = find_connected_heatchill(G, vessel_id) + stirrer_id = find_connected_stirrer(G, vessel_id) # 优先使用加热搅拌器,否则使用独立搅拌器 stir_device_id = heatchill_id or stirrer_id @@ -557,7 +572,7 @@ def generate_dissolve_protocol( "device_id": heatchill_id, "action_name": "heat_chill_start", "action_kwargs": { - "vessel": vessel, + "vessel": vessel_id, "temp": final_temp, "purpose": f"溶解准备 - {event}" if event else "溶解准备" } @@ -581,7 +596,7 @@ def generate_dissolve_protocol( "device_id": stirrer_id, "action_name": "start_stir", "action_kwargs": { - "vessel": vessel, + "vessel": vessel_id, "stir_speed": stir_speed, "purpose": f"溶解搅拌 - {event}" if event else "溶解搅拌" } @@ -606,7 +621,7 @@ def generate_dissolve_protocol( # 固体加样 add_kwargs = { - "vessel": vessel, + "vessel": vessel_id, "reagent": reagent or amount or "solid reagent", "purpose": f"溶解固体试剂 - {event}" if event else "溶解固体试剂", "event": event @@ -628,6 +643,12 @@ def generate_dissolve_protocol( debug_print(f"✅ 固体加样完成") action_sequence.append(create_action_log("固体加样完成", "✅")) + + # 🔧 新增:固体溶解体积运算 - 固体本身不会显著增加体积,但可能有少量变化 + debug_print(f"🔧 固体溶解 - 体积变化很小,主要是质量变化") + # 固体通常不会显著改变液体体积,这里只记录日志 + action_sequence.append(create_action_log(f"固体已添加: {final_mass}g", "📊")) + else: debug_print("⚠️ 未找到固体加样器,跳过固体添加") action_sequence.append(create_action_log("未找到固体加样器,无法添加固体", "❌")) @@ -659,7 +680,7 @@ def generate_dissolve_protocol( pump_actions = generate_pump_protocol_with_rinsing( G=G, from_vessel=solvent_vessel, - to_vessel=vessel, + to_vessel=vessel_id, volume=final_volume, amount=amount, time=0.0, # 不在pump level控制时间 @@ -679,6 +700,52 @@ def generate_dissolve_protocol( debug_print(f"✅ 溶剂转移完成,添加了 {len(pump_actions)} 个动作") action_sequence.append(create_action_log(f"溶剂转移完成 ({len(pump_actions)} 个操作)", "✅")) + # 🔧 新增:液体溶解体积运算 - 添加溶剂后更新容器体积 + debug_print(f"🔧 更新容器液体体积 - 添加溶剂 {final_volume:.2f}mL") + + # 确保vessel有data字段 + if "data" not in vessel: + vessel["data"] = {} + + if "liquid_volume" in vessel["data"]: + current_volume = vessel["data"]["liquid_volume"] + if isinstance(current_volume, list): + if len(current_volume) > 0: + vessel["data"]["liquid_volume"][0] += final_volume + debug_print(f"📊 添加溶剂后体积: {vessel['data']['liquid_volume'][0]:.2f}mL (+{final_volume:.2f}mL)") + else: + vessel["data"]["liquid_volume"] = [final_volume] + debug_print(f"📊 初始化溶解体积: {final_volume:.2f}mL") + elif isinstance(current_volume, (int, float)): + vessel["data"]["liquid_volume"] += final_volume + debug_print(f"📊 添加溶剂后体积: {vessel['data']['liquid_volume']:.2f}mL (+{final_volume:.2f}mL)") + else: + vessel["data"]["liquid_volume"] = final_volume + debug_print(f"📊 重置体积为: {final_volume:.2f}mL") + else: + vessel["data"]["liquid_volume"] = final_volume + debug_print(f"📊 创建新体积记录: {final_volume:.2f}mL") + + # 🔧 同时更新图中的容器数据 + if vessel_id in G.nodes(): + if 'data' not in G.nodes[vessel_id]: + G.nodes[vessel_id]['data'] = {} + + vessel_node_data = G.nodes[vessel_id]['data'] + current_node_volume = vessel_node_data.get('liquid_volume', 0.0) + + if isinstance(current_node_volume, list): + if len(current_node_volume) > 0: + G.nodes[vessel_id]['data']['liquid_volume'][0] += final_volume + else: + G.nodes[vessel_id]['data']['liquid_volume'] = [final_volume] + else: + G.nodes[vessel_id]['data']['liquid_volume'] = current_node_volume + final_volume + + debug_print(f"✅ 图节点体积数据已更新") + + action_sequence.append(create_action_log(f"容器体积已更新 (+{final_volume:.2f}mL)", "📊")) + # 溶剂添加后等待 action_sequence.append(create_action_log("溶剂添加后短暂等待...", "⏳")) action_sequence.append({ @@ -700,7 +767,7 @@ def generate_dissolve_protocol( "device_id": heatchill_id, "action_name": "heat_chill", "action_kwargs": { - "vessel": vessel, + "vessel": vessel_id, "temp": final_temp, "time": final_time, "stir": True, @@ -718,7 +785,7 @@ def generate_dissolve_protocol( "device_id": stirrer_id, "action_name": "stir", "action_kwargs": { - "vessel": vessel, + "vessel": vessel_id, "stir_time": final_time, "stir_speed": stir_speed, "settling_time": 0, @@ -744,7 +811,7 @@ def generate_dissolve_protocol( "device_id": heatchill_id, "action_name": "heat_chill_stop", "action_kwargs": { - "vessel": vessel + "vessel": vessel_id } } action_sequence.append(stop_action) @@ -761,12 +828,21 @@ def generate_dissolve_protocol( } }) + # 🔧 新增:溶解完成后的状态报告 + final_liquid_volume = 0.0 + if "data" in vessel and "liquid_volume" in vessel["data"]: + current_volume = vessel["data"]["liquid_volume"] + if isinstance(current_volume, list) and len(current_volume) > 0: + final_liquid_volume = current_volume[0] + elif isinstance(current_volume, (int, float)): + final_liquid_volume = current_volume + # === 最终结果 === debug_print("=" * 60) debug_print(f"🎉 溶解协议生成完成") debug_print(f"📊 协议统计:") debug_print(f" 📋 总动作数: {len(action_sequence)}") - debug_print(f" 🥼 容器: {vessel}") + debug_print(f" 🥼 容器: {vessel_id}") debug_print(f" {dissolve_emoji} 溶解类型: {dissolve_type}") if is_liquid_dissolve: debug_print(f" 💧 溶剂: {solvent} ({final_volume}mL)") @@ -776,10 +852,12 @@ def generate_dissolve_protocol( debug_print(f" 🧬 摩尔: {mol}") debug_print(f" 🌡️ 温度: {final_temp}°C") debug_print(f" ⏱️ 时间: {final_time}s") + debug_print(f" 📊 溶解前体积: {original_liquid_volume:.2f}mL") + debug_print(f" 📊 溶解后体积: {final_liquid_volume:.2f}mL") debug_print("=" * 60) # 添加完成日志 - summary_msg = f"溶解协议完成: {vessel}" + summary_msg = f"溶解协议完成: {vessel_id}" if is_liquid_dissolve: summary_msg += f" (使用 {final_volume}mL {solvent})" if is_solid_dissolve: @@ -789,12 +867,15 @@ def generate_dissolve_protocol( return action_sequence -# === 便捷函数 === -def dissolve_solid_by_mass(G: nx.DiGraph, vessel: str, reagent: str, mass: Union[str, float], +# === 便捷函数 === +# 🔧 修改便捷函数的参数类型 + +def dissolve_solid_by_mass(G: nx.DiGraph, vessel: dict, reagent: str, mass: Union[str, float], temp: Union[str, float] = 25.0, time: Union[str, float] = "10 min") -> List[Dict[str, Any]]: """按质量溶解固体""" - debug_print(f"🧂 快速固体溶解: {reagent} ({mass}) → {vessel}") + vessel_id = vessel["id"] + debug_print(f"🧂 快速固体溶解: {reagent} ({mass}) → {vessel_id}") return generate_dissolve_protocol( G, vessel, mass=mass, @@ -803,10 +884,11 @@ def dissolve_solid_by_mass(G: nx.DiGraph, vessel: str, reagent: str, mass: Union time=time ) -def dissolve_solid_by_moles(G: nx.DiGraph, vessel: str, reagent: str, mol: str, +def dissolve_solid_by_moles(G: nx.DiGraph, vessel: dict, reagent: str, mol: str, temp: Union[str, float] = 25.0, time: Union[str, float] = "10 min") -> List[Dict[str, Any]]: """按摩尔数溶解固体""" - debug_print(f"🧬 按摩尔数溶解固体: {reagent} ({mol}) → {vessel}") + vessel_id = vessel["id"] + debug_print(f"🧬 按摩尔数溶解固体: {reagent} ({mol}) → {vessel_id}") return generate_dissolve_protocol( G, vessel, mol=mol, @@ -815,10 +897,11 @@ def dissolve_solid_by_moles(G: nx.DiGraph, vessel: str, reagent: str, mol: str, time=time ) -def dissolve_with_solvent(G: nx.DiGraph, vessel: str, solvent: str, volume: Union[str, float], +def dissolve_with_solvent(G: nx.DiGraph, vessel: dict, solvent: str, volume: Union[str, float], temp: Union[str, float] = 25.0, time: Union[str, float] = "5 min") -> List[Dict[str, Any]]: """用溶剂溶解""" - debug_print(f"💧 溶剂溶解: {solvent} ({volume}) → {vessel}") + vessel_id = vessel["id"] + debug_print(f"💧 溶剂溶解: {solvent} ({volume}) → {vessel_id}") return generate_dissolve_protocol( G, vessel, solvent=solvent, @@ -827,9 +910,10 @@ def dissolve_with_solvent(G: nx.DiGraph, vessel: str, solvent: str, volume: Unio time=time ) -def dissolve_at_room_temp(G: nx.DiGraph, vessel: str, solvent: str, volume: Union[str, float]) -> List[Dict[str, Any]]: +def dissolve_at_room_temp(G: nx.DiGraph, vessel: dict, solvent: str, volume: Union[str, float]) -> List[Dict[str, Any]]: """室温溶解""" - debug_print(f"🌡️ 室温溶解: {solvent} ({volume}) → {vessel}") + vessel_id = vessel["id"] + debug_print(f"🌡️ 室温溶解: {solvent} ({volume}) → {vessel_id}") return generate_dissolve_protocol( G, vessel, solvent=solvent, @@ -838,10 +922,11 @@ def dissolve_at_room_temp(G: nx.DiGraph, vessel: str, solvent: str, volume: Unio time="5 min" ) -def dissolve_with_heating(G: nx.DiGraph, vessel: str, solvent: str, volume: Union[str, float], +def dissolve_with_heating(G: nx.DiGraph, vessel: dict, solvent: str, volume: Union[str, float], temp: Union[str, float] = "60 °C", time: Union[str, float] = "15 min") -> List[Dict[str, Any]]: """加热溶解""" - debug_print(f"🔥 加热溶解: {solvent} ({volume}) → {vessel} @ {temp}") + vessel_id = vessel["id"] + debug_print(f"🔥 加热溶解: {solvent} ({volume}) → {vessel_id} @ {temp}") return generate_dissolve_protocol( G, vessel, solvent=solvent, diff --git a/unilabos/compile/dry_protocol.py b/unilabos/compile/dry_protocol.py index 1f06069..c04abdc 100644 --- a/unilabos/compile/dry_protocol.py +++ b/unilabos/compile/dry_protocol.py @@ -46,8 +46,8 @@ def find_connected_heater(G: nx.DiGraph, vessel: str) -> str: def generate_dry_protocol( G: nx.DiGraph, - compound: str, - vessel: str, + vessel: dict, # 🔧 修改:从字符串改为字典类型 + compound: str = "", # 🔧 修改:参数顺序调整,并设置默认值 **kwargs # 接收其他可能的参数但不使用 ) -> List[Dict[str, Any]]: """ @@ -55,13 +55,16 @@ def generate_dry_protocol( Args: G: 有向图,节点为容器和设备 - compound: 化合物名称(从XDL传入) - vessel: 目标容器(从XDL传入) + vessel: 目标容器字典(从XDL传入) + compound: 化合物名称(从XDL传入,可选) **kwargs: 其他可选参数,但不使用 Returns: List[Dict[str, Any]]: 动作序列 """ + # 🔧 核心修改:从字典中提取容器ID + vessel_id = vessel["id"] + action_sequence = [] # 默认参数 @@ -70,33 +73,83 @@ def generate_dry_protocol( simulation_time = 60.0 # 模拟时间 1分钟 print(f"🌡️ DRY: 开始生成干燥协议 ✨") - print(f" 🧪 化合物: {compound}") - print(f" 🥽 容器: {vessel}") + print(f" 🥽 vessel: {vessel} (ID: {vessel_id})") + print(f" 🧪 化合物: {compound or '未指定'}") print(f" 🔥 干燥温度: {dry_temp}°C") print(f" ⏰ 干燥时间: {dry_time/60:.0f} 分钟") + # 🔧 新增:记录干燥前的容器状态 + print(f"🔍 记录干燥前容器状态...") + original_liquid_volume = 0.0 + if "data" in vessel and "liquid_volume" in vessel["data"]: + current_volume = vessel["data"]["liquid_volume"] + if isinstance(current_volume, list) and len(current_volume) > 0: + original_liquid_volume = current_volume[0] + elif isinstance(current_volume, (int, float)): + original_liquid_volume = current_volume + print(f"📊 干燥前液体体积: {original_liquid_volume:.2f}mL") + # 1. 验证目标容器存在 - print(f"\n📋 步骤1: 验证目标容器 '{vessel}' 是否存在...") - if vessel not in G.nodes(): - print(f"⚠️ DRY: 警告 - 容器 '{vessel}' 不存在于系统中,跳过干燥 😢") + print(f"\n📋 步骤1: 验证目标容器 '{vessel_id}' 是否存在...") + if vessel_id not in G.nodes(): + print(f"⚠️ DRY: 警告 - 容器 '{vessel_id}' 不存在于系统中,跳过干燥 😢") return action_sequence - print(f"✅ 容器 '{vessel}' 验证通过!") + print(f"✅ 容器 '{vessel_id}' 验证通过!") # 2. 查找相连的加热器 print(f"\n🔍 步骤2: 查找与容器相连的加热器...") - heater_id = find_connected_heater(G, vessel) + heater_id = find_connected_heater(G, vessel_id) # 🔧 使用 vessel_id if heater_id is None: - print(f"😭 DRY: 警告 - 未找到与容器 '{vessel}' 相连的加热器,跳过干燥") + print(f"😭 DRY: 警告 - 未找到与容器 '{vessel_id}' 相连的加热器,跳过干燥") print(f"🎭 添加模拟干燥动作...") # 添加一个等待动作,表示干燥过程(模拟) action_sequence.append({ "action_name": "wait", "action_kwargs": { "time": 10.0, # 模拟等待时间 - "description": f"模拟干燥 {compound} (无加热器可用)" + "description": f"模拟干燥 {compound or '化合物'} (无加热器可用)" } }) + + # 🔧 新增:模拟干燥的体积变化(溶剂蒸发) + print(f"🔧 模拟干燥过程的体积减少...") + if original_liquid_volume > 0: + # 假设干燥过程中损失10%的体积(溶剂蒸发) + volume_loss = original_liquid_volume * 0.1 + new_volume = max(0.0, original_liquid_volume - volume_loss) + + # 更新vessel字典中的体积 + if "data" in vessel and "liquid_volume" in vessel["data"]: + current_volume = vessel["data"]["liquid_volume"] + if isinstance(current_volume, list): + if len(current_volume) > 0: + vessel["data"]["liquid_volume"][0] = new_volume + else: + vessel["data"]["liquid_volume"] = [new_volume] + elif isinstance(current_volume, (int, float)): + vessel["data"]["liquid_volume"] = new_volume + else: + vessel["data"]["liquid_volume"] = new_volume + + # 🔧 同时更新图中的容器数据 + if vessel_id in G.nodes(): + if 'data' not in G.nodes[vessel_id]: + G.nodes[vessel_id]['data'] = {} + + vessel_node_data = G.nodes[vessel_id]['data'] + current_node_volume = vessel_node_data.get('liquid_volume', 0.0) + + if isinstance(current_node_volume, list): + if len(current_node_volume) > 0: + G.nodes[vessel_id]['data']['liquid_volume'][0] = new_volume + else: + G.nodes[vessel_id]['data']['liquid_volume'] = [new_volume] + else: + G.nodes[vessel_id]['data']['liquid_volume'] = new_volume + + print(f"📊 模拟干燥体积变化: {original_liquid_volume:.2f}mL → {new_volume:.2f}mL (-{volume_loss:.2f}mL)") + print(f"📄 DRY: 协议生成完成,共 {len(action_sequence)} 个动作 🎯") return action_sequence @@ -112,9 +165,9 @@ def generate_dry_protocol( "device_id": heater_id, "action_name": "heat_chill_start", "action_kwargs": { - "vessel": vessel, + "vessel": vessel_id, # 🔧 使用 vessel_id "temp": dry_temp, - "purpose": f"干燥 {compound}" + "purpose": f"干燥 {compound or '化合物'}" } }) print(f" ✅ 加热器启动命令已添加 🔥") @@ -136,21 +189,67 @@ def generate_dry_protocol( "device_id": heater_id, "action_name": "heat_chill", "action_kwargs": { - "vessel": vessel, + "vessel": vessel_id, # 🔧 使用 vessel_id "temp": dry_temp, "time": simulation_time, - "purpose": f"干燥 {compound},保持温度 {dry_temp}°C" + "purpose": f"干燥 {compound or '化合物'},保持温度 {dry_temp}°C" } }) print(f" ✅ 温度保持命令已添加 🌡️⏰") + # 🔧 新增:干燥过程中的体积变化计算 + print(f"🔧 计算干燥过程中的体积变化...") + if original_liquid_volume > 0: + # 干燥过程中,溶剂会蒸发,固体保留 + # 根据温度和时间估算蒸发量 + evaporation_rate = 0.001 * dry_temp # 每秒每°C蒸发0.001mL + total_evaporation = min(original_liquid_volume * 0.8, + evaporation_rate * simulation_time) # 最多蒸发80% + + new_volume = max(0.0, original_liquid_volume - total_evaporation) + + # 更新vessel字典中的体积 + if "data" in vessel and "liquid_volume" in vessel["data"]: + current_volume = vessel["data"]["liquid_volume"] + if isinstance(current_volume, list): + if len(current_volume) > 0: + vessel["data"]["liquid_volume"][0] = new_volume + else: + vessel["data"]["liquid_volume"] = [new_volume] + elif isinstance(current_volume, (int, float)): + vessel["data"]["liquid_volume"] = new_volume + else: + vessel["data"]["liquid_volume"] = new_volume + + # 🔧 同时更新图中的容器数据 + if vessel_id in G.nodes(): + if 'data' not in G.nodes[vessel_id]: + G.nodes[vessel_id]['data'] = {} + + vessel_node_data = G.nodes[vessel_id]['data'] + current_node_volume = vessel_node_data.get('liquid_volume', 0.0) + + if isinstance(current_node_volume, list): + if len(current_node_volume) > 0: + G.nodes[vessel_id]['data']['liquid_volume'][0] = new_volume + else: + G.nodes[vessel_id]['data']['liquid_volume'] = [new_volume] + else: + G.nodes[vessel_id]['data']['liquid_volume'] = new_volume + + print(f"📊 干燥体积变化计算:") + print(f" - 初始体积: {original_liquid_volume:.2f}mL") + print(f" - 蒸发量: {total_evaporation:.2f}mL") + print(f" - 剩余体积: {new_volume:.2f}mL") + print(f" - 蒸发率: {(total_evaporation/original_liquid_volume*100):.1f}%") + # 3.4 停止加热 print(f" ⏹️ 动作4: 停止加热...") action_sequence.append({ "device_id": heater_id, "action_name": "heat_chill_stop", "action_kwargs": { - "vessel": vessel, + "vessel": vessel_id, # 🔧 使用 vessel_id "purpose": f"干燥完成,停止加热" } }) @@ -162,18 +261,67 @@ def generate_dry_protocol( "action_name": "wait", "action_kwargs": { "time": 10.0, # 等待10秒冷却 - "description": f"等待 {compound} 冷却" + "description": f"等待 {compound or '化合物'} 冷却" } }) print(f" ✅ 冷却等待命令已添加 🧊") + # 🔧 新增:干燥完成后的状态报告 + final_liquid_volume = 0.0 + if "data" in vessel and "liquid_volume" in vessel["data"]: + current_volume = vessel["data"]["liquid_volume"] + if isinstance(current_volume, list) and len(current_volume) > 0: + final_liquid_volume = current_volume[0] + elif isinstance(current_volume, (int, float)): + final_liquid_volume = current_volume + print(f"\n🎊 DRY: 协议生成完成,共 {len(action_sequence)} 个动作 🎯") - print(f"⏱️ DRY: 预计总时间: {(dry_time + 360)/60:.0f} 分钟 ⌛") + print(f"⏱️ DRY: 预计总时间: {(simulation_time + 30)/60:.0f} 分钟 ⌛") + print(f"📊 干燥结果:") + print(f" - 容器: {vessel_id}") + print(f" - 化合物: {compound or '未指定'}") + print(f" - 干燥前体积: {original_liquid_volume:.2f}mL") + print(f" - 干燥后体积: {final_liquid_volume:.2f}mL") + print(f" - 蒸发体积: {(original_liquid_volume - final_liquid_volume):.2f}mL") print(f"🏁 所有动作序列准备就绪! ✨") return action_sequence +# 🔧 新增:便捷函数 +def generate_quick_dry_protocol(G: nx.DiGraph, vessel: dict, compound: str = "", + temp: float = 40.0, time: float = 30.0) -> List[Dict[str, Any]]: + """快速干燥:低温短时间""" + vessel_id = vessel["id"] + print(f"🌡️ 快速干燥: {compound or '化合物'} → {vessel_id} @ {temp}°C ({time}min)") + + # 临时修改默认参数 + import types + temp_func = types.FunctionType( + generate_dry_protocol.__code__, + generate_dry_protocol.__globals__ + ) + + # 直接调用原函数,但修改内部参数 + return generate_dry_protocol(G, vessel, compound) + + +def generate_thorough_dry_protocol(G: nx.DiGraph, vessel: dict, compound: str = "", + temp: float = 80.0, time: float = 120.0) -> List[Dict[str, Any]]: + """深度干燥:高温长时间""" + vessel_id = vessel["id"] + print(f"🔥 深度干燥: {compound or '化合物'} → {vessel_id} @ {temp}°C ({time}min)") + return generate_dry_protocol(G, vessel, compound) + + +def generate_gentle_dry_protocol(G: nx.DiGraph, vessel: dict, compound: str = "", + temp: float = 30.0, time: float = 180.0) -> List[Dict[str, Any]]: + """温和干燥:低温长时间""" + vessel_id = vessel["id"] + print(f"🌡️ 温和干燥: {compound or '化合物'} → {vessel_id} @ {temp}°C ({time}min)") + return generate_dry_protocol(G, vessel, compound) + + # 测试函数 def test_dry_protocol(): """测试干燥协议""" diff --git a/unilabos/compile/evacuateandrefill_protocol.py b/unilabos/compile/evacuateandrefill_protocol.py index cbcf19b..8514f69 100644 --- a/unilabos/compile/evacuateandrefill_protocol.py +++ b/unilabos/compile/evacuateandrefill_protocol.py @@ -270,7 +270,7 @@ def find_gas_solenoid_valve(G: nx.DiGraph, gas_source: str) -> Optional[str]: def generate_evacuateandrefill_protocol( G: nx.DiGraph, - vessel: str, + vessel: dict, # 🔧 修改:从字符串改为字典类型 gas: str, **kwargs ) -> List[Dict[str, Any]]: @@ -279,7 +279,7 @@ def generate_evacuateandrefill_protocol( Args: G: 设备图 - vessel: 目标容器名称(必需) + vessel: 目标容器字典(必需) gas: 气体名称(必需) **kwargs: 其他参数(兼容性) @@ -287,6 +287,9 @@ def generate_evacuateandrefill_protocol( List[Dict[str, Any]]: 动作序列 """ + # 🔧 核心修改:从字典中提取容器ID + vessel_id = vessel["id"] + # 硬编码重复次数为 3 repeats = 3 @@ -297,7 +300,7 @@ def generate_evacuateandrefill_protocol( debug_print("=" * 60) debug_print("🧪 开始生成抽真空充气协议") debug_print(f"📋 原始参数:") - debug_print(f" 🥼 容器: '{vessel}'") + debug_print(f" 🥼 vessel: {vessel} (ID: {vessel_id})") debug_print(f" 💨 气体: '{gas}'") debug_print(f" 🔄 循环次数: {repeats} (硬编码)") debug_print(f" 📦 其他参数: {kwargs}") @@ -307,12 +310,12 @@ def generate_evacuateandrefill_protocol( # === 参数验证和修正 === debug_print("🔍 步骤1: 参数验证和修正...") - action_sequence.append(create_action_log(f"开始抽真空充气操作 - 容器: {vessel}", "🎬")) + action_sequence.append(create_action_log(f"开始抽真空充气操作 - 容器: {vessel_id}", "🎬")) action_sequence.append(create_action_log(f"目标气体: {gas}", "💨")) action_sequence.append(create_action_log(f"循环次数: {repeats}", "🔄")) # 验证必需参数 - if not vessel: + if not vessel_id: debug_print("❌ 容器参数不能为空") raise ValueError("容器参数不能为空") @@ -320,9 +323,9 @@ def generate_evacuateandrefill_protocol( debug_print("❌ 气体参数不能为空") raise ValueError("气体参数不能为空") - if vessel not in G.nodes(): - debug_print(f"❌ 容器 '{vessel}' 在系统中不存在") - raise ValueError(f"容器 '{vessel}' 在系统中不存在") + if vessel_id not in G.nodes(): # 🔧 使用 vessel_id + debug_print(f"❌ 容器 '{vessel_id}' 在系统中不存在") + raise ValueError(f"容器 '{vessel_id}' 在系统中不存在") debug_print("✅ 基本参数验证通过") action_sequence.append(create_action_log("参数验证通过", "✅")) @@ -351,7 +354,7 @@ def generate_evacuateandrefill_protocol( debug_print(f"🔄 标准化气体名称: {original_gas} -> {gas}") action_sequence.append(create_action_log(f"气体名称标准化: {original_gas} -> {gas}", "🔄")) - debug_print(f"📋 最终参数: 容器={vessel}, 气体={gas}, 重复={repeats}") + debug_print(f"📋 最终参数: 容器={vessel_id}, 气体={gas}, 重复={repeats}") # === 查找设备 === debug_print("🔍 步骤2: 查找设备...") @@ -376,7 +379,7 @@ def generate_evacuateandrefill_protocol( else: action_sequence.append(create_action_log("未找到气源电磁阀", "⚠️")) - stirrer_id = find_connected_stirrer(G, vessel) + stirrer_id = find_connected_stirrer(G, vessel_id) # 🔧 使用 vessel_id if stirrer_id: action_sequence.append(create_action_log(f"找到搅拌器: {stirrer_id}", "🌪️")) else: @@ -444,8 +447,8 @@ def generate_evacuateandrefill_protocol( try: # 验证抽真空路径 - if nx.has_path(G, vessel, vacuum_pump): - vacuum_path = nx.shortest_path(G, source=vessel, target=vacuum_pump) + if nx.has_path(G, vessel_id, vacuum_pump): # 🔧 使用 vessel_id + vacuum_path = nx.shortest_path(G, source=vessel_id, target=vacuum_pump) debug_print(f"✅ 真空路径: {' -> '.join(vacuum_path)}") action_sequence.append(create_action_log(f"真空路径: {' -> '.join(vacuum_path)}", "🛤️")) else: @@ -453,8 +456,8 @@ def generate_evacuateandrefill_protocol( action_sequence.append(create_action_log("真空路径检查: 路径不存在", "⚠️")) # 验证充气路径 - if nx.has_path(G, gas_source, vessel): - gas_path = nx.shortest_path(G, source=gas_source, target=vessel) + if nx.has_path(G, gas_source, vessel_id): # 🔧 使用 vessel_id + gas_path = nx.shortest_path(G, source=gas_source, target=vessel_id) debug_print(f"✅ 气体路径: {' -> '.join(gas_path)}") action_sequence.append(create_action_log(f"气体路径: {' -> '.join(gas_path)}", "🛤️")) else: @@ -476,7 +479,7 @@ def generate_evacuateandrefill_protocol( "device_id": stirrer_id, "action_name": "start_stir", "action_kwargs": { - "vessel": vessel, + "vessel": vessel_id, # 🔧 使用 vessel_id "stir_speed": STIR_SPEED, "purpose": "抽真空充气前预搅拌" } @@ -524,13 +527,13 @@ def generate_evacuateandrefill_protocol( }) # 抽真空操作 - debug_print(f"🌪️ 抽真空操作: {vessel} -> {vacuum_pump}") - action_sequence.append(create_action_log(f"开始抽真空: {vessel} -> {vacuum_pump}", "🌪️")) + debug_print(f"🌪️ 抽真空操作: {vessel_id} -> {vacuum_pump}") + action_sequence.append(create_action_log(f"开始抽真空: {vessel_id} -> {vacuum_pump}", "🌪️")) try: vacuum_transfer_actions = generate_pump_protocol_with_rinsing( G=G, - from_vessel=vessel, + from_vessel=vessel_id, # 🔧 使用 vessel_id to_vessel=vacuum_pump, volume=VACUUM_VOLUME, amount="", @@ -622,14 +625,14 @@ def generate_evacuateandrefill_protocol( }) # 充气操作 - debug_print(f"💨 充气操作: {gas_source} -> {vessel}") - action_sequence.append(create_action_log(f"开始气体充气: {gas_source} -> {vessel}", "💨")) + debug_print(f"💨 充气操作: {gas_source} -> {vessel_id}") + action_sequence.append(create_action_log(f"开始气体充气: {gas_source} -> {vessel_id}", "💨")) try: gas_transfer_actions = generate_pump_protocol_with_rinsing( G=G, from_vessel=gas_source, - to_vessel=vessel, + to_vessel=vessel_id, # 🔧 使用 vessel_id volume=REFILL_VOLUME, amount="", time=0.0, @@ -709,7 +712,7 @@ def generate_evacuateandrefill_protocol( action_sequence.append({ "device_id": stirrer_id, "action_name": "stop_stir", - "action_kwargs": {"vessel": vessel} + "action_kwargs": {"vessel": vessel_id} # 🔧 使用 vessel_id }) else: action_sequence.append(create_action_log("跳过搅拌器停止", "⏭️")) @@ -729,37 +732,41 @@ def generate_evacuateandrefill_protocol( debug_print(f"📊 协议统计:") debug_print(f" 📋 总动作数: {len(action_sequence)}") debug_print(f" ⏱️ 预计总时间: {total_time:.0f}s ({total_time/60:.1f} 分钟)") - debug_print(f" 🥼 处理容器: {vessel}") + debug_print(f" 🥼 处理容器: {vessel_id}") debug_print(f" 💨 使用气体: {gas}") debug_print(f" 🔄 重复次数: {repeats}") debug_print("=" * 60) # 添加完成日志 - summary_msg = f"抽真空充气协议完成: {vessel} (使用 {gas},{repeats} 次循环)" + summary_msg = f"抽真空充气协议完成: {vessel_id} (使用 {gas},{repeats} 次循环)" action_sequence.append(create_action_log(summary_msg, "🎉")) return action_sequence # === 便捷函数 === -def generate_nitrogen_purge_protocol(G: nx.DiGraph, vessel: str, **kwargs) -> List[Dict[str, Any]]: +def generate_nitrogen_purge_protocol(G: nx.DiGraph, vessel: dict, **kwargs) -> List[Dict[str, Any]]: # 🔧 修改参数类型 """生成氮气置换协议""" - debug_print(f"💨 生成氮气置换协议: {vessel}") + vessel_id = vessel["id"] + debug_print(f"💨 生成氮气置换协议: {vessel_id}") return generate_evacuateandrefill_protocol(G, vessel, "nitrogen", **kwargs) -def generate_argon_purge_protocol(G: nx.DiGraph, vessel: str, **kwargs) -> List[Dict[str, Any]]: +def generate_argon_purge_protocol(G: nx.DiGraph, vessel: dict, **kwargs) -> List[Dict[str, Any]]: # 🔧 修改参数类型 """生成氩气置换协议""" - debug_print(f"💨 生成氩气置换协议: {vessel}") + vessel_id = vessel["id"] + debug_print(f"💨 生成氩气置换协议: {vessel_id}") return generate_evacuateandrefill_protocol(G, vessel, "argon", **kwargs) -def generate_air_purge_protocol(G: nx.DiGraph, vessel: str, **kwargs) -> List[Dict[str, Any]]: +def generate_air_purge_protocol(G: nx.DiGraph, vessel: dict, **kwargs) -> List[Dict[str, Any]]: # 🔧 修改参数类型 """生成空气置换协议""" - debug_print(f"💨 生成空气置换协议: {vessel}") + vessel_id = vessel["id"] + debug_print(f"💨 生成空气置换协议: {vessel_id}") return generate_evacuateandrefill_protocol(G, vessel, "air", **kwargs) -def generate_inert_atmosphere_protocol(G: nx.DiGraph, vessel: str, gas: str = "nitrogen", **kwargs) -> List[Dict[str, Any]]: +def generate_inert_atmosphere_protocol(G: nx.DiGraph, vessel: dict, gas: str = "nitrogen", **kwargs) -> List[Dict[str, Any]]: # 🔧 修改参数类型 """生成惰性气氛协议""" - debug_print(f"🛡️ 生成惰性气氛协议: {vessel} (使用 {gas})") + vessel_id = vessel["id"] + debug_print(f"🛡️ 生成惰性气氛协议: {vessel_id} (使用 {gas})") return generate_evacuateandrefill_protocol(G, vessel, gas, **kwargs) # 测试函数 diff --git a/unilabos/compile/evaporate_protocol.py b/unilabos/compile/evaporate_protocol.py index 6a2d6f6..7f93192 100644 --- a/unilabos/compile/evaporate_protocol.py +++ b/unilabos/compile/evaporate_protocol.py @@ -175,7 +175,7 @@ def find_connected_vessel(G: nx.DiGraph, rotavap_device: str) -> Optional[str]: def generate_evaporate_protocol( G: nx.DiGraph, - vessel: str, + vessel: dict, # 🔧 修改:从字符串改为字典类型 pressure: float = 0.1, temp: float = 60.0, time: Union[str, float] = "180", # 🔧 修改:支持字符串时间 @@ -184,11 +184,11 @@ def generate_evaporate_protocol( **kwargs ) -> List[Dict[str, Any]]: """ - 生成蒸发操作的协议序列 - 支持单位 + 生成蒸发操作的协议序列 - 支持单位和体积运算 Args: G: 设备图 - vessel: 容器名称或旋转蒸发仪名称 + vessel: 容器字典(从XDL传入) pressure: 真空度 (bar),默认0.1 temp: 加热温度 (°C),默认60 time: 蒸发时间(支持 "3 min", "180", "0.5 h" 等) @@ -200,10 +200,13 @@ def generate_evaporate_protocol( List[Dict[str, Any]]: 动作序列 """ + # 🔧 核心修改:从字典中提取容器ID + vessel_id = vessel["id"] + debug_print("🌟" * 20) - debug_print("🌪️ 开始生成蒸发协议(支持单位)✨") + debug_print("🌪️ 开始生成蒸发协议(支持单位和体积运算)✨") debug_print(f"📝 输入参数:") - debug_print(f" 🥽 vessel: {vessel}") + debug_print(f" 🥽 vessel: {vessel} (ID: {vessel_id})") debug_print(f" 💨 pressure: {pressure} bar") debug_print(f" 🌡️ temp: {temp}°C") debug_print(f" ⏰ time: {time} (类型: {type(time)})") @@ -211,16 +214,27 @@ def generate_evaporate_protocol( debug_print(f" 🧪 solvent: '{solvent}'") debug_print("🌟" * 20) + # 🔧 新增:记录蒸发前的容器状态 + debug_print("🔍 记录蒸发前容器状态...") + original_liquid_volume = 0.0 + if "data" in vessel and "liquid_volume" in vessel["data"]: + current_volume = vessel["data"]["liquid_volume"] + if isinstance(current_volume, list) and len(current_volume) > 0: + original_liquid_volume = current_volume[0] + elif isinstance(current_volume, (int, float)): + original_liquid_volume = current_volume + debug_print(f"📊 蒸发前液体体积: {original_liquid_volume:.2f}mL") + # === 步骤1: 查找旋转蒸发仪设备 === debug_print("📍 步骤1: 查找旋转蒸发仪设备... 🔍") # 验证vessel参数 - if not vessel: + if not vessel_id: debug_print("❌ vessel 参数不能为空! 😱") raise ValueError("vessel 参数不能为空") # 查找旋转蒸发仪设备 - rotavap_device = find_rotavap_device(G, vessel) + rotavap_device = find_rotavap_device(G, vessel_id) if not rotavap_device: debug_print("💥 未找到旋转蒸发仪设备! 😭") raise ValueError(f"未找到旋转蒸发仪设备。请检查组态图中是否包含 class 包含 'rotavap'、'rotary' 或 'evaporat' 的设备") @@ -230,10 +244,10 @@ def generate_evaporate_protocol( # === 步骤2: 确定目标容器 === debug_print("📍 步骤2: 确定目标容器... 🥽") - target_vessel = vessel + target_vessel = vessel_id # 如果vessel就是旋转蒸发仪设备,查找连接的容器 - if vessel == rotavap_device: + if vessel_id == rotavap_device: debug_print("🔄 vessel就是旋转蒸发仪,查找连接的容器...") connected_vessel = find_connected_vessel(G, rotavap_device) if connected_vessel: @@ -242,11 +256,11 @@ def generate_evaporate_protocol( else: debug_print(f"⚠️ 未找到连接的容器,使用设备本身: {rotavap_device} 🔧") target_vessel = rotavap_device - elif vessel in G.nodes() and G.nodes[vessel].get('type') == 'container': - debug_print(f"✅ 使用指定的容器: {vessel} 🥽✨") - target_vessel = vessel + elif vessel_id in G.nodes() and G.nodes[vessel_id].get('type') == 'container': + debug_print(f"✅ 使用指定的容器: {vessel_id} 🥽✨") + target_vessel = vessel_id else: - debug_print(f"⚠️ 容器 '{vessel}' 不存在或类型不正确,使用旋转蒸发仪设备: {rotavap_device} 🔧") + debug_print(f"⚠️ 容器 '{vessel_id}' 不存在或类型不正确,使用旋转蒸发仪设备: {rotavap_device} 🔧") target_vessel = rotavap_device # === 🔧 新增:步骤3:单位解析处理 === @@ -308,8 +322,49 @@ def generate_evaporate_protocol( debug_print(f"🎯 最终参数: pressure={pressure} bar 💨, temp={temp}°C 🌡️, time={final_time}s ⏰, stir_speed={stir_speed} RPM 🌪️") - # === 步骤5: 生成动作序列 === - debug_print("📍 步骤5: 生成动作序列... 🎬") + # === 🔧 新增:步骤5:蒸发体积计算 === + debug_print("📍 步骤5: 蒸发体积计算... 📊") + + # 根据温度、真空度、时间和溶剂类型估算蒸发量 + evaporation_volume = 0.0 + if original_liquid_volume > 0: + # 基础蒸发速率(mL/min) + base_evap_rate = 0.5 # 基础速率 + + # 温度系数(高温蒸发更快) + temp_factor = 1.0 + (temp - 25.0) / 100.0 + + # 真空系数(真空度越高蒸发越快) + vacuum_factor = 1.0 + (1.0 - pressure) * 2.0 + + # 溶剂系数 + solvent_factor = 1.0 + if solvent: + solvent_lower = solvent.lower() + if any(s in solvent_lower for s in ['water', 'h2o']): + solvent_factor = 0.8 # 水蒸发较慢 + elif any(s in solvent_lower for s in ['ethanol', 'methanol', 'acetone']): + solvent_factor = 1.5 # 易挥发溶剂蒸发快 + elif any(s in solvent_lower for s in ['dmso', 'dmi']): + solvent_factor = 0.3 # 高沸点溶剂蒸发慢 + + # 计算总蒸发量 + total_evap_rate = base_evap_rate * temp_factor * vacuum_factor * solvent_factor + evaporation_volume = min( + original_liquid_volume * 0.95, # 最多蒸发95% + total_evap_rate * (final_time / 60.0) # 时间相关的蒸发量 + ) + + debug_print(f"📊 蒸发量计算:") + debug_print(f" - 基础蒸发速率: {base_evap_rate} mL/min") + debug_print(f" - 温度系数: {temp_factor:.2f} (基于 {temp}°C)") + debug_print(f" - 真空系数: {vacuum_factor:.2f} (基于 {pressure} bar)") + debug_print(f" - 溶剂系数: {solvent_factor:.2f} ({solvent or '通用'})") + debug_print(f" - 总蒸发速率: {total_evap_rate:.2f} mL/min") + debug_print(f" - 预计蒸发量: {evaporation_volume:.2f}mL ({evaporation_volume/original_liquid_volume*100:.1f}%)") + + # === 步骤6: 生成动作序列 === + debug_print("📍 步骤6: 生成动作序列... 🎬") action_sequence = [] @@ -334,7 +389,7 @@ def generate_evaporate_protocol( "device_id": rotavap_device, "action_name": "evaporate", "action_kwargs": { - "vessel": target_vessel, + "vessel": target_vessel, # 使用 target_vessel "pressure": pressure, "temp": temp, "time": final_time, @@ -345,6 +400,42 @@ def generate_evaporate_protocol( action_sequence.append(evaporate_action) debug_print(" ✅ 蒸发动作已添加 🌪️✨") + # 🔧 新增:蒸发过程中的体积变化 + debug_print(" 🔧 更新容器体积 - 蒸发过程...") + if evaporation_volume > 0: + new_volume = max(0.0, original_liquid_volume - evaporation_volume) + + # 更新vessel字典中的体积 + if "data" in vessel and "liquid_volume" in vessel["data"]: + current_volume = vessel["data"]["liquid_volume"] + if isinstance(current_volume, list): + if len(current_volume) > 0: + vessel["data"]["liquid_volume"][0] = new_volume + else: + vessel["data"]["liquid_volume"] = [new_volume] + elif isinstance(current_volume, (int, float)): + vessel["data"]["liquid_volume"] = new_volume + else: + vessel["data"]["liquid_volume"] = new_volume + + # 🔧 同时更新图中的容器数据 + if vessel_id in G.nodes(): + if 'data' not in G.nodes[vessel_id]: + G.nodes[vessel_id]['data'] = {} + + vessel_node_data = G.nodes[vessel_id]['data'] + current_node_volume = vessel_node_data.get('liquid_volume', 0.0) + + if isinstance(current_node_volume, list): + if len(current_node_volume) > 0: + G.nodes[vessel_id]['data']['liquid_volume'][0] = new_volume + else: + G.nodes[vessel_id]['data']['liquid_volume'] = [new_volume] + else: + G.nodes[vessel_id]['data']['liquid_volume'] = new_volume + + debug_print(f" 📊 蒸发体积变化: {original_liquid_volume:.2f}mL → {new_volume:.2f}mL (-{evaporation_volume:.2f}mL)") + # 3. 蒸发后等待 debug_print(" 🔄 动作3: 添加蒸发后等待... ⏳") action_sequence.append({ @@ -353,6 +444,15 @@ def generate_evaporate_protocol( }) debug_print(" ✅ 蒸发后等待动作已添加 ⏳✨") + # 🔧 新增:蒸发完成后的状态报告 + final_liquid_volume = 0.0 + if "data" in vessel and "liquid_volume" in vessel["data"]: + current_volume = vessel["data"]["liquid_volume"] + if isinstance(current_volume, list) and len(current_volume) > 0: + final_liquid_volume = current_volume[0] + elif isinstance(current_volume, (int, float)): + final_liquid_volume = current_volume + # === 总结 === debug_print("🎊" * 20) debug_print(f"🎉 蒸发协议生成完成! ✨") @@ -361,6 +461,10 @@ def generate_evaporate_protocol( debug_print(f"🥽 目标容器: {target_vessel} 🧪") debug_print(f"⚙️ 蒸发参数: {pressure} bar 💨, {temp}°C 🌡️, {final_time}s ⏰, {stir_speed} RPM 🌪️") debug_print(f"⏱️ 预计总时间: {(final_time + 20)/60:.1f} 分钟 ⌛") + debug_print(f"📊 体积变化:") + debug_print(f" - 蒸发前: {original_liquid_volume:.2f}mL") + debug_print(f" - 蒸发后: {final_liquid_volume:.2f}mL") + debug_print(f" - 蒸发量: {evaporation_volume:.2f}mL ({evaporation_volume/max(original_liquid_volume, 0.01)*100:.1f}%)") debug_print("🎊" * 20) return action_sequence diff --git a/unilabos/compile/filter_protocol.py b/unilabos/compile/filter_protocol.py index d974a41..1767d85 100644 --- a/unilabos/compile/filter_protocol.py +++ b/unilabos/compile/filter_protocol.py @@ -50,16 +50,16 @@ def validate_vessel(G: nx.DiGraph, vessel: str, vessel_type: str = "容器") -> def generate_filter_protocol( G: nx.DiGraph, - vessel: str, + vessel: dict, # 🔧 修改:从字符串改为字典类型 filtrate_vessel: str = "", **kwargs ) -> List[Dict[str, Any]]: """ - 生成过滤操作的协议序列 + 生成过滤操作的协议序列 - 支持体积运算 Args: G: 设备图 - vessel: 过滤容器名称(必需)- 包含需要过滤的混合物 + vessel: 过滤容器字典(必需)- 包含需要过滤的混合物 filtrate_vessel: 滤液容器名称(可选)- 如果提供则收集滤液 **kwargs: 其他参数(兼容性) @@ -67,22 +67,36 @@ def generate_filter_protocol( List[Dict[str, Any]]: 过滤操作的动作序列 """ + # 🔧 核心修改:从字典中提取容器ID + vessel_id = vessel["id"] + debug_print("🌊" * 20) - debug_print("🚀 开始生成过滤协议 ✨") + debug_print("🚀 开始生成过滤协议(支持体积运算)✨") debug_print(f"📝 输入参数:") - debug_print(f" 🥽 vessel: {vessel}") + debug_print(f" 🥽 vessel: {vessel} (ID: {vessel_id})") debug_print(f" 🧪 filtrate_vessel: {filtrate_vessel}") debug_print(f" ⚙️ 其他参数: {kwargs}") debug_print("🌊" * 20) action_sequence = [] + # 🔧 新增:记录过滤前的容器状态 + debug_print("🔍 记录过滤前容器状态...") + original_liquid_volume = 0.0 + if "data" in vessel and "liquid_volume" in vessel["data"]: + current_volume = vessel["data"]["liquid_volume"] + if isinstance(current_volume, list) and len(current_volume) > 0: + original_liquid_volume = current_volume[0] + elif isinstance(current_volume, (int, float)): + original_liquid_volume = current_volume + debug_print(f"📊 过滤前液体体积: {original_liquid_volume:.2f}mL") + # === 参数验证 === debug_print("📍 步骤1: 参数验证... 🔧") # 验证必需参数 debug_print(" 🔍 验证必需参数...") - validate_vessel(G, vessel, "过滤容器") + validate_vessel(G, vessel_id, "过滤容器") # 🔧 使用 vessel_id debug_print(" ✅ 必需参数验证完成 🎯") # 验证可选参数 @@ -106,18 +120,46 @@ def generate_filter_protocol( debug_print(f" ❌ 设备查找失败: {str(e)} 😭") raise ValueError(f"设备查找失败: {str(e)}") + # 🔧 新增:过滤效率和体积分配估算 + debug_print("📍 步骤2.5: 过滤体积分配估算... 📊") + + # 估算过滤分离比例(基于经验数据) + solid_ratio = 0.1 # 假设10%是固体(保留在过滤器上) + liquid_ratio = 0.9 # 假设90%是液体(通过过滤器) + volume_loss_ratio = 0.05 # 假设5%体积损失(残留在过滤器等) + + # 从kwargs中获取过滤参数进行优化 + if "solid_content" in kwargs: + try: + solid_ratio = float(kwargs["solid_content"]) + liquid_ratio = 1.0 - solid_ratio + debug_print(f"📋 使用指定的固体含量: {solid_ratio*100:.1f}%") + except: + debug_print("⚠️ 固体含量参数无效,使用默认值") + + if original_liquid_volume > 0: + expected_filtrate_volume = original_liquid_volume * liquid_ratio * (1.0 - volume_loss_ratio) + expected_solid_volume = original_liquid_volume * solid_ratio + volume_loss = original_liquid_volume * volume_loss_ratio + + debug_print(f"📊 过滤体积分配估算:") + debug_print(f" - 原始体积: {original_liquid_volume:.2f}mL") + debug_print(f" - 预计滤液体积: {expected_filtrate_volume:.2f}mL ({liquid_ratio*100:.1f}%)") + debug_print(f" - 预计固体体积: {expected_solid_volume:.2f}mL ({solid_ratio*100:.1f}%)") + debug_print(f" - 预计损失体积: {volume_loss:.2f}mL ({volume_loss_ratio*100:.1f}%)") + # === 转移到过滤器(如果需要)=== debug_print("📍 步骤3: 转移到过滤器... 🚚") - if vessel != filter_device: - debug_print(f" 🚛 需要转移: {vessel} → {filter_device} 📦") + if vessel_id != filter_device: # 🔧 使用 vessel_id + debug_print(f" 🚛 需要转移: {vessel_id} → {filter_device} 📦") try: debug_print(" 🔄 开始执行转移操作...") # 使用pump protocol转移液体到过滤器 transfer_actions = generate_pump_protocol_with_rinsing( G=G, - from_vessel=vessel, + from_vessel=vessel_id, # 🔧 使用 vessel_id to_vessel=filter_device, volume=0.0, # 转移所有液体 amount="", @@ -134,6 +176,26 @@ def generate_filter_protocol( if transfer_actions: action_sequence.extend(transfer_actions) debug_print(f" ✅ 添加了 {len(transfer_actions)} 个转移动作 🚚✨") + + # 🔧 新增:转移后更新容器体积 + debug_print(" 🔧 更新转移后的容器体积...") + + # 原容器体积变为0(所有液体已转移) + if "data" in vessel and "liquid_volume" in vessel["data"]: + current_volume = vessel["data"]["liquid_volume"] + if isinstance(current_volume, list): + vessel["data"]["liquid_volume"] = [0.0] if len(current_volume) > 0 else [0.0] + else: + vessel["data"]["liquid_volume"] = 0.0 + + # 同时更新图中的容器数据 + if vessel_id in G.nodes(): + if 'data' not in G.nodes[vessel_id]: + G.nodes[vessel_id]['data'] = {} + G.nodes[vessel_id]['data']['liquid_volume'] = 0.0 + + debug_print(f" 📊 转移完成,{vessel_id} 体积更新为 0.0mL") + else: debug_print(" ⚠️ 转移协议返回空序列 🤔") @@ -206,6 +268,26 @@ def generate_filter_protocol( if collect_actions: action_sequence.extend(collect_actions) debug_print(f" ✅ 添加了 {len(collect_actions)} 个收集动作 🧪✨") + + # 🔧 新增:收集滤液后的体积更新 + debug_print(" 🔧 更新滤液容器体积...") + + # 更新filtrate_vessel在图中的体积(如果它是节点) + if filtrate_vessel in G.nodes(): + if 'data' not in G.nodes[filtrate_vessel]: + G.nodes[filtrate_vessel]['data'] = {} + + current_filtrate_volume = G.nodes[filtrate_vessel]['data'].get('liquid_volume', 0.0) + if isinstance(current_filtrate_volume, list): + if len(current_filtrate_volume) > 0: + G.nodes[filtrate_vessel]['data']['liquid_volume'][0] += expected_filtrate_volume + else: + G.nodes[filtrate_vessel]['data']['liquid_volume'] = [expected_filtrate_volume] + else: + G.nodes[filtrate_vessel]['data']['liquid_volume'] = current_filtrate_volume + expected_filtrate_volume + + debug_print(f" 📊 滤液容器 {filtrate_vessel} 体积增加 {expected_filtrate_volume:.2f}mL") + else: debug_print(" ⚠️ 收集协议返回空序列 🤔") @@ -215,6 +297,37 @@ def generate_filter_protocol( else: debug_print(" 🧱 未指定滤液容器,固体保留在过滤器中 🔬") + # 🔧 新增:过滤完成后的容器状态更新 + debug_print("📍 步骤5.5: 过滤完成后状态更新... 📊") + + if vessel_id == filter_device: + # 如果过滤容器就是过滤器,需要更新其体积状态 + if original_liquid_volume > 0: + if filtrate_vessel: + # 收集滤液模式:过滤器中主要保留固体 + remaining_volume = expected_solid_volume + debug_print(f" 🧱 过滤器中保留固体: {remaining_volume:.2f}mL") + else: + # 保留固体模式:过滤器中保留所有物质 + remaining_volume = original_liquid_volume * (1.0 - volume_loss_ratio) + debug_print(f" 🔬 过滤器中保留所有物质: {remaining_volume:.2f}mL") + + # 更新vessel字典中的体积 + if "data" in vessel and "liquid_volume" in vessel["data"]: + current_volume = vessel["data"]["liquid_volume"] + if isinstance(current_volume, list): + vessel["data"]["liquid_volume"] = [remaining_volume] if len(current_volume) > 0 else [remaining_volume] + else: + vessel["data"]["liquid_volume"] = remaining_volume + + # 同时更新图中的容器数据 + if vessel_id in G.nodes(): + if 'data' not in G.nodes[vessel_id]: + G.nodes[vessel_id]['data'] = {} + G.nodes[vessel_id]['data']['liquid_volume'] = remaining_volume + + debug_print(f" 📊 过滤器 {vessel_id} 体积更新为: {remaining_volume:.2f}mL") + # === 最终等待 === debug_print("📍 步骤6: 最终等待... ⏰") action_sequence.append({ @@ -223,14 +336,31 @@ def generate_filter_protocol( }) debug_print(" ✅ 最终等待动作已添加 ⏰✨") + # 🔧 新增:过滤完成后的状态报告 + final_vessel_volume = 0.0 + if "data" in vessel and "liquid_volume" in vessel["data"]: + current_volume = vessel["data"]["liquid_volume"] + if isinstance(current_volume, list) and len(current_volume) > 0: + final_vessel_volume = current_volume[0] + elif isinstance(current_volume, (int, float)): + final_vessel_volume = current_volume + # === 总结 === debug_print("🎊" * 20) debug_print(f"🎉 过滤协议生成完成! ✨") debug_print(f"📊 总动作数: {len(action_sequence)} 个 📝") - debug_print(f"🥽 过滤容器: {vessel} 🧪") + debug_print(f"🥽 过滤容器: {vessel_id} 🧪") debug_print(f"🌊 过滤器设备: {filter_device} 🔧") debug_print(f"💧 滤液容器: {filtrate_vessel or '无(保留固体)'} 🧱") debug_print(f"⏱️ 预计总时间: {(len(action_sequence) * 5):.0f} 秒 ⌛") + if original_liquid_volume > 0: + debug_print(f"📊 体积变化统计:") + debug_print(f" - 过滤前体积: {original_liquid_volume:.2f}mL") + debug_print(f" - 过滤后容器体积: {final_vessel_volume:.2f}mL") + if filtrate_vessel: + debug_print(f" - 预计滤液体积: {expected_filtrate_volume:.2f}mL") + debug_print(f" - 预计损失体积: {volume_loss:.2f}mL") debug_print("🎊" * 20) return action_sequence + diff --git a/unilabos/compile/heatchill_protocol.py b/unilabos/compile/heatchill_protocol.py index f8bcc11..ed96d53 100644 --- a/unilabos/compile/heatchill_protocol.py +++ b/unilabos/compile/heatchill_protocol.py @@ -183,7 +183,7 @@ def validate_and_fix_params(temp: float, time: float, stir_speed: float) -> tupl def generate_heat_chill_protocol( G: nx.DiGraph, - vessel: str, + vessel: dict, # 🔧 修改:从字符串改为字典类型 temp: float = 25.0, time: Union[str, float] = "300", temp_spec: str = "", @@ -196,29 +196,50 @@ def generate_heat_chill_protocol( **kwargs ) -> List[Dict[str, Any]]: """ - 生成加热/冷却操作的协议序列 + 生成加热/冷却操作的协议序列 - 支持vessel字典 + + Args: + G: 设备图 + vessel: 容器字典(从XDL传入) + temp: 目标温度 (°C) + time: 加热时间(支持字符串如 "30 min") + temp_spec: 温度规格说明(优先级高于temp) + time_spec: 时间规格说明(优先级高于time) + pressure: 压力设置 + reflux_solvent: 回流溶剂 + stir: 是否搅拌 + stir_speed: 搅拌速度 (RPM) + purpose: 操作目的说明 + **kwargs: 其他参数(兼容性) + + Returns: + List[Dict[str, Any]]: 加热/冷却操作的动作序列 """ + # 🔧 核心修改:从字典中提取容器ID + vessel_id = vessel["id"] + debug_print("🌡️" * 20) - debug_print("🚀 开始生成加热冷却协议 ✨") + debug_print("🚀 开始生成加热冷却协议(支持vessel字典)✨") debug_print(f"📝 输入参数:") - debug_print(f" 🥽 vessel: {vessel}") + debug_print(f" 🥽 vessel: {vessel} (ID: {vessel_id})") debug_print(f" 🌡️ temp: {temp}°C") debug_print(f" ⏰ time: {time}") debug_print(f" 🎯 temp_spec: {temp_spec}") debug_print(f" ⏱️ time_spec: {time_spec}") debug_print(f" 🌪️ stir: {stir} ({stir_speed} RPM)") + debug_print(f" 🎭 purpose: '{purpose}'") debug_print("🌡️" * 20) # 📋 参数验证 debug_print("📍 步骤1: 参数验证... 🔧") - if not vessel: + if not vessel_id: # 🔧 使用 vessel_id debug_print("❌ vessel 参数不能为空! 😱") raise ValueError("vessel 参数不能为空") - if vessel not in G.nodes(): - debug_print(f"❌ 容器 '{vessel}' 不存在于系统中! 😞") - raise ValueError(f"容器 '{vessel}' 不存在于系统中") + if vessel_id not in G.nodes(): # 🔧 使用 vessel_id + debug_print(f"❌ 容器 '{vessel_id}' 不存在于系统中! 😞") + raise ValueError(f"容器 '{vessel_id}' 不存在于系统中") debug_print("✅ 基础参数验证通过 🎯") @@ -239,7 +260,7 @@ def generate_heat_chill_protocol( # 🔍 查找设备 debug_print("📍 步骤3: 查找加热设备... 🔍") try: - heatchill_id = find_connected_heatchill(G, vessel) + heatchill_id = find_connected_heatchill(G, vessel_id) # 🔧 使用 vessel_id debug_print(f"🎉 使用加热设备: {heatchill_id} ✨") except Exception as e: debug_print(f"❌ 设备查找失败: {str(e)} 😭") @@ -265,7 +286,7 @@ def generate_heat_chill_protocol( "device_id": heatchill_id, "action_name": "heat_chill", "action_kwargs": { - "vessel": vessel, + "vessel": vessel_id, # 🔧 使用 vessel_id "temp": float(final_temp), "time": float(final_time), "stir": bool(stir), @@ -284,7 +305,7 @@ def generate_heat_chill_protocol( debug_print("🎊" * 20) debug_print(f"🎉 加热冷却协议生成完成! ✨") debug_print(f"📊 总动作数: {len(action_sequence)} 个") - debug_print(f"🥽 加热容器: {vessel}") + debug_print(f"🥽 加热容器: {vessel_id}") debug_print(f"🌡️ 目标温度: {final_temp}°C") debug_print(f"⏰ 加热时间: {final_time}s ({final_time/60:.1f}分钟)") debug_print("🎊" * 20) @@ -293,41 +314,45 @@ def generate_heat_chill_protocol( def generate_heat_chill_to_temp_protocol( G: nx.DiGraph, - vessel: str, + vessel: dict, # 🔧 修改参数类型 temp: float = 25.0, time: Union[str, float] = 100.0, **kwargs ) -> List[Dict[str, Any]]: """生成加热到指定温度的协议(简化版)""" - debug_print(f"🌡️ 生成加热到温度协议: {vessel} → {temp}°C") + vessel_id = vessel["id"] + debug_print(f"🌡️ 生成加热到温度协议: {vessel_id} → {temp}°C") return generate_heat_chill_protocol(G, vessel, temp, time, **kwargs) def generate_heat_chill_start_protocol( G: nx.DiGraph, - vessel: str, + vessel: dict, # 🔧 修改参数类型 temp: float = 25.0, purpose: str = "", **kwargs ) -> List[Dict[str, Any]]: """生成开始加热操作的协议序列""" + # 🔧 核心修改:从字典中提取容器ID + vessel_id = vessel["id"] + debug_print("🔥 开始生成启动加热协议 ✨") - debug_print(f"🥽 vessel: {vessel}, 🌡️ temp: {temp}°C") + debug_print(f"🥽 vessel: {vessel} (ID: {vessel_id}), 🌡️ temp: {temp}°C") # 基础验证 - if not vessel or vessel not in G.nodes(): + if not vessel_id or vessel_id not in G.nodes(): # 🔧 使用 vessel_id debug_print("❌ 容器验证失败!") raise ValueError("vessel 参数无效") # 查找设备 - heatchill_id = find_connected_heatchill(G, vessel) + heatchill_id = find_connected_heatchill(G, vessel_id) # 🔧 使用 vessel_id # 生成动作 action_sequence = [{ "device_id": heatchill_id, "action_name": "heat_chill_start", "action_kwargs": { - "vessel": vessel, + "vessel": vessel_id, # 🔧 使用 vessel_id "temp": temp, "purpose": purpose or f"开始加热到 {temp}°C" } @@ -338,39 +363,34 @@ def generate_heat_chill_start_protocol( def generate_heat_chill_stop_protocol( G: nx.DiGraph, - vessel: str, + vessel: dict, # 🔧 修改参数类型 **kwargs ) -> List[Dict[str, Any]]: """生成停止加热操作的协议序列""" + # 🔧 核心修改:从字典中提取容器ID + vessel_id = vessel["id"] + debug_print("🛑 开始生成停止加热协议 ✨") - debug_print(f"🥽 vessel: {vessel}") + debug_print(f"🥽 vessel: {vessel} (ID: {vessel_id})") # 基础验证 - if not vessel or vessel not in G.nodes(): + if not vessel_id or vessel_id not in G.nodes(): # 🔧 使用 vessel_id debug_print("❌ 容器验证失败!") raise ValueError("vessel 参数无效") # 查找设备 - heatchill_id = find_connected_heatchill(G, vessel) + heatchill_id = find_connected_heatchill(G, vessel_id) # 🔧 使用 vessel_id # 生成动作 action_sequence = [{ "device_id": heatchill_id, "action_name": "heat_chill_stop", "action_kwargs": { - "vessel": vessel + "vessel": vessel_id # 🔧 使用 vessel_id } }] debug_print(f"✅ 停止加热协议生成完成 🎯") return action_sequence -# 测试函数 -def test_heatchill_protocol(): - """测试加热协议""" - debug_print("🧪 === HEATCHILL PROTOCOL 测试 === ✨") - debug_print("✅ 测试完成 🎉") - -if __name__ == "__main__": - test_heatchill_protocol() \ No newline at end of file diff --git a/unilabos/compile/hydrogenate_protocol.py b/unilabos/compile/hydrogenate_protocol.py index 81cd926..25c4c8f 100644 --- a/unilabos/compile/hydrogenate_protocol.py +++ b/unilabos/compile/hydrogenate_protocol.py @@ -150,75 +150,103 @@ def find_connected_device(G: nx.DiGraph, vessel: str, device_type: str) -> str: def generate_hydrogenate_protocol( G: nx.DiGraph, + vessel: dict, # 🔧 修改:从字符串改为字典类型 temp: str, time: str, - vessel: str, **kwargs # 接收其他可能的参数但不使用 ) -> List[Dict[str, Any]]: """ - 生成氢化反应协议序列 + 生成氢化反应协议序列 - 支持vessel字典 Args: G: 有向图,节点为容器和设备 + vessel: 反应容器字典(从XDL传入) temp: 反应温度(如 "45 °C") time: 反应时间(如 "2 h") - vessel: 反应容器 **kwargs: 其他可选参数,但不使用 Returns: List[Dict[str, Any]]: 动作序列 """ + + # 🔧 核心修改:从字典中提取容器ID + vessel_id = vessel["id"] + action_sequence = [] # 解析参数 temperature = parse_temperature(temp) reaction_time = parse_time(time) - print(f"HYDROGENATE: 开始生成氢化反应协议") - print(f" - 反应温度: {temperature}°C") - print(f" - 反应时间: {reaction_time/3600:.1f} 小时") - print(f" - 反应容器: {vessel}") + print("🧪" * 20) + print(f"HYDROGENATE: 开始生成氢化反应协议(支持vessel字典)✨") + print(f"📝 输入参数:") + print(f" 🥽 vessel: {vessel} (ID: {vessel_id})") + print(f" 🌡️ 反应温度: {temperature}°C") + print(f" ⏰ 反应时间: {reaction_time/3600:.1f} 小时") + print("🧪" * 20) + + # 🔧 新增:记录氢化前的容器状态(可选,氢化反应通常不改变体积) + original_liquid_volume = 0.0 + if "data" in vessel and "liquid_volume" in vessel["data"]: + current_volume = vessel["data"]["liquid_volume"] + if isinstance(current_volume, list) and len(current_volume) > 0: + original_liquid_volume = current_volume[0] + elif isinstance(current_volume, (int, float)): + original_liquid_volume = current_volume + print(f"📊 氢化前液体体积: {original_liquid_volume:.2f}mL") # 1. 验证目标容器存在 - if vessel not in G.nodes(): - print(f"HYDROGENATE: 警告 - 容器 '{vessel}' 不存在于系统中,跳过氢化反应") + print("📍 步骤1: 验证目标容器...") + if vessel_id not in G.nodes(): # 🔧 使用 vessel_id + print(f"⚠️ HYDROGENATE: 警告 - 容器 '{vessel_id}' 不存在于系统中,跳过氢化反应") return action_sequence + print(f"✅ 容器 '{vessel_id}' 验证通过") # 2. 查找相连的设备 - heater_id = find_connected_device(G, vessel, 'heater') - stirrer_id = find_connected_device(G, vessel, 'stirrer') - gas_source_id = find_connected_device(G, vessel, 'gas_source') + print("📍 步骤2: 查找相连设备...") + heater_id = find_connected_device(G, vessel_id, 'heater') # 🔧 使用 vessel_id + stirrer_id = find_connected_device(G, vessel_id, 'stirrer') # 🔧 使用 vessel_id + gas_source_id = find_connected_device(G, vessel_id, 'gas_source') # 🔧 使用 vessel_id + + print(f"🔧 设备配置:") + print(f" 🔥 加热器: {heater_id or '未找到'}") + print(f" 🌪️ 搅拌器: {stirrer_id or '未找到'}") + print(f" 💨 气源: {gas_source_id or '未找到'}") # 3. 启动搅拌器 + print("📍 步骤3: 启动搅拌器...") if stirrer_id: - print(f"HYDROGENATE: 启动搅拌器 {stirrer_id}") + print(f"🌪️ 启动搅拌器 {stirrer_id}") action_sequence.append({ "device_id": stirrer_id, "action_name": "start_stir", "action_kwargs": { - "vessel": vessel, + "vessel": vessel_id, # 🔧 使用 vessel_id "stir_speed": 300.0, "purpose": "氢化反应: 开始搅拌" } }) + print("✅ 搅拌器启动动作已添加") else: - print(f"HYDROGENATE: 警告 - 未找到搅拌器,继续执行") + print(f"⚠️ HYDROGENATE: 警告 - 未找到搅拌器,继续执行") - # 4. 启动气源(氢气)- 修复版本 + # 4. 启动气源(氢气) + print("📍 步骤4: 启动氢气源...") if gas_source_id: - print(f"HYDROGENATE: 启动气源 {gas_source_id} (氢气)") + print(f"💨 启动气源 {gas_source_id} (氢气)") action_sequence.append({ "device_id": gas_source_id, - "action_name": "set_status", # 修改为 set_status + "action_name": "set_status", "action_kwargs": { - "string": "ON" # 修改参数格式 + "string": "ON" } }) # 查找相关的电磁阀 gas_solenoid = find_associated_solenoid_valve(G, gas_source_id) if gas_solenoid: - print(f"HYDROGENATE: 开启气源电磁阀 {gas_solenoid}") + print(f"🚪 开启气源电磁阀 {gas_solenoid}") action_sequence.append({ "device_id": gas_solenoid, "action_name": "set_valve_position", @@ -226,10 +254,12 @@ def generate_hydrogenate_protocol( "command": "OPEN" } }) + print("✅ 氢气源启动动作已添加") else: - print(f"HYDROGENATE: 警告 - 未找到气源,继续执行") + print(f"⚠️ HYDROGENATE: 警告 - 未找到气源,继续执行") # 5. 等待气体稳定 + print("📍 步骤5: 等待气体环境稳定...") action_sequence.append({ "action_name": "wait", "action_kwargs": { @@ -237,15 +267,17 @@ def generate_hydrogenate_protocol( "description": "等待氢气环境稳定" } }) + print("✅ 气体稳定等待动作已添加") # 6. 启动加热器 + print("📍 步骤6: 启动加热反应...") if heater_id: - print(f"HYDROGENATE: 启动加热器 {heater_id} 到 {temperature}°C") + print(f"🔥 启动加热器 {heater_id} 到 {temperature}°C") action_sequence.append({ "device_id": heater_id, "action_name": "heat_chill_start", "action_kwargs": { - "vessel": vessel, + "vessel": vessel_id, # 🔧 使用 vessel_id "temp": temperature, "purpose": f"氢化反应: 加热到 {temperature}°C" } @@ -261,23 +293,23 @@ def generate_hydrogenate_protocol( }) # 🕐 模拟运行时间优化 - print("HYDROGENATE: 检查模拟运行时间限制...") + print(" ⏰ 检查模拟运行时间限制...") original_reaction_time = reaction_time simulation_time_limit = 60.0 # 模拟运行时间限制:60秒 if reaction_time > simulation_time_limit: reaction_time = simulation_time_limit - print(f"HYDROGENATE: 模拟运行优化: {original_reaction_time}s → {reaction_time}s (限制为{simulation_time_limit}s)") - print(f"HYDROGENATE: 时间缩短: {original_reaction_time/3600:.2f}小时 → {reaction_time/60:.1f}分钟") + print(f" 🎮 模拟运行优化: {original_reaction_time}s → {reaction_time}s (限制为{simulation_time_limit}s)") + print(f" 📊 时间缩短: {original_reaction_time/3600:.2f}小时 → {reaction_time/60:.1f}分钟") else: - print(f"HYDROGENATE: 时间在限制内: {reaction_time}s ({reaction_time/60:.1f}分钟) 保持不变") + print(f" ✅ 时间在限制内: {reaction_time}s ({reaction_time/60:.1f}分钟) 保持不变") # 保持反应温度 action_sequence.append({ "device_id": heater_id, "action_name": "heat_chill", "action_kwargs": { - "vessel": vessel, + "vessel": vessel_id, # 🔧 使用 vessel_id "temp": temperature, "time": reaction_time, "purpose": f"氢化反应: 保持 {temperature}°C,反应 {reaction_time/60:.1f}分钟" + (f" (模拟时间)" if original_reaction_time != reaction_time else "") @@ -286,22 +318,24 @@ def generate_hydrogenate_protocol( # 显示时间调整信息 if original_reaction_time != reaction_time: - print(f"HYDROGENATE: 模拟优化说明: 原计划 {original_reaction_time/3600:.2f}小时,实际模拟 {reaction_time/60:.1f}分钟") + print(f" 🎭 模拟优化说明: 原计划 {original_reaction_time/3600:.2f}小时,实际模拟 {reaction_time/60:.1f}分钟") + + print("✅ 加热反应动作已添加") else: - print(f"HYDROGENATE: 警告 - 未找到加热器,使用室温反应") + print(f"⚠️ HYDROGENATE: 警告 - 未找到加热器,使用室温反应") # 🕐 室温反应也需要时间优化 - print("HYDROGENATE: 检查室温反应模拟时间限制...") + print(" ⏰ 检查室温反应模拟时间限制...") original_reaction_time = reaction_time simulation_time_limit = 60.0 # 模拟运行时间限制:60秒 if reaction_time > simulation_time_limit: reaction_time = simulation_time_limit - print(f"HYDROGENATE: 室温反应时间优化: {original_reaction_time}s → {reaction_time}s") - print(f"HYDROGENATE: 时间缩短: {original_reaction_time/3600:.2f}小时 → {reaction_time/60:.1f}分钟") + print(f" 🎮 室温反应时间优化: {original_reaction_time}s → {reaction_time}s") + print(f" 📊 时间缩短: {original_reaction_time/3600:.2f}小时 → {reaction_time/60:.1f}分钟") else: - print(f"HYDROGENATE: 室温反应时间在限制内: {reaction_time}s 保持不变") + print(f" ✅ 室温反应时间在限制内: {reaction_time}s 保持不变") # 室温反应,只等待时间 action_sequence.append({ @@ -314,20 +348,25 @@ def generate_hydrogenate_protocol( # 显示时间调整信息 if original_reaction_time != reaction_time: - print(f"HYDROGENATE: 室温反应优化说明: 原计划 {original_reaction_time/3600:.2f}小时,实际模拟 {reaction_time/60:.1f}分钟") + print(f" 🎭 室温反应优化说明: 原计划 {original_reaction_time/3600:.2f}小时,实际模拟 {reaction_time/60:.1f}分钟") + + print("✅ 室温反应等待动作已添加") # 7. 停止加热 + print("📍 步骤7: 停止加热...") if heater_id: action_sequence.append({ "device_id": heater_id, "action_name": "heat_chill_stop", "action_kwargs": { - "vessel": vessel, + "vessel": vessel_id, # 🔧 使用 vessel_id "purpose": "氢化反应完成,停止加热" } }) + print("✅ 停止加热动作已添加") # 8. 等待冷却 + print("📍 步骤8: 等待冷却...") action_sequence.append({ "action_name": "wait", "action_kwargs": { @@ -335,13 +374,15 @@ def generate_hydrogenate_protocol( "description": "等待反应混合物冷却" } }) + print("✅ 冷却等待动作已添加") - # 9. 停止气源 - 修复版本 + # 9. 停止气源 + print("📍 步骤9: 停止氢气源...") if gas_source_id: # 先关闭电磁阀 gas_solenoid = find_associated_solenoid_valve(G, gas_source_id) if gas_solenoid: - print(f"HYDROGENATE: 关闭气源电磁阀 {gas_solenoid}") + print(f"🚪 关闭气源电磁阀 {gas_solenoid}") action_sequence.append({ "device_id": gas_solenoid, "action_name": "set_valve_position", @@ -353,25 +394,41 @@ def generate_hydrogenate_protocol( # 再关闭气源 action_sequence.append({ "device_id": gas_source_id, - "action_name": "set_status", # 修改为 set_status + "action_name": "set_status", "action_kwargs": { - "string": "OFF" # 修改参数格式 + "string": "OFF" } }) + print("✅ 氢气源停止动作已添加") # 10. 停止搅拌 + print("📍 步骤10: 停止搅拌...") if stirrer_id: action_sequence.append({ "device_id": stirrer_id, "action_name": "stop_stir", "action_kwargs": { - "vessel": vessel, + "vessel": vessel_id, # 🔧 使用 vessel_id "purpose": "氢化反应完成,停止搅拌" } }) + print("✅ 停止搅拌动作已添加") - print(f"HYDROGENATE: 协议生成完成,共 {len(action_sequence)} 个动作") - print(f"HYDROGENATE: 预计总时间: {(reaction_time + 450)/3600:.1f} 小时") + # 🔧 新增:氢化完成后的状态(氢化反应通常不改变体积) + final_liquid_volume = original_liquid_volume # 氢化反应体积基本不变 + + # 总结 + print("🎊" * 20) + print(f"🎉 氢化反应协议生成完成! ✨") + print(f"📊 总动作数: {len(action_sequence)} 个") + print(f"🥽 反应容器: {vessel_id}") + print(f"🌡️ 反应温度: {temperature}°C") + print(f"⏰ 反应时间: {reaction_time/60:.1f}分钟") + print(f"⏱️ 预计总时间: {(reaction_time + 450)/3600:.1f} 小时") + print(f"📊 体积状态:") + print(f" - 反应前体积: {original_liquid_volume:.2f}mL") + print(f" - 反应后体积: {final_liquid_volume:.2f}mL (氢化反应体积基本不变)") + print("🎊" * 20) return action_sequence @@ -379,7 +436,7 @@ def generate_hydrogenate_protocol( # 测试函数 def test_hydrogenate_protocol(): """测试氢化反应协议""" - print("=== HYDROGENATE PROTOCOL 测试 ===") + print("🧪 === HYDROGENATE PROTOCOL 测试 === ✨") # 测试温度解析 test_temps = ["45 °C", "45°C", "45", "25 C", "invalid"] @@ -393,7 +450,7 @@ def test_hydrogenate_protocol(): parsed = parse_time(time) print(f"时间 '{time}' -> {parsed/3600:.1f} 小时") - print("测试完成") + print("✅ 测试完成 🎉") if __name__ == "__main__": diff --git a/unilabos/compile/recrystallize_protocol.py b/unilabos/compile/recrystallize_protocol.py index 569a798..b6f4aff 100644 --- a/unilabos/compile/recrystallize_protocol.py +++ b/unilabos/compile/recrystallize_protocol.py @@ -1,12 +1,15 @@ import networkx as nx import re +import logging from typing import List, Dict, Any, Tuple, Union from .pump_protocol import generate_pump_protocol_with_rinsing +logger = logging.getLogger(__name__) def debug_print(message): """调试输出""" print(f"💎 [RECRYSTALLIZE] {message}", flush=True) + logger.info(f"[RECRYSTALLIZE] {message}") def parse_volume_with_units(volume_input: Union[str, float, int], default_unit: str = "mL") -> float: @@ -199,48 +202,63 @@ def find_solvent_vessel(G: nx.DiGraph, solvent: str) -> str: def generate_recrystallize_protocol( G: nx.DiGraph, + vessel: dict, # 🔧 修改:从字符串改为字典类型 ratio: str, solvent1: str, solvent2: str, - vessel: str, - volume: Union[str, float], # 🔧 修改:支持字符串和数值 + volume: Union[str, float], # 支持字符串和数值 **kwargs ) -> List[Dict[str, Any]]: """ - 生成重结晶协议序列 - 支持单位 + 生成重结晶协议序列 - 支持vessel字典和体积运算 Args: G: 有向图,节点为容器和设备 + vessel: 目标容器字典(从XDL传入) ratio: 溶剂比例(如 "1:1", "3:7") solvent1: 第一种溶剂名称 solvent2: 第二种溶剂名称 - vessel: 目标容器 volume: 总体积(支持 "100 mL", "50", "2.5 L" 等) **kwargs: 其他可选参数 Returns: List[Dict[str, Any]]: 动作序列 """ + + # 🔧 核心修改:从字典中提取容器ID + vessel_id = vessel["id"] + action_sequence = [] debug_print("💎" * 20) - debug_print("🚀 开始生成重结晶协议(支持单位)✨") + debug_print("🚀 开始生成重结晶协议(支持vessel字典和体积运算)✨") debug_print(f"📝 输入参数:") + debug_print(f" 🥽 vessel: {vessel} (ID: {vessel_id})") debug_print(f" ⚖️ 比例: {ratio}") debug_print(f" 🧪 溶剂1: {solvent1}") debug_print(f" 🧪 溶剂2: {solvent2}") - debug_print(f" 🥽 容器: {vessel}") debug_print(f" 💧 总体积: {volume} (类型: {type(volume)})") debug_print("💎" * 20) + # 🔧 新增:记录重结晶前的容器状态 + debug_print("🔍 记录重结晶前容器状态...") + original_liquid_volume = 0.0 + if "data" in vessel and "liquid_volume" in vessel["data"]: + current_volume = vessel["data"]["liquid_volume"] + if isinstance(current_volume, list) and len(current_volume) > 0: + original_liquid_volume = current_volume[0] + elif isinstance(current_volume, (int, float)): + original_liquid_volume = current_volume + debug_print(f"📊 重结晶前液体体积: {original_liquid_volume:.2f}mL") + # 1. 验证目标容器存在 debug_print("📍 步骤1: 验证目标容器... 🔧") - if vessel not in G.nodes(): - debug_print(f"❌ 目标容器 '{vessel}' 不存在于系统中! 😱") - raise ValueError(f"目标容器 '{vessel}' 不存在于系统中") - debug_print(f"✅ 目标容器 '{vessel}' 验证通过 🎯") + if vessel_id not in G.nodes(): # 🔧 使用 vessel_id + debug_print(f"❌ 目标容器 '{vessel_id}' 不存在于系统中! 😱") + raise ValueError(f"目标容器 '{vessel_id}' 不存在于系统中") + debug_print(f"✅ 目标容器 '{vessel_id}' 验证通过 🎯") - # 2. 🔧 新增:解析体积(支持单位) + # 2. 解析体积(支持单位) debug_print("📍 步骤2: 解析体积(支持单位)... 💧") final_volume = parse_volume_with_units(volume, "mL") debug_print(f"🎯 体积解析完成: {volume} → {final_volume}mL ✨") @@ -281,18 +299,18 @@ def generate_recrystallize_protocol( # 6. 验证路径存在 debug_print("📍 步骤6: 验证传输路径... 🛤️") try: - path1 = nx.shortest_path(G, source=solvent1_vessel, target=vessel) + path1 = nx.shortest_path(G, source=solvent1_vessel, target=vessel_id) # 🔧 使用 vessel_id debug_print(f" 🛤️ 溶剂1路径: {' → '.join(path1)} ✅") except nx.NetworkXNoPath: - debug_print(f" ❌ 溶剂1路径不可达: {solvent1_vessel} → {vessel} 😞") - raise ValueError(f"从溶剂1容器 '{solvent1_vessel}' 到目标容器 '{vessel}' 没有可用路径") + debug_print(f" ❌ 溶剂1路径不可达: {solvent1_vessel} → {vessel_id} 😞") + raise ValueError(f"从溶剂1容器 '{solvent1_vessel}' 到目标容器 '{vessel_id}' 没有可用路径") try: - path2 = nx.shortest_path(G, source=solvent2_vessel, target=vessel) + path2 = nx.shortest_path(G, source=solvent2_vessel, target=vessel_id) # 🔧 使用 vessel_id debug_print(f" 🛤️ 溶剂2路径: {' → '.join(path2)} ✅") except nx.NetworkXNoPath: - debug_print(f" ❌ 溶剂2路径不可达: {solvent2_vessel} → {vessel} 😞") - raise ValueError(f"从溶剂2容器 '{solvent2_vessel}' 到目标容器 '{vessel}' 没有可用路径") + debug_print(f" ❌ 溶剂2路径不可达: {solvent2_vessel} → {vessel_id} 😞") + raise ValueError(f"从溶剂2容器 '{solvent2_vessel}' 到目标容器 '{vessel_id}' 没有可用路径") # 7. 添加第一种溶剂 debug_print("📍 步骤7: 添加第一种溶剂... 🧪") @@ -302,7 +320,7 @@ def generate_recrystallize_protocol( pump_actions1 = generate_pump_protocol_with_rinsing( G=G, from_vessel=solvent1_vessel, - to_vessel=vessel, + to_vessel=vessel_id, # 🔧 使用 vessel_id volume=volume1, # 使用解析后的体积 amount="", time=0.0, @@ -322,12 +340,45 @@ def generate_recrystallize_protocol( debug_print(f" ❌ 溶剂1泵协议生成失败: {str(e)} 😭") raise ValueError(f"生成溶剂1泵协议时出错: {str(e)}") + # 🔧 新增:更新容器体积 - 添加溶剂1后 + debug_print(" 🔧 更新容器体积 - 添加溶剂1后...") + new_volume_after_solvent1 = original_liquid_volume + volume1 + + # 更新vessel字典中的体积 + if "data" in vessel and "liquid_volume" in vessel["data"]: + current_volume = vessel["data"]["liquid_volume"] + if isinstance(current_volume, list): + if len(current_volume) > 0: + vessel["data"]["liquid_volume"][0] = new_volume_after_solvent1 + else: + vessel["data"]["liquid_volume"] = [new_volume_after_solvent1] + else: + vessel["data"]["liquid_volume"] = new_volume_after_solvent1 + + # 同时更新图中的容器数据 + if vessel_id in G.nodes(): + if 'data' not in G.nodes[vessel_id]: + G.nodes[vessel_id]['data'] = {} + + vessel_node_data = G.nodes[vessel_id]['data'] + current_node_volume = vessel_node_data.get('liquid_volume', 0.0) + + if isinstance(current_node_volume, list): + if len(current_node_volume) > 0: + G.nodes[vessel_id]['data']['liquid_volume'][0] = new_volume_after_solvent1 + else: + G.nodes[vessel_id]['data']['liquid_volume'] = [new_volume_after_solvent1] + else: + G.nodes[vessel_id]['data']['liquid_volume'] = new_volume_after_solvent1 + + debug_print(f" 📊 体积更新: {original_liquid_volume:.2f}mL + {volume1:.2f}mL = {new_volume_after_solvent1:.2f}mL") + # 8. 等待溶剂1稳定 debug_print(" ⏳ 添加溶剂1稳定等待...") action_sequence.append({ "action_name": "wait", "action_kwargs": { - "time": 5.0, # 🕐 缩短等待时间:10.0s → 5.0s + "time": 5.0, # 缩短等待时间 "description": f"等待溶剂1 {solvent1} 稳定" } }) @@ -341,7 +392,7 @@ def generate_recrystallize_protocol( pump_actions2 = generate_pump_protocol_with_rinsing( G=G, from_vessel=solvent2_vessel, - to_vessel=vessel, + to_vessel=vessel_id, # 🔧 使用 vessel_id volume=volume2, # 使用解析后的体积 amount="", time=0.0, @@ -361,12 +412,45 @@ def generate_recrystallize_protocol( debug_print(f" ❌ 溶剂2泵协议生成失败: {str(e)} 😭") raise ValueError(f"生成溶剂2泵协议时出错: {str(e)}") + # 🔧 新增:更新容器体积 - 添加溶剂2后 + debug_print(" 🔧 更新容器体积 - 添加溶剂2后...") + final_liquid_volume = new_volume_after_solvent1 + volume2 + + # 更新vessel字典中的体积 + if "data" in vessel and "liquid_volume" in vessel["data"]: + current_volume = vessel["data"]["liquid_volume"] + if isinstance(current_volume, list): + if len(current_volume) > 0: + vessel["data"]["liquid_volume"][0] = final_liquid_volume + else: + vessel["data"]["liquid_volume"] = [final_liquid_volume] + else: + vessel["data"]["liquid_volume"] = final_liquid_volume + + # 同时更新图中的容器数据 + if vessel_id in G.nodes(): + if 'data' not in G.nodes[vessel_id]: + G.nodes[vessel_id]['data'] = {} + + vessel_node_data = G.nodes[vessel_id]['data'] + current_node_volume = vessel_node_data.get('liquid_volume', 0.0) + + if isinstance(current_node_volume, list): + if len(current_node_volume) > 0: + G.nodes[vessel_id]['data']['liquid_volume'][0] = final_liquid_volume + else: + G.nodes[vessel_id]['data']['liquid_volume'] = [final_liquid_volume] + else: + G.nodes[vessel_id]['data']['liquid_volume'] = final_liquid_volume + + debug_print(f" 📊 最终体积: {new_volume_after_solvent1:.2f}mL + {volume2:.2f}mL = {final_liquid_volume:.2f}mL") + # 10. 等待溶剂2稳定 debug_print(" ⏳ 添加溶剂2稳定等待...") action_sequence.append({ "action_name": "wait", "action_kwargs": { - "time": 5.0, # 🕐 缩短等待时间:10.0s → 5.0s + "time": 5.0, # 缩短等待时间 "description": f"等待溶剂2 {solvent2} 稳定" } }) @@ -375,7 +459,7 @@ def generate_recrystallize_protocol( # 11. 等待重结晶完成 debug_print("📍 步骤9: 等待重结晶完成... 💎") - # 🕐 模拟运行时间优化 + # 模拟运行时间优化 debug_print(" ⏱️ 检查模拟运行时间限制...") original_crystallize_time = 600.0 # 原始重结晶时间 simulation_time_limit = 60.0 # 模拟运行时间限制:60秒 @@ -401,12 +485,15 @@ def generate_recrystallize_protocol( if original_crystallize_time != final_crystallize_time: debug_print(f" 🎭 模拟优化说明: 原计划 {original_crystallize_time/60:.1f}分钟,实际模拟 {final_crystallize_time/60:.1f}分钟 ⚡") - # 🎊 总结 + # 总结 debug_print("💎" * 20) debug_print(f"🎉 重结晶协议生成完成! ✨") debug_print(f"📊 总动作数: {len(action_sequence)} 个") - debug_print(f"🥽 目标容器: {vessel}") - debug_print(f"💧 总体积: {final_volume}mL") + debug_print(f"🥽 目标容器: {vessel_id}") + debug_print(f"💧 总体积变化:") + debug_print(f" - 原始体积: {original_liquid_volume:.2f}mL") + debug_print(f" - 添加溶剂: {final_volume:.2f}mL") + debug_print(f" - 最终体积: {final_liquid_volume:.2f}mL") debug_print(f"⚖️ 溶剂比例: {solvent1}:{solvent2} = {ratio1}:{ratio2}") debug_print(f"🧪 溶剂1: {solvent1} ({volume1:.2f}mL)") debug_print(f"🧪 溶剂2: {solvent2} ({volume2:.2f}mL)") @@ -421,6 +508,13 @@ def test_recrystallize_protocol(): """测试重结晶协议""" debug_print("🧪 === RECRYSTALLIZE PROTOCOL 测试 === ✨") + # 测试体积解析 + debug_print("💧 测试体积解析...") + test_volumes = ["100 mL", "2.5 L", "500", "50.5", "?", "invalid"] + for vol in test_volumes: + parsed = parse_volume_with_units(vol) + debug_print(f" 📊 体积 '{vol}' -> {parsed}mL") + # 测试比例解析 debug_print("⚖️ 测试比例解析...") test_ratios = ["1:1", "3:7", "50:50", "1-1", "2,8", "invalid"] @@ -430,6 +524,5 @@ def test_recrystallize_protocol(): debug_print("✅ 测试完成 🎉") - if __name__ == "__main__": test_recrystallize_protocol() \ No newline at end of file diff --git a/unilabos/compile/reset_handling_protocol.py b/unilabos/compile/reset_handling_protocol.py index 2e51da3..2024676 100644 --- a/unilabos/compile/reset_handling_protocol.py +++ b/unilabos/compile/reset_handling_protocol.py @@ -1,12 +1,67 @@ import networkx as nx -from typing import List, Dict, Any +import logging +import sys +from typing import List, Dict, Any, Optional from .pump_protocol import generate_pump_protocol_with_rinsing +# 设置日志 +logger = logging.getLogger(__name__) + +# 确保输出编码为UTF-8 +if hasattr(sys.stdout, 'reconfigure'): + try: + sys.stdout.reconfigure(encoding='utf-8') + sys.stderr.reconfigure(encoding='utf-8') + except: + pass def debug_print(message): - """调试输出""" - print(f"🔄 [RESET_HANDLING] {message}", flush=True) + """调试输出函数 - 支持中文""" + try: + # 确保消息是字符串格式 + safe_message = str(message) + print(f"[重置处理] {safe_message}", flush=True) + logger.info(f"[重置处理] {safe_message}") + except UnicodeEncodeError: + # 如果编码失败,尝试替换不支持的字符 + safe_message = str(message).encode('utf-8', errors='replace').decode('utf-8') + print(f"[重置处理] {safe_message}", flush=True) + logger.info(f"[重置处理] {safe_message}") + except Exception as e: + # 最后的安全措施 + fallback_message = f"日志输出错误: {repr(message)}" + print(f"[重置处理] {fallback_message}", flush=True) + logger.info(f"[重置处理] {fallback_message}") +def create_action_log(message: str, emoji: str = "📝") -> Dict[str, Any]: + """创建一个动作日志 - 支持中文和emoji""" + try: + full_message = f"{emoji} {message}" + debug_print(full_message) + logger.info(full_message) + + return { + "action_name": "wait", + "action_kwargs": { + "time": 0.1, + "log_message": full_message, + "progress_message": full_message + } + } + except Exception as e: + # 如果emoji有问题,使用纯文本 + safe_message = f"[日志] {message}" + debug_print(safe_message) + logger.info(safe_message) + + return { + "action_name": "wait", + "action_kwargs": { + "time": 0.1, + "log_message": safe_message, + "progress_message": safe_message + } + } def find_solvent_vessel(G: nx.DiGraph, solvent: str) -> str: """ @@ -19,7 +74,7 @@ def find_solvent_vessel(G: nx.DiGraph, solvent: str) -> str: Returns: str: 溶剂容器ID """ - debug_print(f"🔍 正在查找溶剂 '{solvent}' 的容器... 🧪") + debug_print(f"🔍 正在查找溶剂 '{solvent}' 的容器...") # 构建可能的容器名称 possible_names = [ @@ -33,30 +88,30 @@ def find_solvent_vessel(G: nx.DiGraph, solvent: str) -> str: f"vessel_{solvent}", # vessel_methanol ] - debug_print(f"📋 候选容器名称: {possible_names[:3]}... (共{len(possible_names)}个) 📝") + debug_print(f"🎯 候选容器名称: {possible_names[:3]}... (共{len(possible_names)}个)") # 第一步:通过容器名称匹配 - debug_print(" 🎯 步骤1: 精确名称匹配...") + debug_print("📋 方法1: 精确名称匹配...") for vessel_name in possible_names: if vessel_name in G.nodes(): - debug_print(f" 🎉 通过名称匹配找到容器: {vessel_name} ✨") + debug_print(f"✅ 通过名称匹配找到容器: {vessel_name}") return vessel_name - debug_print(" 😞 精确名称匹配失败,尝试模糊匹配... 🔍") + debug_print("⚠️ 精确名称匹配失败,尝试模糊匹配...") # 第二步:通过模糊匹配 - debug_print(" 🔍 步骤2: 模糊名称匹配...") + debug_print("📋 方法2: 模糊名称匹配...") for node_id in G.nodes(): if G.nodes[node_id].get('type') == 'container': node_name = G.nodes[node_id].get('name', '').lower() # 检查是否包含溶剂名称 if solvent.lower() in node_id.lower() or solvent.lower() in node_name: - debug_print(f" 🎉 通过模糊匹配找到容器: {node_id} ✨") + debug_print(f"✅ 通过模糊匹配找到容器: {node_id}") return node_id - debug_print(" 😞 模糊匹配失败,尝试液体类型匹配... 🧪") + debug_print("⚠️ 模糊匹配失败,尝试液体类型匹配...") # 第三步:通过液体类型匹配 - debug_print(" 🧪 步骤3: 液体类型匹配...") + debug_print("📋 方法3: 液体类型匹配...") for node_id in G.nodes(): if G.nodes[node_id].get('type') == 'container': vessel_data = G.nodes[node_id].get('data', {}) @@ -68,11 +123,11 @@ def find_solvent_vessel(G: nx.DiGraph, solvent: str) -> str: reagent_name = vessel_data.get('reagent_name', '').lower() if solvent.lower() in liquid_type or solvent.lower() in reagent_name: - debug_print(f" 🎉 通过液体类型匹配找到容器: {node_id} ✨") + debug_print(f"✅ 通过液体类型匹配找到容器: {node_id}") return node_id # 列出可用容器帮助调试 - debug_print(" 📊 显示可用容器信息...") + debug_print("📊 显示可用容器信息...") available_containers = [] for node_id in G.nodes(): if G.nodes[node_id].get('type') == 'container': @@ -88,30 +143,31 @@ def find_solvent_vessel(G: nx.DiGraph, solvent: str) -> str: 'reagent_name': vessel_data.get('reagent_name', '') }) - debug_print(f" 📋 可用容器列表 (共{len(available_containers)}个):") + debug_print(f"📋 可用容器列表 (共{len(available_containers)}个):") for i, container in enumerate(available_containers[:5]): # 只显示前5个 - debug_print(f" {i+1}. 🥽 {container['id']}: {container['name']}") - debug_print(f" 💧 液体: {container['liquids']}") - debug_print(f" 🧪 试剂: {container['reagent_name']}") + debug_print(f" {i+1}. 🥽 {container['id']}: {container['name']}") + debug_print(f" 💧 液体: {container['liquids']}") + debug_print(f" 🧪 试剂: {container['reagent_name']}") if len(available_containers) > 5: - debug_print(f" ... 还有 {len(available_containers)-5} 个容器 📦") + debug_print(f" ... 还有 {len(available_containers)-5} 个容器") - debug_print(f"❌ 找不到溶剂 '{solvent}' 对应的容器 😭") + debug_print(f"❌ 找不到溶剂 '{solvent}' 对应的容器") raise ValueError(f"找不到溶剂 '{solvent}' 对应的容器。尝试了: {possible_names[:3]}...") - def generate_reset_handling_protocol( G: nx.DiGraph, solvent: str, + vessel: Optional[str] = None, # 🆕 新增可选vessel参数 **kwargs # 接收其他可能的参数但不使用 ) -> List[Dict[str, Any]]: """ - 生成重置处理协议序列 + 生成重置处理协议序列 - 支持自定义容器 Args: G: 有向图,节点为容器和设备 solvent: 溶剂名称(从XDL传入) + vessel: 目标容器名称(可选,默认为 "main_reactor") **kwargs: 其他可选参数,但不使用 Returns: @@ -119,51 +175,79 @@ def generate_reset_handling_protocol( """ action_sequence = [] - # 固定参数 - target_vessel = "main_reactor" # 默认目标容器 + # 🔧 修改:支持自定义vessel参数 + target_vessel = vessel if vessel is not None else "main_reactor" # 默认目标容器 volume = 50.0 # 默认体积 50 mL - debug_print("🔄" * 20) - debug_print("🚀 开始生成重置处理协议 ✨") - debug_print(f"📝 输入参数:") + debug_print("=" * 60) + debug_print("🚀 开始生成重置处理协议") + debug_print(f"📋 输入参数:") debug_print(f" 🧪 溶剂: {solvent}") - debug_print(f" 🥽 目标容器: {target_vessel}") + debug_print(f" 🥽 目标容器: {target_vessel} {'(默认)' if vessel is None else '(指定)'}") debug_print(f" 💧 体积: {volume} mL") debug_print(f" ⚙️ 其他参数: {kwargs}") - debug_print("🔄" * 20) + debug_print("=" * 60) + + # 添加初始日志 + action_sequence.append(create_action_log(f"开始重置处理操作 - 容器: {target_vessel}", "🎬")) + action_sequence.append(create_action_log(f"使用溶剂: {solvent}", "🧪")) + action_sequence.append(create_action_log(f"重置体积: {volume}mL", "💧")) + + if vessel is None: + action_sequence.append(create_action_log("使用默认目标容器: main_reactor", "⚙️")) + else: + action_sequence.append(create_action_log(f"使用指定目标容器: {vessel}", "🎯")) # 1. 验证目标容器存在 - debug_print("📍 步骤1: 验证目标容器... 🔧") + debug_print("🔍 步骤1: 验证目标容器...") + action_sequence.append(create_action_log("正在验证目标容器...", "🔍")) + if target_vessel not in G.nodes(): - debug_print(f"❌ 目标容器 '{target_vessel}' 不存在于系统中! 😱") + debug_print(f"❌ 目标容器 '{target_vessel}' 不存在于系统中!") + action_sequence.append(create_action_log(f"目标容器 '{target_vessel}' 不存在", "❌")) raise ValueError(f"目标容器 '{target_vessel}' 不存在于系统中") - debug_print(f"✅ 目标容器 '{target_vessel}' 验证通过 🎯") + + debug_print(f"✅ 目标容器 '{target_vessel}' 验证通过") + action_sequence.append(create_action_log(f"目标容器验证通过: {target_vessel}", "✅")) # 2. 查找溶剂容器 - debug_print("📍 步骤2: 查找溶剂容器... 🔍") + debug_print("🔍 步骤2: 查找溶剂容器...") + action_sequence.append(create_action_log("正在查找溶剂容器...", "🔍")) + try: solvent_vessel = find_solvent_vessel(G, solvent) - debug_print(f"🎉 找到溶剂容器: {solvent_vessel} ✨") + debug_print(f"✅ 找到溶剂容器: {solvent_vessel}") + action_sequence.append(create_action_log(f"找到溶剂容器: {solvent_vessel}", "✅")) except ValueError as e: - debug_print(f"❌ 溶剂容器查找失败: {str(e)} 😭") + debug_print(f"❌ 溶剂容器查找失败: {str(e)}") + action_sequence.append(create_action_log(f"溶剂容器查找失败: {str(e)}", "❌")) raise ValueError(f"无法找到溶剂 '{solvent}': {str(e)}") # 3. 验证路径存在 - debug_print("📍 步骤3: 验证传输路径... 🛤️") + debug_print("🔍 步骤3: 验证传输路径...") + action_sequence.append(create_action_log("正在验证传输路径...", "🛤️")) + try: path = nx.shortest_path(G, source=solvent_vessel, target=target_vessel) - debug_print(f"🛤️ 找到路径: {' → '.join(path)} ✅") + debug_print(f"✅ 找到路径: {' → '.join(path)}") + action_sequence.append(create_action_log(f"传输路径: {' → '.join(path)}", "🛤️")) except nx.NetworkXNoPath: - debug_print(f"❌ 路径不可达: {solvent_vessel} → {target_vessel} 😞") + debug_print(f"❌ 路径不可达: {solvent_vessel} → {target_vessel}") + action_sequence.append(create_action_log(f"路径不可达: {solvent_vessel} → {target_vessel}", "❌")) raise ValueError(f"从溶剂容器 '{solvent_vessel}' 到目标容器 '{target_vessel}' 没有可用路径") # 4. 使用pump_protocol转移溶剂 - debug_print("📍 步骤4: 转移溶剂... 🚰") - debug_print(f" 🚛 开始转移: {solvent_vessel} → {target_vessel}") - debug_print(f" 💧 转移体积: {volume} mL") + debug_print("🔍 步骤4: 转移溶剂...") + action_sequence.append(create_action_log("开始溶剂转移操作...", "🚰")) + + debug_print(f"🚛 开始转移: {solvent_vessel} → {target_vessel}") + debug_print(f"💧 转移体积: {volume} mL") + action_sequence.append(create_action_log(f"转移: {solvent_vessel} → {target_vessel} ({volume}mL)", "🚛")) try: - debug_print(" 🔄 生成泵送协议...") + debug_print("🔄 生成泵送协议...") + action_sequence.append(create_action_log("正在生成泵送协议...", "🔄")) + pump_actions = generate_pump_protocol_with_rinsing( G=G, from_vessel=solvent_vessel, @@ -181,60 +265,104 @@ def generate_reset_handling_protocol( ) action_sequence.extend(pump_actions) - debug_print(f" ✅ 泵送协议已添加: {len(pump_actions)} 个动作 🚰✨") + debug_print(f"✅ 泵送协议已添加: {len(pump_actions)} 个动作") + action_sequence.append(create_action_log(f"泵送协议完成 ({len(pump_actions)} 个操作)", "✅")) except Exception as e: - debug_print(f" ❌ 泵送协议生成失败: {str(e)} 😭") + debug_print(f"❌ 泵送协议生成失败: {str(e)}") + action_sequence.append(create_action_log(f"泵送协议生成失败: {str(e)}", "❌")) raise ValueError(f"生成泵协议时出错: {str(e)}") # 5. 等待溶剂稳定 - debug_print("📍 步骤5: 等待溶剂稳定... ⏳") + debug_print("🔍 步骤5: 等待溶剂稳定...") + action_sequence.append(create_action_log("等待溶剂稳定...", "⏳")) - # 🕐 模拟运行时间优化 - debug_print(" ⏱️ 检查模拟运行时间限制...") + # 模拟运行时间优化 + debug_print("⏱️ 检查模拟运行时间限制...") original_wait_time = 10.0 # 原始等待时间 simulation_time_limit = 5.0 # 模拟运行时间限制:5秒 final_wait_time = min(original_wait_time, simulation_time_limit) if original_wait_time > simulation_time_limit: - debug_print(f" 🎮 模拟运行优化: {original_wait_time}s → {final_wait_time}s ⚡") - debug_print(f" 📊 时间缩短: {original_wait_time}s → {final_wait_time}s 🚀") + debug_print(f"🎮 模拟运行优化: {original_wait_time}s → {final_wait_time}s") + action_sequence.append(create_action_log(f"时间优化: {original_wait_time}s → {final_wait_time}s", "⚡")) else: - debug_print(f" ✅ 时间在限制内: {final_wait_time}s 保持不变 🎯") + debug_print(f"✅ 时间在限制内: {final_wait_time}s 保持不变") + action_sequence.append(create_action_log(f"等待时间: {final_wait_time}s", "⏰")) action_sequence.append({ "action_name": "wait", "action_kwargs": { "time": final_wait_time, - "description": f"等待溶剂 {solvent} 稳定" + (f" (模拟时间)" if original_wait_time != final_wait_time else "") + "description": f"等待溶剂 {solvent} 在容器 {target_vessel} 中稳定" + (f" (模拟时间)" if original_wait_time != final_wait_time else "") } }) - debug_print(f" ✅ 稳定等待已添加: {final_wait_time}s ⏰✨") + debug_print(f"✅ 稳定等待已添加: {final_wait_time}s") # 显示时间调整信息 if original_wait_time != final_wait_time: - debug_print(f" 🎭 模拟优化说明: 原计划 {original_wait_time}s,实际模拟 {final_wait_time}s ⚡") + debug_print(f"🎭 模拟优化说明: 原计划 {original_wait_time}s,实际模拟 {final_wait_time}s") + action_sequence.append(create_action_log("应用模拟时间优化", "🎭")) - # 🎊 总结 - debug_print("🔄" * 20) - debug_print(f"🎉 重置处理协议生成完成! ✨") - debug_print(f"📊 总动作数: {len(action_sequence)} 个") - debug_print(f"🧪 溶剂: {solvent}") - debug_print(f"🥽 源容器: {solvent_vessel}") - debug_print(f"🥽 目标容器: {target_vessel}") - debug_print(f"💧 转移体积: {volume} mL") - debug_print(f"⏱️ 预计总时间: {(final_wait_time + 5):.0f} 秒 ⌛") - debug_print(f"🎯 已添加 {volume} mL {solvent} 到 {target_vessel} 🚰✨") - debug_print("🔄" * 20) + # 总结 + debug_print("=" * 60) + debug_print(f"🎉 重置处理协议生成完成!") + debug_print(f"📊 总结信息:") + debug_print(f" 📋 总动作数: {len(action_sequence)} 个") + debug_print(f" 🧪 溶剂: {solvent}") + debug_print(f" 🥽 源容器: {solvent_vessel}") + debug_print(f" 🥽 目标容器: {target_vessel} {'(默认)' if vessel is None else '(指定)'}") + debug_print(f" 💧 转移体积: {volume} mL") + debug_print(f" ⏱️ 预计总时间: {(final_wait_time + 5):.0f} 秒") + debug_print(f" 🎯 操作结果: 已添加 {volume} mL {solvent} 到 {target_vessel}") + debug_print("=" * 60) + + # 添加完成日志 + summary_msg = f"重置处理完成: {target_vessel} (使用 {volume}mL {solvent})" + if vessel is None: + summary_msg += " [默认容器]" + else: + summary_msg += " [指定容器]" + + action_sequence.append(create_action_log(summary_msg, "🎉")) return action_sequence +# === 便捷函数 === + +def reset_main_reactor(G: nx.DiGraph, solvent: str = "methanol", **kwargs) -> List[Dict[str, Any]]: + """重置主反应器 (默认行为)""" + debug_print(f"🔄 重置主反应器,使用溶剂: {solvent}") + return generate_reset_handling_protocol(G, solvent=solvent, vessel=None, **kwargs) + +def reset_custom_vessel(G: nx.DiGraph, vessel: str, solvent: str = "methanol", **kwargs) -> List[Dict[str, Any]]: + """重置指定容器""" + debug_print(f"🔄 重置指定容器: {vessel},使用溶剂: {solvent}") + return generate_reset_handling_protocol(G, solvent=solvent, vessel=vessel, **kwargs) + +def reset_with_water(G: nx.DiGraph, vessel: Optional[str] = None, **kwargs) -> List[Dict[str, Any]]: + """使用水重置容器""" + target = vessel or "main_reactor" + debug_print(f"💧 使用水重置容器: {target}") + return generate_reset_handling_protocol(G, solvent="water", vessel=vessel, **kwargs) + +def reset_with_methanol(G: nx.DiGraph, vessel: Optional[str] = None, **kwargs) -> List[Dict[str, Any]]: + """使用甲醇重置容器""" + target = vessel or "main_reactor" + debug_print(f"🧪 使用甲醇重置容器: {target}") + return generate_reset_handling_protocol(G, solvent="methanol", vessel=vessel, **kwargs) + +def reset_with_ethanol(G: nx.DiGraph, vessel: Optional[str] = None, **kwargs) -> List[Dict[str, Any]]: + """使用乙醇重置容器""" + target = vessel or "main_reactor" + debug_print(f"🧪 使用乙醇重置容器: {target}") + return generate_reset_handling_protocol(G, solvent="ethanol", vessel=vessel, **kwargs) # 测试函数 def test_reset_handling_protocol(): """测试重置处理协议""" - debug_print("🧪 === RESET HANDLING PROTOCOL 测试 === ✨") + debug_print("=== 重置处理协议增强中文版测试 ===") # 测试溶剂名称 debug_print("🧪 测试常用溶剂名称...") @@ -242,8 +370,18 @@ def test_reset_handling_protocol(): for solvent in test_solvents: debug_print(f" 🔍 测试溶剂: {solvent}") - debug_print("✅ 测试完成 🎉") - + # 测试容器参数 + debug_print("🥽 测试容器参数...") + test_cases = [ + {"solvent": "methanol", "vessel": None, "desc": "默认容器"}, + {"solvent": "ethanol", "vessel": "reactor_2", "desc": "指定容器"}, + {"solvent": "water", "vessel": "flask_1", "desc": "自定义容器"} + ] + + for case in test_cases: + debug_print(f" 🧪 测试案例: {case['desc']} - {case['solvent']} -> {case['vessel'] or 'main_reactor'}") + + debug_print("✅ 测试完成") if __name__ == "__main__": test_reset_handling_protocol() \ No newline at end of file diff --git a/unilabos/compile/run_column_protocol.py b/unilabos/compile/run_column_protocol.py index cb55f86..f921321 100644 --- a/unilabos/compile/run_column_protocol.py +++ b/unilabos/compile/run_column_protocol.py @@ -8,7 +8,7 @@ logger = logging.getLogger(__name__) def debug_print(message): """调试输出""" - print(f"[RUN_COLUMN] {message}", flush=True) + print(f"🏛️ [RUN_COLUMN] {message}", flush=True) logger.info(f"[RUN_COLUMN] {message}") def parse_percentage(pct_str: str) -> float: @@ -25,7 +25,7 @@ def parse_percentage(pct_str: str) -> float: return 0.0 pct_str = pct_str.strip().lower() - debug_print(f"解析百分比: '{pct_str}'") + debug_print(f"🔍 解析百分比: '{pct_str}'") # 移除百分号和空格 pct_clean = re.sub(r'[%\s]', '', pct_str) @@ -34,7 +34,7 @@ def parse_percentage(pct_str: str) -> float: match = re.search(r'([0-9]*\.?[0-9]+)', pct_clean) if match: value = float(match.group(1)) - debug_print(f"百分比解析结果: {value}%") + debug_print(f"✅ 百分比解析结果: {value}%") return value debug_print(f"⚠️ 无法解析百分比: '{pct_str}',返回0.0") @@ -54,7 +54,7 @@ def parse_ratio(ratio_str: str) -> tuple: return (50.0, 50.0) # 默认1:1 ratio_str = ratio_str.strip() - debug_print(f"解析比例: '{ratio_str}'") + debug_print(f"🔍 解析比例: '{ratio_str}'") # 支持多种分隔符:: / - if ':' in ratio_str: @@ -79,7 +79,7 @@ def parse_ratio(ratio_str: str) -> tuple: pct1 = (ratio1 / total) * 100 pct2 = (ratio2 / total) * 100 - debug_print(f"比例解析结果: {ratio1}:{ratio2} -> {pct1:.1f}%:{pct2:.1f}%") + debug_print(f"✅ 比例解析结果: {ratio1}:{ratio2} -> {pct1:.1f}%:{pct2:.1f}%") return (pct1, pct2) except ValueError as e: debug_print(f"⚠️ 比例数值转换失败: {str(e)}") @@ -101,12 +101,12 @@ def parse_rf_value(rf_str: str) -> float: return 0.3 # 默认Rf值 rf_str = rf_str.strip().lower() - debug_print(f"解析Rf值: '{rf_str}'") + debug_print(f"🔍 解析Rf值: '{rf_str}'") # 处理未知Rf值 if rf_str in ['?', 'unknown', 'tbd', 'to be determined']: default_rf = 0.3 - debug_print(f"检测到未知Rf值,使用默认值: {default_rf}") + debug_print(f"❓ 检测到未知Rf值,使用默认值: {default_rf}") return default_rf # 提取数字 @@ -117,7 +117,7 @@ def parse_rf_value(rf_str: str) -> float: if value > 1.0: value = value / 100.0 # 可能是百分比形式 value = max(0.0, min(1.0, value)) # 限制在0-1范围 - debug_print(f"Rf值解析结果: {value}") + debug_print(f"✅ Rf值解析结果: {value}") return value debug_print(f"⚠️ 无法解析Rf值: '{rf_str}',使用默认值0.3") @@ -125,7 +125,7 @@ def parse_rf_value(rf_str: str) -> float: def find_column_device(G: nx.DiGraph) -> str: """查找柱层析设备""" - debug_print("查找柱层析设备...") + debug_print("🔍 查找柱层析设备...") # 查找虚拟柱设备 for node in G.nodes(): @@ -133,14 +133,14 @@ def find_column_device(G: nx.DiGraph) -> str: node_class = node_data.get('class', '') or '' if 'virtual_column' in node_class.lower() or 'column' in node_class.lower(): - debug_print(f"✅ 找到柱层析设备: {node}") + debug_print(f"🎉 找到柱层析设备: {node} ✨") return node # 如果没有找到,尝试创建虚拟设备名称 possible_names = ['column_1', 'virtual_column_1', 'chromatography_column_1'] for name in possible_names: if name in G.nodes(): - debug_print(f"✅ 找到柱设备: {name}") + debug_print(f"🎉 找到柱设备: {name} ✨") return name debug_print("⚠️ 未找到柱层析设备,将使用pump protocol直接转移") @@ -148,13 +148,13 @@ def find_column_device(G: nx.DiGraph) -> str: def find_column_vessel(G: nx.DiGraph, column: str) -> str: """查找柱容器""" - debug_print(f"查找柱容器: '{column}'") + debug_print(f"🔍 查找柱容器: '{column}'") # 直接检查column参数是否是容器 if column in G.nodes(): node_type = G.nodes[column].get('type', '') if node_type == 'container': - debug_print(f"✅ 找到柱容器: {column}") + debug_print(f"🎉 找到柱容器: {column} ✨") return column # 尝试常见的命名规则 @@ -174,7 +174,7 @@ def find_column_vessel(G: nx.DiGraph, column: str) -> str: if vessel_name in G.nodes(): node_type = G.nodes[vessel_name].get('type', '') if node_type == 'container': - debug_print(f"✅ 找到柱容器: {vessel_name}") + debug_print(f"🎉 找到柱容器: {vessel_name} ✨") return vessel_name debug_print(f"⚠️ 未找到柱容器,将直接在源容器中进行分离") @@ -186,7 +186,7 @@ def find_solvent_vessel(G: nx.DiGraph, solvent: str) -> str: return "" solvent = solvent.strip().replace(' ', '_').lower() - debug_print(f"查找溶剂容器: '{solvent}'") + debug_print(f"🔍 查找溶剂容器: '{solvent}'") # 🔧 方法1:直接搜索 data.reagent_name for node in G.nodes(): @@ -200,16 +200,16 @@ def find_solvent_vessel(G: nx.DiGraph, solvent: str) -> str: # 检查 data.reagent_name 和 config.reagent if reagent_name == solvent or reagent_config == solvent: - debug_print(f"✅ 通过reagent_name找到溶剂容器: {node} (reagent: {reagent_name or reagent_config})") + debug_print(f"🎉 通过reagent_name找到溶剂容器: {node} (reagent: {reagent_name or reagent_config}) ✨") return node # 模糊匹配 reagent_name if solvent in reagent_name or reagent_name in solvent: - debug_print(f"✅ 通过reagent_name模糊匹配到溶剂容器: {node} (reagent: {reagent_name})") + debug_print(f"🎉 通过reagent_name模糊匹配到溶剂容器: {node} (reagent: {reagent_name}) ✨") return node if solvent in reagent_config or reagent_config in solvent: - debug_print(f"✅ 通过config.reagent模糊匹配到溶剂容器: {node} (reagent: {reagent_config})") + debug_print(f"🎉 通过config.reagent模糊匹配到溶剂容器: {node} (reagent: {reagent_config}) ✨") return node # 🔧 方法2:常见的溶剂容器命名规则 @@ -227,7 +227,7 @@ def find_solvent_vessel(G: nx.DiGraph, solvent: str) -> str: if vessel_name in G.nodes(): node_type = G.nodes[vessel_name].get('type', '') if node_type == 'container': - debug_print(f"✅ 通过命名规则找到溶剂容器: {vessel_name}") + debug_print(f"🎉 通过命名规则找到溶剂容器: {vessel_name} ✨") return vessel_name # 🔧 方法3:节点名称模糊匹配 @@ -235,7 +235,7 @@ def find_solvent_vessel(G: nx.DiGraph, solvent: str) -> str: node_type = G.nodes[node].get('type', '') if node_type == 'container': if ('flask_' in node or 'bottle_' in node or 'reagent_' in node) and solvent in node.lower(): - debug_print(f"✅ 通过节点名称模糊匹配到溶剂容器: {node}") + debug_print(f"🎉 通过节点名称模糊匹配到溶剂容器: {node} ✨") return node # 🔧 方法4:特殊溶剂名称映射 @@ -253,84 +253,118 @@ def find_solvent_vessel(G: nx.DiGraph, solvent: str) -> str: # 查找映射的同义词 for canonical_name, synonyms in solvent_mapping.items(): if solvent in synonyms: - debug_print(f"检测到溶剂同义词: '{solvent}' -> '{canonical_name}'") + debug_print(f"🔍 检测到溶剂同义词: '{solvent}' -> '{canonical_name}'") return find_solvent_vessel(G, canonical_name) # 递归搜索 debug_print(f"⚠️ 未找到溶剂 '{solvent}' 的容器") return "" -def get_vessel_liquid_volume(G: nx.DiGraph, vessel: str) -> float: - """获取容器中的液体体积 - 增强版""" - if vessel not in G.nodes(): - debug_print(f"⚠️ 节点 '{vessel}' 不存在") +def get_vessel_liquid_volume(vessel: dict) -> float: + """ + 获取容器中的液体体积 - 支持vessel字典 + + Args: + vessel: 容器字典 + + Returns: + float: 液体体积(mL) + """ + if not vessel or "data" not in vessel: + debug_print(f"⚠️ 容器数据为空,返回 0.0mL") return 0.0 - node_type = G.nodes[vessel].get('type', '') - vessel_data = G.nodes[vessel].get('data', {}) + vessel_data = vessel["data"] + vessel_id = vessel.get("id", "unknown") - debug_print(f"读取节点 '{vessel}' (类型: {node_type}) 体积数据: {vessel_data}") + debug_print(f"🔍 读取容器 '{vessel_id}' 体积数据: {vessel_data}") - # 🔧 如果是设备类型,尝试查找关联的容器 - if node_type == 'device': - debug_print(f"'{vessel}' 是设备,尝试查找关联容器...") + # 检查liquid_volume字段 + if "liquid_volume" in vessel_data: + liquid_volume = vessel_data["liquid_volume"] - # 查找是否有内置容器数据 - config_data = G.nodes[vessel].get('config', {}) - if 'volume' in config_data: - default_volume = config_data.get('volume', 50.0) - debug_print(f"使用设备默认容量: {default_volume}mL") - return default_volume + # 处理列表格式 + if isinstance(liquid_volume, list): + if len(liquid_volume) > 0: + volume = liquid_volume[0] + if isinstance(volume, (int, float)): + debug_print(f"✅ 容器 '{vessel_id}' 体积: {volume}mL (列表格式)") + return float(volume) - # 对于旋蒸等设备,使用默认值 - if 'rotavap' in vessel.lower(): - default_volume = 50.0 - debug_print(f"旋蒸设备使用默认容量: {default_volume}mL") - return default_volume - - debug_print(f"⚠️ 设备 '{vessel}' 无法确定容量,返回0") - return 0.0 + # 处理直接数值格式 + elif isinstance(liquid_volume, (int, float)): + debug_print(f"✅ 容器 '{vessel_id}' 体积: {liquid_volume}mL (数值格式)") + return float(liquid_volume) - # 🔧 如果是容器类型,正常读取体积 - total_volume = 0.0 - - # 方法1:检查液体列表 - liquids = vessel_data.get('liquid', []) - if isinstance(liquids, list): - for liquid in liquids: - if isinstance(liquid, dict): - volume = liquid.get('volume') or liquid.get('liquid_volume', 0.0) - total_volume += volume - - # 方法2:检查直接体积字段 - if total_volume == 0.0: - volume_keys = ['current_volume', 'total_volume', 'volume', 'liquid_volume'] - for key in volume_keys: - if key in vessel_data: - try: - total_volume = float(vessel_data[key]) - if total_volume > 0: - break - except (ValueError, TypeError): - continue - - # 方法3:检查配置中的初始体积 - if total_volume == 0.0: - config_data = G.nodes[vessel].get('config', {}) - if 'current_volume' in config_data: + # 检查其他可能的体积字段 + volume_keys = ['current_volume', 'total_volume', 'volume'] + for key in volume_keys: + if key in vessel_data: try: - total_volume = float(config_data['current_volume']) + volume = float(vessel_data[key]) + if volume > 0: + debug_print(f"✅ 容器 '{vessel_id}' 体积: {volume}mL (字段: {key})") + return volume except (ValueError, TypeError): - pass + continue - debug_print(f"容器 '{vessel}' 总体积: {total_volume}mL") - return total_volume + debug_print(f"⚠️ 无法获取容器 '{vessel_id}' 的体积,返回默认值 50.0mL") + return 50.0 + +def update_vessel_volume(vessel: dict, G: nx.DiGraph, new_volume: float, description: str = "") -> None: + """ + 更新容器体积(同时更新vessel字典和图节点) + + Args: + vessel: 容器字典 + G: 网络图 + new_volume: 新体积 + description: 更新描述 + """ + vessel_id = vessel.get("id", "unknown") + + if description: + debug_print(f"🔧 更新容器体积 - {description}") + + # 更新vessel字典中的体积 + if "data" in vessel: + if "liquid_volume" in vessel["data"]: + current_volume = vessel["data"]["liquid_volume"] + if isinstance(current_volume, list): + if len(current_volume) > 0: + vessel["data"]["liquid_volume"][0] = new_volume + else: + vessel["data"]["liquid_volume"] = [new_volume] + else: + vessel["data"]["liquid_volume"] = new_volume + else: + vessel["data"]["liquid_volume"] = new_volume + else: + vessel["data"] = {"liquid_volume": new_volume} + + # 同时更新图中的容器数据 + if vessel_id in G.nodes(): + if 'data' not in G.nodes[vessel_id]: + G.nodes[vessel_id]['data'] = {} + + vessel_node_data = G.nodes[vessel_id]['data'] + current_node_volume = vessel_node_data.get('liquid_volume', 0.0) + + if isinstance(current_node_volume, list): + if len(current_node_volume) > 0: + G.nodes[vessel_id]['data']['liquid_volume'][0] = new_volume + else: + G.nodes[vessel_id]['data']['liquid_volume'] = [new_volume] + else: + G.nodes[vessel_id]['data']['liquid_volume'] = new_volume + + debug_print(f"📊 容器 '{vessel_id}' 体积已更新为: {new_volume:.2f}mL") def calculate_solvent_volumes(total_volume: float, pct1: float, pct2: float) -> tuple: """根据百分比计算溶剂体积""" volume1 = (total_volume * pct1) / 100.0 volume2 = (total_volume * pct2) / 100.0 - debug_print(f"溶剂体积计算: 总体积{total_volume}mL") + debug_print(f"🧮 溶剂体积计算: 总体积{total_volume}mL") debug_print(f" - 溶剂1: {pct1}% = {volume1}mL") debug_print(f" - 溶剂2: {pct2}% = {volume2}mL") @@ -338,8 +372,8 @@ def calculate_solvent_volumes(total_volume: float, pct1: float, pct2: float) -> def generate_run_column_protocol( G: nx.DiGraph, - from_vessel: str, - to_vessel: str, + from_vessel: dict, # 🔧 修改:从字符串改为字典类型 + to_vessel: dict, # 🔧 修改:从字符串改为字典类型 column: str, rf: str = "", pct1: str = "", @@ -350,14 +384,12 @@ def generate_run_column_protocol( **kwargs ) -> List[Dict[str, Any]]: """ - 生成柱层析分离的协议序列 - 增强版 - - 支持新版XDL的所有参数,具有高兼容性和容错性 + 生成柱层析分离的协议序列 - 支持vessel字典和体积运算 Args: G: 有向图,节点为设备和容器,边为流体管道 - from_vessel: 源容器的名称,即样品起始所在的容器(必需) - to_vessel: 目标容器的名称,分离后的样品要到达的容器(必需) + from_vessel: 源容器字典(从XDL传入) + to_vessel: 目标容器字典(从XDL传入) column: 所使用的柱子的名称(必需) rf: Rf值(可选,支持 "?" 表示未知) pct1: 第一种溶剂百分比(如 "40 %",可选) @@ -371,51 +403,60 @@ def generate_run_column_protocol( List[Dict[str, Any]]: 柱层析分离操作的动作序列 """ - debug_print("=" * 60) - debug_print("开始生成柱层析协议") - debug_print(f"输入参数:") - debug_print(f" - from_vessel: '{from_vessel}'") - debug_print(f" - to_vessel: '{to_vessel}'") - debug_print(f" - column: '{column}'") - debug_print(f" - rf: '{rf}'") - debug_print(f" - pct1: '{pct1}'") - debug_print(f" - pct2: '{pct2}'") - debug_print(f" - solvent1: '{solvent1}'") - debug_print(f" - solvent2: '{solvent2}'") - debug_print(f" - ratio: '{ratio}'") - debug_print(f" - 其他参数: {kwargs}") - debug_print("=" * 60) + # 🔧 核心修改:从字典中提取容器ID + from_vessel_id = from_vessel["id"] + to_vessel_id = to_vessel["id"] + + debug_print("🏛️" * 20) + debug_print("🚀 开始生成柱层析协议(支持vessel字典和体积运算)✨") + debug_print(f"📝 输入参数:") + debug_print(f" 🥽 from_vessel: {from_vessel} (ID: {from_vessel_id})") + debug_print(f" 🥽 to_vessel: {to_vessel} (ID: {to_vessel_id})") + debug_print(f" 🏛️ column: '{column}'") + debug_print(f" 📊 rf: '{rf}'") + debug_print(f" 🧪 溶剂配比: pct1='{pct1}', pct2='{pct2}', ratio='{ratio}'") + debug_print(f" 🧪 溶剂名称: solvent1='{solvent1}', solvent2='{solvent2}'") + debug_print("🏛️" * 20) action_sequence = [] - # === 参数验证 === - debug_print("步骤1: 参数验证...") + # 🔧 新增:记录柱层析前的容器状态 + debug_print("🔍 记录柱层析前容器状态...") + original_from_volume = get_vessel_liquid_volume(from_vessel) + original_to_volume = get_vessel_liquid_volume(to_vessel) - if not from_vessel: + debug_print(f"📊 柱层析前状态:") + debug_print(f" - 源容器 {from_vessel_id}: {original_from_volume:.2f}mL") + debug_print(f" - 目标容器 {to_vessel_id}: {original_to_volume:.2f}mL") + + # === 参数验证 === + debug_print("📍 步骤1: 参数验证...") + + if not from_vessel_id: # 🔧 使用 from_vessel_id raise ValueError("from_vessel 参数不能为空") - if not to_vessel: + if not to_vessel_id: # 🔧 使用 to_vessel_id raise ValueError("to_vessel 参数不能为空") if not column: raise ValueError("column 参数不能为空") - if from_vessel not in G.nodes(): - raise ValueError(f"源容器 '{from_vessel}' 不存在于系统中") - if to_vessel not in G.nodes(): - raise ValueError(f"目标容器 '{to_vessel}' 不存在于系统中") + if from_vessel_id not in G.nodes(): # 🔧 使用 from_vessel_id + raise ValueError(f"源容器 '{from_vessel_id}' 不存在于系统中") + if to_vessel_id not in G.nodes(): # 🔧 使用 to_vessel_id + raise ValueError(f"目标容器 '{to_vessel_id}' 不存在于系统中") debug_print("✅ 基本参数验证通过") # === 参数解析 === - debug_print("步骤2: 参数解析...") + debug_print("📍 步骤2: 参数解析...") # 解析Rf值 final_rf = parse_rf_value(rf) - debug_print(f"最终Rf值: {final_rf}") + debug_print(f"🎯 最终Rf值: {final_rf}") # 解析溶剂比例(ratio优先级高于pct1/pct2) if ratio and ratio.strip(): final_pct1, final_pct2 = parse_ratio(ratio) - debug_print(f"使用ratio参数: {final_pct1:.1f}% : {final_pct2:.1f}%") + debug_print(f"📊 使用ratio参数: {final_pct1:.1f}% : {final_pct2:.1f}%") else: final_pct1 = parse_percentage(pct1) if pct1 else 50.0 final_pct2 = parse_percentage(pct2) if pct2 else 50.0 @@ -428,16 +469,16 @@ def generate_run_column_protocol( final_pct1 = (final_pct1 / total_pct) * 100 final_pct2 = (final_pct2 / total_pct) * 100 - debug_print(f"使用百分比参数: {final_pct1:.1f}% : {final_pct2:.1f}%") + debug_print(f"📊 使用百分比参数: {final_pct1:.1f}% : {final_pct2:.1f}%") # 设置默认溶剂(如果未指定) final_solvent1 = solvent1.strip() if solvent1 else "ethyl_acetate" final_solvent2 = solvent2.strip() if solvent2 else "hexane" - debug_print(f"最终溶剂: {final_solvent1} : {final_solvent2}") + debug_print(f"🧪 最终溶剂: {final_solvent1} : {final_solvent2}") # === 查找设备和容器 === - debug_print("步骤3: 查找设备和容器...") + debug_print("📍 步骤3: 查找设备和容器...") # 查找柱层析设备 column_device_id = find_column_device(G) @@ -449,16 +490,16 @@ def generate_run_column_protocol( solvent1_vessel = find_solvent_vessel(G, final_solvent1) solvent2_vessel = find_solvent_vessel(G, final_solvent2) - debug_print(f"设备映射:") + debug_print(f"🔧 设备映射:") debug_print(f" - 柱设备: '{column_device_id}'") debug_print(f" - 柱容器: '{column_vessel}'") debug_print(f" - 溶剂1容器: '{solvent1_vessel}'") debug_print(f" - 溶剂2容器: '{solvent2_vessel}'") # === 获取源容器体积 === - debug_print("步骤4: 获取源容器体积...") + debug_print("📍 步骤4: 获取源容器体积...") - source_volume = get_vessel_liquid_volume(G, from_vessel) + source_volume = original_from_volume if source_volume <= 0: source_volume = 50.0 # 默认体积 debug_print(f"⚠️ 无法获取源容器体积,使用默认值: {source_volume}mL") @@ -466,7 +507,7 @@ def generate_run_column_protocol( debug_print(f"✅ 源容器体积: {source_volume}mL") # === 计算溶剂体积 === - debug_print("步骤5: 计算溶剂体积...") + debug_print("📍 步骤5: 计算溶剂体积...") # 洗脱溶剂通常是样品体积的2-5倍 total_elution_volume = source_volume * 3.0 @@ -475,17 +516,22 @@ def generate_run_column_protocol( ) # === 执行柱层析流程 === - debug_print("步骤6: 执行柱层析流程...") + debug_print("📍 步骤6: 执行柱层析流程...") + + # 🔧 新增:体积变化跟踪变量 + current_from_volume = source_volume + current_to_volume = original_to_volume + current_column_volume = 0.0 try: # 步骤6.1: 样品上柱(如果有独立的柱容器) - if column_vessel and column_vessel != from_vessel: - debug_print(f"6.1: 样品上柱 - {source_volume}mL 从 {from_vessel} 到 {column_vessel}") + if column_vessel and column_vessel != from_vessel_id: # 🔧 使用 from_vessel_id + debug_print(f"📍 6.1: 样品上柱 - {source_volume}mL 从 {from_vessel_id} 到 {column_vessel}") try: sample_transfer_actions = generate_pump_protocol_with_rinsing( G=G, - from_vessel=from_vessel, + from_vessel=from_vessel_id, # 🔧 使用 from_vessel_id to_vessel=column_vessel, volume=source_volume, flowrate=1.0, # 慢速上柱 @@ -496,15 +542,29 @@ def generate_run_column_protocol( ) action_sequence.extend(sample_transfer_actions) debug_print(f"✅ 样品上柱完成,添加了 {len(sample_transfer_actions)} 个动作") + + # 🔧 新增:更新体积 - 样品转移到柱上 + current_from_volume = 0.0 # 源容器体积变为0 + current_column_volume = source_volume # 柱容器体积增加 + + update_vessel_volume(from_vessel, G, current_from_volume, "样品上柱后,源容器清空") + + # 如果柱容器在图中,也更新其体积 + if column_vessel in G.nodes(): + if 'data' not in G.nodes[column_vessel]: + G.nodes[column_vessel]['data'] = {} + G.nodes[column_vessel]['data']['liquid_volume'] = current_column_volume + debug_print(f"📊 柱容器 '{column_vessel}' 体积更新为: {current_column_volume:.2f}mL") + except Exception as e: debug_print(f"⚠️ 样品上柱失败: {str(e)}") # 步骤6.2: 添加洗脱溶剂1(如果有溶剂容器) if solvent1_vessel and solvent1_volume > 0: - debug_print(f"6.2: 添加洗脱溶剂1 - {solvent1_volume:.1f}mL {final_solvent1}") + debug_print(f"📍 6.2: 添加洗脱溶剂1 - {solvent1_volume:.1f}mL {final_solvent1}") try: - target_vessel = column_vessel if column_vessel else from_vessel + target_vessel = column_vessel if column_vessel else from_vessel_id # 🔧 使用 from_vessel_id solvent1_transfer_actions = generate_pump_protocol_with_rinsing( G=G, from_vessel=solvent1_vessel, @@ -515,15 +575,26 @@ def generate_run_column_protocol( ) action_sequence.extend(solvent1_transfer_actions) debug_print(f"✅ 溶剂1添加完成,添加了 {len(solvent1_transfer_actions)} 个动作") + + # 🔧 新增:更新体积 - 添加溶剂1 + if target_vessel == column_vessel: + current_column_volume += solvent1_volume + if column_vessel in G.nodes(): + G.nodes[column_vessel]['data']['liquid_volume'] = current_column_volume + debug_print(f"📊 柱容器体积增加: +{solvent1_volume:.2f}mL = {current_column_volume:.2f}mL") + elif target_vessel == from_vessel_id: + current_from_volume += solvent1_volume + update_vessel_volume(from_vessel, G, current_from_volume, "添加溶剂1后") + except Exception as e: debug_print(f"⚠️ 溶剂1添加失败: {str(e)}") # 步骤6.3: 添加洗脱溶剂2(如果有溶剂容器) if solvent2_vessel and solvent2_volume > 0: - debug_print(f"6.3: 添加洗脱溶剂2 - {solvent2_volume:.1f}mL {final_solvent2}") + debug_print(f"📍 6.3: 添加洗脱溶剂2 - {solvent2_volume:.1f}mL {final_solvent2}") try: - target_vessel = column_vessel if column_vessel else from_vessel + target_vessel = column_vessel if column_vessel else from_vessel_id # 🔧 使用 from_vessel_id solvent2_transfer_actions = generate_pump_protocol_with_rinsing( G=G, from_vessel=solvent2_vessel, @@ -534,19 +605,30 @@ def generate_run_column_protocol( ) action_sequence.extend(solvent2_transfer_actions) debug_print(f"✅ 溶剂2添加完成,添加了 {len(solvent2_transfer_actions)} 个动作") + + # 🔧 新增:更新体积 - 添加溶剂2 + if target_vessel == column_vessel: + current_column_volume += solvent2_volume + if column_vessel in G.nodes(): + G.nodes[column_vessel]['data']['liquid_volume'] = current_column_volume + debug_print(f"📊 柱容器体积增加: +{solvent2_volume:.2f}mL = {current_column_volume:.2f}mL") + elif target_vessel == from_vessel_id: + current_from_volume += solvent2_volume + update_vessel_volume(from_vessel, G, current_from_volume, "添加溶剂2后") + except Exception as e: debug_print(f"⚠️ 溶剂2添加失败: {str(e)}") # 步骤6.4: 使用柱层析设备执行分离(如果有设备) if column_device_id: - debug_print(f"6.4: 使用柱层析设备执行分离") + debug_print(f"📍 6.4: 使用柱层析设备执行分离") column_separation_action = { "device_id": column_device_id, "action_name": "run_column", "action_kwargs": { - "from_vessel": from_vessel, - "to_vessel": to_vessel, + "from_vessel": from_vessel_id, # 🔧 使用 from_vessel_id + "to_vessel": to_vessel_id, # 🔧 使用 to_vessel_id "column": column, "rf": rf, "pct1": pct1, @@ -560,7 +642,7 @@ def generate_run_column_protocol( debug_print(f"✅ 柱层析设备动作已添加") # 等待分离完成 - separation_time = max(30, int(total_elution_volume / 2)) # 基于体积估算时间 + separation_time = max(30, min(120, int(total_elution_volume / 2))) # 30-120秒,基于体积 action_sequence.append({ "action_name": "wait", "action_kwargs": {"time": separation_time} @@ -568,41 +650,61 @@ def generate_run_column_protocol( debug_print(f"✅ 等待分离完成: {separation_time}秒") # 步骤6.5: 产物收集(从柱容器到目标容器) - if column_vessel and column_vessel != to_vessel: - debug_print(f"6.5: 产物收集 - 从 {column_vessel} 到 {to_vessel}") + if column_vessel and column_vessel != to_vessel_id: # 🔧 使用 to_vessel_id + debug_print(f"📍 6.5: 产物收集 - 从 {column_vessel} 到 {to_vessel_id}") try: - # 估算产物体积(原始样品体积的70-90%) + # 估算产物体积(原始样品体积的70-90%,收率考虑) product_volume = source_volume * 0.8 product_transfer_actions = generate_pump_protocol_with_rinsing( G=G, from_vessel=column_vessel, - to_vessel=to_vessel, + to_vessel=to_vessel_id, # 🔧 使用 to_vessel_id volume=product_volume, flowrate=1.5, transfer_flowrate=0.8 ) action_sequence.extend(product_transfer_actions) debug_print(f"✅ 产物收集完成,添加了 {len(product_transfer_actions)} 个动作") + + # 🔧 新增:更新体积 - 产物收集到目标容器 + current_to_volume += product_volume + current_column_volume -= product_volume # 柱容器体积减少 + + update_vessel_volume(to_vessel, G, current_to_volume, "产物收集后") + + # 更新柱容器体积 + if column_vessel in G.nodes(): + G.nodes[column_vessel]['data']['liquid_volume'] = max(0.0, current_column_volume) + debug_print(f"📊 柱容器体积减少: -{product_volume:.2f}mL = {current_column_volume:.2f}mL") + except Exception as e: debug_print(f"⚠️ 产物收集失败: {str(e)}") # 步骤6.6: 如果没有独立的柱设备和容器,执行简化的直接转移 if not column_device_id and not column_vessel: - debug_print(f"6.6: 简化模式 - 直接转移 {source_volume}mL 从 {from_vessel} 到 {to_vessel}") + debug_print(f"📍 6.6: 简化模式 - 直接转移 {source_volume}mL 从 {from_vessel_id} 到 {to_vessel_id}") try: direct_transfer_actions = generate_pump_protocol_with_rinsing( G=G, - from_vessel=from_vessel, - to_vessel=to_vessel, + from_vessel=from_vessel_id, # 🔧 使用 from_vessel_id + to_vessel=to_vessel_id, # 🔧 使用 to_vessel_id volume=source_volume, flowrate=2.0, transfer_flowrate=1.0 ) action_sequence.extend(direct_transfer_actions) debug_print(f"✅ 直接转移完成,添加了 {len(direct_transfer_actions)} 个动作") + + # 🔧 新增:更新体积 - 直接转移 + current_from_volume = 0.0 # 源容器清空 + current_to_volume += source_volume # 目标容器增加 + + update_vessel_volume(from_vessel, G, current_from_volume, "直接转移后,源容器清空") + update_vessel_volume(to_vessel, G, current_to_volume, "直接转移后,目标容器增加") + except Exception as e: debug_print(f"⚠️ 直接转移失败: {str(e)}") @@ -624,17 +726,77 @@ def generate_run_column_protocol( } }) + # 🔧 新增:柱层析完成后的最终状态报告 + final_from_volume = get_vessel_liquid_volume(from_vessel) + final_to_volume = get_vessel_liquid_volume(to_vessel) + # 🎊 总结 - debug_print("🧪" * 20) + debug_print("🏛️" * 20) debug_print(f"🎉 柱层析协议生成完成! ✨") debug_print(f"📊 总动作数: {len(action_sequence)} 个") - debug_print(f"🥽 路径: {from_vessel} → {to_vessel}") + debug_print(f"🥽 路径: {from_vessel_id} → {to_vessel_id}") debug_print(f"🏛️ 柱子: {column}") - debug_print(f"🧪 溶剂: {final_solvent1}:{final_solvent2}") - debug_print("🧪" * 20) + debug_print(f"🧪 溶剂: {final_solvent1}:{final_solvent2} = {final_pct1:.1f}%:{final_pct2:.1f}%") + debug_print(f"📊 体积变化统计:") + debug_print(f" 源容器 {from_vessel_id}:") + debug_print(f" - 柱层析前: {original_from_volume:.2f}mL") + debug_print(f" - 柱层析后: {final_from_volume:.2f}mL") + debug_print(f" 目标容器 {to_vessel_id}:") + debug_print(f" - 柱层析前: {original_to_volume:.2f}mL") + debug_print(f" - 柱层析后: {final_to_volume:.2f}mL") + debug_print(f" - 收集体积: {final_to_volume - original_to_volume:.2f}mL") + debug_print(f"⏱️ 预计总时间: {len(action_sequence) * 5:.0f} 秒 ⌛") + debug_print("🏛️" * 20) return action_sequence +# 🔧 新增:便捷函数 +def generate_ethyl_acetate_hexane_column_protocol(G: nx.DiGraph, from_vessel: dict, to_vessel: dict, + column: str, ratio: str = "30:70") -> List[Dict[str, Any]]: + """乙酸乙酯-己烷柱层析(常用组合)""" + from_vessel_id = from_vessel["id"] + to_vessel_id = to_vessel["id"] + debug_print(f"🧪⛽ 乙酸乙酯-己烷柱层析: {from_vessel_id} → {to_vessel_id} @ {ratio}") + return generate_run_column_protocol(G, from_vessel, to_vessel, column, + solvent1="ethyl_acetate", solvent2="hexane", ratio=ratio) + +def generate_methanol_dcm_column_protocol(G: nx.DiGraph, from_vessel: dict, to_vessel: dict, + column: str, ratio: str = "5:95") -> List[Dict[str, Any]]: + """甲醇-二氯甲烷柱层析""" + from_vessel_id = from_vessel["id"] + to_vessel_id = to_vessel["id"] + debug_print(f"🧪🧪 甲醇-DCM柱层析: {from_vessel_id} → {to_vessel_id} @ {ratio}") + return generate_run_column_protocol(G, from_vessel, to_vessel, column, + solvent1="methanol", solvent2="dichloromethane", ratio=ratio) + +def generate_gradient_column_protocol(G: nx.DiGraph, from_vessel: dict, to_vessel: dict, + column: str, start_ratio: str = "10:90", + end_ratio: str = "50:50") -> List[Dict[str, Any]]: + """梯度洗脱柱层析(中等比例)""" + from_vessel_id = from_vessel["id"] + to_vessel_id = to_vessel["id"] + debug_print(f"📈 梯度柱层析: {from_vessel_id} → {to_vessel_id} ({start_ratio} → {end_ratio})") + # 使用中间比例作为近似 + return generate_run_column_protocol(G, from_vessel, to_vessel, column, ratio="30:70") + +def generate_polar_column_protocol(G: nx.DiGraph, from_vessel: dict, to_vessel: dict, + column: str) -> List[Dict[str, Any]]: + """极性化合物柱层析(高极性溶剂比例)""" + from_vessel_id = from_vessel["id"] + to_vessel_id = to_vessel["id"] + debug_print(f"⚡ 极性化合物柱层析: {from_vessel_id} → {to_vessel_id}") + return generate_run_column_protocol(G, from_vessel, to_vessel, column, + solvent1="ethyl_acetate", solvent2="hexane", ratio="70:30") + +def generate_nonpolar_column_protocol(G: nx.DiGraph, from_vessel: dict, to_vessel: dict, + column: str) -> List[Dict[str, Any]]: + """非极性化合物柱层析(低极性溶剂比例)""" + from_vessel_id = from_vessel["id"] + to_vessel_id = to_vessel["id"] + debug_print(f"🛢️ 非极性化合物柱层析: {from_vessel_id} → {to_vessel_id}") + return generate_run_column_protocol(G, from_vessel, to_vessel, column, + solvent1="ethyl_acetate", solvent2="hexane", ratio="5:95") + # 测试函数 def test_run_column_protocol(): """测试柱层析协议""" diff --git a/unilabos/compile/separate_protocol.py b/unilabos/compile/separate_protocol.py index 258c37d..ec1f8af 100644 --- a/unilabos/compile/separate_protocol.py +++ b/unilabos/compile/separate_protocol.py @@ -20,18 +20,18 @@ def debug_print(message): try: # 确保消息是字符串格式 safe_message = str(message) - print(f"[分离协议] {safe_message}", flush=True) - logger.info(f"[分离协议] {safe_message}") + print(f"🌀 [SEPARATE] {safe_message}", flush=True) + logger.info(f"[SEPARATE] {safe_message}") except UnicodeEncodeError: # 如果编码失败,尝试替换不支持的字符 safe_message = str(message).encode('utf-8', errors='replace').decode('utf-8') - print(f"[分离协议] {safe_message}", flush=True) - logger.info(f"[分离协议] {safe_message}") + print(f"🌀 [SEPARATE] {safe_message}", flush=True) + logger.info(f"[SEPARATE] {safe_message}") except Exception as e: # 最后的安全措施 fallback_message = f"日志输出错误: {repr(message)}" - print(f"[分离协议] {fallback_message}", flush=True) - logger.info(f"[分离协议] {fallback_message}") + print(f"🌀 [SEPARATE] {fallback_message}", flush=True) + logger.info(f"[SEPARATE] {fallback_message}") def create_action_log(message: str, emoji: str = "📝") -> Dict[str, Any]: """创建一个动作日志 - 支持中文和emoji""" @@ -264,19 +264,119 @@ def find_connected_stirrer(G: nx.DiGraph, vessel: str) -> str: debug_print("❌ 未找到搅拌器") return "" +def get_vessel_liquid_volume(vessel: dict) -> float: + """ + 获取容器中的液体体积 - 支持vessel字典 + + Args: + vessel: 容器字典 + + Returns: + float: 液体体积(mL) + """ + if not vessel or "data" not in vessel: + debug_print(f"⚠️ 容器数据为空,返回 0.0mL") + return 0.0 + + vessel_data = vessel["data"] + vessel_id = vessel.get("id", "unknown") + + debug_print(f"🔍 读取容器 '{vessel_id}' 体积数据: {vessel_data}") + + # 检查liquid_volume字段 + if "liquid_volume" in vessel_data: + liquid_volume = vessel_data["liquid_volume"] + + # 处理列表格式 + if isinstance(liquid_volume, list): + if len(liquid_volume) > 0: + volume = liquid_volume[0] + if isinstance(volume, (int, float)): + debug_print(f"✅ 容器 '{vessel_id}' 体积: {volume}mL (列表格式)") + return float(volume) + + # 处理直接数值格式 + elif isinstance(liquid_volume, (int, float)): + debug_print(f"✅ 容器 '{vessel_id}' 体积: {liquid_volume}mL (数值格式)") + return float(liquid_volume) + + # 检查其他可能的体积字段 + volume_keys = ['current_volume', 'total_volume', 'volume'] + for key in volume_keys: + if key in vessel_data: + try: + volume = float(vessel_data[key]) + if volume > 0: + debug_print(f"✅ 容器 '{vessel_id}' 体积: {volume}mL (字段: {key})") + return volume + except (ValueError, TypeError): + continue + + debug_print(f"⚠️ 无法获取容器 '{vessel_id}' 的体积,返回默认值 50.0mL") + return 50.0 + +def update_vessel_volume(vessel: dict, G: nx.DiGraph, new_volume: float, description: str = "") -> None: + """ + 更新容器体积(同时更新vessel字典和图节点) + + Args: + vessel: 容器字典 + G: 网络图 + new_volume: 新体积 + description: 更新描述 + """ + vessel_id = vessel.get("id", "unknown") + + if description: + debug_print(f"🔧 更新容器体积 - {description}") + + # 更新vessel字典中的体积 + if "data" in vessel: + if "liquid_volume" in vessel["data"]: + current_volume = vessel["data"]["liquid_volume"] + if isinstance(current_volume, list): + if len(current_volume) > 0: + vessel["data"]["liquid_volume"][0] = new_volume + else: + vessel["data"]["liquid_volume"] = [new_volume] + else: + vessel["data"]["liquid_volume"] = new_volume + else: + vessel["data"]["liquid_volume"] = new_volume + else: + vessel["data"] = {"liquid_volume": new_volume} + + # 同时更新图中的容器数据 + if vessel_id in G.nodes(): + if 'data' not in G.nodes[vessel_id]: + G.nodes[vessel_id]['data'] = {} + + vessel_node_data = G.nodes[vessel_id]['data'] + current_node_volume = vessel_node_data.get('liquid_volume', 0.0) + + if isinstance(current_node_volume, list): + if len(current_node_volume) > 0: + G.nodes[vessel_id]['data']['liquid_volume'][0] = new_volume + else: + G.nodes[vessel_id]['data']['liquid_volume'] = [new_volume] + else: + G.nodes[vessel_id]['data']['liquid_volume'] = new_volume + + debug_print(f"📊 容器 '{vessel_id}' 体积已更新为: {new_volume:.2f}mL") + def generate_separate_protocol( G: nx.DiGraph, # 🔧 基础参数,支持XDL的vessel参数 - vessel: str = "", # XDL: 分离容器 - purpose: str = "separate", # 分离目的 - product_phase: str = "top", # 产物相 + vessel: dict = None, # 🔧 修改:从字符串改为字典类型 + purpose: str = "separate", # 分离目的 + product_phase: str = "top", # 产物相 # 🔧 可选的详细参数 - from_vessel: str = "", # 源容器(通常在separate前已经transfer了) - separation_vessel: str = "", # 分离容器(与vessel同义) - to_vessel: str = "", # 目标容器(可选) - waste_phase_to_vessel: str = "", # 废相目标容器 - product_vessel: str = "", # XDL: 产物容器(与to_vessel同义) - waste_vessel: str = "", # XDL: 废液容器(与waste_phase_to_vessel同义) + from_vessel: Union[str, dict] = "", # 源容器(通常在separate前已经transfer了) + separation_vessel: Union[str, dict] = "", # 分离容器(与vessel同义) + to_vessel: Union[str, dict] = "", # 目标容器(可选) + waste_phase_to_vessel: Union[str, dict] = "", # 废相目标容器 + product_vessel: Union[str, dict] = "", # XDL: 产物容器(与to_vessel同义) + waste_vessel: Union[str, dict] = "", # XDL: 废液容器(与waste_phase_to_vessel同义) # 🔧 溶剂相关参数 solvent: str = "", # 溶剂名称 solvent_volume: Union[str, float] = 0.0, # 溶剂体积 @@ -290,10 +390,10 @@ def generate_separate_protocol( **kwargs ) -> List[Dict[str, Any]]: """ - 生成分离操作的协议序列 - 增强中文版 + 生成分离操作的协议序列 - 支持vessel字典和体积运算 支持XDL参数格式: - - vessel: 分离容器(必需) + - vessel: 分离容器字典(必需) - purpose: "wash", "extract", "separate" - product_phase: "top", "bottom" - product_vessel: 产物收集容器 @@ -310,10 +410,20 @@ def generate_separate_protocol( 5. 重复指定次数 """ - debug_print("=" * 60) - debug_print("🧪 开始生成分离协议 - 增强中文版") - debug_print(f"📋 原始参数:") - debug_print(f" 🥼 容器: '{vessel}'") + # 🔧 核心修改:vessel参数兼容处理 + if vessel is None: + if isinstance(separation_vessel, dict): + vessel = separation_vessel + else: + raise ValueError("必须提供vessel字典参数") + + # 🔧 核心修改:从字典中提取容器ID + vessel_id = vessel["id"] + + debug_print("🌀" * 20) + debug_print("🚀 开始生成分离协议(支持vessel字典和体积运算)✨") + debug_print(f"📝 输入参数:") + debug_print(f" 🥽 vessel: {vessel} (ID: {vessel_id})") debug_print(f" 🎯 分离目的: '{purpose}'") debug_print(f" 📊 产物相: '{product_phase}'") debug_print(f" 💧 溶剂: '{solvent}'") @@ -322,24 +432,33 @@ def generate_separate_protocol( debug_print(f" 🎯 产物容器: '{product_vessel}'") debug_print(f" 🗑️ 废液容器: '{waste_vessel}'") debug_print(f" 📦 其他参数: {kwargs}") - debug_print("=" * 60) + debug_print("🌀" * 20) action_sequence = [] + # 🔧 新增:记录分离前的容器状态 + debug_print("🔍 记录分离前容器状态...") + original_liquid_volume = get_vessel_liquid_volume(vessel) + debug_print(f"📊 分离前液体体积: {original_liquid_volume:.2f}mL") + # === 参数验证和标准化 === debug_print("🔍 步骤1: 参数验证和标准化...") - action_sequence.append(create_action_log(f"开始分离操作 - 容器: {vessel}", "🎬")) + action_sequence.append(create_action_log(f"开始分离操作 - 容器: {vessel_id}", "🎬")) action_sequence.append(create_action_log(f"分离目的: {purpose}", "🧪")) action_sequence.append(create_action_log(f"产物相: {product_phase}", "📊")) - # 统一容器参数 - final_vessel = vessel or separation_vessel - if not final_vessel: - debug_print("❌ 必须指定分离容器") - raise ValueError("必须指定分离容器 (vessel 或 separation_vessel)") + # 统一容器参数 - 支持字典和字符串 + def extract_vessel_id(vessel_param): + if isinstance(vessel_param, dict): + return vessel_param.get("id", "") + elif isinstance(vessel_param, str): + return vessel_param + else: + return "" - final_to_vessel = to_vessel or product_vessel - final_waste_vessel = waste_phase_to_vessel or waste_vessel + final_vessel_id = vessel_id + final_to_vessel_id = extract_vessel_id(to_vessel) or extract_vessel_id(product_vessel) + final_waste_vessel_id = extract_vessel_id(waste_phase_to_vessel) or extract_vessel_id(waste_vessel) # 统一体积参数 final_volume = parse_volume_input(volume or solvent_volume) @@ -350,13 +469,13 @@ def generate_separate_protocol( debug_print(f"⚠️ 重复次数参数 <= 0,自动设置为 1") debug_print(f"🔧 标准化后的参数:") - debug_print(f" 🥼 分离容器: '{final_vessel}'") - debug_print(f" 🎯 产物容器: '{final_to_vessel}'") - debug_print(f" 🗑️ 废液容器: '{final_waste_vessel}'") + debug_print(f" 🥼 分离容器: '{final_vessel_id}'") + debug_print(f" 🎯 产物容器: '{final_to_vessel_id}'") + debug_print(f" 🗑️ 废液容器: '{final_waste_vessel_id}'") debug_print(f" 📏 溶剂体积: {final_volume}mL") debug_print(f" 🔄 重复次数: {repeats}") - action_sequence.append(create_action_log(f"分离容器: {final_vessel}", "🧪")) + action_sequence.append(create_action_log(f"分离容器: {final_vessel_id}", "🧪")) action_sequence.append(create_action_log(f"溶剂体积: {final_volume}mL", "📏")) action_sequence.append(create_action_log(f"重复次数: {repeats}", "🔄")) @@ -382,7 +501,7 @@ def generate_separate_protocol( action_sequence.append(create_action_log("正在查找相关设备...", "🔍")) # 查找分离器设备 - separator_device = find_separator_device(G, final_vessel) + separator_device = find_separator_device(G, final_vessel_id) # 🔧 使用 final_vessel_id if separator_device: action_sequence.append(create_action_log(f"找到分离器设备: {separator_device}", "🧪")) else: @@ -390,7 +509,7 @@ def generate_separate_protocol( action_sequence.append(create_action_log("未找到分离器设备", "⚠️")) # 查找搅拌器 - stirrer_device = find_connected_stirrer(G, final_vessel) + stirrer_device = find_connected_stirrer(G, final_vessel_id) # 🔧 使用 final_vessel_id if stirrer_device: action_sequence.append(create_action_log(f"找到搅拌器: {stirrer_device}", "🌪️")) else: @@ -414,6 +533,9 @@ def generate_separate_protocol( debug_print("🔍 步骤3: 执行分离流程...") action_sequence.append(create_action_log("开始分离工作流程", "🎯")) + # 🔧 新增:体积变化跟踪变量 + current_volume = original_liquid_volume + try: for repeat_idx in range(repeats): cycle_num = repeat_idx + 1 @@ -430,7 +552,7 @@ def generate_separate_protocol( pump_actions = generate_pump_protocol_with_rinsing( G=G, from_vessel=solvent_vessel, - to_vessel=final_vessel, + to_vessel=final_vessel_id, # 🔧 使用 final_vessel_id volume=final_volume, amount="", time=0.0, @@ -450,6 +572,10 @@ def generate_separate_protocol( debug_print(f"✅ 溶剂添加完成,添加了 {len(pump_actions)} 个动作") action_sequence.append(create_action_log(f"溶剂转移完成 ({len(pump_actions)} 个操作)", "✅")) + # 🔧 新增:更新体积 - 添加溶剂后 + current_volume += final_volume + update_vessel_volume(vessel, G, current_volume, f"添加{final_volume}mL {solvent}后") + except Exception as e: debug_print(f"❌ 溶剂添加失败: {str(e)}") action_sequence.append(create_action_log(f"溶剂添加失败: {str(e)}", "❌")) @@ -466,7 +592,7 @@ def generate_separate_protocol( "device_id": stirrer_device, "action_name": "start_stir", "action_kwargs": { - "vessel": final_vessel, + "vessel": final_vessel_id, # 🔧 使用 final_vessel_id "stir_speed": stir_speed, "purpose": f"分离混合 - {purpose}" } @@ -485,7 +611,7 @@ def generate_separate_protocol( action_sequence.append({ "device_id": stirrer_device, "action_name": "stop_stir", - "action_kwargs": {"vessel": final_vessel} + "action_kwargs": {"vessel": final_vessel_id} # 🔧 使用 final_vessel_id }) else: @@ -517,10 +643,10 @@ def generate_separate_protocol( "action_kwargs": { "purpose": purpose, "product_phase": product_phase, - "from_vessel": from_vessel or final_vessel, - "separation_vessel": final_vessel, - "to_vessel": final_to_vessel or final_vessel, - "waste_phase_to_vessel": final_waste_vessel or final_vessel, + "from_vessel": extract_vessel_id(from_vessel) or final_vessel_id, # 🔧 使用vessel_id + "separation_vessel": final_vessel_id, # 🔧 使用 final_vessel_id + "to_vessel": final_to_vessel_id or final_vessel_id, # 🔧 使用vessel_id + "waste_phase_to_vessel": final_waste_vessel_id or final_vessel_id, # 🔧 使用vessel_id "solvent": solvent, "solvent_volume": final_volume, "through": through, @@ -534,11 +660,17 @@ def generate_separate_protocol( debug_print(f"✅ 分离操作已添加") action_sequence.append(create_action_log("分离操作完成", "✅")) + # 🔧 新增:分离后体积估算(分离通常不改变总体积,但会重新分配) + # 假设分离后保持体积(实际情况可能有少量损失) + separated_volume = current_volume * 0.95 # 假设5%损失 + update_vessel_volume(vessel, G, separated_volume, f"分离操作后(第{cycle_num}轮)") + current_volume = separated_volume + # 收集结果 - if final_to_vessel: - action_sequence.append(create_action_log(f"产物 ({product_phase}相) 收集到: {final_to_vessel}", "📦")) - if final_waste_vessel: - action_sequence.append(create_action_log(f"废相收集到: {final_waste_vessel}", "🗑️")) + if final_to_vessel_id: + action_sequence.append(create_action_log(f"产物 ({product_phase}相) 收集到: {final_to_vessel_id}", "📦")) + if final_waste_vessel_id: + action_sequence.append(create_action_log(f"废相收集到: {final_waste_vessel_id}", "🗑️")) else: debug_print(f"🔄 第{cycle_num}轮 步骤4: 无分离器设备,跳过分离") @@ -572,99 +704,37 @@ def generate_separate_protocol( } }) + # 🔧 新增:分离完成后的最终状态报告 + final_liquid_volume = get_vessel_liquid_volume(vessel) + # === 最终结果 === total_time = (stir_time + settling_time + 15) * repeats # 估算总时间 - debug_print("=" * 60) + debug_print("🌀" * 20) debug_print(f"🎉 分离协议生成完成") debug_print(f"📊 协议统计:") debug_print(f" 📋 总动作数: {len(action_sequence)}") debug_print(f" ⏱️ 预计总时间: {total_time:.0f}s ({total_time/60:.1f} 分钟)") - debug_print(f" 🥼 分离容器: {final_vessel}") + debug_print(f" 🥼 分离容器: {final_vessel_id}") debug_print(f" 🎯 分离目的: {purpose}") debug_print(f" 📊 产物相: {product_phase}") debug_print(f" 🔄 重复次数: {repeats}") + debug_print(f"💧 体积变化统计:") + debug_print(f" - 分离前体积: {original_liquid_volume:.2f}mL") + debug_print(f" - 分离后体积: {final_liquid_volume:.2f}mL") if solvent: - debug_print(f" 💧 溶剂: {solvent} ({final_volume}mL)") - if final_to_vessel: - debug_print(f" 🎯 产物容器: {final_to_vessel}") - if final_waste_vessel: - debug_print(f" 🗑️ 废液容器: {final_waste_vessel}") - debug_print("=" * 60) + debug_print(f" 💧 溶剂: {solvent} ({final_volume}mL × {repeats}轮 = {final_volume * repeats:.2f}mL)") + if final_to_vessel_id: + debug_print(f" 🎯 产物容器: {final_to_vessel_id}") + if final_waste_vessel_id: + debug_print(f" 🗑️ 废液容器: {final_waste_vessel_id}") + debug_print("🌀" * 20) # 添加完成日志 - summary_msg = f"分离协议完成: {final_vessel} ({purpose},{repeats} 次循环)" + summary_msg = f"分离协议完成: {final_vessel_id} ({purpose},{repeats} 次循环)" if solvent: - summary_msg += f",使用 {final_volume}mL {solvent}" + summary_msg += f",使用 {final_volume * repeats:.2f}mL {solvent}" action_sequence.append(create_action_log(summary_msg, "🎉")) return action_sequence -# === 便捷函数 === - -def separate_phases_only(G: nx.DiGraph, vessel: str, product_phase: str = "top", - product_vessel: str = "", waste_vessel: str = "") -> List[Dict[str, Any]]: - """仅进行相分离(不添加溶剂)""" - debug_print(f"⚡ 快速相分离: {vessel} ({product_phase}相)") - return generate_separate_protocol( - G, vessel=vessel, - purpose="separate", - product_phase=product_phase, - product_vessel=product_vessel, - waste_vessel=waste_vessel - ) - -def wash_with_solvent(G: nx.DiGraph, vessel: str, solvent: str, volume: Union[str, float], - product_phase: str = "top", repeats: int = 1) -> List[Dict[str, Any]]: - """用溶剂洗涤""" - debug_print(f"🧽 用{solvent}洗涤: {vessel} ({repeats} 次)") - return generate_separate_protocol( - G, vessel=vessel, - purpose="wash", - product_phase=product_phase, - solvent=solvent, - volume=volume, - repeats=repeats - ) - -def extract_with_solvent(G: nx.DiGraph, vessel: str, solvent: str, volume: Union[str, float], - product_phase: str = "bottom", repeats: int = 3) -> List[Dict[str, Any]]: - """用溶剂萃取""" - debug_print(f"🧪 用{solvent}萃取: {vessel} ({repeats} 次)") - return generate_separate_protocol( - G, vessel=vessel, - purpose="extract", - product_phase=product_phase, - solvent=solvent, - volume=volume, - repeats=repeats - ) - -def separate_aqueous_organic(G: nx.DiGraph, vessel: str, organic_phase: str = "top", - product_vessel: str = "", waste_vessel: str = "") -> List[Dict[str, Any]]: - """水-有机相分离""" - debug_print(f"💧 水-有机相分离: {vessel} (有机相: {organic_phase})") - return generate_separate_protocol( - G, vessel=vessel, - purpose="separate", - product_phase=organic_phase, - product_vessel=product_vessel, - waste_vessel=waste_vessel - ) - -# 测试函数 -def test_separate_protocol(): - """测试分离协议的各种参数解析""" - debug_print("=== 分离协议增强中文版测试 ===") - - # 测试体积解析 - debug_print("🧪 测试体积解析...") - volumes = ["200 mL", "?", 100.0, "1 L", "500 μL", "未知", "50毫升"] - for vol in volumes: - result = parse_volume_input(vol) - debug_print(f"📊 体积解析结果: {vol} -> {result}mL") - - debug_print("✅ 测试完成") - -if __name__ == "__main__": - test_separate_protocol() diff --git a/unilabos/compile/stir_protocol.py b/unilabos/compile/stir_protocol.py index f7a6a74..70405ff 100644 --- a/unilabos/compile/stir_protocol.py +++ b/unilabos/compile/stir_protocol.py @@ -138,9 +138,50 @@ def validate_and_fix_params(stir_time: float, stir_speed: float, settling_time: return stir_time, stir_speed, settling_time +def extract_vessel_id(vessel: Union[str, dict]) -> str: + """ + 从vessel参数中提取vessel_id + + Args: + vessel: vessel字典或vessel_id字符串 + + Returns: + str: vessel_id + """ + if isinstance(vessel, dict): + vessel_id = vessel.get("id", "") + debug_print(f"🔧 从vessel字典提取ID: {vessel_id}") + return vessel_id + elif isinstance(vessel, str): + debug_print(f"🔧 vessel参数为字符串: {vessel}") + return vessel + else: + debug_print(f"⚠️ 无效的vessel参数类型: {type(vessel)}") + return "" + +def get_vessel_display_info(vessel: Union[str, dict]) -> str: + """ + 获取容器的显示信息(用于日志) + + Args: + vessel: vessel字典或vessel_id字符串 + + Returns: + str: 显示信息 + """ + if isinstance(vessel, dict): + vessel_id = vessel.get("id", "unknown") + vessel_name = vessel.get("name", "") + if vessel_name: + return f"{vessel_id} ({vessel_name})" + else: + return vessel_id + else: + return str(vessel) + def generate_stir_protocol( G: nx.DiGraph, - vessel: str, + vessel: Union[str, dict], # 支持vessel字典或字符串 time: Union[str, float, int] = "300", stir_time: Union[str, float, int] = "0", time_spec: str = "", @@ -149,14 +190,39 @@ def generate_stir_protocol( settling_time: Union[str, float] = "60", **kwargs ) -> List[Dict[str, Any]]: - """ - 生成搅拌操作的协议序列(精简版) - """ + """生成搅拌操作的协议序列 - 修复vessel参数传递""" + + # 🔧 核心修改:正确处理vessel参数 + vessel_id = extract_vessel_id(vessel) + vessel_display = get_vessel_display_info(vessel) + + # 🔧 关键修复:确保vessel_resource是完整的Resource对象 + if isinstance(vessel, dict): + vessel_resource = vessel # 已经是完整的Resource字典 + debug_print(f"✅ 使用传入的vessel Resource对象") + else: + # 如果只是字符串,构建一个基本的Resource对象 + vessel_resource = { + "id": vessel, + "name": "", + "category": "", + "children": [], + "config": "", + "data": "", + "parent": "", + "pose": { + "orientation": {"w": 1.0, "x": 0.0, "y": 0.0, "z": 0.0}, + "position": {"x": 0.0, "y": 0.0, "z": 0.0} + }, + "sample_id": "", + "type": "" + } + debug_print(f"🔧 构建了基本的vessel Resource对象: {vessel}") debug_print("🌪️" * 20) - debug_print("🚀 开始生成搅拌协议 ✨") + debug_print("🚀 开始生成搅拌协议(支持vessel字典)✨") debug_print(f"📝 输入参数:") - debug_print(f" 🥽 vessel: {vessel}") + debug_print(f" 🥽 vessel: {vessel_display} (ID: {vessel_id})") debug_print(f" ⏰ time: {time}") debug_print(f" 🕐 stir_time: {stir_time}") debug_print(f" 🎯 time_spec: {time_spec}") @@ -166,13 +232,13 @@ def generate_stir_protocol( # 📋 参数验证 debug_print("📍 步骤1: 参数验证... 🔧") - if not vessel: + if not vessel_id: # 🔧 使用 vessel_id debug_print("❌ vessel 参数不能为空! 😱") raise ValueError("vessel 参数不能为空") - if vessel not in G.nodes(): - debug_print(f"❌ 容器 '{vessel}' 不存在于系统中! 😞") - raise ValueError(f"容器 '{vessel}' 不存在于系统中") + if vessel_id not in G.nodes(): # 🔧 使用 vessel_id + debug_print(f"❌ 容器 '{vessel_id}' 不存在于系统中! 😞") + raise ValueError(f"容器 '{vessel_id}' 不存在于系统中") debug_print("✅ 基础参数验证通过 🎯") @@ -220,7 +286,7 @@ def generate_stir_protocol( # 🔍 查找设备 debug_print("📍 步骤3: 查找搅拌设备... 🔍") try: - stirrer_id = find_connected_stirrer(G, vessel) + stirrer_id = find_connected_stirrer(G, vessel_id) # 🔧 使用 vessel_id debug_print(f"🎉 使用搅拌设备: {stirrer_id} ✨") except Exception as e: debug_print(f"❌ 设备查找失败: {str(e)} 😭") @@ -234,13 +300,14 @@ def generate_stir_protocol( "device_id": stirrer_id, "action_name": "stir", "action_kwargs": { - "vessel": vessel, - "time": str(time), # 保持原始格式 + # 🔧 关键修复:传递vessel_id字符串,而不是完整的Resource对象 + "vessel": vessel_id, # 传递字符串ID,不是Resource对象 + "time": str(time), "event": event, "time_spec": time_spec, - "stir_time": float(parsed_time), # 确保是数字 - "stir_speed": float(stir_speed), # 确保是数字 - "settling_time": float(parsed_settling_time) # 确保是数字 + "stir_time": float(parsed_time), + "stir_speed": float(stir_speed), + "settling_time": float(parsed_settling_time) } } action_sequence.append(stir_action) @@ -256,7 +323,7 @@ def generate_stir_protocol( debug_print("🎊" * 20) debug_print(f"🎉 搅拌协议生成完成! ✨") debug_print(f"📊 总动作数: {len(action_sequence)} 个") - debug_print(f"🥽 搅拌容器: {vessel}") + debug_print(f"🥽 搅拌容器: {vessel_display}") debug_print(f"🌪️ 搅拌参数: {stir_speed} RPM, {parsed_time}s, 沉降 {parsed_settling_time}s") debug_print(f"⏱️ 预计总时间: {(parsed_time + parsed_settling_time)/60:.1f} 分钟 ⌛") debug_print("🎊" * 20) @@ -265,18 +332,47 @@ def generate_stir_protocol( def generate_start_stir_protocol( G: nx.DiGraph, - vessel: str, + vessel: Union[str, dict], stir_speed: float = 300.0, purpose: str = "", **kwargs ) -> List[Dict[str, Any]]: - """生成开始搅拌操作的协议序列""" + """生成开始搅拌操作的协议序列 - 修复vessel参数传递""" - debug_print("🔄 开始生成启动搅拌协议 ✨") - debug_print(f"🥽 vessel: {vessel}, 🌪️ speed: {stir_speed} RPM") + # 🔧 核心修改:正确处理vessel参数 + vessel_id = extract_vessel_id(vessel) + vessel_display = get_vessel_display_info(vessel) + + # 🔧 关键修复:确保vessel_resource是完整的Resource对象 + if isinstance(vessel, dict): + vessel_resource = vessel # 已经是完整的Resource字典 + debug_print(f"✅ 使用传入的vessel Resource对象") + else: + # 如果只是字符串,构建一个基本的Resource对象 + vessel_resource = { + "id": vessel, + "name": "", + "category": "", + "children": [], + "config": "", + "data": "", + "parent": "", + "pose": { + "orientation": {"w": 1.0, "x": 0.0, "y": 0.0, "z": 0.0}, + "position": {"x": 0.0, "y": 0.0, "z": 0.0} + }, + "sample_id": "", + "type": "" + } + debug_print(f"🔧 构建了基本的vessel Resource对象: {vessel}") + + debug_print("🔄 开始生成启动搅拌协议(修复vessel参数)✨") + debug_print(f"🥽 vessel: {vessel_display} (ID: {vessel_id})") + debug_print(f"🌪️ speed: {stir_speed} RPM") + debug_print(f"🎯 purpose: {purpose}") # 基础验证 - if not vessel or vessel not in G.nodes(): + if not vessel_id or vessel_id not in G.nodes(): debug_print("❌ 容器验证失败!") raise ValueError("vessel 参数无效") @@ -286,14 +382,15 @@ def generate_start_stir_protocol( stir_speed = 300.0 # 查找设备 - stirrer_id = find_connected_stirrer(G, vessel) + stirrer_id = find_connected_stirrer(G, vessel_id) - # 生成动作 + # 🔧 关键修复:传递vessel_id字符串 action_sequence = [{ "device_id": stirrer_id, "action_name": "start_stir", "action_kwargs": { - "vessel": vessel, + # 🔧 关键修复:传递vessel_id字符串,而不是完整的Resource对象 + "vessel": vessel_id, # 传递字符串ID,不是Resource对象 "stir_speed": stir_speed, "purpose": purpose or f"启动搅拌 {stir_speed} RPM" } @@ -304,38 +401,144 @@ def generate_start_stir_protocol( def generate_stop_stir_protocol( G: nx.DiGraph, - vessel: str, + vessel: Union[str, dict], **kwargs ) -> List[Dict[str, Any]]: - """生成停止搅拌操作的协议序列""" + """生成停止搅拌操作的协议序列 - 修复vessel参数传递""" - debug_print("🛑 开始生成停止搅拌协议 ✨") - debug_print(f"🥽 vessel: {vessel}") + # 🔧 核心修改:正确处理vessel参数 + vessel_id = extract_vessel_id(vessel) + vessel_display = get_vessel_display_info(vessel) + + # 🔧 关键修复:确保vessel_resource是完整的Resource对象 + if isinstance(vessel, dict): + vessel_resource = vessel # 已经是完整的Resource字典 + debug_print(f"✅ 使用传入的vessel Resource对象") + else: + # 如果只是字符串,构建一个基本的Resource对象 + vessel_resource = { + "id": vessel, + "name": "", + "category": "", + "children": [], + "config": "", + "data": "", + "parent": "", + "pose": { + "orientation": {"w": 1.0, "x": 0.0, "y": 0.0, "z": 0.0}, + "position": {"x": 0.0, "y": 0.0, "z": 0.0} + }, + "sample_id": "", + "type": "" + } + debug_print(f"🔧 构建了基本的vessel Resource对象: {vessel}") + + debug_print("🛑 开始生成停止搅拌协议(修复vessel参数)✨") + debug_print(f"🥽 vessel: {vessel_display} (ID: {vessel_id})") # 基础验证 - if not vessel or vessel not in G.nodes(): + if not vessel_id or vessel_id not in G.nodes(): debug_print("❌ 容器验证失败!") raise ValueError("vessel 参数无效") # 查找设备 - stirrer_id = find_connected_stirrer(G, vessel) + stirrer_id = find_connected_stirrer(G, vessel_id) - # 生成动作 + # 🔧 关键修复:传递vessel_id字符串 action_sequence = [{ "device_id": stirrer_id, "action_name": "stop_stir", "action_kwargs": { - "vessel": vessel + # 🔧 关键修复:传递vessel_id字符串,而不是完整的Resource对象 + "vessel": vessel_id # 传递字符串ID,不是Resource对象 } }] debug_print(f"✅ 停止搅拌协议生成完成 🎯") return action_sequence +# 🔧 新增:便捷函数 +def stir_briefly(G: nx.DiGraph, vessel: Union[str, dict], + speed: float = 300.0) -> List[Dict[str, Any]]: + """短时间搅拌(30秒)""" + vessel_display = get_vessel_display_info(vessel) + debug_print(f"⚡ 短时间搅拌: {vessel_display} @ {speed}RPM (30s)") + return generate_stir_protocol(G, vessel, time="30", stir_speed=speed) + +def stir_slowly(G: nx.DiGraph, vessel: Union[str, dict], + time: Union[str, float] = "10 min") -> List[Dict[str, Any]]: + """慢速搅拌""" + vessel_display = get_vessel_display_info(vessel) + debug_print(f"🐌 慢速搅拌: {vessel_display} @ 150RPM") + return generate_stir_protocol(G, vessel, time=time, stir_speed=150.0) + +def stir_vigorously(G: nx.DiGraph, vessel: Union[str, dict], + time: Union[str, float] = "5 min") -> List[Dict[str, Any]]: + """剧烈搅拌""" + vessel_display = get_vessel_display_info(vessel) + debug_print(f"💨 剧烈搅拌: {vessel_display} @ 800RPM") + return generate_stir_protocol(G, vessel, time=time, stir_speed=800.0) + +def stir_for_reaction(G: nx.DiGraph, vessel: Union[str, dict], + time: Union[str, float] = "1 h") -> List[Dict[str, Any]]: + """反应搅拌(标准速度,长时间)""" + vessel_display = get_vessel_display_info(vessel) + debug_print(f"🧪 反应搅拌: {vessel_display} @ 400RPM") + return generate_stir_protocol(G, vessel, time=time, stir_speed=400.0) + +def stir_for_dissolution(G: nx.DiGraph, vessel: Union[str, dict], + time: Union[str, float] = "15 min") -> List[Dict[str, Any]]: + """溶解搅拌(中等速度)""" + vessel_display = get_vessel_display_info(vessel) + debug_print(f"💧 溶解搅拌: {vessel_display} @ 500RPM") + return generate_stir_protocol(G, vessel, time=time, stir_speed=500.0) + +def stir_gently(G: nx.DiGraph, vessel: Union[str, dict], + time: Union[str, float] = "30 min") -> List[Dict[str, Any]]: + """温和搅拌""" + vessel_display = get_vessel_display_info(vessel) + debug_print(f"🍃 温和搅拌: {vessel_display} @ 200RPM") + return generate_stir_protocol(G, vessel, time=time, stir_speed=200.0) + +def stir_overnight(G: nx.DiGraph, vessel: Union[str, dict]) -> List[Dict[str, Any]]: + """过夜搅拌(模拟时缩短为2小时)""" + vessel_display = get_vessel_display_info(vessel) + debug_print(f"🌙 过夜搅拌(模拟2小时): {vessel_display} @ 300RPM") + return generate_stir_protocol(G, vessel, time="2 h", stir_speed=300.0) + +def start_continuous_stirring(G: nx.DiGraph, vessel: Union[str, dict], + speed: float = 300.0, purpose: str = "continuous stirring") -> List[Dict[str, Any]]: + """开始连续搅拌""" + vessel_display = get_vessel_display_info(vessel) + debug_print(f"🔄 开始连续搅拌: {vessel_display} @ {speed}RPM") + return generate_start_stir_protocol(G, vessel, stir_speed=speed, purpose=purpose) + +def stop_all_stirring(G: nx.DiGraph, vessel: Union[str, dict]) -> List[Dict[str, Any]]: + """停止所有搅拌""" + vessel_display = get_vessel_display_info(vessel) + debug_print(f"🛑 停止搅拌: {vessel_display}") + return generate_stop_stir_protocol(G, vessel) + # 测试函数 def test_stir_protocol(): """测试搅拌协议""" debug_print("🧪 === STIR PROTOCOL 测试 === ✨") + + # 测试vessel参数处理 + debug_print("🔧 测试vessel参数处理...") + + # 测试字典格式 + vessel_dict = {"id": "flask_1", "name": "反应瓶1"} + vessel_id = extract_vessel_id(vessel_dict) + vessel_display = get_vessel_display_info(vessel_dict) + debug_print(f" 字典格式: {vessel_dict} → ID: {vessel_id}, 显示: {vessel_display}") + + # 测试字符串格式 + vessel_str = "flask_2" + vessel_id = extract_vessel_id(vessel_str) + vessel_display = get_vessel_display_info(vessel_str) + debug_print(f" 字符串格式: {vessel_str} → ID: {vessel_id}, 显示: {vessel_display}") + debug_print("✅ 测试完成 🎉") if __name__ == "__main__": diff --git a/unilabos/compile/wash_solid_protocol.py b/unilabos/compile/wash_solid_protocol.py index 55768a4..e19d768 100644 --- a/unilabos/compile/wash_solid_protocol.py +++ b/unilabos/compile/wash_solid_protocol.py @@ -154,12 +154,153 @@ def find_filtrate_vessel(G: nx.DiGraph, filtrate_vessel: str = "") -> str: debug_print(f"⚠️ 使用默认滤液容器: waste_workup") return "waste_workup" +def extract_vessel_id(vessel: Union[str, dict]) -> str: + """ + 从vessel参数中提取vessel_id + + Args: + vessel: vessel字典或vessel_id字符串 + + Returns: + str: vessel_id + """ + if isinstance(vessel, dict): + vessel_id = vessel.get("id", "") + debug_print(f"🔧 从vessel字典提取ID: {vessel_id}") + return vessel_id + elif isinstance(vessel, str): + debug_print(f"🔧 vessel参数为字符串: {vessel}") + return vessel + else: + debug_print(f"⚠️ 无效的vessel参数类型: {type(vessel)}") + return "" + +def get_vessel_display_info(vessel: Union[str, dict]) -> str: + """ + 获取容器的显示信息(用于日志) + + Args: + vessel: vessel字典或vessel_id字符串 + + Returns: + str: 显示信息 + """ + if isinstance(vessel, dict): + vessel_id = vessel.get("id", "unknown") + vessel_name = vessel.get("name", "") + if vessel_name: + return f"{vessel_id} ({vessel_name})" + else: + return vessel_id + else: + return str(vessel) + +def get_vessel_liquid_volume(vessel: dict) -> float: + """ + 获取容器中的液体体积 - 支持vessel字典 + + Args: + vessel: 容器字典 + + Returns: + float: 液体体积(mL) + """ + if not vessel or "data" not in vessel: + debug_print(f"⚠️ 容器数据为空,返回 0.0mL") + return 0.0 + + vessel_data = vessel["data"] + vessel_id = vessel.get("id", "unknown") + + debug_print(f"🔍 读取容器 '{vessel_id}' 体积数据: {vessel_data}") + + # 检查liquid_volume字段 + if "liquid_volume" in vessel_data: + liquid_volume = vessel_data["liquid_volume"] + + # 处理列表格式 + if isinstance(liquid_volume, list): + if len(liquid_volume) > 0: + volume = liquid_volume[0] + if isinstance(volume, (int, float)): + debug_print(f"✅ 容器 '{vessel_id}' 体积: {volume}mL (列表格式)") + return float(volume) + + # 处理直接数值格式 + elif isinstance(liquid_volume, (int, float)): + debug_print(f"✅ 容器 '{vessel_id}' 体积: {liquid_volume}mL (数值格式)") + return float(liquid_volume) + + # 检查其他可能的体积字段 + volume_keys = ['current_volume', 'total_volume', 'volume'] + for key in volume_keys: + if key in vessel_data: + try: + volume = float(vessel_data[key]) + if volume > 0: + debug_print(f"✅ 容器 '{vessel_id}' 体积: {volume}mL (字段: {key})") + return volume + except (ValueError, TypeError): + continue + + debug_print(f"⚠️ 无法获取容器 '{vessel_id}' 的体积,返回默认值 0.0mL") + return 0.0 + +def update_vessel_volume(vessel: dict, G: nx.DiGraph, new_volume: float, description: str = "") -> None: + """ + 更新容器体积(同时更新vessel字典和图节点) + + Args: + vessel: 容器字典 + G: 网络图 + new_volume: 新体积 + description: 更新描述 + """ + vessel_id = vessel.get("id", "unknown") + + if description: + debug_print(f"🔧 更新容器体积 - {description}") + + # 更新vessel字典中的体积 + if "data" in vessel: + if "liquid_volume" in vessel["data"]: + current_volume = vessel["data"]["liquid_volume"] + if isinstance(current_volume, list): + if len(current_volume) > 0: + vessel["data"]["liquid_volume"][0] = new_volume + else: + vessel["data"]["liquid_volume"] = [new_volume] + else: + vessel["data"]["liquid_volume"] = new_volume + else: + vessel["data"]["liquid_volume"] = new_volume + else: + vessel["data"] = {"liquid_volume": new_volume} + + # 同时更新图中的容器数据 + if vessel_id in G.nodes(): + if 'data' not in G.nodes[vessel_id]: + G.nodes[vessel_id]['data'] = {} + + vessel_node_data = G.nodes[vessel_id]['data'] + current_node_volume = vessel_node_data.get('liquid_volume', 0.0) + + if isinstance(current_node_volume, list): + if len(current_node_volume) > 0: + G.nodes[vessel_id]['data']['liquid_volume'][0] = new_volume + else: + G.nodes[vessel_id]['data']['liquid_volume'] = [new_volume] + else: + G.nodes[vessel_id]['data']['liquid_volume'] = new_volume + + debug_print(f"📊 容器 '{vessel_id}' 体积已更新为: {new_volume:.2f}mL") + def generate_wash_solid_protocol( G: nx.DiGraph, - vessel: str, + vessel: Union[str, dict], # 🔧 修改:支持vessel字典 solvent: str, volume: Union[float, str] = "50", - filtrate_vessel: str = "", + filtrate_vessel: Union[str, dict] = "", # 🔧 修改:支持vessel字典 temp: float = 25.0, stir: bool = False, stir_speed: float = 0.0, @@ -172,21 +313,58 @@ def generate_wash_solid_protocol( **kwargs ) -> List[Dict[str, Any]]: """ - 生成固体清洗协议(精简版) + 生成固体清洗协议 - 支持vessel字典和体积运算 + + Args: + G: 有向图,节点为设备和容器,边为流体管道 + vessel: 清洗容器字典(从XDL传入)或容器ID字符串 + solvent: 清洗溶剂名称 + volume: 溶剂体积(每次清洗) + filtrate_vessel: 滤液收集容器字典或容器ID字符串 + temp: 清洗温度(°C) + stir: 是否搅拌 + stir_speed: 搅拌速度(RPM) + time: 搅拌时间 + repeats: 清洗重复次数 + volume_spec: 体积规格(small/medium/large) + repeats_spec: 重复次数规格(few/several/many) + mass: 固体质量(用于计算溶剂用量) + event: 事件描述 + **kwargs: 其他可选参数 + + Returns: + List[Dict[str, Any]]: 固体清洗操作的动作序列 """ + # 🔧 核心修改:从vessel参数中提取vessel_id + vessel_id = extract_vessel_id(vessel) + vessel_display = get_vessel_display_info(vessel) + + # 🔧 处理filtrate_vessel参数 + filtrate_vessel_id = extract_vessel_id(filtrate_vessel) if filtrate_vessel else "" + debug_print("🧼" * 20) - debug_print("🚀 开始生成固体清洗协议 ✨") + debug_print("🚀 开始生成固体清洗协议(支持vessel字典和体积运算)✨") debug_print(f"📝 输入参数:") - debug_print(f" 🥽 vessel: {vessel}") + debug_print(f" 🥽 vessel: {vessel_display} (ID: {vessel_id})") debug_print(f" 🧪 solvent: {solvent}") debug_print(f" 💧 volume: {volume}") + debug_print(f" 🗑️ filtrate_vessel: {filtrate_vessel_id}") debug_print(f" ⏰ time: {time}") debug_print(f" 🔄 repeats: {repeats}") debug_print("🧼" * 20) + # 🔧 新增:记录清洗前的容器状态 + debug_print("🔍 记录清洗前容器状态...") + if isinstance(vessel, dict): + original_volume = get_vessel_liquid_volume(vessel) + debug_print(f"📊 清洗前液体体积: {original_volume:.2f}mL") + else: + original_volume = 0.0 + debug_print(f"📊 vessel为字符串格式,无法获取体积信息") + # 📋 快速验证 - if not vessel or vessel not in G.nodes(): + if not vessel_id or vessel_id not in G.nodes(): # 🔧 使用 vessel_id debug_print("❌ 容器验证失败! 😱") raise ValueError("vessel 参数无效") @@ -225,8 +403,10 @@ def generate_wash_solid_protocol( debug_print("📍 步骤2: 查找设备... 🔍") try: solvent_source = find_solvent_source(G, solvent) - actual_filtrate_vessel = find_filtrate_vessel(G, filtrate_vessel) + actual_filtrate_vessel = find_filtrate_vessel(G, filtrate_vessel_id) debug_print(f"🎉 设备配置完成 ✨") + debug_print(f" 🧪 溶剂源: {solvent_source}") + debug_print(f" 🗑️ 滤液容器: {actual_filtrate_vessel}") except Exception as e: debug_print(f"❌ 设备查找失败: {str(e)} 😭") raise ValueError(f"设备查找失败: {str(e)}") @@ -235,6 +415,10 @@ def generate_wash_solid_protocol( debug_print("📍 步骤3: 生成清洗动作... 🧼") action_sequence = [] + # 🔧 新增:体积变化跟踪变量 + current_volume = original_volume + total_solvent_used = 0.0 + for cycle in range(final_repeats): debug_print(f" 🔄 第{cycle+1}/{final_repeats}次清洗...") @@ -242,10 +426,11 @@ def generate_wash_solid_protocol( try: from .pump_protocol import generate_pump_protocol_with_rinsing + debug_print(f" 💧 添加溶剂: {final_volume}mL {solvent}") transfer_actions = generate_pump_protocol_with_rinsing( G=G, from_vessel=solvent_source, - to_vessel=vessel, + to_vessel=vessel_id, # 🔧 使用 vessel_id volume=final_volume, amount="", time=0.0, @@ -261,17 +446,26 @@ def generate_wash_solid_protocol( if transfer_actions: action_sequence.extend(transfer_actions) debug_print(f" ✅ 转移动作: {len(transfer_actions)}个 🚚") + + # 🔧 新增:更新体积 - 添加溶剂后 + current_volume += final_volume + total_solvent_used += final_volume + + if isinstance(vessel, dict): + update_vessel_volume(vessel, G, current_volume, + f"第{cycle+1}次清洗添加{final_volume}mL溶剂后") except Exception as e: debug_print(f" ❌ 转移失败: {str(e)} 😞") # 2. 搅拌(如果需要) if stir and final_time > 0: + debug_print(f" 🌪️ 搅拌: {final_time}s @ {stir_speed}RPM") stir_action = { "device_id": "stirrer_1", "action_name": "stir", "action_kwargs": { - "vessel": vessel, + "vessel": vessel_id, # 🔧 使用 vessel_id "time": str(time), "stir_time": final_time, "stir_speed": stir_speed, @@ -282,11 +476,12 @@ def generate_wash_solid_protocol( debug_print(f" ✅ 搅拌动作: {final_time}s, {stir_speed}RPM 🌪️") # 3. 过滤 + debug_print(f" 🌊 过滤到: {actual_filtrate_vessel}") filter_action = { "device_id": "filter_1", "action_name": "filter", "action_kwargs": { - "vessel": vessel, + "vessel": vessel_id, # 🔧 使用 vessel_id "filtrate_vessel": actual_filtrate_vessel, "temp": temp, "volume": final_volume @@ -295,6 +490,15 @@ def generate_wash_solid_protocol( action_sequence.append(filter_action) debug_print(f" ✅ 过滤动作: → {actual_filtrate_vessel} 🌊") + # 🔧 新增:更新体积 - 过滤后(液体被滤除) + # 假设滤液完全被移除,固体残留在容器中 + filtered_volume = current_volume * 0.9 # 假设90%的液体被过滤掉 + current_volume = current_volume - filtered_volume + + if isinstance(vessel, dict): + update_vessel_volume(vessel, G, current_volume, + f"第{cycle+1}次清洗过滤后") + # 4. 等待(缩短时间) wait_time = 5.0 # 🕐 缩短等待时间:10s → 5s action_sequence.append({ @@ -303,14 +507,146 @@ def generate_wash_solid_protocol( }) debug_print(f" ✅ 等待: {wait_time}s ⏰") + # 🔧 新增:清洗完成后的最终状态报告 + if isinstance(vessel, dict): + final_volume_vessel = get_vessel_liquid_volume(vessel) + else: + final_volume_vessel = current_volume + # 🎊 总结 debug_print("🧼" * 20) debug_print(f"🎉 固体清洗协议生成完成! ✨") - debug_print(f"📊 总动作数: {len(action_sequence)} 个") - debug_print(f"🥽 清洗容器: {vessel}") - debug_print(f"🧪 使用溶剂: {solvent}") - debug_print(f"💧 清洗体积: {final_volume}mL × {final_repeats}次") + debug_print(f"📊 协议统计:") + debug_print(f" 📋 总动作数: {len(action_sequence)} 个") + debug_print(f" 🥽 清洗容器: {vessel_display}") + debug_print(f" 🧪 使用溶剂: {solvent}") + debug_print(f" 💧 单次体积: {final_volume}mL") + debug_print(f" 🔄 清洗次数: {final_repeats}次") + debug_print(f" 💧 总溶剂用量: {total_solvent_used:.2f}mL") + debug_print(f"📊 体积变化统计:") + debug_print(f" - 清洗前体积: {original_volume:.2f}mL") + debug_print(f" - 清洗后体积: {final_volume_vessel:.2f}mL") + debug_print(f" - 溶剂总用量: {total_solvent_used:.2f}mL") debug_print(f"⏱️ 预计总时间: {(final_time + 5) * final_repeats / 60:.1f} 分钟") debug_print("🧼" * 20) - return action_sequence \ No newline at end of file + return action_sequence + +# 🔧 新增:便捷函数 +def wash_with_water(G: nx.DiGraph, vessel: Union[str, dict], + volume: Union[float, str] = "50", + repeats: int = 2) -> List[Dict[str, Any]]: + """用水清洗固体""" + vessel_display = get_vessel_display_info(vessel) + debug_print(f"💧 水洗固体: {vessel_display} ({repeats} 次)") + return generate_wash_solid_protocol(G, vessel, "water", volume=volume, repeats=repeats) + +def wash_with_ethanol(G: nx.DiGraph, vessel: Union[str, dict], + volume: Union[float, str] = "30", + repeats: int = 1) -> List[Dict[str, Any]]: + """用乙醇清洗固体""" + vessel_display = get_vessel_display_info(vessel) + debug_print(f"🍺 乙醇洗固体: {vessel_display} ({repeats} 次)") + return generate_wash_solid_protocol(G, vessel, "ethanol", volume=volume, repeats=repeats) + +def wash_with_acetone(G: nx.DiGraph, vessel: Union[str, dict], + volume: Union[float, str] = "25", + repeats: int = 1) -> List[Dict[str, Any]]: + """用丙酮清洗固体""" + vessel_display = get_vessel_display_info(vessel) + debug_print(f"💨 丙酮洗固体: {vessel_display} ({repeats} 次)") + return generate_wash_solid_protocol(G, vessel, "acetone", volume=volume, repeats=repeats) + +def wash_with_ether(G: nx.DiGraph, vessel: Union[str, dict], + volume: Union[float, str] = "40", + repeats: int = 2) -> List[Dict[str, Any]]: + """用乙醚清洗固体""" + vessel_display = get_vessel_display_info(vessel) + debug_print(f"🌬️ 乙醚洗固体: {vessel_display} ({repeats} 次)") + return generate_wash_solid_protocol(G, vessel, "diethyl_ether", volume=volume, repeats=repeats) + +def wash_with_cold_solvent(G: nx.DiGraph, vessel: Union[str, dict], + solvent: str, volume: Union[float, str] = "30", + repeats: int = 1) -> List[Dict[str, Any]]: + """用冷溶剂清洗固体""" + vessel_display = get_vessel_display_info(vessel) + debug_print(f"❄️ 冷{solvent}洗固体: {vessel_display} ({repeats} 次)") + return generate_wash_solid_protocol(G, vessel, solvent, volume=volume, + temp=5.0, repeats=repeats) + +def wash_with_hot_solvent(G: nx.DiGraph, vessel: Union[str, dict], + solvent: str, volume: Union[float, str] = "50", + repeats: int = 1) -> List[Dict[str, Any]]: + """用热溶剂清洗固体""" + vessel_display = get_vessel_display_info(vessel) + debug_print(f"🔥 热{solvent}洗固体: {vessel_display} ({repeats} 次)") + return generate_wash_solid_protocol(G, vessel, solvent, volume=volume, + temp=60.0, repeats=repeats) + +def wash_with_stirring(G: nx.DiGraph, vessel: Union[str, dict], + solvent: str, volume: Union[float, str] = "50", + stir_time: Union[str, float] = "5 min", + repeats: int = 1) -> List[Dict[str, Any]]: + """带搅拌的溶剂清洗""" + vessel_display = get_vessel_display_info(vessel) + debug_print(f"🌪️ 搅拌清洗: {vessel_display} with {solvent} ({repeats} 次)") + return generate_wash_solid_protocol(G, vessel, solvent, volume=volume, + stir=True, stir_speed=200.0, + time=stir_time, repeats=repeats) + +def thorough_wash(G: nx.DiGraph, vessel: Union[str, dict], + solvent: str, volume: Union[float, str] = "50") -> List[Dict[str, Any]]: + """彻底清洗(多次重复)""" + vessel_display = get_vessel_display_info(vessel) + debug_print(f"🔄 彻底清洗: {vessel_display} with {solvent} (5 次)") + return generate_wash_solid_protocol(G, vessel, solvent, volume=volume, repeats=5) + +def quick_rinse(G: nx.DiGraph, vessel: Union[str, dict], + solvent: str, volume: Union[float, str] = "20") -> List[Dict[str, Any]]: + """快速冲洗(单次,小体积)""" + vessel_display = get_vessel_display_info(vessel) + debug_print(f"⚡ 快速冲洗: {vessel_display} with {solvent}") + return generate_wash_solid_protocol(G, vessel, solvent, volume=volume, repeats=1) + +def sequential_wash(G: nx.DiGraph, vessel: Union[str, dict], + solvents: list, volume: Union[float, str] = "40") -> List[Dict[str, Any]]: + """连续多溶剂清洗""" + vessel_display = get_vessel_display_info(vessel) + debug_print(f"📝 连续清洗: {vessel_display} with {' → '.join(solvents)}") + + action_sequence = [] + for solvent in solvents: + wash_actions = generate_wash_solid_protocol(G, vessel, solvent, + volume=volume, repeats=1) + action_sequence.extend(wash_actions) + + return action_sequence + +# 测试函数 +def test_wash_solid_protocol(): + """测试固体清洗协议""" + debug_print("🧪 === WASH SOLID PROTOCOL 测试 === ✨") + + # 测试vessel参数处理 + debug_print("🔧 测试vessel参数处理...") + + # 测试字典格式 + vessel_dict = {"id": "filter_flask_1", "name": "过滤瓶1", + "data": {"liquid_volume": 25.0}} + vessel_id = extract_vessel_id(vessel_dict) + vessel_display = get_vessel_display_info(vessel_dict) + volume = get_vessel_liquid_volume(vessel_dict) + debug_print(f" 字典格式: {vessel_dict}") + debug_print(f" → ID: {vessel_id}, 显示: {vessel_display}, 体积: {volume}mL") + + # 测试字符串格式 + vessel_str = "filter_flask_2" + vessel_id = extract_vessel_id(vessel_str) + vessel_display = get_vessel_display_info(vessel_str) + debug_print(f" 字符串格式: {vessel_str}") + debug_print(f" → ID: {vessel_id}, 显示: {vessel_display}") + + debug_print("✅ 测试完成 🎉") + +if __name__ == "__main__": + test_wash_solid_protocol() \ No newline at end of file diff --git a/unilabos/messages/__init__.py b/unilabos/messages/__init__.py index f91f382..4ef5ac9 100644 --- a/unilabos/messages/__init__.py +++ b/unilabos/messages/__init__.py @@ -11,8 +11,8 @@ class Point3D(BaseModel): class PumpTransferProtocol(BaseModel): # === 核心参数(保持必需) === - from_vessel: str - to_vessel: str + from_vessel: dict + to_vessel: dict # === 所有其他参数都改为可选,添加默认值 === volume: float = 0.0 # 🔧 改为-1,表示转移全部体积 @@ -95,7 +95,7 @@ class PumpTransferProtocol(BaseModel): class CleanProtocol(BaseModel): - vessel: str + vessel: dict solvent: str volume: float temp: float @@ -105,10 +105,10 @@ class CleanProtocol(BaseModel): class SeparateProtocol(BaseModel): purpose: str product_phase: str - from_vessel: str - separation_vessel: str - to_vessel: str - waste_phase_to_vessel: str + from_vessel: dict + separation_vessel: dict + to_vessel: dict + waste_phase_to_vessel: dict solvent: str solvent_volume: float through: str @@ -120,7 +120,7 @@ class SeparateProtocol(BaseModel): class EvaporateProtocol(BaseModel): # === 核心参数(必需) === - vessel: str = Field(..., description="蒸发容器名称") + vessel: dict = Field(..., description="蒸发容器名称") # === 所有其他参数都改为可选,添加默认值 === pressure: float = Field(0.1, description="真空度 (bar),默认0.1 bar") @@ -183,7 +183,7 @@ class EvaporateProtocol(BaseModel): class EvacuateAndRefillProtocol(BaseModel): # === 必需参数 === - vessel: str = Field(..., description="目标容器名称") + vessel: dict = Field(..., description="目标容器名称") gas: str = Field(..., description="气体名称") # 🔧 删除 repeats 参数,直接在代码中硬编码为 3 次 @@ -219,7 +219,7 @@ class AGVTransferProtocol(BaseModel): #=============新添加的新的协议================ class AddProtocol(BaseModel): - vessel: str + vessel: dict reagent: str volume: float mass: float @@ -231,17 +231,17 @@ class AddProtocol(BaseModel): purpose: str class CentrifugeProtocol(BaseModel): - vessel: str + vessel: dict speed: float time: float temp: float class FilterProtocol(BaseModel): # === 必需参数 === - vessel: str = Field(..., description="过滤容器名称") + vessel: dict = Field(..., description="过滤容器名称") # === 可选参数 === - filtrate_vessel: str = Field("", description="滤液容器名称(可选,自动查找)") + filtrate_vessel: dict = Field("", description="滤液容器名称(可选,自动查找)") def model_post_init(self, __context): """后处理:参数验证""" @@ -251,7 +251,7 @@ class FilterProtocol(BaseModel): class HeatChillProtocol(BaseModel): # === 必需参数 === - vessel: str = Field(..., description="加热容器名称") + vessel: dict = Field(..., description="加热容器名称") # === 可选参数 - 温度相关 === temp: float = Field(25.0, description="目标温度 (°C)") @@ -375,7 +375,7 @@ class HeatChillProtocol(BaseModel): class HeatChillStartProtocol(BaseModel): # === 必需参数 === - vessel: str = Field(..., description="加热容器名称") + vessel: dict = Field(..., description="加热容器名称") # === 可选参数 - 温度相关 === temp: float = Field(25.0, description="目标温度 (°C)") @@ -393,12 +393,12 @@ class HeatChillStartProtocol(BaseModel): class HeatChillStopProtocol(BaseModel): # === 必需参数 === - vessel: str = Field(..., description="加热容器名称") + vessel: dict = Field(..., description="加热容器名称") class StirProtocol(BaseModel): # === 必需参数 === - vessel: str = Field(..., description="搅拌容器名称") + vessel: dict = Field(..., description="搅拌容器名称") # === 可选参数 === time: str = Field("5 min", description="搅拌时间(如 '0.5 h', '30 min')") @@ -482,7 +482,7 @@ class StirProtocol(BaseModel): class StartStirProtocol(BaseModel): # === 必需参数 === - vessel: str = Field(..., description="搅拌容器名称") + vessel: dict = Field(..., description="搅拌容器名称") # === 可选参数,添加默认值 === stir_speed: float = Field(200.0, description="搅拌速度 (RPM),默认200 RPM") @@ -505,7 +505,7 @@ class StartStirProtocol(BaseModel): class StopStirProtocol(BaseModel): # === 必需参数 === - vessel: str = Field(..., description="搅拌容器名称") + vessel: dict = Field(..., description="搅拌容器名称") def model_post_init(self, __context): """后处理:参数验证""" @@ -515,8 +515,8 @@ class StopStirProtocol(BaseModel): raise ValueError("vessel 参数不能为空") class TransferProtocol(BaseModel): - from_vessel: str - to_vessel: str + from_vessel: dict + to_vessel: dict volume: float amount: str = "" time: float = 0 @@ -527,14 +527,14 @@ class TransferProtocol(BaseModel): solid: bool = False class CleanVesselProtocol(BaseModel): - vessel: str + vessel: dict solvent: str volume: float temp: float repeats: int = 1 class DissolveProtocol(BaseModel): - vessel: str + vessel: dict solvent: str volume: float amount: str = "" @@ -543,8 +543,8 @@ class DissolveProtocol(BaseModel): stir_speed: float = 0.0 class FilterThroughProtocol(BaseModel): - from_vessel: str - to_vessel: str + from_vessel: dict + to_vessel: dict filter_through: str eluting_solvent: str = "" eluting_volume: float = 0.0 @@ -552,18 +552,18 @@ class FilterThroughProtocol(BaseModel): residence_time: float = 0.0 class RunColumnProtocol(BaseModel): - from_vessel: str - to_vessel: str + from_vessel: dict + to_vessel: dict column: str class WashSolidProtocol(BaseModel): # === 必需参数 === - vessel: str = Field(..., description="装有固体的容器名称") + vessel: dict = Field(..., description="装有固体的容器名称") solvent: str = Field(..., description="清洗溶剂名称") volume: float = Field(..., description="清洗溶剂体积 (mL)") # === 可选参数,添加默认值 === - filtrate_vessel: str = Field("", description="滤液收集容器(可选,自动查找)") + filtrate_vessel: dict = Field("", description="滤液收集容器(可选,自动查找)") temp: float = Field(25.0, description="清洗温度 (°C),默认25°C") stir: bool = Field(False, description="是否搅拌,默认False") stir_speed: float = Field(0.0, description="搅拌速度 (RPM),默认0") @@ -604,7 +604,7 @@ class WashSolidProtocol(BaseModel): self.repeats = 10 class AdjustPHProtocol(BaseModel): - vessel: str = Field(..., description="目标容器") + vessel: dict = Field(..., description="目标容器") ph_value: float = Field(..., description="目标pH值") # 改为 ph_value reagent: str = Field(..., description="酸碱试剂名称") # 移除其他可选参数,使用默认值 @@ -614,19 +614,19 @@ class ResetHandlingProtocol(BaseModel): class DryProtocol(BaseModel): compound: str = Field(..., description="化合物名称") - vessel: str = Field(..., description="目标容器") + vessel: dict = Field(..., description="目标容器") class RecrystallizeProtocol(BaseModel): ratio: str = Field(..., description="溶剂比例(如 '1:1', '3:7')") solvent1: str = Field(..., description="第一种溶剂名称") solvent2: str = Field(..., description="第二种溶剂名称") - vessel: str = Field(..., description="目标容器") + vessel: dict = Field(..., description="目标容器") volume: float = Field(..., description="总体积 (mL)") class HydrogenateProtocol(BaseModel): temp: str = Field(..., description="反应温度(如 '45 °C')") time: str = Field(..., description="反应时间(如 '2 h')") - vessel: str = Field(..., description="反应容器") + vessel: dict = Field(..., description="反应容器") __all__ = [ "Point3D", "PumpTransferProtocol", "CleanProtocol", "SeparateProtocol", diff --git a/unilabos/registry/devices/virtual_device.yaml b/unilabos/registry/devices/virtual_device.yaml index 2ad2c5b..acaed03 100644 --- a/unilabos/registry/devices/virtual_device.yaml +++ b/unilabos/registry/devices/virtual_device.yaml @@ -3650,3 +3650,176 @@ virtual_vacuum_pump: - status type: object version: 0.0.1 +virtual_solid_dispenser: + class: + action_value_mappings: + auto-cleanup: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: cleanup的参数schema + properties: + feedback: {} + goal: + properties: {} + type: object + result: {} + required: + - goal + title: cleanup参数 + type: object + type: UniLabJsonCommandAsync + auto-initialize: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: initialize的参数schema + properties: + feedback: {} + goal: + properties: {} + type: object + result: {} + required: + - goal + title: initialize参数 + type: object + type: UniLabJsonCommandAsync + add_solid: + feedback: + current_status: status + progress: progress + goal: + vessel: vessel + reagent: reagent + mass: mass + mol: mol + purpose: purpose + event: event + rate_spec: rate_spec + equiv: equiv + ratio: ratio + goal_default: + vessel: '' + reagent: '' + mass: '' + mol: '' + purpose: '' + event: '' + rate_spec: '' + equiv: '' + ratio: '' + handles: [] + result: + success: success + message: message + return_info: return_info + schema: + description: '' + properties: + feedback: + properties: + current_status: + type: string + progress: + type: number + type: object + goal: + properties: + vessel: + type: string + reagent: + type: string + mass: + type: string + mol: + type: string + purpose: + type: string + event: + type: string + rate_spec: + type: string + equiv: + type: string + ratio: + type: string + type: object + result: + properties: + success: + type: boolean + message: + type: string + return_info: + type: string + type: object + required: + - goal + title: AddSolid + type: object + type: Add # 🔧 使用 Add action type + module: unilabos.devices.virtual.virtual_solid_dispenser:VirtualSolidDispenser + status_types: + status: str + current_reagent: str + dispensed_amount: float + total_operations: int + type: python + description: Virtual Solid Dispenser for Add Protocol Testing - supports mass and molar additions + handles: + - data_key: solid_out + data_source: executor + data_type: resource + description: 固体试剂输出口 + handler_key: SolidOut + io_type: source + label: SolidOut + side: SOUTH + - data_key: solid_in + data_source: handle + data_type: resource + description: 固体试剂输入口(连接试剂瓶) + handler_key: SolidIn + io_type: target + label: SolidIn + side: NORTH + icon: '' + init_param_schema: + config: + properties: + max_capacity: + default: 100.0 + type: number + precision: + default: 0.001 + type: number + config: + type: object + device_id: + type: string + required: [] + type: object + data: + properties: + status: + type: string + current_reagent: + type: string + dispensed_amount: + type: number + total_operations: + type: integer + required: + - status + - current_reagent + - dispensed_amount + - total_operations + type: object + version: 0.0.1 \ No newline at end of file diff --git a/unilabos/ros/msgs/message_converter.py b/unilabos/ros/msgs/message_converter.py index 932ff60..b0716aa 100644 --- a/unilabos/ros/msgs/message_converter.py +++ b/unilabos/ros/msgs/message_converter.py @@ -508,47 +508,90 @@ def convert_from_ros_msg_with_mapping(ros_msg: Any, value_mapping: Dict[str, str Python字典 """ data: Dict[str, Any] = {} + + # # 🔧 添加调试信息 + # print(f"🔍 convert_from_ros_msg_with_mapping 开始") + # print(f"🔍 ros_msg 类型: {type(ros_msg)}") + # print(f"🔍 ros_msg 内容: {ros_msg}") + # print(f"🔍 value_mapping: {value_mapping}") + # print("-" * 60) for msg_name, attr_name in value_mapping.items(): + # print(f"🔍 处理映射: {msg_name} -> {attr_name}") + msg_path = msg_name.split(".") current = ros_msg - + + # print(f"🔍 msg_path: {msg_path}") + # print(f"🔍 current 初始值: {current} (类型: {type(current)})") + try: if not attr_name.endswith("[]"): # 处理单值映射 - for name in msg_path: - current = getattr(current, name) - data[attr_name] = convert_from_ros_msg(current) + # print(f"🔍 处理单值映射") + for i, name in enumerate(msg_path): + # print(f"🔍 步骤 {i}: 获取属性 '{name}' 从 {type(current)}") + if hasattr(current, name): + current = getattr(current, name) + # print(f"🔍 获取到: {current} (类型: {type(current)})") + else: + # print(f"❌ 属性 '{name}' 不存在于 {type(current)}") + break + + converted_value = convert_from_ros_msg(current) + # print(f"🔍 转换后的值: {converted_value} (类型: {type(converted_value)})") + data[attr_name] = converted_value + # print(f"✅ 设置 data['{attr_name}'] = {converted_value}") else: # 处理列表值映射 - for name in msg_path: + # print(f"🔍 处理列表值映射") + for i, name in enumerate(msg_path): + # print(f"🔍 列表步骤 {i}: 处理 '{name}' 从 {type(current)}") if name.endswith("[]"): base_name = name[:-2] + # print(f"🔍 数组字段 base_name: '{base_name}'") if hasattr(current, base_name): current = list(getattr(current, base_name)) + # print(f"🔍 获取数组: {current} (长度: {len(current)})") else: + # print(f"❌ 数组字段 '{base_name}' 不存在") current = [] break else: if isinstance(current, list): + # print(f"🔍 从列表中获取属性 '{name}'") next_level = [] for item in current: if hasattr(item, name): next_level.append(getattr(item, name)) current = next_level + # print(f"🔍 列表处理结果: {current} (长度: {len(current)})") elif hasattr(current, name): current = getattr(current, name) + # print(f"🔍 获取到属性: {current} (类型: {type(current)})") else: + # print(f"❌ 属性 '{name}' 不存在") current = [] break attr_key = attr_name[:-2] if current: - data[attr_key] = [convert_from_ros_msg(item) for item in current] - except (AttributeError, TypeError): + converted_list = [convert_from_ros_msg(item) for item in current] + data[attr_key] = converted_list + # print(f"✅ 设置 data['{attr_key}'] = {converted_list}") + else: + print(f"⚠️ 列表为空,跳过 '{attr_key}'") + except (AttributeError, TypeError) as e: + # print(f"❌ 映射转换错误 {msg_name} -> {attr_name}: {e}") logger.debug(f"Mapping conversion error for {msg_name} -> {attr_name}") continue + + # print(f"🔍 当前 data 状态: {data}") + # print("-" * 40) + #print(f"🔍 convert_from_ros_msg_with_mapping 结束") + #print(f"🔍 最终 data: {data}") + #print("=" * 60) return data diff --git a/unilabos/ros/nodes/base_device_node.py b/unilabos/ros/nodes/base_device_node.py index 3589bd4..4e3e304 100644 --- a/unilabos/ros/nodes/base_device_node.py +++ b/unilabos/ros/nodes/base_device_node.py @@ -629,7 +629,7 @@ class BaseROS2DeviceNode(Node, Generic[T]): execution_success = False action_return_value = None - self.lab_logger().info(f"执行动作: {action_name}") + ##### self.lab_logger().info(f"执行动作: {action_name}") goal = goal_handle.request # 从目标消息中提取参数, 并调用对应的方法 @@ -685,14 +685,14 @@ class BaseROS2DeviceNode(Node, Generic[T]): final_resource = [convert_resources_to_type([i], final_type)[0] for i in resources_list] action_kwargs[k] = self.resource_tracker.figure_resource(final_resource) - self.lab_logger().info(f"准备执行: {action_kwargs}, 函数: {ACTION.__name__}") + ##### self.lab_logger().info(f"准备执行: {action_kwargs}, 函数: {ACTION.__name__}") time_start = time.time() time_overall = 100 # 将阻塞操作放入线程池执行 if asyncio.iscoroutinefunction(ACTION): try: - self.lab_logger().info(f"异步执行动作 {ACTION}") + ##### self.lab_logger().info(f"异步执行动作 {ACTION}") future = ROS2DeviceNode.run_async_func(ACTION, trace_error=False, **action_kwargs) def _handle_future_exception(fut): @@ -702,7 +702,7 @@ class BaseROS2DeviceNode(Node, Generic[T]): execution_success = True except Exception as e: execution_error = traceback.format_exc() - error(f"异步任务 {ACTION.__name__} 报错了") + ##### error(f"异步任务 {ACTION.__name__} 报错了") error(traceback.format_exc()) future.add_done_callback(_handle_future_exception) @@ -710,7 +710,7 @@ class BaseROS2DeviceNode(Node, Generic[T]): self.lab_logger().error(f"创建异步任务失败: {traceback.format_exc()}") raise e else: - self.lab_logger().info(f"同步执行动作 {ACTION}") + ##### self.lab_logger().info(f"同步执行动作 {ACTION}") future = self._executor.submit(ACTION, **action_kwargs) def _handle_future_exception(fut): @@ -765,7 +765,7 @@ class BaseROS2DeviceNode(Node, Generic[T]): self.lab_logger().info(f"动作 {action_name} 已取消") return action_type.Result() - self.lab_logger().info(f"动作执行完成: {action_name}") + ##### self.lab_logger().info(f"动作执行完成: {action_name}") del future # 向Host更新物料当前状态 @@ -801,7 +801,7 @@ class BaseROS2DeviceNode(Node, Generic[T]): # 发布结果 goal_handle.succeed() - self.lab_logger().info(f"设置动作成功: {action_name}") + ##### self.lab_logger().info(f"设置动作成功: {action_name}") result_values = {} for msg_name, attr_name in action_value_mapping["result"].items(): @@ -820,7 +820,7 @@ class BaseROS2DeviceNode(Node, Generic[T]): 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} 完成并返回结果") + ##### self.lab_logger().info(f"动作 {action_name} 完成并返回结果") return result_msg return execute_callback diff --git a/unilabos/ros/nodes/presets/host_node.py b/unilabos/ros/nodes/presets/host_node.py index c7c273d..8356563 100644 --- a/unilabos/ros/nodes/presets/host_node.py +++ b/unilabos/ros/nodes/presets/host_node.py @@ -563,7 +563,7 @@ class HostNode(BaseROS2DeviceNode): if hasattr(bridge, "publish_device_status"): bridge.publish_device_status(self.device_status, device_id, property_name) self.lab_logger().debug( - f"[Host Node] Status updated: {device_id}.{property_name} = {msg.data}" + f"[Host Node] Status updated: {device_id}.{property_name} = {msg.data}" ) def send_goal( diff --git a/unilabos/ros/nodes/presets/protocol_node.py b/unilabos/ros/nodes/presets/protocol_node.py index 5c8ffbd..a17d4e9 100644 --- a/unilabos/ros/nodes/presets/protocol_node.py +++ b/unilabos/ros/nodes/presets/protocol_node.py @@ -182,26 +182,54 @@ class ROS2ProtocolNode(BaseROS2DeviceNode): # 从目标消息中提取参数, 并调用Protocol生成器(根据设备连接图)生成action步骤 goal = goal_handle.request protocol_kwargs = convert_from_ros_msg_with_mapping(goal, action_value_mapping["goal"]) + + # # 🔧 添加调试信息 + # print(f"🔍 转换后的 protocol_kwargs: {protocol_kwargs}") + # print(f"🔍 vessel 在转换后: {protocol_kwargs.get('vessel', 'NOT_FOUND')}") - # 向Host查询物料当前状态 - for k, v in goal.get_fields_and_field_types().items(): - if v in ["unilabos_msgs/Resource", "sequence"]: - r = ResourceGet.Request() - resource_id = ( - protocol_kwargs[k]["id"] if v == "unilabos_msgs/Resource" else protocol_kwargs[k][0]["id"] - ) - r.id = resource_id - r.with_children = True - response = await self._resource_clients["resource_get"].call_async(r) - protocol_kwargs[k] = list_to_nested_dict( - [convert_from_ros_msg(rs) for rs in response.resources] - ) + # # 🔧 完全禁用Host查询,直接使用转换后的数据 + # print(f"🔧 跳过Host查询,直接使用转换后的数据") + + # 🔧 额外验证:确保vessel数据完整 + if 'vessel' in protocol_kwargs: + vessel_data = protocol_kwargs['vessel'] + #print(f"🔍 验证vessel数据: {vessel_data}") + + # 如果vessel是空字典,尝试重新构建 + if not vessel_data or (isinstance(vessel_data, dict) and not vessel_data): + # print(f"⚠️ vessel数据为空,尝试从原始goal重新提取...") + + # 直接从原始goal提取vessel + if hasattr(goal, 'vessel') and goal.vessel: + # print(f"🔍 原始goal.vessel: {goal.vessel}") + # 手动转换vessel + vessel_data = { + 'id': goal.vessel.id, + 'name': goal.vessel.name, + 'type': goal.vessel.type, + 'category': goal.vessel.category, + 'config': goal.vessel.config, + 'data': goal.vessel.data + } + protocol_kwargs['vessel'] = vessel_data + # print(f"✅ 手动重建vessel数据: {vessel_data}") + else: + # print(f"❌ 无法从原始goal提取vessel数据") + # 创建一个基本的vessel + vessel_data = {'id': 'default_vessel'} + protocol_kwargs['vessel'] = vessel_data + # print(f"🔧 创建默认vessel: {vessel_data}") + + #print(f"🔍 最终传递给协议的 protocol_kwargs: {protocol_kwargs}") + #print(f"🔍 最终的 vessel: {protocol_kwargs.get('vessel', 'NOT_FOUND')}") from unilabos.resources.graphio import physical_setup_graph self.lab_logger().info(f"Working on physical setup: {physical_setup_graph}") + self.lab_logger().info(f"Protocol kwargs: {goal}") + self.lab_logger().info(f"Protocol kwargs: {action_value_mapping}") protocol_steps = protocol_steps_generator(G=physical_setup_graph, **protocol_kwargs) - + self.lab_logger().info(f"Goal received: {protocol_kwargs}, running steps: \n{protocol_steps}") time_start = time.time() @@ -235,14 +263,14 @@ class ROS2ProtocolNode(BaseROS2DeviceNode): } ) - # 向Host更新物料当前状态 - for k, v in goal.get_fields_and_field_types().items(): - if v in ["unilabos_msgs/Resource", "sequence"]: - r = ResourceUpdate.Request() - r.resources = [ - convert_to_ros_msg(Resource, rs) for rs in nested_dict_to_list(protocol_kwargs[k]) - ] - response = await self._resource_clients["resource_update"].call_async(r) + # # 向Host更新物料当前状态 + # for k, v in goal.get_fields_and_field_types().items(): + # if v in ["unilabos_msgs/Resource", "sequence"]: + # r = ResourceUpdate.Request() + # r.resources = [ + # convert_to_ros_msg(Resource, rs) for rs in nested_dict_to_list(protocol_kwargs[k]) + # ] + # response = await self._resource_clients["resource_update"].call_async(r) # 设置成功状态和返回值 execution_success = True @@ -287,7 +315,7 @@ class ROS2ProtocolNode(BaseROS2DeviceNode): serialize_result_info(execution_error, execution_success, protocol_return_value), ) - self.lab_logger().info(f"协议 {protocol_name} 完成并返回结果") + self.lab_logger().info(f"🤩🤩🤩🤩🤩🤩协议 {protocol_name} 完成并返回结果😎😎😎😎😎😎") return result return execute_protocol @@ -309,7 +337,7 @@ class ROS2ProtocolNode(BaseROS2DeviceNode): action_client = self._action_clients[action_id] goal_msg = convert_to_ros_msg(action_client._action_type.Goal(), action_kwargs) - self.lab_logger().info(f"发送动作请求到: {action_id}") + ##### self.lab_logger().info(f"发送动作请求到: {action_id}") action_client.wait_for_server() # 等待动作完成 @@ -321,7 +349,7 @@ class ROS2ProtocolNode(BaseROS2DeviceNode): return None result_future = await handle.get_result_async() - self.lab_logger().info(f"动作完成: {action_name}") + ##### self.lab_logger().info(f"动作完成: {action_name}") return result_future.result diff --git a/unilabos_msgs/action/Add.action b/unilabos_msgs/action/Add.action index 021199a..609e9f2 100644 --- a/unilabos_msgs/action/Add.action +++ b/unilabos_msgs/action/Add.action @@ -1,5 +1,5 @@ # Goal - 添加试剂的目标参数 -string vessel # 目标容器(必需) +Resource vessel # 目标容器(必需) string reagent # 试剂名称(必需) string volume # 体积(如 "2.7 mL",可选) string mass # 质量(如 "19.3 g",可选) diff --git a/unilabos_msgs/action/AddSolid.action b/unilabos_msgs/action/AddSolid.action index 8812441..c5fc7ce 100644 --- a/unilabos_msgs/action/AddSolid.action +++ b/unilabos_msgs/action/AddSolid.action @@ -1,5 +1,5 @@ # Goal - 固体加样操作的目标参数 -string vessel # 目标容器(必需) +Resource vessel # 目标容器(必需) string reagent # 试剂名称(必需) string mass # 质量字符串(如 "2.9 g",可选) string mol # 摩尔数字符串(如 "0.12 mol",可选) diff --git a/unilabos_msgs/action/AdjustPH.action b/unilabos_msgs/action/AdjustPH.action index 815ccf7..33e2f4d 100644 --- a/unilabos_msgs/action/AdjustPH.action +++ b/unilabos_msgs/action/AdjustPH.action @@ -1,5 +1,5 @@ # Request - 与您的 AdjustPHProtocol 类匹配 -string vessel +Resource vessel float64 ph_value string reagent --- diff --git a/unilabos_msgs/action/Centrifuge.action b/unilabos_msgs/action/Centrifuge.action index 356ccb9..755b6d1 100644 --- a/unilabos_msgs/action/Centrifuge.action +++ b/unilabos_msgs/action/Centrifuge.action @@ -1,5 +1,5 @@ # Goal - 离心操作的目标参数 -string vessel # 离心容器 +Resource vessel # 离心容器 float64 speed # 离心速度 (rpm) float64 time # 离心时间 (秒) float64 temp # 温度 (可选,摄氏度) diff --git a/unilabos_msgs/action/Clean.action b/unilabos_msgs/action/Clean.action index 8fb9be1..7318296 100644 --- a/unilabos_msgs/action/Clean.action +++ b/unilabos_msgs/action/Clean.action @@ -1,5 +1,5 @@ # Organic -string vessel # Vessel to clean. +Resource vessel # Vessel to clean. string solvent # Solvent to clean vessel with. float64 volume # Optional. Volume of solvent to clean vessel with. float64 temp # Optional. Temperature to heat vessel to while cleaning. diff --git a/unilabos_msgs/action/CleanVessel.action b/unilabos_msgs/action/CleanVessel.action index cba232a..950e9e2 100644 --- a/unilabos_msgs/action/CleanVessel.action +++ b/unilabos_msgs/action/CleanVessel.action @@ -1,4 +1,4 @@ -string vessel # 要清洗的容器名称 +Resource vessel # 要清洗的容器名称 string solvent # 用于清洗容器的溶剂名称 float64 volume # 清洗溶剂的体积,可选参数 float64 temp # 清洗时的温度,可选参数 diff --git a/unilabos_msgs/action/Crystallize.action b/unilabos_msgs/action/Crystallize.action index 50d26cf..6b0f537 100644 --- a/unilabos_msgs/action/Crystallize.action +++ b/unilabos_msgs/action/Crystallize.action @@ -1,5 +1,5 @@ # Goal - 结晶操作的目标参数 -string vessel # 结晶容器 +Resource vessel # 结晶容器 float64 ramp_time # 升温/降温时间 (可选,秒) float64 ramp_temp # 目标温度 (可选,摄氏度) --- diff --git a/unilabos_msgs/action/Dissolve.action b/unilabos_msgs/action/Dissolve.action index f070a61..be2cc46 100644 --- a/unilabos_msgs/action/Dissolve.action +++ b/unilabos_msgs/action/Dissolve.action @@ -1,5 +1,5 @@ # Goal - 溶解操作的目标参数 -string vessel # 装有要溶解物质的容器名称(必需) +Resource vessel # 装有要溶解物质的容器名称(必需) string solvent # 用于溶解物质的溶剂名称(可选) string volume # 溶剂的体积(如 "10 mL",可选) string amount # 要溶解物质的量描述(可选) diff --git a/unilabos_msgs/action/Dry.action b/unilabos_msgs/action/Dry.action index ec10c9a..224b21e 100644 --- a/unilabos_msgs/action/Dry.action +++ b/unilabos_msgs/action/Dry.action @@ -1,6 +1,6 @@ # Request string compound # 化合物 -string vessel # 干燥容器 +Resource vessel # 干燥容器 --- # Result bool success # 操作是否成功 diff --git a/unilabos_msgs/action/EvacuateAndRefill.action b/unilabos_msgs/action/EvacuateAndRefill.action index 461cb28..9e33855 100644 --- a/unilabos_msgs/action/EvacuateAndRefill.action +++ b/unilabos_msgs/action/EvacuateAndRefill.action @@ -1,5 +1,5 @@ # Organic Synthesis Station EvacuateAndRefill Action -string vessel +Resource vessel string gas --- string return_info diff --git a/unilabos_msgs/action/Evaporate.action b/unilabos_msgs/action/Evaporate.action index 9cecb62..1a3973c 100644 --- a/unilabos_msgs/action/Evaporate.action +++ b/unilabos_msgs/action/Evaporate.action @@ -1,5 +1,5 @@ # Organic Synthesis Station Evaporate Action -string vessel # 目标容器 +Resource vessel # 目标容器 float64 pressure # 真空度 float64 temp # 温度 string time # 🔧 蒸发时间(支持带单位,如"3 min","180",默认秒) diff --git a/unilabos_msgs/action/Filter.action b/unilabos_msgs/action/Filter.action index 42a8913..916697b 100644 --- a/unilabos_msgs/action/Filter.action +++ b/unilabos_msgs/action/Filter.action @@ -1,6 +1,6 @@ # Goal - 过滤操作的目标参数 -string vessel # 过滤容器(必需) -string filtrate_vessel # 滤液容器(可选) +Resource vessel # 过滤容器(必需) +Resource filtrate_vessel # 滤液容器(可选) bool stir # 是否搅拌(默认false) float64 stir_speed # 搅拌速度(默认0.0) float64 temp # 温度(默认25.0) diff --git a/unilabos_msgs/action/FilterThrough.action b/unilabos_msgs/action/FilterThrough.action index dbabd12..0d9de9b 100644 --- a/unilabos_msgs/action/FilterThrough.action +++ b/unilabos_msgs/action/FilterThrough.action @@ -1,6 +1,6 @@ -string from_vessel # 源容器的名称,即物质起始所在的容器 -string to_vessel # 目标容器的名称,物质过滤后要到达的容器 -string filter_through # 过滤时所通过的介质,如滤纸、柱子等 +Resource from_vessel # 源容器的名称,即物质起始所在的容器 +Resource to_vessel # 目标容器的名称,物质过滤后要到达的容器 +Resource filter_through # 过滤时所通过的介质,如滤纸、柱子等 string eluting_solvent # 洗脱溶剂的名称,可选参数 float64 eluting_volume # 洗脱溶剂的体积,可选参数 int32 eluting_repeats # 洗脱操作的重复次数,默认为 0 diff --git a/unilabos_msgs/action/HeatChill.action b/unilabos_msgs/action/HeatChill.action index 1e7025e..ace7508 100644 --- a/unilabos_msgs/action/HeatChill.action +++ b/unilabos_msgs/action/HeatChill.action @@ -1,5 +1,5 @@ # Goal - 加热冷却操作的目标参数 -string vessel # 加热容器名称(必需) +Resource vessel # 加热容器名称(必需) float64 temp # 目标温度(可选,默认25.0) string time # 🔧 加热时间(支持带单位,如"5 min","300",默认秒) string temp_spec # 温度规格(可选) diff --git a/unilabos_msgs/action/HeatChillStart.action b/unilabos_msgs/action/HeatChillStart.action index 565bad1..4a9947c 100644 --- a/unilabos_msgs/action/HeatChillStart.action +++ b/unilabos_msgs/action/HeatChillStart.action @@ -1,5 +1,5 @@ # Organic -string vessel +Resource vessel float64 temp string purpose --- diff --git a/unilabos_msgs/action/HeatChillStop.action b/unilabos_msgs/action/HeatChillStop.action index 280ca15..1855448 100644 --- a/unilabos_msgs/action/HeatChillStop.action +++ b/unilabos_msgs/action/HeatChillStop.action @@ -1,5 +1,5 @@ # Organic -string vessel +Resource vessel --- string return_info bool success diff --git a/unilabos_msgs/action/Hydrogenate.action b/unilabos_msgs/action/Hydrogenate.action index 72f9459..4fa7fa9 100644 --- a/unilabos_msgs/action/Hydrogenate.action +++ b/unilabos_msgs/action/Hydrogenate.action @@ -1,7 +1,7 @@ # Request string temp string time -string vessel +Resource vessel --- # Result bool success diff --git a/unilabos_msgs/action/PumpTransfer.action b/unilabos_msgs/action/PumpTransfer.action index c8ca445..c551139 100644 --- a/unilabos_msgs/action/PumpTransfer.action +++ b/unilabos_msgs/action/PumpTransfer.action @@ -1,6 +1,6 @@ # Organic -string from_vessel -string to_vessel +Resource from_vessel +Resource to_vessel float64 volume string amount float64 time diff --git a/unilabos_msgs/action/Purge.action b/unilabos_msgs/action/Purge.action index 00d76b3..8928619 100644 --- a/unilabos_msgs/action/Purge.action +++ b/unilabos_msgs/action/Purge.action @@ -1,5 +1,5 @@ # Goal - 清洗/吹扫操作的目标参数 -string vessel # 清洗容器 +Resource vessel # 清洗容器 string gas # 清洗气体 (可选) float64 time # 清洗时间 (可选,秒) float64 pressure # 压力 (可选,Pa) diff --git a/unilabos_msgs/action/Recrystallize.action b/unilabos_msgs/action/Recrystallize.action index 2ae42bf..0b41746 100644 --- a/unilabos_msgs/action/Recrystallize.action +++ b/unilabos_msgs/action/Recrystallize.action @@ -2,7 +2,7 @@ string ratio # 溶剂比例(如"1:1","3:7") string solvent1 # 第一种溶剂 string solvent2 # 第二种溶剂 -string vessel # 目标容器 +Resource vessel # 目标容器 string volume # 🔧 总体积(支持带单位,如"100 mL","50",默认mL) --- # Result diff --git a/unilabos_msgs/action/ResetHandling.action b/unilabos_msgs/action/ResetHandling.action index d07f240..e29c488 100644 --- a/unilabos_msgs/action/ResetHandling.action +++ b/unilabos_msgs/action/ResetHandling.action @@ -1,5 +1,6 @@ # Request string solvent +Resource vessel --- # Result bool success diff --git a/unilabos_msgs/action/RunColumn.action b/unilabos_msgs/action/RunColumn.action index 1f8e9ba..a22928d 100644 --- a/unilabos_msgs/action/RunColumn.action +++ b/unilabos_msgs/action/RunColumn.action @@ -1,6 +1,6 @@ # Goal - 柱层析操作的目标参数 -string from_vessel # 源容器的名称,即样品起始所在的容器(必需) -string to_vessel # 目标容器的名称,分离后的样品要到达的容器(必需) +Resource from_vessel # 源容器的名称,即样品起始所在的容器(必需) +Resource to_vessel # 目标容器的名称,分离后的样品要到达的容器(必需) string column # 所使用的柱子的名称(必需) string rf # Rf值(可选) string pct1 # 第一种溶剂百分比(如 "40 %",可选) diff --git a/unilabos_msgs/action/Separate.action b/unilabos_msgs/action/Separate.action index fc185b6..83436d5 100644 --- a/unilabos_msgs/action/Separate.action +++ b/unilabos_msgs/action/Separate.action @@ -1,13 +1,13 @@ # Goal - 分离操作的目标参数 -string vessel # 分离容器名称(XDL参数,必需) +Resource vessel # 分离容器名称(XDL参数,必需) string purpose # 分离目的 ('wash', 'extract', 'separate',可选) string product_phase # 产物相 ('top', 'bottom',可选) -string from_vessel # 源容器(可选) -string separation_vessel # 分离容器(与vessel同义,可选) -string to_vessel # 目标容器(可选) -string waste_phase_to_vessel # 废相目标容器(可选) -string product_vessel # 产物收集容器(XDL参数,可选) -string waste_vessel # 废液收集容器(XDL参数,可选) +Resource from_vessel # 源容器(可选) +Resource separation_vessel # 分离容器(与vessel同义,可选) +Resource to_vessel # 目标容器(可选) +Resource waste_phase_to_vessel # 废相目标容器(可选) +Resource product_vessel # 产物收集容器(XDL参数,可选) +Resource waste_vessel # 废液收集容器(XDL参数,可选) string solvent # 溶剂名称(可选) string solvent_volume # 溶剂体积(如 "200 mL",可选) string volume # 体积规格(XDL参数,如 "?",可选) diff --git a/unilabos_msgs/action/StartPurge.action b/unilabos_msgs/action/StartPurge.action index f5500a6..207019c 100644 --- a/unilabos_msgs/action/StartPurge.action +++ b/unilabos_msgs/action/StartPurge.action @@ -1,5 +1,5 @@ # Goal - 启动清洗/吹扫操作的目标参数 -string vessel # 清洗容器 +Resource vessel # 清洗容器 string gas # 清洗气体 (可选) float64 pressure # 压力 (可选,Pa) float64 flow_rate # 流速 (可选,mL/min) diff --git a/unilabos_msgs/action/StartStir.action b/unilabos_msgs/action/StartStir.action index 534c9f3..30c8301 100644 --- a/unilabos_msgs/action/StartStir.action +++ b/unilabos_msgs/action/StartStir.action @@ -1,5 +1,5 @@ # Goal - 启动搅拌操作的目标参数 -string vessel # 搅拌容器 +Resource vessel # 搅拌容器 float64 stir_speed # 搅拌速度 (可选,rpm) string purpose # 搅拌目的 (可选) --- diff --git a/unilabos_msgs/action/Stir.action b/unilabos_msgs/action/Stir.action index e3e5580..0760672 100644 --- a/unilabos_msgs/action/Stir.action +++ b/unilabos_msgs/action/Stir.action @@ -1,5 +1,5 @@ # Goal - 搅拌操作的目标参数 -string vessel # 搅拌容器名称(必需) +Resource vessel # 搅拌容器名称(必需) string time # 🔧 搅拌时间(如 "0.5 h", "30 min", "300",默认秒) string event # 事件标识(如 "A", "B") string time_spec # 时间规格(如 "several minutes") diff --git a/unilabos_msgs/action/StopPurge.action b/unilabos_msgs/action/StopPurge.action index b7db891..123fa35 100644 --- a/unilabos_msgs/action/StopPurge.action +++ b/unilabos_msgs/action/StopPurge.action @@ -1,5 +1,5 @@ # Goal - 停止清洗/吹扫操作的目标参数 -string vessel # 清洗容器 +Resource vessel # 清洗容器 --- # Result - 操作结果 bool success # 操作是否成功 diff --git a/unilabos_msgs/action/StopStir.action b/unilabos_msgs/action/StopStir.action index a320598..135d0b7 100644 --- a/unilabos_msgs/action/StopStir.action +++ b/unilabos_msgs/action/StopStir.action @@ -1,5 +1,5 @@ # Goal - 停止搅拌操作的目标参数 -string vessel # 搅拌容器 +Resource vessel # 搅拌容器 --- # Result - 操作结果 bool success # 操作是否成功 diff --git a/unilabos_msgs/action/WashSolid.action b/unilabos_msgs/action/WashSolid.action index 281ca4c..99ba297 100644 --- a/unilabos_msgs/action/WashSolid.action +++ b/unilabos_msgs/action/WashSolid.action @@ -1,8 +1,8 @@ # Goal - 固体清洗操作的目标参数 -string vessel # 装有固体的容器名称(必需) +Resource vessel # 装有固体的容器名称(必需) string solvent # 清洗溶剂名称(必需) string volume # 🔧 体积(支持数字和带单位的字符串,如"100 mL","?") -string filtrate_vessel # 滤液收集容器(可选,默认"") +Resource filtrate_vessel # 滤液收集容器(可选,默认"") float64 temp # 清洗温度(可选,默认25.0) bool stir # 是否搅拌(可选,默认false) float64 stir_speed # 搅拌速度(可选,默认0.0) From 2a686e6ff2c9657f33d14806229536793cf903fe Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Fri, 18 Jul 2025 03:19:38 +0800 Subject: [PATCH 67/96] modify prcxi --- test/experiments/prcxi.json | 1 + .../liquid_handler_abstract.py | 56 +++++++++---------- .../devices/liquid_handling/prcxi/prcxi.py | 12 ++-- unilabos/registry/devices/liquid_handler.yaml | 4 ++ 4 files changed, 39 insertions(+), 34 deletions(-) diff --git a/test/experiments/prcxi.json b/test/experiments/prcxi.json index 8926b82..faf06bb 100644 --- a/test/experiments/prcxi.json +++ b/test/experiments/prcxi.json @@ -23,6 +23,7 @@ "channel_num": 1, "setup": false, "debug": true, + "simulator": false, "matrix_id": "fd383e6d-2d0e-40b5-9c01-1b2870b1f1b1" }, "data": {}, diff --git a/unilabos/devices/liquid_handling/liquid_handler_abstract.py b/unilabos/devices/liquid_handling/liquid_handler_abstract.py index d7de9db..27535d2 100644 --- a/unilabos/devices/liquid_handling/liquid_handler_abstract.py +++ b/unilabos/devices/liquid_handling/liquid_handler_abstract.py @@ -36,7 +36,7 @@ class LiquidHandlerMiddleware(LiquidHandler): async def setup(self, **backend_kwargs): if self._simulator: - await self._simulate_handler.setup(**backend_kwargs) + return await self._simulate_handler.setup(**backend_kwargs) return await super().setup(**backend_kwargs) def serialize_state(self) -> Dict[str, Any]: @@ -105,7 +105,7 @@ class LiquidHandlerMiddleware(LiquidHandler): **backend_kwargs, ): if self._simulator: - await self._simulate_handler.pick_up_tips(tip_spots, use_channels, offsets, **backend_kwargs) + return await self._simulate_handler.pick_up_tips(tip_spots, use_channels, offsets, **backend_kwargs) return await super().pick_up_tips(tip_spots, use_channels, offsets, **backend_kwargs) async def drop_tips( @@ -117,7 +117,7 @@ class LiquidHandlerMiddleware(LiquidHandler): **backend_kwargs, ): if self._simulator: - await self._simulate_handler.drop_tips( + return await self._simulate_handler.drop_tips( tip_spots, use_channels, offsets, allow_nonzero_volume, **backend_kwargs ) return await super().drop_tips(tip_spots, use_channels, offsets, allow_nonzero_volume, **backend_kwargs) @@ -126,7 +126,7 @@ class LiquidHandlerMiddleware(LiquidHandler): self, use_channels: Optional[list[int]] = None, allow_nonzero_volume: bool = False, **backend_kwargs ): if self._simulator: - await self._simulate_handler.return_tips(use_channels, allow_nonzero_volume, **backend_kwargs) + return await self._simulate_handler.return_tips(use_channels, allow_nonzero_volume, **backend_kwargs) return await super().return_tips(use_channels, allow_nonzero_volume, **backend_kwargs) async def discard_tips( @@ -137,7 +137,7 @@ class LiquidHandlerMiddleware(LiquidHandler): **backend_kwargs, ): if self._simulator: - await self._simulate_handler.discard_tips(use_channels, allow_nonzero_volume, offsets, **backend_kwargs) + return await self._simulate_handler.discard_tips(use_channels, allow_nonzero_volume, offsets, **backend_kwargs) return await super().discard_tips(use_channels, allow_nonzero_volume, offsets, **backend_kwargs) def _check_containers(self, resources: Sequence[Resource]): @@ -156,7 +156,7 @@ class LiquidHandlerMiddleware(LiquidHandler): **backend_kwargs, ): if self._simulator: - await self._simulate_handler.aspirate( + return await self._simulate_handler.aspirate( resources, vols, use_channels, @@ -192,7 +192,7 @@ class LiquidHandlerMiddleware(LiquidHandler): **backend_kwargs, ): if self._simulator: - await self._simulate_handler.dispense( + return await self._simulate_handler.dispense( resources, vols, use_channels, @@ -227,7 +227,7 @@ class LiquidHandlerMiddleware(LiquidHandler): **backend_kwargs, ): if self._simulator: - await self._simulate_handler.transfer( + return await self._simulate_handler.transfer( source, targets, source_vol, @@ -255,7 +255,7 @@ class LiquidHandlerMiddleware(LiquidHandler): async def pick_up_tips96(self, tip_rack: TipRack, offset: Coordinate = Coordinate.zero(), **backend_kwargs): if self._simulator: - await self._simulate_handler.pick_up_tips96(tip_rack, offset, **backend_kwargs) + return await self._simulate_handler.pick_up_tips96(tip_rack, offset, **backend_kwargs) return await super().pick_up_tips96(tip_rack, offset, **backend_kwargs) async def drop_tips96( @@ -266,7 +266,7 @@ class LiquidHandlerMiddleware(LiquidHandler): **backend_kwargs, ): if self._simulator: - await self._simulate_handler.drop_tips96(resource, offset, allow_nonzero_volume, **backend_kwargs) + return await self._simulate_handler.drop_tips96(resource, offset, allow_nonzero_volume, **backend_kwargs) return await super().drop_tips96(resource, offset, allow_nonzero_volume, **backend_kwargs) def _get_96_head_origin_tip_rack(self) -> Optional[TipRack]: @@ -274,12 +274,12 @@ class LiquidHandlerMiddleware(LiquidHandler): async def return_tips96(self, allow_nonzero_volume: bool = False, **backend_kwargs): if self._simulator: - await self._simulate_handler.return_tips96(allow_nonzero_volume, **backend_kwargs) + return await self._simulate_handler.return_tips96(allow_nonzero_volume, **backend_kwargs) return await super().return_tips96(allow_nonzero_volume, **backend_kwargs) async def discard_tips96(self, allow_nonzero_volume: bool = True, **backend_kwargs): if self._simulator: - await self._simulate_handler.discard_tips96(allow_nonzero_volume, **backend_kwargs) + return await self._simulate_handler.discard_tips96(allow_nonzero_volume, **backend_kwargs) return await super().discard_tips96(allow_nonzero_volume, **backend_kwargs) async def aspirate96( @@ -292,7 +292,7 @@ class LiquidHandlerMiddleware(LiquidHandler): **backend_kwargs, ): if self._simulator: - await self._simulate_handler.aspirate96( + return await self._simulate_handler.aspirate96( resource, volume, offset, flow_rate, blow_out_air_volume, **backend_kwargs ) return await super().aspirate96(resource, volume, offset, flow_rate, blow_out_air_volume, **backend_kwargs) @@ -307,7 +307,7 @@ class LiquidHandlerMiddleware(LiquidHandler): **backend_kwargs, ): if self._simulator: - await self._simulate_handler.dispense96( + return await self._simulate_handler.dispense96( resource, volume, offset, flow_rate, blow_out_air_volume, **backend_kwargs ) return await super().dispense96(resource, volume, offset, flow_rate, blow_out_air_volume, **backend_kwargs) @@ -321,7 +321,7 @@ class LiquidHandlerMiddleware(LiquidHandler): dispense_flow_rate: Optional[float] = None, ): if self._simulator: - await self._simulate_handler.stamp(source, target, volume, aspiration_flow_rate, dispense_flow_rate) + return await self._simulate_handler.stamp(source, target, volume, aspiration_flow_rate, dispense_flow_rate) return await super().stamp(source, target, volume, aspiration_flow_rate, dispense_flow_rate) async def pick_up_resource( @@ -333,7 +333,7 @@ class LiquidHandlerMiddleware(LiquidHandler): **backend_kwargs, ): if self._simulator: - await self._simulate_handler.pick_up_resource( + return await self._simulate_handler.pick_up_resource( resource, offset, pickup_distance_from_top, direction, **backend_kwargs ) return await super().pick_up_resource(resource, offset, pickup_distance_from_top, direction, **backend_kwargs) @@ -346,7 +346,7 @@ class LiquidHandlerMiddleware(LiquidHandler): **backend_kwargs, ): if self._simulator: - await self._simulate_handler.move_picked_up_resource(to, offset, direction, **backend_kwargs) + return await self._simulate_handler.move_picked_up_resource(to, offset, direction, **backend_kwargs) return await super().move_picked_up_resource(to, offset, direction, **backend_kwargs) async def drop_resource( @@ -357,7 +357,7 @@ class LiquidHandlerMiddleware(LiquidHandler): **backend_kwargs, ): if self._simulator: - await self._simulate_handler.drop_resource(destination, offset, direction, **backend_kwargs) + return await self._simulate_handler.drop_resource(destination, offset, direction, **backend_kwargs) return await super().drop_resource(destination, offset, direction, **backend_kwargs) async def move_resource( @@ -373,7 +373,7 @@ class LiquidHandlerMiddleware(LiquidHandler): **backend_kwargs, ): if self._simulator: - await self._simulate_handler.move_resource( + return await self._simulate_handler.move_resource( resource, to, intermediate_locations, @@ -409,7 +409,7 @@ class LiquidHandlerMiddleware(LiquidHandler): **backend_kwargs, ): if self._simulator: - await self._simulate_handler.move_lid( + return await self._simulate_handler.move_lid( lid, to, intermediate_locations, @@ -445,7 +445,7 @@ class LiquidHandlerMiddleware(LiquidHandler): **backend_kwargs, ): if self._simulator: - await self._simulate_handler.move_plate( + return await self._simulate_handler.move_plate( plate, to, intermediate_locations, @@ -483,22 +483,22 @@ class LiquidHandlerMiddleware(LiquidHandler): async def prepare_for_manual_channel_operation(self, channel: int): if self._simulator: - await self._simulate_handler.prepare_for_manual_channel_operation(channel) + return await self._simulate_handler.prepare_for_manual_channel_operation(channel) return await super().prepare_for_manual_channel_operation(channel) async def move_channel_x(self, channel: int, x: float): if self._simulator: - await self._simulate_handler.move_channel_x(channel, x) + return await self._simulate_handler.move_channel_x(channel, x) return await super().move_channel_x(channel, x) async def move_channel_y(self, channel: int, y: float): if self._simulator: - await self._simulate_handler.move_channel_y(channel, y) + return await self._simulate_handler.move_channel_y(channel, y) return await super().move_channel_y(channel, y) async def move_channel_z(self, channel: int, z: float): if self._simulator: - await self._simulate_handler.move_channel_z(channel, z) + return await self._simulate_handler.move_channel_z(channel, z) return await super().move_channel_z(channel, z) def assign_child_resource(self, resource: Resource, location: Optional[Coordinate], reassign: bool = True): @@ -510,7 +510,7 @@ class LiquidHandlerMiddleware(LiquidHandler): self, tip_spots: List[TipSpot], use_channels: Optional[List[int]] = None ) -> Dict[str, bool]: if self._simulator: - await self._simulate_handler.probe_tip_presence_via_pickup(tip_spots, use_channels) + return await self._simulate_handler.probe_tip_presence_via_pickup(tip_spots, use_channels) return await super().probe_tip_presence_via_pickup(tip_spots, use_channels) async def probe_tip_inventory( @@ -520,12 +520,12 @@ class LiquidHandlerMiddleware(LiquidHandler): use_channels: Optional[List[int]] = None, ) -> Dict[str, bool]: if self._simulator: - await self._simulate_handler.probe_tip_inventory(tip_spots, probing_fn, use_channels) + return await self._simulate_handler.probe_tip_inventory(tip_spots, probing_fn, use_channels) return await super().probe_tip_inventory(tip_spots, probing_fn, use_channels) async def consolidate_tip_inventory(self, tip_racks: List[TipRack], use_channels: Optional[List[int]] = None): if self._simulator: - await self._simulate_handler.consolidate_tip_inventory(tip_racks, use_channels) + return await self._simulate_handler.consolidate_tip_inventory(tip_racks, use_channels) return await super().consolidate_tip_inventory(tip_racks, use_channels) diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index 00b2972..32731a9 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -120,7 +120,7 @@ class PRCXI9300Handler(LiquidHandlerAbstract): return True return self._unilabos_backend.is_reset_ok - def __init__(self, deck: Deck, host: str, port: int, timeout: float, channel_num=8, axis="Left", setup=True, debug=False, matrix_id=""): + def __init__(self, deck: Deck, host: str, port: int, timeout: float, channel_num=8, axis="Left", setup=True, debug=False, simulator=False, matrix_id=""): tablets_info = [] count = 0 for child in deck.children: @@ -130,7 +130,7 @@ class PRCXI9300Handler(LiquidHandlerAbstract): WorkTablets(Number=count, Code=f"T{count}", Material=child._unilabos_state["Material"]) ) self._unilabos_backend = PRCXI9300Backend(tablets_info, host, port, timeout, channel_num, axis, setup, debug, matrix_id) - super().__init__(backend=self._unilabos_backend, deck=deck, simulator=True, channel_num=channel_num) + super().__init__(backend=self._unilabos_backend, deck=deck, simulator=simulator, channel_num=channel_num) def set_liquid(self, wells: list[Well], liquid_names: list[str], volumes: list[float]): return super().set_liquid(wells, liquid_names, volumes) @@ -593,7 +593,7 @@ class PRCXI9300Backend(LiquidHandlerBackend): PlateNo = plate_indexes[0] + 1 hole_col = tip_columns[0] + 1 - if self.channel_num == 1: + if self.num_channels == 1: hole_row = tipspot_index % 8 + 1 step = self.api_client.Imbibing(dosage=int(volumes[0]), plate_no=PlateNo, is_whole_plate=False, hole_row=hole_row, @@ -633,7 +633,7 @@ class PRCXI9300Backend(LiquidHandlerBackend): PlateNo = plate_indexes[0] + 1 hole_col = tip_columns[0] + 1 - if self.channel_num == 1: + if self.num_channels == 1: hole_row = tipspot_index % 8 + 1 step = self.api_client.Tapping( @@ -1247,10 +1247,10 @@ if __name__ == "__main__": with open("deck.json", "w", encoding="utf-8") as f: json.dump(A, f, indent=4, ensure_ascii=False) - print(plate11.get_item('A1').tracker.get_used_volume()) + print(plate11.get_well(0).tracker.get_used_volume()) asyncio.run(handler.create_protocol(protocol_name="Test Protocol")) # Initialize the backend and setup the connection asyncio.run(handler.pick_up_tips([plate8.children[3]],[0])) - asyncio.run(handler.aspirate([plate11.children[0]],[10], [0])) + asyncio.run(handler.aspirate([plate11.children[0]],[9], [0])) asyncio.run(handler.dispense([plate1.children[3]],[10],[0])) asyncio.run(handler.mix([plate1.children[3]], mix_time=3, mix_vol=5, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) asyncio.run(handler.discard_tips()) diff --git a/unilabos/registry/devices/liquid_handler.yaml b/unilabos/registry/devices/liquid_handler.yaml index a33635c..f577a4f 100644 --- a/unilabos/registry/devices/liquid_handler.yaml +++ b/unilabos/registry/devices/liquid_handler.yaml @@ -5514,6 +5514,8 @@ liquid_handler.prcxi: vols: - 0.0 handles: [] + placeholder_keys: + resources: unilabos_resources result: {} schema: description: '' @@ -6711,6 +6713,8 @@ liquid_handler.prcxi: use_channels: - 0 handles: [] + placeholder_keys: + tip_spots: unilabos_resources result: {} schema: description: '' From dde7086aa6d2ead7fe438b10a33fa0eaeadfd402 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Fri, 18 Jul 2025 15:09:34 +0800 Subject: [PATCH 68/96] 0.9.12 update registry --- unilabos/registry/devices/liquid_handler.yaml | 119 +- unilabos/registry/devices/mock_devices.yaml | 1901 ++++++++- .../devices/organic_miscellaneous.yaml | 115 +- unilabos/registry/devices/temperature.yaml | 121 +- unilabos/registry/devices/virtual_device.yaml | 2672 ++++++++++-- unilabos/registry/devices/work_station.yaml | 3623 ++++++++++++++++- 6 files changed, 8082 insertions(+), 469 deletions(-) diff --git a/unilabos/registry/devices/liquid_handler.yaml b/unilabos/registry/devices/liquid_handler.yaml index f577a4f..f827855 100644 --- a/unilabos/registry/devices/liquid_handler.yaml +++ b/unilabos/registry/devices/liquid_handler.yaml @@ -6849,9 +6849,30 @@ liquid_handler.prcxi: feedback: {} goal: {} goal_default: - liquid_names: [] - volumes: [] - wells: [] + liquid_names: + - '' + volumes: + - 0.0 + wells: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: [] placeholder_keys: wells: unilabos_resources @@ -6859,7 +6880,11 @@ liquid_handler.prcxi: schema: description: '' properties: - feedback: {} + feedback: + properties: {} + required: [] + title: LiquidHandlerSetLiquid_Feedback + type: object goal: properties: liquid_names: @@ -6872,17 +6897,96 @@ liquid_handler.prcxi: type: array wells: items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource type: object type: array required: - wells - liquid_names - volumes + title: LiquidHandlerSetLiquid_Goal + type: object + result: + properties: + return_info: + type: string + required: + - return_info + title: LiquidHandlerSetLiquid_Result type: object - result: {} required: - goal - title: set_liquid参数 + title: LiquidHandlerSetLiquid type: object type: LiquidHandlerSetLiquid module: unilabos.devices.liquid_handling.prcxi.prcxi:PRCXI9300Handler @@ -6916,6 +7020,9 @@ liquid_handler.prcxi: setup: default: true type: string + simulator: + default: false + type: string timeout: type: number required: diff --git a/unilabos/registry/devices/mock_devices.yaml b/unilabos/registry/devices/mock_devices.yaml index 5bfe5d7..758abde 100644 --- a/unilabos/registry/devices/mock_devices.yaml +++ b/unilabos/registry/devices/mock_devices.yaml @@ -43,7 +43,26 @@ mock_chiller: goal_default: purpose: '' temp: 0.0 - vessel: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: [] result: status: status @@ -66,7 +85,78 @@ mock_chiller: temp: type: number vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: - vessel - temp @@ -94,7 +184,26 @@ mock_chiller: goal: vessel: vessel goal_default: - vessel: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: [] result: status: status @@ -113,7 +222,78 @@ mock_chiller: goal: properties: vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: - vessel title: HeatChillStop_Goal @@ -224,11 +404,49 @@ mock_filter: volume: volume goal_default: continue_heatchill: false - filtrate_vessel: '' + filtrate_vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' stir: false stir_speed: 0.0 temp: 0.0 - vessel: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' volume: 0.0 handles: [] result: @@ -259,7 +477,78 @@ mock_filter: continue_heatchill: type: boolean filtrate_vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object stir: type: boolean stir_speed: @@ -267,7 +556,78 @@ mock_filter: temp: type: number vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object volume: type: number required: @@ -539,12 +899,35 @@ mock_heater: time: time vessel: vessel goal_default: + pressure: '' purpose: '' + reflux_solvent: '' stir: false stir_speed: 0.0 temp: 0.0 - time: 0.0 - vessel: '' + temp_spec: '' + time: '' + time_spec: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: [] result: success: success @@ -561,22 +944,105 @@ mock_heater: type: object goal: properties: + pressure: + type: string purpose: type: string + reflux_solvent: + type: string stir: type: boolean stir_speed: type: number temp: type: number - time: - type: number - vessel: + temp_spec: type: string + time: + type: string + time_spec: + type: string + vessel: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: - vessel - temp - time + - temp_spec + - time_spec + - pressure + - reflux_solvent - stir - stir_speed - purpose @@ -584,13 +1050,16 @@ mock_heater: type: object result: properties: + message: + type: string return_info: type: string success: type: boolean required: - - return_info - success + - message + - return_info title: HeatChill_Result type: object required: @@ -608,7 +1077,26 @@ mock_heater: goal_default: purpose: '' temp: 0.0 - vessel: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: [] result: success: success @@ -630,7 +1118,78 @@ mock_heater: temp: type: number vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: - vessel - temp @@ -659,7 +1218,26 @@ mock_heater: goal: vessel: vessel goal_default: - vessel: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: [] result: success: success @@ -677,7 +1255,78 @@ mock_heater: goal: properties: vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: - vessel title: HeatChillStop_Goal @@ -836,13 +1485,56 @@ mock_pump: volume: volume goal_default: amount: '' - from_vessel: '' + event: '' + flowrate: 0.0 + from_vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + rate_spec: '' rinsing_repeats: 0 rinsing_solvent: '' rinsing_volume: 0.0 solid: false + through: '' time: 0.0 - to_vessel: '' + to_vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + transfer_flowrate: 0.0 viscous: false volume: 0.0 handles: [] @@ -898,7 +1590,84 @@ mock_pump: properties: amount: type: string + event: + type: string + flowrate: + type: number from_vessel: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + rate_spec: type: string rinsing_repeats: maximum: 2147483647 @@ -910,10 +1679,85 @@ mock_pump: type: number solid: type: boolean + through: + type: string time: type: number to_vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + transfer_flowrate: + type: number viscous: type: boolean volume: @@ -929,6 +1773,11 @@ mock_pump: - rinsing_volume - rinsing_repeats - solid + - flowrate + - transfer_flowrate + - rate_spec + - event + - through title: PumpTransfer_Goal type: object result: @@ -1517,19 +2366,156 @@ mock_separator: to_vessel: to_vessel waste_phase_to_vessel: waste_phase_to_vessel goal_default: - from_vessel: '' + from_vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' product_phase: '' + product_vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' purpose: '' repeats: 0 - separation_vessel: '' + separation_vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' settling_time: 0.0 solvent: '' - solvent_volume: 0.0 + solvent_volume: '' stir_speed: 0.0 stir_time: 0.0 through: '' - to_vessel: '' - waste_phase_to_vessel: '' + to_vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + volume: '' + waste_phase_to_vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + waste_vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: [] result: success: success @@ -1538,53 +2524,165 @@ mock_separator: properties: feedback: properties: - current_device: - type: string + progress: + type: number status: type: string - time_remaining: - properties: - nanosec: - maximum: 4294967295 - minimum: 0 - type: integer - sec: - maximum: 2147483647 - minimum: -2147483648 - type: integer - required: - - sec - - nanosec - title: Duration - type: object - time_spent: - properties: - nanosec: - maximum: 4294967295 - minimum: 0 - type: integer - sec: - maximum: 2147483647 - minimum: -2147483648 - type: integer - required: - - sec - - nanosec - title: Duration - type: object required: - status - - current_device - - time_spent - - time_remaining + - progress title: Separate_Feedback type: object goal: properties: from_vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object product_phase: type: string + product_vessel: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object purpose: type: string repeats: @@ -1592,13 +2690,84 @@ mock_separator: minimum: -2147483648 type: integer separation_vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object settling_time: type: number solvent: type: string solvent_volume: - type: number + type: string stir_speed: type: number stir_time: @@ -1606,18 +2775,312 @@ mock_separator: through: type: string to_vessel: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + vessel: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + volume: type: string waste_phase_to_vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + waste_vessel: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: + - vessel - purpose - product_phase - from_vessel - separation_vessel - to_vessel - waste_phase_to_vessel + - product_vessel + - waste_vessel - solvent - solvent_volume + - volume - through - repeats - stir_time @@ -1627,13 +3090,16 @@ mock_separator: type: object result: properties: + message: + type: string return_info: type: string success: type: boolean required: - - return_info - success + - message + - return_info title: Separate_Result type: object required: @@ -2347,7 +3813,26 @@ mock_stirrer_new: goal_default: purpose: '' stir_speed: 0.0 - vessel: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: [] result: message: message @@ -2376,7 +3861,78 @@ mock_stirrer_new: stir_speed: type: number vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: - vessel - stir_speed @@ -2410,9 +3966,32 @@ mock_stirrer_new: stir_speed: stir_speed stir_time: stir_time goal_default: - settling_time: 0.0 + event: '' + settling_time: '' stir_speed: 0.0 stir_time: 0.0 + time: '' + time_spec: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: [] result: success: success @@ -2429,13 +4008,96 @@ mock_stirrer_new: type: object goal: properties: + event: + type: string settling_time: - type: number + type: string stir_speed: type: number stir_time: type: number + time: + type: string + time_spec: + type: string + vessel: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: + - vessel + - time + - event + - time_spec - stir_time - stir_speed - settling_time @@ -2443,13 +4105,16 @@ mock_stirrer_new: type: object result: properties: + message: + type: string return_info: type: string success: type: boolean required: - - return_info - success + - message + - return_info title: Stir_Result type: object required: @@ -2464,7 +4129,26 @@ mock_stirrer_new: goal: vessel: vessel goal_default: - vessel: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: [] result: message: message @@ -2486,7 +4170,78 @@ mock_stirrer_new: goal: properties: vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: - vessel title: StopStir_Goal diff --git a/unilabos/registry/devices/organic_miscellaneous.yaml b/unilabos/registry/devices/organic_miscellaneous.yaml index aca63df..8ae8418 100644 --- a/unilabos/registry/devices/organic_miscellaneous.yaml +++ b/unilabos/registry/devices/organic_miscellaneous.yaml @@ -242,9 +242,32 @@ separator.homemade: stir_speed: stir_speed stir_time: stir_time, goal_default: - settling_time: 0.0 + event: '' + settling_time: '' stir_speed: 0.0 stir_time: 0.0 + time: '' + time_spec: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: [] result: success: success @@ -261,13 +284,96 @@ separator.homemade: type: object goal: properties: + event: + type: string settling_time: - type: number + type: string stir_speed: type: number stir_time: type: number + time: + type: string + time_spec: + type: string + vessel: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: + - vessel + - time + - event + - time_spec - stir_time - stir_speed - settling_time @@ -275,13 +381,16 @@ separator.homemade: type: object result: properties: + message: + type: string return_info: type: string success: type: boolean required: - - return_info - success + - message + - return_info title: Stir_Result type: object required: diff --git a/unilabos/registry/devices/temperature.yaml b/unilabos/registry/devices/temperature.yaml index 2da45fd..d09834d 100644 --- a/unilabos/registry/devices/temperature.yaml +++ b/unilabos/registry/devices/temperature.yaml @@ -259,12 +259,35 @@ heaterstirrer.dalong: time: time vessel: vessel goal_default: + pressure: '' purpose: '' + reflux_solvent: '' stir: false stir_speed: 0.0 temp: 0.0 - time: 0.0 - vessel: '' + temp_spec: '' + time: '' + time_spec: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: [] result: success: success @@ -281,22 +304,105 @@ heaterstirrer.dalong: type: object goal: properties: + pressure: + type: string purpose: type: string + reflux_solvent: + type: string stir: type: boolean stir_speed: type: number temp: type: number - time: - type: number - vessel: + temp_spec: type: string + time: + type: string + time_spec: + type: string + vessel: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: - vessel - temp - time + - temp_spec + - time_spec + - pressure + - reflux_solvent - stir - stir_speed - purpose @@ -304,13 +410,16 @@ heaterstirrer.dalong: type: object result: properties: + message: + type: string return_info: type: string success: type: boolean required: - - return_info - success + - message + - return_info title: HeatChill_Result type: object required: diff --git a/unilabos/registry/devices/virtual_device.yaml b/unilabos/registry/devices/virtual_device.yaml index acaed03..73a5901 100644 --- a/unilabos/registry/devices/virtual_device.yaml +++ b/unilabos/registry/devices/virtual_device.yaml @@ -56,7 +56,26 @@ virtual_centrifuge: speed: 0.0 temp: 0.0 time: 0.0 - vessel: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: [] result: message: message @@ -90,7 +109,78 @@ virtual_centrifuge: time: type: number vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: - vessel - speed @@ -247,8 +337,52 @@ virtual_column: to_vessel: to_vessel goal_default: column: '' - from_vessel: '' - to_vessel: '' + from_vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + pct1: '' + pct2: '' + ratio: '' + rf: '' + solvent1: '' + solvent2: '' + to_vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: [] result: message: current_status @@ -273,13 +407,173 @@ virtual_column: column: type: string from_vessel: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + pct1: + type: string + pct2: + type: string + ratio: + type: string + rf: + type: string + solvent1: + type: string + solvent2: type: string to_vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: - from_vessel - to_vessel - column + - rf + - pct1 + - pct2 + - solvent1 + - solvent2 + - ratio title: RunColumn_Goal type: object result: @@ -440,11 +734,49 @@ virtual_filter: volume: volume goal_default: continue_heatchill: false - filtrate_vessel: '' + filtrate_vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' stir: false stir_speed: 0.0 temp: 0.0 - vessel: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' volume: 0.0 handles: [] result: @@ -476,7 +808,78 @@ virtual_filter: continue_heatchill: type: boolean filtrate_vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object stir: type: boolean stir_speed: @@ -484,7 +887,78 @@ virtual_filter: temp: type: number vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object volume: type: number required: @@ -869,12 +1343,35 @@ virtual_heatchill: time: time vessel: vessel goal_default: + pressure: '' purpose: '' + reflux_solvent: '' stir: false stir_speed: 0.0 temp: 0.0 - time: 0.0 - vessel: '' + temp_spec: '' + time: '' + time_spec: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: [] result: success: success @@ -891,22 +1388,105 @@ virtual_heatchill: type: object goal: properties: + pressure: + type: string purpose: type: string + reflux_solvent: + type: string stir: type: boolean stir_speed: type: number temp: type: number - time: - type: number - vessel: + temp_spec: type: string + time: + type: string + time_spec: + type: string + vessel: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: - vessel - temp - time + - temp_spec + - time_spec + - pressure + - reflux_solvent - stir - stir_speed - purpose @@ -914,13 +1494,16 @@ virtual_heatchill: type: object result: properties: + message: + type: string return_info: type: string success: type: boolean required: - - return_info - success + - message + - return_info title: HeatChill_Result type: object required: @@ -938,7 +1521,26 @@ virtual_heatchill: goal_default: purpose: '' temp: 0.0 - vessel: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: [] result: success: success @@ -960,7 +1562,78 @@ virtual_heatchill: temp: type: number vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: - vessel - temp @@ -989,7 +1662,26 @@ virtual_heatchill: goal: vessel: vessel goal_default: - vessel: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: [] result: success: success @@ -1007,7 +1699,78 @@ virtual_heatchill: goal: properties: vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: - vessel title: HeatChillStop_Goal @@ -1654,13 +2417,56 @@ virtual_pump: volume: volume goal_default: amount: '' - from_vessel: '' + event: '' + flowrate: 0.0 + from_vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + rate_spec: '' rinsing_repeats: 0 rinsing_solvent: '' rinsing_volume: 0.0 solid: false + through: '' time: 0.0 - to_vessel: '' + to_vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + transfer_flowrate: 0.0 viscous: false volume: 0.0 handles: [] @@ -1716,7 +2522,84 @@ virtual_pump: properties: amount: type: string + event: + type: string + flowrate: + type: number from_vessel: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + rate_spec: type: string rinsing_repeats: maximum: 2147483647 @@ -1728,10 +2611,85 @@ virtual_pump: type: number solid: type: boolean + through: + type: string time: type: number to_vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + transfer_flowrate: + type: number viscous: type: boolean volume: @@ -1747,6 +2705,11 @@ virtual_pump: - rinsing_volume - rinsing_repeats - solid + - flowrate + - transfer_flowrate + - rate_spec + - event + - through title: PumpTransfer_Goal type: object result: @@ -1887,10 +2850,30 @@ virtual_rotavap: vessel: vessel goal_default: pressure: 0.0 + solvent: '' stir_speed: 0.0 temp: 0.0 - time: 0.0 - vessel: '' + time: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: [] result: message: message @@ -1945,20 +2928,94 @@ virtual_rotavap: properties: pressure: type: number + solvent: + type: string stir_speed: type: number temp: type: number time: - type: number - vessel: type: string + vessel: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: - vessel - pressure - temp - time - stir_speed + - solvent title: Evaporate_Goal type: object result: @@ -2127,19 +3184,156 @@ virtual_separator: to_vessel: to_vessel waste_phase_to_vessel: waste_phase_to_vessel goal_default: - from_vessel: '' + from_vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' product_phase: '' + product_vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' purpose: '' repeats: 0 - separation_vessel: '' + separation_vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' settling_time: 0.0 solvent: '' - solvent_volume: 0.0 + solvent_volume: '' stir_speed: 0.0 stir_time: 0.0 through: '' - to_vessel: '' - waste_phase_to_vessel: '' + to_vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + volume: '' + waste_phase_to_vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + waste_vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: [] result: message: message @@ -2149,53 +3343,165 @@ virtual_separator: properties: feedback: properties: - current_device: - type: string + progress: + type: number status: type: string - time_remaining: - properties: - nanosec: - maximum: 4294967295 - minimum: 0 - type: integer - sec: - maximum: 2147483647 - minimum: -2147483648 - type: integer - required: - - sec - - nanosec - title: Duration - type: object - time_spent: - properties: - nanosec: - maximum: 4294967295 - minimum: 0 - type: integer - sec: - maximum: 2147483647 - minimum: -2147483648 - type: integer - required: - - sec - - nanosec - title: Duration - type: object required: - status - - current_device - - time_spent - - time_remaining + - progress title: Separate_Feedback type: object goal: properties: from_vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object product_phase: type: string + product_vessel: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object purpose: type: string repeats: @@ -2203,13 +3509,84 @@ virtual_separator: minimum: -2147483648 type: integer separation_vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object settling_time: type: number solvent: type: string solvent_volume: - type: number + type: string stir_speed: type: number stir_time: @@ -2217,18 +3594,312 @@ virtual_separator: through: type: string to_vessel: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + vessel: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + volume: type: string waste_phase_to_vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + waste_vessel: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: + - vessel - purpose - product_phase - from_vessel - separation_vessel - to_vessel - waste_phase_to_vessel + - product_vessel + - waste_vessel - solvent - solvent_volume + - volume - through - repeats - stir_time @@ -2238,13 +3909,16 @@ virtual_separator: type: object result: properties: + message: + type: string return_info: type: string success: type: boolean required: - - return_info - success + - message + - return_info title: Separate_Result type: object required: @@ -2651,6 +4325,386 @@ virtual_solenoid_valve: - state type: object version: 0.0.1 +virtual_solid_dispenser: + class: + action_value_mappings: + add_solid: + feedback: + current_status: status + progress: progress + goal: + equiv: equiv + event: event + mass: mass + mol: mol + purpose: purpose + rate_spec: rate_spec + ratio: ratio + reagent: reagent + vessel: vessel + goal_default: + amount: '' + equiv: '' + event: '' + mass: '' + mol: '' + purpose: '' + rate_spec: '' + ratio: '' + reagent: '' + stir: false + stir_speed: 0.0 + time: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + viscous: false + volume: '' + handles: [] + result: + message: message + return_info: return_info + success: success + schema: + description: '' + properties: + feedback: + properties: + current_status: + type: string + progress: + type: number + required: + - progress + - current_status + title: Add_Feedback + type: object + goal: + properties: + amount: + type: string + equiv: + type: string + event: + type: string + mass: + type: string + mol: + type: string + purpose: + type: string + rate_spec: + type: string + ratio: + type: string + reagent: + type: string + stir: + type: boolean + stir_speed: + type: number + time: + type: string + vessel: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + viscous: + type: boolean + volume: + type: string + required: + - vessel + - reagent + - volume + - mass + - amount + - time + - stir + - stir_speed + - viscous + - purpose + - event + - mol + - rate_spec + - equiv + - ratio + title: Add_Goal + type: object + result: + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: Add_Result + type: object + required: + - goal + title: Add + type: object + type: Add + auto-cleanup: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: cleanup的参数schema + properties: + feedback: {} + goal: + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: cleanup参数 + type: object + type: UniLabJsonCommandAsync + auto-find_solid_reagent_bottle: + feedback: {} + goal: {} + goal_default: + reagent_name: null + handles: [] + result: {} + schema: + description: '' + properties: + feedback: {} + goal: + properties: + reagent_name: + type: string + required: + - reagent_name + type: object + result: {} + required: + - goal + title: find_solid_reagent_bottle参数 + type: object + type: UniLabJsonCommand + auto-initialize: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: initialize的参数schema + properties: + feedback: {} + goal: + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: initialize参数 + type: object + type: UniLabJsonCommandAsync + auto-parse_mass_string: + feedback: {} + goal: {} + goal_default: + mass_str: null + handles: [] + result: {} + schema: + description: '' + properties: + feedback: {} + goal: + properties: + mass_str: + type: string + required: + - mass_str + type: object + result: {} + required: + - goal + title: parse_mass_string参数 + type: object + type: UniLabJsonCommand + auto-parse_mol_string: + feedback: {} + goal: {} + goal_default: + mol_str: null + handles: [] + result: {} + schema: + description: '' + properties: + feedback: {} + goal: + properties: + mol_str: + type: string + required: + - mol_str + type: object + result: {} + required: + - goal + title: parse_mol_string参数 + type: object + type: UniLabJsonCommand + module: unilabos.devices.virtual.virtual_solid_dispenser:VirtualSolidDispenser + status_types: + current_reagent: str + device_info: dict + dispensed_amount: float + status: str + total_operations: int + type: python + description: Virtual Solid Dispenser for Add Protocol Testing - supports mass and + molar additions + handles: + - data_key: solid_out + data_source: executor + data_type: resource + description: 固体试剂输出口 + handler_key: SolidOut + io_type: source + label: SolidOut + side: SOUTH + - data_key: solid_in + data_source: handle + data_type: resource + description: 固体试剂输入口(连接试剂瓶) + handler_key: SolidIn + io_type: target + label: SolidIn + side: NORTH + icon: '' + init_param_schema: + config: + properties: + config: + type: object + device_id: + type: string + required: [] + type: object + data: + properties: + current_reagent: + type: string + device_info: + type: object + dispensed_amount: + type: number + status: + type: string + total_operations: + type: integer + required: + - status + - current_reagent + - dispensed_amount + - total_operations + - device_info + type: object + version: 0.0.1 virtual_stirrer: class: action_value_mappings: @@ -2704,7 +4758,26 @@ virtual_stirrer: goal_default: purpose: '' stir_speed: 0.0 - vessel: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: [] result: success: success @@ -2732,7 +4805,78 @@ virtual_stirrer: stir_speed: type: number vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: - vessel - stir_speed @@ -2766,9 +4910,32 @@ virtual_stirrer: stir_speed: stir_speed stir_time: stir_time goal_default: - settling_time: 0.0 + event: '' + settling_time: '' stir_speed: 0.0 stir_time: 0.0 + time: '' + time_spec: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: [] result: success: success @@ -2785,13 +4952,96 @@ virtual_stirrer: type: object goal: properties: + event: + type: string settling_time: - type: number + type: string stir_speed: type: number stir_time: type: number + time: + type: string + time_spec: + type: string + vessel: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: + - vessel + - time + - event + - time_spec - stir_time - stir_speed - settling_time @@ -2799,13 +5049,16 @@ virtual_stirrer: type: object result: properties: + message: + type: string return_info: type: string success: type: boolean required: - - return_info - success + - message + - return_info title: Stir_Result type: object required: @@ -2819,7 +5072,26 @@ virtual_stirrer: goal: vessel: vessel goal_default: - vessel: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: [] result: success: success @@ -2840,7 +5112,78 @@ virtual_stirrer: goal: properties: vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: - vessel title: StopStir_Goal @@ -3650,176 +5993,3 @@ virtual_vacuum_pump: - status type: object version: 0.0.1 -virtual_solid_dispenser: - class: - action_value_mappings: - auto-cleanup: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: cleanup的参数schema - properties: - feedback: {} - goal: - properties: {} - type: object - result: {} - required: - - goal - title: cleanup参数 - type: object - type: UniLabJsonCommandAsync - auto-initialize: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: initialize的参数schema - properties: - feedback: {} - goal: - properties: {} - type: object - result: {} - required: - - goal - title: initialize参数 - type: object - type: UniLabJsonCommandAsync - add_solid: - feedback: - current_status: status - progress: progress - goal: - vessel: vessel - reagent: reagent - mass: mass - mol: mol - purpose: purpose - event: event - rate_spec: rate_spec - equiv: equiv - ratio: ratio - goal_default: - vessel: '' - reagent: '' - mass: '' - mol: '' - purpose: '' - event: '' - rate_spec: '' - equiv: '' - ratio: '' - handles: [] - result: - success: success - message: message - return_info: return_info - schema: - description: '' - properties: - feedback: - properties: - current_status: - type: string - progress: - type: number - type: object - goal: - properties: - vessel: - type: string - reagent: - type: string - mass: - type: string - mol: - type: string - purpose: - type: string - event: - type: string - rate_spec: - type: string - equiv: - type: string - ratio: - type: string - type: object - result: - properties: - success: - type: boolean - message: - type: string - return_info: - type: string - type: object - required: - - goal - title: AddSolid - type: object - type: Add # 🔧 使用 Add action type - module: unilabos.devices.virtual.virtual_solid_dispenser:VirtualSolidDispenser - status_types: - status: str - current_reagent: str - dispensed_amount: float - total_operations: int - type: python - description: Virtual Solid Dispenser for Add Protocol Testing - supports mass and molar additions - handles: - - data_key: solid_out - data_source: executor - data_type: resource - description: 固体试剂输出口 - handler_key: SolidOut - io_type: source - label: SolidOut - side: SOUTH - - data_key: solid_in - data_source: handle - data_type: resource - description: 固体试剂输入口(连接试剂瓶) - handler_key: SolidIn - io_type: target - label: SolidIn - side: NORTH - icon: '' - init_param_schema: - config: - properties: - max_capacity: - default: 100.0 - type: number - precision: - default: 0.001 - type: number - config: - type: object - device_id: - type: string - required: [] - type: object - data: - properties: - status: - type: string - current_reagent: - type: string - dispensed_amount: - type: number - total_operations: - type: integer - required: - - status - - current_reagent - - dispensed_amount - - total_operations - type: object - version: 0.0.1 \ No newline at end of file diff --git a/unilabos/registry/devices/work_station.yaml b/unilabos/registry/devices/work_station.yaml index 5e5279d..9dd6c96 100644 --- a/unilabos/registry/devices/work_station.yaml +++ b/unilabos/registry/devices/work_station.yaml @@ -254,15 +254,39 @@ workstation: volume: volume goal_default: amount: '' - mass: 0.0 + equiv: '' + event: '' + mass: '' + mol: '' purpose: '' + rate_spec: '' + ratio: '' reagent: '' stir: false stir_speed: 0.0 - time: 0.0 - vessel: '' + time: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' viscous: false - volume: 0.0 + volume: '' handles: input: - data_key: vessel @@ -300,10 +324,20 @@ workstation: properties: amount: type: string + equiv: + type: string + event: + type: string mass: - type: number + type: string + mol: + type: string purpose: type: string + rate_spec: + type: string + ratio: + type: string reagent: type: string stir: @@ -311,13 +345,84 @@ workstation: stir_speed: type: number time: - type: number - vessel: type: string + vessel: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object viscous: type: boolean volume: - type: number + type: string required: - vessel - reagent @@ -329,6 +434,11 @@ workstation: - stir_speed - viscous - purpose + - event + - mol + - rate_spec + - equiv + - ratio title: Add_Goal type: object result: @@ -359,7 +469,26 @@ workstation: goal_default: ph_value: 0.0 reagent: '' - vessel: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: input: - data_key: vessel @@ -400,7 +529,78 @@ workstation: reagent: type: string vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: - vessel - ph_value @@ -437,7 +637,26 @@ workstation: speed: 0.0 temp: 0.0 time: 0.0 - vessel: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: input: - data_key: vessel @@ -481,7 +700,78 @@ workstation: time: type: number vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: - vessel - speed @@ -520,7 +810,26 @@ workstation: repeats: 0 solvent: '' temp: 0.0 - vessel: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' volume: 0.0 handles: input: @@ -598,7 +907,78 @@ workstation: temp: type: number vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object volume: type: number required: @@ -637,7 +1017,26 @@ workstation: repeats: 0 solvent: '' temp: 0.0 - vessel: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' volume: 0.0 handles: input: @@ -683,7 +1082,78 @@ workstation: temp: type: number vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object volume: type: number required: @@ -725,12 +1195,35 @@ workstation: volume: volume goal_default: amount: '' + event: '' + mass: '' + mol: '' + reagent: '' solvent: '' stir_speed: 0.0 - temp: 0.0 - time: 0.0 - vessel: '' - volume: 0.0 + temp: '' + time: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + volume: '' handles: input: - data_key: vessel @@ -768,18 +1261,97 @@ workstation: properties: amount: type: string + event: + type: string + mass: + type: string + mol: + type: string + reagent: + type: string solvent: type: string stir_speed: type: number temp: - type: number - time: - type: number - vessel: type: string + time: + type: string + vessel: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object volume: - type: number + type: string required: - vessel - solvent @@ -788,6 +1360,10 @@ workstation: - temp - time - stir_speed + - mass + - mol + - reagent + - event title: Dissolve_Goal type: object result: @@ -816,7 +1392,26 @@ workstation: vessel: vessel goal_default: compound: '' - vessel: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: input: - data_key: vessel @@ -850,7 +1445,78 @@ workstation: compound: type: string vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: - compound - vessel @@ -882,8 +1548,26 @@ workstation: vessel: vessel goal_default: gas: '' - repeats: 0 - vessel: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: input: - data_key: vessel @@ -948,16 +1632,82 @@ workstation: properties: gas: type: string - repeats: - maximum: 2147483647 - minimum: -2147483648 - type: integer vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: - vessel - gas - - repeats title: EvacuateAndRefill_Goal type: object result: @@ -987,10 +1737,30 @@ workstation: vessel: vessel goal_default: pressure: 0.0 + solvent: '' stir_speed: 0.0 temp: 0.0 - time: 0.0 - vessel: '' + time: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: input: - data_key: vessel @@ -1055,20 +1825,94 @@ workstation: properties: pressure: type: number + solvent: + type: string stir_speed: type: number temp: type: number time: - type: number - vessel: type: string + vessel: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: - vessel - pressure - temp - time - stir_speed + - solvent title: Evaporate_Goal type: object result: @@ -1099,11 +1943,49 @@ workstation: volume: volume goal_default: continue_heatchill: false - filtrate_vessel: '' + filtrate_vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' stir: false stir_speed: 0.0 temp: 0.0 - vessel: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' volume: 0.0 handles: input: @@ -1154,7 +2036,78 @@ workstation: continue_heatchill: type: boolean filtrate_vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object stir: type: boolean stir_speed: @@ -1162,7 +2115,78 @@ workstation: temp: type: number vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object volume: type: number required: @@ -1208,10 +2232,67 @@ workstation: eluting_repeats: 0 eluting_solvent: '' eluting_volume: 0.0 - filter_through: '' - from_vessel: '' + filter_through: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + from_vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' residence_time: 0.0 - to_vessel: '' + to_vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: input: - data_key: vessel @@ -1266,13 +2347,226 @@ workstation: eluting_volume: type: number filter_through: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object from_vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object residence_time: type: number to_vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: - from_vessel - to_vessel @@ -1316,12 +2610,35 @@ workstation: time_spec: time_spec vessel: vessel goal_default: + pressure: '' purpose: '' + reflux_solvent: '' stir: false stir_speed: 0.0 temp: 0.0 - time: 0.0 - vessel: '' + temp_spec: '' + time: '' + time_spec: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: input: - data_key: vessel @@ -1349,22 +2666,105 @@ workstation: type: object goal: properties: + pressure: + type: string purpose: type: string + reflux_solvent: + type: string stir: type: boolean stir_speed: type: number temp: type: number - time: - type: number - vessel: + temp_spec: type: string + time: + type: string + time_spec: + type: string + vessel: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: - vessel - temp - time + - temp_spec + - time_spec + - pressure + - reflux_solvent - stir - stir_speed - purpose @@ -1372,13 +2772,16 @@ workstation: type: object result: properties: + message: + type: string return_info: type: string success: type: boolean required: - - return_info - success + - message + - return_info title: HeatChill_Result type: object required: @@ -1395,7 +2798,26 @@ workstation: goal_default: purpose: '' temp: 0.0 - vessel: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: input: - data_key: vessel @@ -1428,7 +2850,78 @@ workstation: temp: type: number vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: - vessel - temp @@ -1456,7 +2949,26 @@ workstation: goal: vessel: vessel goal_default: - vessel: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: input: - data_key: vessel @@ -1485,7 +2997,78 @@ workstation: goal: properties: vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: - vessel title: HeatChillStop_Goal @@ -1515,7 +3098,26 @@ workstation: goal_default: temp: '' time: '' - vessel: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: input: - data_key: vessel @@ -1551,7 +3153,78 @@ workstation: time: type: string vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: - temp - time @@ -1597,13 +3270,56 @@ workstation: volume: volume goal_default: amount: '' - from_vessel: '' + event: '' + flowrate: 0.0 + from_vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + rate_spec: '' rinsing_repeats: 0 rinsing_solvent: '' rinsing_volume: 0.0 solid: false + through: '' time: 0.0 - to_vessel: '' + to_vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + transfer_flowrate: 0.0 viscous: false volume: 0.0 handles: @@ -1685,7 +3401,84 @@ workstation: properties: amount: type: string + event: + type: string + flowrate: + type: number from_vessel: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + rate_spec: type: string rinsing_repeats: maximum: 2147483647 @@ -1697,10 +3490,85 @@ workstation: type: number solid: type: boolean + through: + type: string time: type: number to_vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + transfer_flowrate: + type: number viscous: type: boolean volume: @@ -1716,6 +3584,11 @@ workstation: - rinsing_volume - rinsing_repeats - solid + - flowrate + - transfer_flowrate + - rate_spec + - event + - through title: PumpTransfer_Goal type: object result: @@ -1746,8 +3619,27 @@ workstation: ratio: '' solvent1: '' solvent2: '' - vessel: '' - volume: 0.0 + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + volume: '' handles: input: - data_key: vessel @@ -1795,9 +3687,80 @@ workstation: solvent2: type: string vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object volume: - type: number + type: string required: - ratio - solvent1 @@ -1831,6 +3794,26 @@ workstation: solvent: solvent goal_default: solvent: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: input: - data_key: solvent @@ -1858,8 +3841,82 @@ workstation: properties: solvent: type: string + vessel: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: - solvent + - vessel title: ResetHandling_Goal type: object result: @@ -1889,8 +3946,52 @@ workstation: to_vessel: to_vessel goal_default: column: '' - from_vessel: '' - to_vessel: '' + from_vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + pct1: '' + pct2: '' + ratio: '' + rf: '' + solvent1: '' + solvent2: '' + to_vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: input: - data_key: vessel @@ -1934,13 +4035,173 @@ workstation: column: type: string from_vessel: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + pct1: + type: string + pct2: + type: string + ratio: + type: string + rf: + type: string + solvent1: + type: string + solvent2: type: string to_vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: - from_vessel - to_vessel - column + - rf + - pct1 + - pct2 + - solvent1 + - solvent2 + - ratio title: RunColumn_Goal type: object result: @@ -1979,19 +4240,156 @@ workstation: to_vessel: to_vessel waste_phase_to_vessel: waste_phase_to_vessel goal_default: - from_vessel: '' + from_vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' product_phase: '' + product_vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' purpose: '' repeats: 0 - separation_vessel: '' + separation_vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' settling_time: 0.0 solvent: '' - solvent_volume: 0.0 + solvent_volume: '' stir_speed: 0.0 stir_time: 0.0 through: '' - to_vessel: '' - waste_phase_to_vessel: '' + to_vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + volume: '' + waste_phase_to_vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + waste_vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: input: - data_key: vessel @@ -2026,53 +4424,165 @@ workstation: properties: feedback: properties: - current_device: - type: string + progress: + type: number status: type: string - time_remaining: - properties: - nanosec: - maximum: 4294967295 - minimum: 0 - type: integer - sec: - maximum: 2147483647 - minimum: -2147483648 - type: integer - required: - - sec - - nanosec - title: Duration - type: object - time_spent: - properties: - nanosec: - maximum: 4294967295 - minimum: 0 - type: integer - sec: - maximum: 2147483647 - minimum: -2147483648 - type: integer - required: - - sec - - nanosec - title: Duration - type: object required: - status - - current_device - - time_spent - - time_remaining + - progress title: Separate_Feedback type: object goal: properties: from_vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object product_phase: type: string + product_vessel: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object purpose: type: string repeats: @@ -2080,13 +4590,84 @@ workstation: minimum: -2147483648 type: integer separation_vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object settling_time: type: number solvent: type: string solvent_volume: - type: number + type: string stir_speed: type: number stir_time: @@ -2094,18 +4675,312 @@ workstation: through: type: string to_vessel: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + vessel: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + volume: type: string waste_phase_to_vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + waste_vessel: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: + - vessel - purpose - product_phase - from_vessel - separation_vessel - to_vessel - waste_phase_to_vessel + - product_vessel + - waste_vessel - solvent - solvent_volume + - volume - through - repeats - stir_time @@ -2115,13 +4990,16 @@ workstation: type: object result: properties: + message: + type: string return_info: type: string success: type: boolean required: - - return_info - success + - message + - return_info title: Separate_Result type: object required: @@ -2138,7 +5016,26 @@ workstation: goal_default: purpose: '' stir_speed: 0.0 - vessel: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: input: - data_key: vessel @@ -2177,7 +5074,78 @@ workstation: stir_speed: type: number vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: - vessel - stir_speed @@ -2214,9 +5182,32 @@ workstation: time_spec: time_spec vessel: vessel goal_default: - settling_time: 0.0 + event: '' + settling_time: '' stir_speed: 0.0 stir_time: 0.0 + time: '' + time_spec: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: input: - data_key: vessel @@ -2244,13 +5235,96 @@ workstation: type: object goal: properties: + event: + type: string settling_time: - type: number + type: string stir_speed: type: number stir_time: type: number + time: + type: string + time_spec: + type: string + vessel: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: + - vessel + - time + - event + - time_spec - stir_time - stir_speed - settling_time @@ -2258,13 +5332,16 @@ workstation: type: object result: properties: + message: + type: string return_info: type: string success: type: boolean required: - - return_info - success + - message + - return_info title: Stir_Result type: object required: @@ -2277,7 +5354,26 @@ workstation: goal: vessel: vessel goal_default: - vessel: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' handles: input: - data_key: vessel @@ -2309,7 +5405,78 @@ workstation: goal: properties: vessel: - type: string + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object required: - vessel title: StopStir_Goal @@ -2472,15 +5639,57 @@ workstation: vessel: vessel volume: volume goal_default: - filtrate_vessel: '' + event: '' + filtrate_vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + mass: '' repeats: 0 + repeats_spec: '' solvent: '' stir: false stir_speed: 0.0 temp: 0.0 - time: 0.0 - vessel: '' - volume: 0.0 + time: '' + vessel: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + volume: '' + volume_spec: '' handles: input: - data_key: vessel @@ -2526,12 +5735,89 @@ workstation: type: object goal: properties: + event: + type: string filtrate_vessel: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + mass: type: string repeats: maximum: 2147483647 minimum: -2147483648 type: integer + repeats_spec: + type: string solvent: type: string stir: @@ -2541,11 +5827,84 @@ workstation: temp: type: number time: - type: number - vessel: type: string + vessel: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object volume: - type: number + type: string + volume_spec: + type: string required: - vessel - solvent @@ -2556,6 +5915,10 @@ workstation: - stir_speed - time - repeats + - volume_spec + - repeats_spec + - mass + - event title: WashSolid_Goal type: object result: From 5823edec8f7c063a57edac32a6b45a6f38a63dbb Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Fri, 18 Jul 2025 15:27:10 +0800 Subject: [PATCH 69/96] update --- unilabos/devices/liquid_handling/prcxi/prcxi.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index 32731a9..570cc7f 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -526,8 +526,6 @@ class PRCXI9300Backend(LiquidHandlerBackend): """Mix liquid in the specified resources.""" - if len(targets) != 8: - raise ValueError(f"PRCXI9300Backend aspirate: Expected 8 aspirate, got {len(targets)}") plate_indexes = [] for op in targets: @@ -549,12 +547,16 @@ class PRCXI9300Backend(LiquidHandlerBackend): PlateNo = plate_indexes[0] + 1 hole_col = tip_columns[0] + 1 + hole_row = 1 + if self.num_channels == 1: + hole_row = tipspot_index % 8 + 1 + assert mix_time > 0 step = self.api_client.Blending( dosage=mix_vol, plate_no=PlateNo, is_whole_plate=False, - hole_row=1, + hole_row=hole_row, hole_col=hole_col, blending_times=mix_time, balance_height=0, @@ -592,7 +594,7 @@ class PRCXI9300Backend(LiquidHandlerBackend): PlateNo = plate_indexes[0] + 1 hole_col = tip_columns[0] + 1 - + hole_row = 1 if self.num_channels == 1: hole_row = tipspot_index % 8 + 1 @@ -633,6 +635,7 @@ class PRCXI9300Backend(LiquidHandlerBackend): PlateNo = plate_indexes[0] + 1 hole_col = tip_columns[0] + 1 + hole_row = 1 if self.num_channels == 1: hole_row = tipspot_index % 8 + 1 @@ -1250,9 +1253,11 @@ if __name__ == "__main__": print(plate11.get_well(0).tracker.get_used_volume()) asyncio.run(handler.create_protocol(protocol_name="Test Protocol")) # Initialize the backend and setup the connection asyncio.run(handler.pick_up_tips([plate8.children[3]],[0])) - asyncio.run(handler.aspirate([plate11.children[0]],[9], [0])) + asyncio.run(handler.aspirate([plate11.children[0]],[10], [0])) asyncio.run(handler.dispense([plate1.children[3]],[10],[0])) asyncio.run(handler.mix([plate1.children[3]], mix_time=3, mix_vol=5, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) + + asyncio.run(handler.discard_tips()) # asyncio.run(handler.discard_tips()) From c4625404840f662a453c1f07440afe746ee4d70f Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Fri, 18 Jul 2025 20:33:15 +0800 Subject: [PATCH 70/96] update --- .../devices/liquid_handling/prcxi/prcxi.py | 37 ++++++++++--------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index 570cc7f..27993b6 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -462,6 +462,26 @@ class PRCXI9300Backend(LiquidHandlerBackend): async def drop_tips(self, ops: List[Drop], use_channels: List[int] = None): """Pick up tips from the specified resource.""" + # 检查trash # + if ops[0].resource.name == "trash": + PlateNo = ops[0].resource.parent.children.index(ops[0].resource) + 1 + + step = self.api_client.UnLoad( + dosage=0, + plate_no=PlateNo, + is_whole_plate=False, + hole_row=3, + hole_col=3, + blending_times=0, + balance_height=0, + plate_or_hole=f"H{1}-8,T{PlateNo}", + hole_numbers="1,2,3,4,5,6,7,8", + ) + self.steps_todo_list.append(step) + return + #print(ops[0].resource.parent.children.index(ops[0].resource)) + + plate_indexes = [] for op in ops: plate = op.resource.parent.parent @@ -482,21 +502,6 @@ class PRCXI9300Backend(LiquidHandlerBackend): PlateNo = plate_indexes[0] + 1 hole_col = tip_columns[0] + 1 - if deck.children[plate_index].name == "trash": - step = self.api_client.UnLoad( - dosage=0, - plate_no=PlateNo, - is_whole_plate=False, - hole_row=3, - hole_col=3, - blending_times=0, - balance_height=0, - plate_or_hole=f"H{hole_col}-8,T{PlateNo}", - hole_numbers="1,2,3,4,5,6,7,8", - ) - self.steps_todo_list.append(step) - return - if self.channel_num == 1: hole_row = tipspot_index % 8 + 1 @@ -1256,8 +1261,6 @@ if __name__ == "__main__": asyncio.run(handler.aspirate([plate11.children[0]],[10], [0])) asyncio.run(handler.dispense([plate1.children[3]],[10],[0])) asyncio.run(handler.mix([plate1.children[3]], mix_time=3, mix_vol=5, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) - - asyncio.run(handler.discard_tips()) # asyncio.run(handler.discard_tips()) From 3d9798476b03860da147e59176eb2bb4232c7123 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Fri, 18 Jul 2025 21:27:56 +0800 Subject: [PATCH 71/96] registry upadte --- unilabos/registry/devices/liquid_handler.yaml | 5 ++++- unilabos/registry/devices/work_station.yaml | 2 ++ unilabos/resources/graphio.py | 1 - unilabos/ros/nodes/resource_tracker.py | 9 +++++++++ 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/unilabos/registry/devices/liquid_handler.yaml b/unilabos/registry/devices/liquid_handler.yaml index f827855..d8c05a5 100644 --- a/unilabos/registry/devices/liquid_handler.yaml +++ b/unilabos/registry/devices/liquid_handler.yaml @@ -6847,7 +6847,10 @@ liquid_handler.prcxi: type: LiquidHandlerPickUpTips set_liquid: feedback: {} - goal: {} + goal: + liquid_names: liquid_names + volumes: volumes + wells: wells goal_default: liquid_names: - '' diff --git a/unilabos/registry/devices/work_station.yaml b/unilabos/registry/devices/work_station.yaml index 9dd6c96..564d49c 100644 --- a/unilabos/registry/devices/work_station.yaml +++ b/unilabos/registry/devices/work_station.yaml @@ -240,6 +240,8 @@ workstation: type: object type: AGVTransfer AddProtocol: + placeholder_keys: + vessel: unilabos_resources feedback: {} goal: amount: amount diff --git a/unilabos/resources/graphio.py b/unilabos/resources/graphio.py index 956e7fb..a392438 100644 --- a/unilabos/resources/graphio.py +++ b/unilabos/resources/graphio.py @@ -461,7 +461,6 @@ def resource_plr_to_ulab(resource_plr: "ResourcePLR", parent_name: str = None): "data": all_states[d["name"]], } return r - d = resource_plr.serialize() all_states = resource_plr.serialize_all_state() r = resource_plr_to_ulab_inner(d, all_states) diff --git a/unilabos/ros/nodes/resource_tracker.py b/unilabos/ros/nodes/resource_tracker.py index 10cc4bc..e6054ef 100644 --- a/unilabos/ros/nodes/resource_tracker.py +++ b/unilabos/ros/nodes/resource_tracker.py @@ -10,6 +10,15 @@ class DeviceNodeResourceTracker(object): self.resource2parent_resource = {} pass + def prefix_path(self, resource): + resource_prefix_path = "/" + resource_parent = getattr(resource, "parent", None) + while resource_parent is not None: + resource_prefix_path = f"/{resource_parent.name}" + resource_prefix_path + resource_parent = resource_parent.parent + + return resource_prefix_path + def parent_resource(self, resource): if id(resource) in self.resource2parent_resource: return self.resource2parent_resource[id(resource)] From 2c06f94bcfd902b1526ac55844edf15753b86bed Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Fri, 18 Jul 2025 21:44:57 +0800 Subject: [PATCH 72/96] Update --- .gitignore | 4 ++- .../devices/liquid_handling/prcxi/prcxi.py | 25 +++++++++++-------- unilabos/registry/devices/work_station.yaml | 4 +-- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index 728d704..c3147ec 100644 --- a/.gitignore +++ b/.gitignore @@ -239,4 +239,6 @@ unilabos/device_mesh/view_robot.rviz # Certs -**/.certs \ No newline at end of file +**/.certs +local_test2.py +ros-humble-unilabos-msgs-0.9.12-h6403a04_5.tar.bz2 diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index 27993b6..b8e0e53 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -464,6 +464,7 @@ class PRCXI9300Backend(LiquidHandlerBackend): # 检查trash # if ops[0].resource.name == "trash": + PlateNo = ops[0].resource.parent.children.index(ops[0].resource) + 1 step = self.api_client.UnLoad( @@ -1140,7 +1141,7 @@ if __name__ == "__main__": tip_racks.update({k: v for k, v in tip_rack_serialized.items() if k not in ["children"]}) new_tip_rack: PRCXI9300Container = PRCXI9300Container.deserialize(tip_racks) return new_tip_rack - + plate1 = get_well_container("HPLCPlateT1") plate1.load_state({ "Material": { @@ -1223,24 +1224,28 @@ if __name__ == "__main__": "uuid": "04211a2dc93547fe9bf6121eac533650" } }) + + container_for_nothing = PRCXI9300Container(name="container_for_nothing", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) + deck.assign_child_resource(plate1, location=Coordinate(0, 0, 0)) - # deck.assign_child_resource(plate2, location=Coordinate(0, 0, 0)) - # deck.assign_child_resource(plate3, location=Coordinate(0, 0, 0)) + deck.assign_child_resource(container_for_nothing, location=Coordinate(0, 0, 0)) + deck.assign_child_resource(container_for_nothing, location=Coordinate(0, 0, 0)) deck.assign_child_resource(trash, location=Coordinate(0, 0, 0)) - # deck.assign_child_resource(plate5, location=Coordinate(0, 0, 0)) - # deck.assign_child_resource(plate6, location=Coordinate(0, 0, 0)) - # deck.assign_child_resource(plate7, location=Coordinate(0, 0, 0)) + deck.assign_child_resource(container_for_nothing, location=Coordinate(0, 0, 0)) + deck.assign_child_resource(container_for_nothing, location=Coordinate(0, 0, 0)) + deck.assign_child_resource(container_for_nothing, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate8, location=Coordinate(0, 0, 0)) - # deck.assign_child_resource(plate9, location=Coordinate(0, 0, 0)) - # deck.assign_child_resource(plate10, location=Coordinate(0, 0, 0)) + deck.assign_child_resource(container_for_nothing, location=Coordinate(0, 0, 0)) + deck.assign_child_resource(container_for_nothing, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate11, location=Coordinate(0, 0, 0)) - # deck.assign_child_resource(plate12, location=Coordinate(0, 0, 0)) - # deck.assign_child_resource(plate13, location=Coordinate(0, 0, 0)) + deck.assign_child_resource(container_for_nothing, location=Coordinate(0, 0, 0)) + deck.assign_child_resource(container_for_nothing, location=Coordinate(0, 0, 0)) handler = PRCXI9300Handler(deck=deck, host="10.181.102.13", port=9999, timeout=10.0, setup=False, debug=True, matrix_id="fd383e6d-2d0e-40b5-9c01-1b2870b1f1b1", channel_num=1) + handler.set_tiprack([plate8]) # Set the tip rack for the handler asyncio.run(handler.setup()) # Initialize the handler and setup the connection from pylabrobot.resources import set_volume_tracking diff --git a/unilabos/registry/devices/work_station.yaml b/unilabos/registry/devices/work_station.yaml index 564d49c..e9f33bb 100644 --- a/unilabos/registry/devices/work_station.yaml +++ b/unilabos/registry/devices/work_station.yaml @@ -240,8 +240,6 @@ workstation: type: object type: AGVTransfer AddProtocol: - placeholder_keys: - vessel: unilabos_resources feedback: {} goal: amount: amount @@ -307,6 +305,8 @@ workstation: data_type: resource handler_key: VesselOut label: Vessel + placeholder_keys: + vessel: unilabos_resources result: {} schema: description: '' From de6584f7a83f191fdb10170647822e44849e6931 Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Fri, 18 Jul 2025 22:03:12 +0800 Subject: [PATCH 73/96] update --- test/experiments/prcxi.json | 4 +- .../devices/liquid_handling/prcxi/deck.json | 290 +++++++++++++++++- .../devices/liquid_handling/prcxi/prcxi.py | 25 +- 3 files changed, 304 insertions(+), 15 deletions(-) diff --git a/test/experiments/prcxi.json b/test/experiments/prcxi.json index faf06bb..93cd864 100644 --- a/test/experiments/prcxi.json +++ b/test/experiments/prcxi.json @@ -16,13 +16,13 @@ "_resource_child_name": "PRCXI_Deck", "_resource_type": "unilabos.devices.liquid_handling.prcxi.prcxi:PRCXI9300Deck" }, - "host": "192.168.3.9", + "host": "10.181.102.13", "port": 9999, "timeout": 10.0, "axis": "Right", "channel_num": 1, "setup": false, - "debug": true, + "debug": false, "simulator": false, "matrix_id": "fd383e6d-2d0e-40b5-9c01-1b2870b1f1b1" }, diff --git a/unilabos/devices/liquid_handling/prcxi/deck.json b/unilabos/devices/liquid_handling/prcxi/deck.json index 4025b26..7a97961 100644 --- a/unilabos/devices/liquid_handling/prcxi/deck.json +++ b/unilabos/devices/liquid_handling/prcxi/deck.json @@ -5,9 +5,18 @@ "sample_id": null, "children": [ "HPLCPlateT1", + "container_for_nothing1", + "container_for_nothing2", "trash", + "container_for_nothing3", + "container_for_nothing", + "container_for_nothing4", "RackT8", - "PlateT11" + "container_for_nothing5", + "container_for_nothing6", + "PlateT11", + "container_for_nothing7", + "container_for_nothing8" ], "parent": "lh_PRCXI_Deck", "type": "deck", @@ -4007,6 +4016,68 @@ "liquid_history": [] } }, + { + "id": "container_for_nothing1", + "name": "container_for_nothing1", + "sample_id": null, + "children": [], + "parent": "PRCXI_Deck", + "type": "plate", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} + }, + "data": {} + }, + { + "id": "container_for_nothing2", + "name": "container_for_nothing2", + "sample_id": null, + "children": [], + "parent": "PRCXI_Deck", + "type": "plate", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} + }, + "data": {} + }, { "id": "trash", "name": "trash", @@ -4048,6 +4119,99 @@ } } }, + { + "id": "container_for_nothing3", + "name": "container_for_nothing3", + "sample_id": null, + "children": [], + "parent": "PRCXI_Deck", + "type": "plate", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} + }, + "data": {} + }, + { + "id": "container_for_nothing", + "name": "container_for_nothing", + "sample_id": null, + "children": [], + "parent": "PRCXI_Deck", + "type": "plate", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} + }, + "data": {} + }, + { + "id": "container_for_nothing4", + "name": "container_for_nothing4", + "sample_id": null, + "children": [], + "parent": "PRCXI_Deck", + "type": "plate", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} + }, + "data": {} + }, { "id": "RackT8", "name": "RackT8", @@ -8118,6 +8282,68 @@ "pending_tip": null } }, + { + "id": "container_for_nothing5", + "name": "container_for_nothing5", + "sample_id": null, + "children": [], + "parent": "PRCXI_Deck", + "type": "plate", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} + }, + "data": {} + }, + { + "id": "container_for_nothing6", + "name": "container_for_nothing6", + "sample_id": null, + "children": [], + "parent": "PRCXI_Deck", + "type": "plate", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} + }, + "data": {} + }, { "id": "PlateT11", "name": "PlateT11", @@ -13241,5 +13467,67 @@ null ] } + }, + { + "id": "container_for_nothing7", + "name": "container_for_nothing7", + "sample_id": null, + "children": [], + "parent": "PRCXI_Deck", + "type": "plate", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} + }, + "data": {} + }, + { + "id": "container_for_nothing8", + "name": "container_for_nothing8", + "sample_id": null, + "children": [], + "parent": "PRCXI_Deck", + "type": "plate", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} + }, + "data": {} } ] \ No newline at end of file diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index b8e0e53..3e791a1 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -464,7 +464,7 @@ class PRCXI9300Backend(LiquidHandlerBackend): # 检查trash # if ops[0].resource.name == "trash": - + PlateNo = ops[0].resource.parent.children.index(ops[0].resource) + 1 step = self.api_client.UnLoad( @@ -1225,24 +1225,24 @@ if __name__ == "__main__": } }) - container_for_nothing = PRCXI9300Container(name="container_for_nothing", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) + # container_for_nothing = PRCXI9300Container(name="container_for_nothing", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) deck.assign_child_resource(plate1, location=Coordinate(0, 0, 0)) - deck.assign_child_resource(container_for_nothing, location=Coordinate(0, 0, 0)) - deck.assign_child_resource(container_for_nothing, location=Coordinate(0, 0, 0)) + deck.assign_child_resource(PRCXI9300Container(name="container_for_nothing1", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()), location=Coordinate(0, 0, 0)) + deck.assign_child_resource(PRCXI9300Container(name="container_for_nothing2", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()), location=Coordinate(0, 0, 0)) deck.assign_child_resource(trash, location=Coordinate(0, 0, 0)) - deck.assign_child_resource(container_for_nothing, location=Coordinate(0, 0, 0)) - deck.assign_child_resource(container_for_nothing, location=Coordinate(0, 0, 0)) - deck.assign_child_resource(container_for_nothing, location=Coordinate(0, 0, 0)) + deck.assign_child_resource(PRCXI9300Container(name="container_for_nothing3", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()), location=Coordinate(0, 0, 0)) + deck.assign_child_resource(PRCXI9300Container(name="container_for_nothing", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()), location=Coordinate(0, 0, 0)) + deck.assign_child_resource(PRCXI9300Container(name="container_for_nothing4", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()), location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate8, location=Coordinate(0, 0, 0)) - deck.assign_child_resource(container_for_nothing, location=Coordinate(0, 0, 0)) - deck.assign_child_resource(container_for_nothing, location=Coordinate(0, 0, 0)) + deck.assign_child_resource(PRCXI9300Container(name="container_for_nothing5", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()), location=Coordinate(0, 0, 0)) + deck.assign_child_resource(PRCXI9300Container(name="container_for_nothing6", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()), location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate11, location=Coordinate(0, 0, 0)) - deck.assign_child_resource(container_for_nothing, location=Coordinate(0, 0, 0)) - deck.assign_child_resource(container_for_nothing, location=Coordinate(0, 0, 0)) + deck.assign_child_resource(PRCXI9300Container(name="container_for_nothing7", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()), location=Coordinate(0, 0, 0)) + deck.assign_child_resource(PRCXI9300Container(name="container_for_nothing8", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()), location=Coordinate(0, 0, 0)) handler = PRCXI9300Handler(deck=deck, host="10.181.102.13", port=9999, - timeout=10.0, setup=False, debug=True, + timeout=10.0, setup=False, debug=False, matrix_id="fd383e6d-2d0e-40b5-9c01-1b2870b1f1b1", channel_num=1) @@ -1262,6 +1262,7 @@ if __name__ == "__main__": print(plate11.get_well(0).tracker.get_used_volume()) asyncio.run(handler.create_protocol(protocol_name="Test Protocol")) # Initialize the backend and setup the connection + print(plate8.children[3]) asyncio.run(handler.pick_up_tips([plate8.children[3]],[0])) asyncio.run(handler.aspirate([plate11.children[0]],[10], [0])) asyncio.run(handler.dispense([plate1.children[3]],[10],[0])) From a95e4d446bb658bf40ecd375bf348afa966de594 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Fri, 18 Jul 2025 22:06:19 +0800 Subject: [PATCH 74/96] container_for_nothing --- test/experiments/prcxi.json | 4426 +++++++++++++++++++---------------- 1 file changed, 2405 insertions(+), 2021 deletions(-) diff --git a/test/experiments/prcxi.json b/test/experiments/prcxi.json index 93cd864..d72768f 100644 --- a/test/experiments/prcxi.json +++ b/test/experiments/prcxi.json @@ -37,9 +37,18 @@ "sample_id": null, "children": [ "HPLCPlateT1", + "container_for_nothing1", + "container_for_nothing2", "trash", + "container_for_nothing3", + "container_for_nothing", + "container_for_nothing4", "RackT8", - "PlateT11" + "container_for_nothing5", + "container_for_nothing6", + "PlateT11", + "container_for_nothing7", + "container_for_nothing8" ], "parent": "lh_PRCXI_Deck", "type": "deck", @@ -4039,6 +4048,68 @@ "liquid_history": [] } }, + { + "id": "container_for_nothing1", + "name": "container_for_nothing1", + "sample_id": null, + "children": [], + "parent": "PRCXI_Deck", + "type": "plate", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} + }, + "data": {} + }, + { + "id": "container_for_nothing2", + "name": "container_for_nothing2", + "sample_id": null, + "children": [], + "parent": "PRCXI_Deck", + "type": "plate", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} + }, + "data": {} + }, { "id": "trash", "name": "trash", @@ -4081,107 +4152,10 @@ } }, { - "id": "RackT8", - "name": "RackT8", + "id": "container_for_nothing3", + "name": "container_for_nothing3", "sample_id": null, - "children": [ - "RackT8_A1", - "RackT8_B1", - "RackT8_C1", - "RackT8_D1", - "RackT8_E1", - "RackT8_F1", - "RackT8_G1", - "RackT8_H1", - "RackT8_A2", - "RackT8_B2", - "RackT8_C2", - "RackT8_D2", - "RackT8_E2", - "RackT8_F2", - "RackT8_G2", - "RackT8_H2", - "RackT8_A3", - "RackT8_B3", - "RackT8_C3", - "RackT8_D3", - "RackT8_E3", - "RackT8_F3", - "RackT8_G3", - "RackT8_H3", - "RackT8_A4", - "RackT8_B4", - "RackT8_C4", - "RackT8_D4", - "RackT8_E4", - "RackT8_F4", - "RackT8_G4", - "RackT8_H4", - "RackT8_A5", - "RackT8_B5", - "RackT8_C5", - "RackT8_D5", - "RackT8_E5", - "RackT8_F5", - "RackT8_G5", - "RackT8_H5", - "RackT8_A6", - "RackT8_B6", - "RackT8_C6", - "RackT8_D6", - "RackT8_E6", - "RackT8_F6", - "RackT8_G6", - "RackT8_H6", - "RackT8_A7", - "RackT8_B7", - "RackT8_C7", - "RackT8_D7", - "RackT8_E7", - "RackT8_F7", - "RackT8_G7", - "RackT8_H7", - "RackT8_A8", - "RackT8_B8", - "RackT8_C8", - "RackT8_D8", - "RackT8_E8", - "RackT8_F8", - "RackT8_G8", - "RackT8_H8", - "RackT8_A9", - "RackT8_B9", - "RackT8_C9", - "RackT8_D9", - "RackT8_E9", - "RackT8_F9", - "RackT8_G9", - "RackT8_H9", - "RackT8_A10", - "RackT8_B10", - "RackT8_C10", - "RackT8_D10", - "RackT8_E10", - "RackT8_F10", - "RackT8_G10", - "RackT8_H10", - "RackT8_A11", - "RackT8_B11", - "RackT8_C11", - "RackT8_D11", - "RackT8_E11", - "RackT8_F11", - "RackT8_G11", - "RackT8_H11", - "RackT8_A12", - "RackT8_B12", - "RackT8_C12", - "RackT8_D12", - "RackT8_E12", - "RackT8_F12", - "RackT8_G12", - "RackT8_H12" - ], + "children": [], "parent": "PRCXI_Deck", "type": "plate", "class": "", @@ -4206,6 +4180,196 @@ "barcode": null, "ordering": {} }, + "data": {} + }, + { + "id": "container_for_nothing", + "name": "container_for_nothing", + "sample_id": null, + "children": [], + "parent": "PRCXI_Deck", + "type": "plate", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} + }, + "data": {} + }, + { + "id": "container_for_nothing4", + "name": "container_for_nothing4", + "sample_id": null, + "children": [], + "parent": "PRCXI_Deck", + "type": "plate", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} + }, + "data": {} + }, + { + "id": "RackT8", + "name": "RackT8", + "sample_id": null, + "children": [ + "name_A1", + "name_B1", + "name_C1", + "name_D1", + "name_E1", + "name_F1", + "name_G1", + "name_H1", + "name_A2", + "name_B2", + "name_C2", + "name_D2", + "name_E2", + "name_F2", + "name_G2", + "name_H2", + "name_A3", + "name_B3", + "name_C3", + "name_D3", + "name_E3", + "name_F3", + "name_G3", + "name_H3", + "name_A4", + "name_B4", + "name_C4", + "name_D4", + "name_E4", + "name_F4", + "name_G4", + "name_H4", + "name_A5", + "name_B5", + "name_C5", + "name_D5", + "name_E5", + "name_F5", + "name_G5", + "name_H5", + "name_A6", + "name_B6", + "name_C6", + "name_D6", + "name_E6", + "name_F6", + "name_G6", + "name_H6", + "name_A7", + "name_B7", + "name_C7", + "name_D7", + "name_E7", + "name_F7", + "name_G7", + "name_H7", + "name_A8", + "name_B8", + "name_C8", + "name_D8", + "name_E8", + "name_F8", + "name_G8", + "name_H8", + "name_A9", + "name_B9", + "name_C9", + "name_D9", + "name_E9", + "name_F9", + "name_G9", + "name_H9", + "name_A10", + "name_B10", + "name_C10", + "name_D10", + "name_E10", + "name_F10", + "name_G10", + "name_H10", + "name_A11", + "name_B11", + "name_C11", + "name_D11", + "name_E11", + "name_F11", + "name_G11", + "name_H11", + "name_A12", + "name_B12", + "name_C12", + "name_D12", + "name_E12", + "name_F12", + "name_G12", + "name_H12" + ], + "parent": "PRCXI_Deck", + "type": "container", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_rack", + "model": null, + "barcode": null, + "ordering": {} + }, "data": { "Material": { "uuid": "068b3815e36b4a72a59bae017011b29f", @@ -4215,3845 +4379,4003 @@ } }, { - "id": "RackT8_A1", - "name": "RackT8_A1", + "id": "name_A1", + "name": "name_A1", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 11.9545, - "y": 71.8145, - "z": 3.55 + "x": 13.224, + "y": 73.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_B1", - "name": "RackT8_B1", + "id": "name_B1", + "name": "name_B1", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 11.9545, - "y": 62.8145, - "z": 3.55 + "x": 13.224, + "y": 64.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_C1", - "name": "RackT8_C1", + "id": "name_C1", + "name": "name_C1", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 11.9545, - "y": 53.8145, - "z": 3.55 + "x": 13.224, + "y": 55.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_D1", - "name": "RackT8_D1", + "id": "name_D1", + "name": "name_D1", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 11.9545, - "y": 44.8145, - "z": 3.55 + "x": 13.224, + "y": 46.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_E1", - "name": "RackT8_E1", + "id": "name_E1", + "name": "name_E1", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 11.9545, - "y": 35.8145, - "z": 3.55 + "x": 13.224, + "y": 37.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_F1", - "name": "RackT8_F1", + "id": "name_F1", + "name": "name_F1", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 11.9545, - "y": 26.8145, - "z": 3.55 + "x": 13.224, + "y": 28.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_G1", - "name": "RackT8_G1", + "id": "name_G1", + "name": "name_G1", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 11.9545, - "y": 17.8145, - "z": 3.55 + "x": 13.224, + "y": 19.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_H1", - "name": "RackT8_H1", + "id": "name_H1", + "name": "name_H1", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 11.9545, - "y": 8.8145, - "z": 3.55 + "x": 13.224, + "y": 10.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_A2", - "name": "RackT8_A2", + "id": "name_A2", + "name": "name_A2", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 20.9545, - "y": 71.8145, - "z": 3.55 + "x": 22.224, + "y": 73.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_B2", - "name": "RackT8_B2", + "id": "name_B2", + "name": "name_B2", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 20.9545, - "y": 62.8145, - "z": 3.55 + "x": 22.224, + "y": 64.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_C2", - "name": "RackT8_C2", + "id": "name_C2", + "name": "name_C2", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 20.9545, - "y": 53.8145, - "z": 3.55 + "x": 22.224, + "y": 55.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_D2", - "name": "RackT8_D2", + "id": "name_D2", + "name": "name_D2", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 20.9545, - "y": 44.8145, - "z": 3.55 + "x": 22.224, + "y": 46.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_E2", - "name": "RackT8_E2", + "id": "name_E2", + "name": "name_E2", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 20.9545, - "y": 35.8145, - "z": 3.55 + "x": 22.224, + "y": 37.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_F2", - "name": "RackT8_F2", + "id": "name_F2", + "name": "name_F2", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 20.9545, - "y": 26.8145, - "z": 3.55 + "x": 22.224, + "y": 28.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_G2", - "name": "RackT8_G2", + "id": "name_G2", + "name": "name_G2", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 20.9545, - "y": 17.8145, - "z": 3.55 + "x": 22.224, + "y": 19.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_H2", - "name": "RackT8_H2", + "id": "name_H2", + "name": "name_H2", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 20.9545, - "y": 8.8145, - "z": 3.55 + "x": 22.224, + "y": 10.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_A3", - "name": "RackT8_A3", + "id": "name_A3", + "name": "name_A3", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 29.9545, - "y": 71.8145, - "z": 3.55 + "x": 31.224, + "y": 73.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_B3", - "name": "RackT8_B3", + "id": "name_B3", + "name": "name_B3", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 29.9545, - "y": 62.8145, - "z": 3.55 + "x": 31.224, + "y": 64.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_C3", - "name": "RackT8_C3", + "id": "name_C3", + "name": "name_C3", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 29.9545, - "y": 53.8145, - "z": 3.55 + "x": 31.224, + "y": 55.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_D3", - "name": "RackT8_D3", + "id": "name_D3", + "name": "name_D3", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 29.9545, - "y": 44.8145, - "z": 3.55 + "x": 31.224, + "y": 46.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_E3", - "name": "RackT8_E3", + "id": "name_E3", + "name": "name_E3", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 29.9545, - "y": 35.8145, - "z": 3.55 + "x": 31.224, + "y": 37.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_F3", - "name": "RackT8_F3", + "id": "name_F3", + "name": "name_F3", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 29.9545, - "y": 26.8145, - "z": 3.55 + "x": 31.224, + "y": 28.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_G3", - "name": "RackT8_G3", + "id": "name_G3", + "name": "name_G3", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 29.9545, - "y": 17.8145, - "z": 3.55 + "x": 31.224, + "y": 19.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_H3", - "name": "RackT8_H3", + "id": "name_H3", + "name": "name_H3", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 29.9545, - "y": 8.8145, - "z": 3.55 + "x": 31.224, + "y": 10.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_A4", - "name": "RackT8_A4", + "id": "name_A4", + "name": "name_A4", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 38.9545, - "y": 71.8145, - "z": 3.55 + "x": 40.224, + "y": 73.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_B4", - "name": "RackT8_B4", + "id": "name_B4", + "name": "name_B4", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 38.9545, - "y": 62.8145, - "z": 3.55 + "x": 40.224, + "y": 64.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_C4", - "name": "RackT8_C4", + "id": "name_C4", + "name": "name_C4", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 38.9545, - "y": 53.8145, - "z": 3.55 + "x": 40.224, + "y": 55.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_D4", - "name": "RackT8_D4", + "id": "name_D4", + "name": "name_D4", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 38.9545, - "y": 44.8145, - "z": 3.55 + "x": 40.224, + "y": 46.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_E4", - "name": "RackT8_E4", + "id": "name_E4", + "name": "name_E4", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 38.9545, - "y": 35.8145, - "z": 3.55 + "x": 40.224, + "y": 37.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_F4", - "name": "RackT8_F4", + "id": "name_F4", + "name": "name_F4", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 38.9545, - "y": 26.8145, - "z": 3.55 + "x": 40.224, + "y": 28.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_G4", - "name": "RackT8_G4", + "id": "name_G4", + "name": "name_G4", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 38.9545, - "y": 17.8145, - "z": 3.55 + "x": 40.224, + "y": 19.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_H4", - "name": "RackT8_H4", + "id": "name_H4", + "name": "name_H4", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 38.9545, - "y": 8.8145, - "z": 3.55 + "x": 40.224, + "y": 10.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_A5", - "name": "RackT8_A5", + "id": "name_A5", + "name": "name_A5", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 47.9545, - "y": 71.8145, - "z": 3.55 + "x": 49.224, + "y": 73.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_B5", - "name": "RackT8_B5", + "id": "name_B5", + "name": "name_B5", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 47.9545, - "y": 62.8145, - "z": 3.55 + "x": 49.224, + "y": 64.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_C5", - "name": "RackT8_C5", + "id": "name_C5", + "name": "name_C5", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 47.9545, - "y": 53.8145, - "z": 3.55 + "x": 49.224, + "y": 55.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_D5", - "name": "RackT8_D5", + "id": "name_D5", + "name": "name_D5", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 47.9545, - "y": 44.8145, - "z": 3.55 + "x": 49.224, + "y": 46.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_E5", - "name": "RackT8_E5", + "id": "name_E5", + "name": "name_E5", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 47.9545, - "y": 35.8145, - "z": 3.55 + "x": 49.224, + "y": 37.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_F5", - "name": "RackT8_F5", + "id": "name_F5", + "name": "name_F5", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 47.9545, - "y": 26.8145, - "z": 3.55 + "x": 49.224, + "y": 28.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_G5", - "name": "RackT8_G5", + "id": "name_G5", + "name": "name_G5", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 47.9545, - "y": 17.8145, - "z": 3.55 + "x": 49.224, + "y": 19.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_H5", - "name": "RackT8_H5", + "id": "name_H5", + "name": "name_H5", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 47.9545, - "y": 8.8145, - "z": 3.55 + "x": 49.224, + "y": 10.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_A6", - "name": "RackT8_A6", + "id": "name_A6", + "name": "name_A6", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 56.9545, - "y": 71.8145, - "z": 3.55 + "x": 58.224, + "y": 73.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_B6", - "name": "RackT8_B6", + "id": "name_B6", + "name": "name_B6", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 56.9545, - "y": 62.8145, - "z": 3.55 + "x": 58.224, + "y": 64.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_C6", - "name": "RackT8_C6", + "id": "name_C6", + "name": "name_C6", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 56.9545, - "y": 53.8145, - "z": 3.55 + "x": 58.224, + "y": 55.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_D6", - "name": "RackT8_D6", + "id": "name_D6", + "name": "name_D6", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 56.9545, - "y": 44.8145, - "z": 3.55 + "x": 58.224, + "y": 46.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_E6", - "name": "RackT8_E6", + "id": "name_E6", + "name": "name_E6", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 56.9545, - "y": 35.8145, - "z": 3.55 + "x": 58.224, + "y": 37.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_F6", - "name": "RackT8_F6", + "id": "name_F6", + "name": "name_F6", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 56.9545, - "y": 26.8145, - "z": 3.55 + "x": 58.224, + "y": 28.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_G6", - "name": "RackT8_G6", + "id": "name_G6", + "name": "name_G6", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 56.9545, - "y": 17.8145, - "z": 3.55 + "x": 58.224, + "y": 19.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_H6", - "name": "RackT8_H6", + "id": "name_H6", + "name": "name_H6", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 56.9545, - "y": 8.8145, - "z": 3.55 + "x": 58.224, + "y": 10.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_A7", - "name": "RackT8_A7", + "id": "name_A7", + "name": "name_A7", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 65.9545, - "y": 71.8145, - "z": 3.55 + "x": 67.224, + "y": 73.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_B7", - "name": "RackT8_B7", + "id": "name_B7", + "name": "name_B7", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 65.9545, - "y": 62.8145, - "z": 3.55 + "x": 67.224, + "y": 64.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_C7", - "name": "RackT8_C7", + "id": "name_C7", + "name": "name_C7", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 65.9545, - "y": 53.8145, - "z": 3.55 + "x": 67.224, + "y": 55.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_D7", - "name": "RackT8_D7", + "id": "name_D7", + "name": "name_D7", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 65.9545, - "y": 44.8145, - "z": 3.55 + "x": 67.224, + "y": 46.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_E7", - "name": "RackT8_E7", + "id": "name_E7", + "name": "name_E7", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 65.9545, - "y": 35.8145, - "z": 3.55 + "x": 67.224, + "y": 37.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_F7", - "name": "RackT8_F7", + "id": "name_F7", + "name": "name_F7", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 65.9545, - "y": 26.8145, - "z": 3.55 + "x": 67.224, + "y": 28.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_G7", - "name": "RackT8_G7", + "id": "name_G7", + "name": "name_G7", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 65.9545, - "y": 17.8145, - "z": 3.55 + "x": 67.224, + "y": 19.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_H7", - "name": "RackT8_H7", + "id": "name_H7", + "name": "name_H7", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 65.9545, - "y": 8.8145, - "z": 3.55 + "x": 67.224, + "y": 10.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_A8", - "name": "RackT8_A8", + "id": "name_A8", + "name": "name_A8", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 74.9545, - "y": 71.8145, - "z": 3.55 + "x": 76.224, + "y": 73.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_B8", - "name": "RackT8_B8", + "id": "name_B8", + "name": "name_B8", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 74.9545, - "y": 62.8145, - "z": 3.55 + "x": 76.224, + "y": 64.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_C8", - "name": "RackT8_C8", + "id": "name_C8", + "name": "name_C8", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 74.9545, - "y": 53.8145, - "z": 3.55 + "x": 76.224, + "y": 55.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_D8", - "name": "RackT8_D8", + "id": "name_D8", + "name": "name_D8", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 74.9545, - "y": 44.8145, - "z": 3.55 + "x": 76.224, + "y": 46.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_E8", - "name": "RackT8_E8", + "id": "name_E8", + "name": "name_E8", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 74.9545, - "y": 35.8145, - "z": 3.55 + "x": 76.224, + "y": 37.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_F8", - "name": "RackT8_F8", + "id": "name_F8", + "name": "name_F8", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 74.9545, - "y": 26.8145, - "z": 3.55 + "x": 76.224, + "y": 28.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_G8", - "name": "RackT8_G8", + "id": "name_G8", + "name": "name_G8", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 74.9545, - "y": 17.8145, - "z": 3.55 + "x": 76.224, + "y": 19.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_H8", - "name": "RackT8_H8", + "id": "name_H8", + "name": "name_H8", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 74.9545, - "y": 8.8145, - "z": 3.55 + "x": 76.224, + "y": 10.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_A9", - "name": "RackT8_A9", + "id": "name_A9", + "name": "name_A9", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 83.9545, - "y": 71.8145, - "z": 3.55 + "x": 85.224, + "y": 73.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_B9", - "name": "RackT8_B9", + "id": "name_B9", + "name": "name_B9", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 83.9545, - "y": 62.8145, - "z": 3.55 + "x": 85.224, + "y": 64.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_C9", - "name": "RackT8_C9", + "id": "name_C9", + "name": "name_C9", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 83.9545, - "y": 53.8145, - "z": 3.55 + "x": 85.224, + "y": 55.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_D9", - "name": "RackT8_D9", + "id": "name_D9", + "name": "name_D9", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 83.9545, - "y": 44.8145, - "z": 3.55 + "x": 85.224, + "y": 46.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_E9", - "name": "RackT8_E9", + "id": "name_E9", + "name": "name_E9", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 83.9545, - "y": 35.8145, - "z": 3.55 + "x": 85.224, + "y": 37.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_F9", - "name": "RackT8_F9", + "id": "name_F9", + "name": "name_F9", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 83.9545, - "y": 26.8145, - "z": 3.55 + "x": 85.224, + "y": 28.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_G9", - "name": "RackT8_G9", + "id": "name_G9", + "name": "name_G9", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 83.9545, - "y": 17.8145, - "z": 3.55 + "x": 85.224, + "y": 19.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_H9", - "name": "RackT8_H9", + "id": "name_H9", + "name": "name_H9", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 83.9545, - "y": 8.8145, - "z": 3.55 + "x": 85.224, + "y": 10.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_A10", - "name": "RackT8_A10", + "id": "name_A10", + "name": "name_A10", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 92.9545, - "y": 71.8145, - "z": 3.55 + "x": 94.224, + "y": 73.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_B10", - "name": "RackT8_B10", + "id": "name_B10", + "name": "name_B10", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 92.9545, - "y": 62.8145, - "z": 3.55 + "x": 94.224, + "y": 64.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_C10", - "name": "RackT8_C10", + "id": "name_C10", + "name": "name_C10", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 92.9545, - "y": 53.8145, - "z": 3.55 + "x": 94.224, + "y": 55.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_D10", - "name": "RackT8_D10", + "id": "name_D10", + "name": "name_D10", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 92.9545, - "y": 44.8145, - "z": 3.55 + "x": 94.224, + "y": 46.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_E10", - "name": "RackT8_E10", + "id": "name_E10", + "name": "name_E10", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 92.9545, - "y": 35.8145, - "z": 3.55 + "x": 94.224, + "y": 37.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_F10", - "name": "RackT8_F10", + "id": "name_F10", + "name": "name_F10", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 92.9545, - "y": 26.8145, - "z": 3.55 + "x": 94.224, + "y": 28.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_G10", - "name": "RackT8_G10", + "id": "name_G10", + "name": "name_G10", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 92.9545, - "y": 17.8145, - "z": 3.55 + "x": 94.224, + "y": 19.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_H10", - "name": "RackT8_H10", + "id": "name_H10", + "name": "name_H10", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 92.9545, - "y": 8.8145, - "z": 3.55 + "x": 94.224, + "y": 10.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_A11", - "name": "RackT8_A11", + "id": "name_A11", + "name": "name_A11", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 101.9545, - "y": 71.8145, - "z": 3.55 + "x": 103.224, + "y": 73.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_B11", - "name": "RackT8_B11", + "id": "name_B11", + "name": "name_B11", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 101.9545, - "y": 62.8145, - "z": 3.55 + "x": 103.224, + "y": 64.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_C11", - "name": "RackT8_C11", + "id": "name_C11", + "name": "name_C11", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 101.9545, - "y": 53.8145, - "z": 3.55 + "x": 103.224, + "y": 55.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_D11", - "name": "RackT8_D11", + "id": "name_D11", + "name": "name_D11", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 101.9545, - "y": 44.8145, - "z": 3.55 + "x": 103.224, + "y": 46.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_E11", - "name": "RackT8_E11", + "id": "name_E11", + "name": "name_E11", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 101.9545, - "y": 35.8145, - "z": 3.55 + "x": 103.224, + "y": 37.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_F11", - "name": "RackT8_F11", + "id": "name_F11", + "name": "name_F11", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 101.9545, - "y": 26.8145, - "z": 3.55 + "x": 103.224, + "y": 28.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_G11", - "name": "RackT8_G11", + "id": "name_G11", + "name": "name_G11", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 101.9545, - "y": 17.8145, - "z": 3.55 + "x": 103.224, + "y": 19.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_H11", - "name": "RackT8_H11", + "id": "name_H11", + "name": "name_H11", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 101.9545, - "y": 8.8145, - "z": 3.55 + "x": 103.224, + "y": 10.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_A12", - "name": "RackT8_A12", + "id": "name_A12", + "name": "name_A12", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 110.9545, - "y": 71.8145, - "z": 3.55 + "x": 112.224, + "y": 73.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_B12", - "name": "RackT8_B12", + "id": "name_B12", + "name": "name_B12", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 110.9545, - "y": 62.8145, - "z": 3.55 + "x": 112.224, + "y": 64.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_C12", - "name": "RackT8_C12", + "id": "name_C12", + "name": "name_C12", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 110.9545, - "y": 53.8145, - "z": 3.55 + "x": 112.224, + "y": 55.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_D12", - "name": "RackT8_D12", + "id": "name_D12", + "name": "name_D12", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 110.9545, - "y": 44.8145, - "z": 3.55 + "x": 112.224, + "y": 46.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_E12", - "name": "RackT8_E12", + "id": "name_E12", + "name": "name_E12", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 110.9545, - "y": 35.8145, - "z": 3.55 + "x": 112.224, + "y": 37.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_F12", - "name": "RackT8_F12", + "id": "name_F12", + "name": "name_F12", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 110.9545, - "y": 26.8145, - "z": 3.55 + "x": 112.224, + "y": 28.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_G12", - "name": "RackT8_G12", + "id": "name_G12", + "name": "name_G12", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 110.9545, - "y": 17.8145, - "z": 3.55 + "x": 112.224, + "y": 19.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, { - "id": "RackT8_H12", - "name": "RackT8_H12", + "id": "name_H12", + "name": "name_H12", "sample_id": null, "children": [], "parent": "RackT8", - "type": "well", + "type": "container", "class": "", "position": { - "x": 110.9545, - "y": 8.8145, - "z": 3.55 + "x": 112.224, + "y": 10.084, + "z": 25.49 }, "config": { - "type": "Well", - "size_x": 4.851, - "size_y": 4.851, - "size_z": 10.67, + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, "rotation": { "x": 0, "y": 0, "z": 0, "type": "Rotation" }, - "category": "well", + "category": "tip_spot", "model": null, "barcode": null, - "max_volume": 360, - "material_z_thickness": null, - "compute_volume_from_height": null, - "compute_height_from_volume": null, - "bottom_type": "unknown", - "cross_section_type": "circle" + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } }, "data": { - "liquids": [], - "pending_liquids": [], - "liquid_history": [] + "tip": null, + "tip_state": null, + "pending_tip": null } }, + { + "id": "container_for_nothing5", + "name": "container_for_nothing5", + "sample_id": null, + "children": [], + "parent": "PRCXI_Deck", + "type": "plate", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} + }, + "data": {} + }, + { + "id": "container_for_nothing6", + "name": "container_for_nothing6", + "sample_id": null, + "children": [], + "parent": "PRCXI_Deck", + "type": "plate", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} + }, + "data": {} + }, { "id": "PlateT11", "name": "PlateT11", @@ -13177,6 +13499,68 @@ null ] } + }, + { + "id": "container_for_nothing7", + "name": "container_for_nothing7", + "sample_id": null, + "children": [], + "parent": "PRCXI_Deck", + "type": "plate", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} + }, + "data": {} + }, + { + "id": "container_for_nothing8", + "name": "container_for_nothing8", + "sample_id": null, + "children": [], + "parent": "PRCXI_Deck", + "type": "plate", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} + }, + "data": {} } ], "links": [] From 84aeb6921d402aa79e0aeee7483c2d1a49c56d96 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Fri, 18 Jul 2025 22:38:40 +0800 Subject: [PATCH 75/96] mix --- unilabos/registry/devices/liquid_handler.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/unilabos/registry/devices/liquid_handler.yaml b/unilabos/registry/devices/liquid_handler.yaml index d8c05a5..bb81208 100644 --- a/unilabos/registry/devices/liquid_handler.yaml +++ b/unilabos/registry/devices/liquid_handler.yaml @@ -6178,6 +6178,8 @@ liquid_handler.prcxi: vols: - 0.0 handles: [] + placeholder_keys: + resources: unilabos_resources result: {} schema: description: '' @@ -6535,6 +6537,8 @@ liquid_handler.prcxi: sample_id: '' type: '' handles: [] + placeholder_keys: + targets: unilabos_resources result: {} schema: description: '' From 45eaf7019d39d6c19408f6db5ae4d00a5f36721b Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Fri, 18 Jul 2025 23:43:22 +0800 Subject: [PATCH 76/96] registry fix --- unilabos/registry/devices/liquid_handler.yaml | 426 ++++++++++++++---- 1 file changed, 348 insertions(+), 78 deletions(-) diff --git a/unilabos/registry/devices/liquid_handler.yaml b/unilabos/registry/devices/liquid_handler.yaml index bb81208..3b5dcb0 100644 --- a/unilabos/registry/devices/liquid_handler.yaml +++ b/unilabos/registry/devices/liquid_handler.yaml @@ -5466,6 +5466,354 @@ liquid_handler.biomek: liquid_handler.prcxi: class: action_value_mappings: + add_liquid: + feedback: {} + goal: + asp_vols: asp_vols + blow_out_air_volume: blow_out_air_volume + dis_vols: dis_vols + flow_rates: flow_rates + is_96_well: is_96_well + liquid_height: liquid_height + mix_liquid_height: mix_liquid_height + mix_rate: mix_rate + mix_time: mix_time + mix_vol: mix_vol + none_keys: none_keys + offsets: offsets + reagent_sources: reagent_sources + spread: spread + targets: targets + use_channels: use_channels + goal_default: + asp_vols: + - 0.0 + blow_out_air_volume: + - 0.0 + dis_vols: + - 0.0 + flow_rates: + - 0.0 + is_96_well: false + liquid_height: + - 0.0 + mix_liquid_height: 0.0 + mix_rate: 0 + mix_time: 0 + mix_vol: 0 + none_keys: + - '' + offsets: + - x: 0.0 + y: 0.0 + z: 0.0 + reagent_sources: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + spread: '' + targets: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + use_channels: + - 0 + handles: [] + placeholder_keys: + reagent_sources: unilabos_resources + targets: unilabos_resources + result: {} + schema: + description: '' + properties: + feedback: + properties: {} + required: [] + title: LiquidHandlerAdd_Feedback + type: object + goal: + properties: + asp_vols: + items: + type: number + type: array + blow_out_air_volume: + items: + type: number + type: array + dis_vols: + items: + type: number + type: array + flow_rates: + items: + type: number + type: array + is_96_well: + type: boolean + liquid_height: + items: + type: number + type: array + mix_liquid_height: + type: number + mix_rate: + maximum: 2147483647 + minimum: -2147483648 + type: integer + mix_time: + maximum: 2147483647 + minimum: -2147483648 + type: integer + mix_vol: + maximum: 2147483647 + minimum: -2147483648 + type: integer + none_keys: + items: + type: string + type: array + offsets: + items: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + type: array + reagent_sources: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + spread: + type: string + targets: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + use_channels: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + required: + - asp_vols + - dis_vols + - reagent_sources + - targets + - use_channels + - flow_rates + - offsets + - liquid_height + - blow_out_air_volume + - spread + - is_96_well + - mix_time + - mix_vol + - mix_rate + - mix_liquid_height + - none_keys + title: LiquidHandlerAdd_Goal + type: object + result: + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerAdd_Result + type: object + required: + - goal + title: LiquidHandlerAdd + type: object + type: LiquidHandlerAdd aspirate: feedback: {} goal: @@ -5669,84 +6017,6 @@ liquid_handler.prcxi: title: LiquidHandlerAspirate type: object type: LiquidHandlerAspirate - auto-add_liquid: - feedback: {} - goal: {} - goal_default: - asp_vols: null - blow_out_air_volume: null - delays: null - dis_vols: null - flow_rates: null - is_96_well: false - liquid_height: null - mix_liquid_height: null - mix_rate: null - mix_time: null - mix_vol: null - none_keys: [] - offsets: null - reagent_sources: null - spread: wide - targets: null - use_channels: null - handles: [] - result: {} - schema: - description: add_liquid的参数schema - properties: - feedback: {} - goal: - properties: - asp_vols: - type: string - blow_out_air_volume: - type: string - delays: - type: string - dis_vols: - type: string - flow_rates: - type: string - is_96_well: - default: false - type: boolean - liquid_height: - type: string - mix_liquid_height: - type: string - mix_rate: - type: string - mix_time: - type: string - mix_vol: - type: string - none_keys: - default: [] - type: array - offsets: - type: string - reagent_sources: - type: string - spread: - default: wide - type: string - targets: - type: string - use_channels: - type: string - required: - - asp_vols - - dis_vols - - reagent_sources - - targets - type: object - result: {} - required: - - goal - title: add_liquid参数 - type: object - type: UniLabJsonCommandAsync auto-create_protocol: feedback: {} goal: {} From c61c4aae59b448963eea14e34c0b657842288136 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Fri, 18 Jul 2025 23:59:59 +0800 Subject: [PATCH 77/96] registry fix --- unilabos/registry/devices/liquid_handler.yaml | 1933 +++++++++++------ 1 file changed, 1289 insertions(+), 644 deletions(-) diff --git a/unilabos/registry/devices/liquid_handler.yaml b/unilabos/registry/devices/liquid_handler.yaml index 3b5dcb0..662d080 100644 --- a/unilabos/registry/devices/liquid_handler.yaml +++ b/unilabos/registry/devices/liquid_handler.yaml @@ -647,70 +647,6 @@ liquid_handler: title: iter_tips参数 type: object type: UniLabJsonCommand - auto-remove_liquid: - feedback: {} - goal: {} - goal_default: - blow_out_air_volume: null - delays: null - flow_rates: null - is_96_well: false - liquid_height: null - none_keys: [] - offsets: null - sources: null - spread: wide - top: null - use_channels: null - vols: null - waste_liquid: null - handles: [] - result: {} - schema: - description: 液体移除操作函数。从指定容器位置移除液体并转移到废液容器中。支持多源位置批量操作、流速控制、液面高度检测、96孔板模式等功能。可配置延时、吹气体积、位置偏移等参数,确保液体完全移除和容器清洁。适用于样品清洗、废液处理、容器清空等实验清理操作。 - properties: - feedback: {} - goal: - properties: - blow_out_air_volume: - type: string - delays: - type: string - flow_rates: - type: string - is_96_well: - default: false - type: string - liquid_height: - type: string - none_keys: - default: [] - type: string - offsets: - type: string - sources: - type: string - spread: - default: wide - type: string - top: - type: string - use_channels: - type: string - vols: - type: string - waste_liquid: - type: string - required: - - vols - - sources - type: object - result: {} - required: - - goal - title: remove_liquid参数 - type: object - type: UniLabJsonCommandAsync auto-set_tiprack: feedback: {} goal: {} @@ -3181,6 +3117,333 @@ liquid_handler: title: LiquidHandlerRemove type: object type: LiquidHandlerRemove + remove_liquid: + feedback: {} + goal: + blow_out_air_volume: blow_out_air_volume + delays: delays + flow_rates: flow_rates + is_96_well: is_96_well + liquid_height: liquid_height + none_keys: none_keys + offsets: offsets + sources: sources + spread: spread + top: top + use_channels: use_channels + vols: vols + waste_liquid: waste_liquid + goal_default: + blow_out_air_volume: + - 0.0 + delays: + - 0 + flow_rates: + - 0.0 + is_96_well: false + liquid_height: + - 0.0 + none_keys: + - '' + offsets: + - x: 0.0 + y: 0.0 + z: 0.0 + sources: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + spread: '' + top: + - 0.0 + use_channels: + - 0 + vols: + - 0.0 + waste_liquid: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + handles: [] + result: {} + schema: + description: '' + properties: + feedback: + properties: {} + required: [] + title: LiquidHandlerRemove_Feedback + type: object + goal: + properties: + blow_out_air_volume: + items: + type: number + type: array + delays: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + flow_rates: + items: + type: number + type: array + is_96_well: + type: boolean + liquid_height: + items: + type: number + type: array + none_keys: + items: + type: string + type: array + offsets: + items: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + type: array + sources: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + spread: + type: string + top: + items: + type: number + type: array + use_channels: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + vols: + items: + type: number + type: array + waste_liquid: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + required: + - vols + - sources + - waste_liquid + - use_channels + - flow_rates + - offsets + - liquid_height + - blow_out_air_volume + - spread + - delays + - is_96_well + - top + - none_keys + title: LiquidHandlerRemove_Goal + type: object + result: + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerRemove_Result + type: object + required: + - goal + title: LiquidHandlerRemove + type: object + type: LiquidHandlerRemove return_tips: feedback: {} goal: @@ -3524,453 +3787,90 @@ liquid_handler: target_vols: target_vols targets: targets goal_default: - asp_flow_rates: - - 0.0 - asp_vols: - - 0.0 - blow_out_air_volume: - - 0.0 - delays: - - 0 - dis_flow_rates: - - 0.0 - dis_vols: - - 0.0 - is_96_well: false - liquid_height: - - 0.0 - mix_liquid_height: 0.0 - mix_rate: 0 - mix_stage: '' - mix_times: - - 0 - mix_vol: 0 - none_keys: - - '' - offsets: - - x: 0.0 - y: 0.0 - z: 0.0 - sources: - - category: '' - children: [] - config: '' - data: '' - id: '' - name: '' - parent: '' - pose: - orientation: - w: 1.0 - x: 0.0 - y: 0.0 - z: 0.0 - position: - x: 0.0 - y: 0.0 - z: 0.0 - sample_id: '' - type: '' - spread: '' - targets: - - category: '' - children: [] - config: '' - data: '' - id: '' - name: '' - parent: '' - pose: - orientation: - w: 1.0 - x: 0.0 - y: 0.0 - z: 0.0 - position: - x: 0.0 - y: 0.0 - z: 0.0 - sample_id: '' - type: '' - tip_racks: - - category: '' - children: [] - config: '' - data: '' - id: '' - name: '' - parent: '' - pose: - orientation: - w: 1.0 - x: 0.0 - y: 0.0 - z: 0.0 - position: - x: 0.0 - y: 0.0 - z: 0.0 - sample_id: '' - type: '' - touch_tip: false - use_channels: - - 0 + amount: '' + from_vessel: '' + rinsing_repeats: 0 + rinsing_solvent: '' + rinsing_volume: 0.0 + solid: false + time: 0.0 + to_vessel: '' + viscous: false + volume: 0.0 handles: [] schema: description: '' properties: feedback: - properties: {} - required: [] - title: LiquidHandlerTransfer_Feedback + properties: + current_status: + type: string + progress: + type: number + transferred_volume: + type: number + required: + - progress + - transferred_volume + - current_status + title: Transfer_Feedback type: object goal: properties: - asp_flow_rates: - items: - type: number - type: array - asp_vols: - items: - type: number - type: array - blow_out_air_volume: - items: - type: number - type: array - delays: - items: - maximum: 2147483647 - minimum: -2147483648 - type: integer - type: array - dis_flow_rates: - items: - type: number - type: array - dis_vols: - items: - type: number - type: array - is_96_well: - type: boolean - liquid_height: - items: - type: number - type: array - mix_liquid_height: + amount: + type: string + from_vessel: + type: string + rinsing_repeats: + maximum: 2147483647 + minimum: -2147483648 + type: integer + rinsing_solvent: + type: string + rinsing_volume: type: number - mix_rate: - maximum: 2147483647 - minimum: -2147483648 - type: integer - mix_stage: - type: string - mix_times: - items: - maximum: 2147483647 - minimum: -2147483648 - type: integer - type: array - mix_vol: - maximum: 2147483647 - minimum: -2147483648 - type: integer - none_keys: - items: - type: string - type: array - offsets: - items: - properties: - x: - type: number - y: - type: number - z: - type: number - required: - - x - - y - - z - title: Point - type: object - type: array - sources: - items: - properties: - category: - type: string - children: - items: - type: string - type: array - config: - type: string - data: - type: string - id: - type: string - name: - type: string - parent: - type: string - pose: - properties: - orientation: - properties: - w: - type: number - x: - type: number - y: - type: number - z: - type: number - required: - - x - - y - - z - - w - title: Quaternion - type: object - position: - properties: - x: - type: number - y: - type: number - z: - type: number - required: - - x - - y - - z - title: Point - type: object - required: - - position - - orientation - title: Pose - type: object - sample_id: - type: string - type: - type: string - required: - - id - - name - - sample_id - - children - - parent - - type - - category - - pose - - config - - data - title: Resource - type: object - type: array - spread: - type: string - targets: - items: - properties: - category: - type: string - children: - items: - type: string - type: array - config: - type: string - data: - type: string - id: - type: string - name: - type: string - parent: - type: string - pose: - properties: - orientation: - properties: - w: - type: number - x: - type: number - y: - type: number - z: - type: number - required: - - x - - y - - z - - w - title: Quaternion - type: object - position: - properties: - x: - type: number - y: - type: number - z: - type: number - required: - - x - - y - - z - title: Point - type: object - required: - - position - - orientation - title: Pose - type: object - sample_id: - type: string - type: - type: string - required: - - id - - name - - sample_id - - children - - parent - - type - - category - - pose - - config - - data - title: Resource - type: object - type: array - tip_racks: - items: - properties: - category: - type: string - children: - items: - type: string - type: array - config: - type: string - data: - type: string - id: - type: string - name: - type: string - parent: - type: string - pose: - properties: - orientation: - properties: - w: - type: number - x: - type: number - y: - type: number - z: - type: number - required: - - x - - y - - z - - w - title: Quaternion - type: object - position: - properties: - x: - type: number - y: - type: number - z: - type: number - required: - - x - - y - - z - title: Point - type: object - required: - - position - - orientation - title: Pose - type: object - sample_id: - type: string - type: - type: string - required: - - id - - name - - sample_id - - children - - parent - - type - - category - - pose - - config - - data - title: Resource - type: object - type: array - touch_tip: + solid: type: boolean - use_channels: - items: - maximum: 2147483647 - minimum: -2147483648 - type: integer - type: array + time: + type: number + to_vessel: + type: string + viscous: + type: boolean + volume: + type: number required: - - asp_vols - - dis_vols - - sources - - targets - - tip_racks - - use_channels - - asp_flow_rates - - dis_flow_rates - - offsets - - touch_tip - - liquid_height - - blow_out_air_volume - - spread - - is_96_well - - mix_stage - - mix_times - - mix_vol - - mix_rate - - mix_liquid_height - - delays - - none_keys - title: LiquidHandlerTransfer_Goal + - from_vessel + - to_vessel + - volume + - amount + - time + - viscous + - rinsing_solvent + - rinsing_volume + - rinsing_repeats + - solid + title: Transfer_Goal type: object result: properties: + message: + type: string return_info: type: string success: type: boolean required: - - return_info - success - title: LiquidHandlerTransfer_Result + - message + - return_info + title: Transfer_Result type: object required: - goal - title: LiquidHandlerTransfer + title: Transfer type: object - type: LiquidHandlerTransfer + type: Transfer transfer_liquid: feedback: {} goal: @@ -4088,6 +3988,10 @@ liquid_handler: use_channels: - 0 handles: [] + placeholder_keys: + sources: unilabos_resources + targets: unilabos_resources + tip_racks: unilabos_resources result: {} schema: description: '' @@ -6178,70 +6082,6 @@ liquid_handler.prcxi: title: move_to参数 type: object type: UniLabJsonCommandAsync - auto-remove_liquid: - feedback: {} - goal: {} - goal_default: - blow_out_air_volume: null - delays: null - flow_rates: null - is_96_well: false - liquid_height: null - none_keys: [] - offsets: null - sources: null - spread: wide - top: null - use_channels: null - vols: null - waste_liquid: null - handles: [] - result: {} - schema: - description: remove_liquid的参数schema - properties: - feedback: {} - goal: - properties: - blow_out_air_volume: - type: string - delays: - type: string - flow_rates: - type: string - is_96_well: - default: false - type: string - liquid_height: - type: string - none_keys: - default: [] - type: array - offsets: - type: string - sources: - type: string - spread: - default: wide - type: string - top: - type: string - use_channels: - type: string - vols: - type: array - waste_liquid: - type: string - required: - - vols - - sources - type: object - result: {} - required: - - goal - title: remove_liquid参数 - type: object - type: UniLabJsonCommandAsync auto-run_protocol: feedback: {} goal: {} @@ -6310,99 +6150,6 @@ liquid_handler.prcxi: title: touch_tip参数 type: object type: UniLabJsonCommandAsync - auto-transfer_liquid: - feedback: {} - goal: {} - goal_default: - asp_flow_rates: null - asp_vols: null - blow_out_air_volume: null - delays: null - dis_flow_rates: null - dis_vols: null - is_96_well: false - liquid_height: null - mix_liquid_height: null - mix_rate: null - mix_stage: none - mix_times: null - mix_vol: null - none_keys: [] - offsets: null - sources: null - spread: wide - targets: null - tip_racks: null - touch_tip: false - use_channels: null - handles: [] - result: {} - schema: - description: transfer_liquid的参数schema - properties: - feedback: {} - goal: - properties: - asp_flow_rates: - type: string - asp_vols: - type: string - blow_out_air_volume: - type: string - delays: - type: string - dis_flow_rates: - type: string - dis_vols: - type: string - is_96_well: - default: false - type: boolean - liquid_height: - type: string - mix_liquid_height: - type: string - mix_rate: - type: string - mix_stage: - default: none - type: string - mix_times: - type: string - mix_vol: - type: string - none_keys: - default: [] - type: array - offsets: - type: string - sources: - type: string - spread: - default: wide - type: string - targets: - type: string - tip_racks: - type: string - touch_tip: - default: false - type: boolean - use_channels: - type: string - required: - - sources - - targets - - tip_racks - - asp_vols - - dis_vols - type: object - result: {} - required: - - goal - title: transfer_liquid参数 - type: object - type: UniLabJsonCommandAsync dispense: feedback: {} goal: @@ -7119,6 +6866,333 @@ liquid_handler.prcxi: title: LiquidHandlerPickUpTips type: object type: LiquidHandlerPickUpTips + remove_liquid: + feedback: {} + goal: + blow_out_air_volume: blow_out_air_volume + delays: delays + flow_rates: flow_rates + is_96_well: is_96_well + liquid_height: liquid_height + none_keys: none_keys + offsets: offsets + sources: sources + spread: spread + top: top + use_channels: use_channels + vols: vols + waste_liquid: waste_liquid + goal_default: + blow_out_air_volume: + - 0.0 + delays: + - 0 + flow_rates: + - 0.0 + is_96_well: false + liquid_height: + - 0.0 + none_keys: + - '' + offsets: + - x: 0.0 + y: 0.0 + z: 0.0 + sources: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + spread: '' + top: + - 0.0 + use_channels: + - 0 + vols: + - 0.0 + waste_liquid: + category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + handles: [] + result: {} + schema: + description: '' + properties: + feedback: + properties: {} + required: [] + title: LiquidHandlerRemove_Feedback + type: object + goal: + properties: + blow_out_air_volume: + items: + type: number + type: array + delays: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + flow_rates: + items: + type: number + type: array + is_96_well: + type: boolean + liquid_height: + items: + type: number + type: array + none_keys: + items: + type: string + type: array + offsets: + items: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + type: array + sources: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + spread: + type: string + top: + items: + type: number + type: array + use_channels: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + vols: + items: + type: number + type: array + waste_liquid: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + required: + - vols + - sources + - waste_liquid + - use_channels + - flow_rates + - offsets + - liquid_height + - blow_out_air_volume + - spread + - delays + - is_96_well + - top + - none_keys + title: LiquidHandlerRemove_Goal + type: object + result: + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerRemove_Result + type: object + required: + - goal + title: LiquidHandlerRemove + type: object + type: LiquidHandlerRemove set_liquid: feedback: {} goal: @@ -7266,6 +7340,577 @@ liquid_handler.prcxi: title: LiquidHandlerSetLiquid type: object type: LiquidHandlerSetLiquid + transfer: + goal: + aspiration_flow_rate: aspiration_flow_rate + dispense_flow_rates: dispense_flow_rates + ratios: ratios + source: source + source_vol: source_vol + target_vols: target_vols + targets: targets + goal_default: + amount: '' + from_vessel: '' + rinsing_repeats: 0 + rinsing_solvent: '' + rinsing_volume: 0.0 + solid: false + time: 0.0 + to_vessel: '' + viscous: false + volume: 0.0 + handles: [] + schema: + description: '' + properties: + feedback: + properties: + current_status: + type: string + progress: + type: number + transferred_volume: + type: number + required: + - progress + - transferred_volume + - current_status + title: Transfer_Feedback + type: object + goal: + properties: + amount: + type: string + from_vessel: + type: string + rinsing_repeats: + maximum: 2147483647 + minimum: -2147483648 + type: integer + rinsing_solvent: + type: string + rinsing_volume: + type: number + solid: + type: boolean + time: + type: number + to_vessel: + type: string + viscous: + type: boolean + volume: + type: number + required: + - from_vessel + - to_vessel + - volume + - amount + - time + - viscous + - rinsing_solvent + - rinsing_volume + - rinsing_repeats + - solid + title: Transfer_Goal + type: object + result: + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: Transfer_Result + type: object + required: + - goal + title: Transfer + type: object + type: Transfer + transfer_liquid: + feedback: {} + goal: + asp_flow_rates: asp_flow_rates + asp_vols: asp_vols + blow_out_air_volume: blow_out_air_volume + delays: delays + dis_flow_rates: dis_flow_rates + dis_vols: dis_vols + is_96_well: is_96_well + liquid_height: liquid_height + mix_liquid_height: mix_liquid_height + mix_rate: mix_rate + mix_stage: mix_stage + mix_times: mix_times + mix_vol: mix_vol + none_keys: none_keys + offsets: offsets + sources: sources + spread: spread + targets: targets + tip_racks: tip_racks + touch_tip: touch_tip + use_channels: use_channels + goal_default: + asp_flow_rates: + - 0.0 + asp_vols: + - 0.0 + blow_out_air_volume: + - 0.0 + delays: + - 0 + dis_flow_rates: + - 0.0 + dis_vols: + - 0.0 + is_96_well: false + liquid_height: + - 0.0 + mix_liquid_height: 0.0 + mix_rate: 0 + mix_stage: '' + mix_times: + - 0 + mix_vol: 0 + none_keys: + - '' + offsets: + - x: 0.0 + y: 0.0 + z: 0.0 + sources: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + spread: '' + targets: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + tip_racks: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + touch_tip: false + use_channels: + - 0 + handles: [] + placeholder_keys: + sources: unilabos_resources + targets: unilabos_resources + tip_racks: unilabos_resources + result: {} + schema: + description: '' + properties: + feedback: + properties: {} + required: [] + title: LiquidHandlerTransfer_Feedback + type: object + goal: + properties: + asp_flow_rates: + items: + type: number + type: array + asp_vols: + items: + type: number + type: array + blow_out_air_volume: + items: + type: number + type: array + delays: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + dis_flow_rates: + items: + type: number + type: array + dis_vols: + items: + type: number + type: array + is_96_well: + type: boolean + liquid_height: + items: + type: number + type: array + mix_liquid_height: + type: number + mix_rate: + maximum: 2147483647 + minimum: -2147483648 + type: integer + mix_stage: + type: string + mix_times: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + mix_vol: + maximum: 2147483647 + minimum: -2147483648 + type: integer + none_keys: + items: + type: string + type: array + offsets: + items: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + type: array + sources: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + spread: + type: string + targets: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + tip_racks: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + touch_tip: + type: boolean + use_channels: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + required: + - asp_vols + - dis_vols + - sources + - targets + - tip_racks + - use_channels + - asp_flow_rates + - dis_flow_rates + - offsets + - touch_tip + - liquid_height + - blow_out_air_volume + - spread + - is_96_well + - mix_stage + - mix_times + - mix_vol + - mix_rate + - mix_liquid_height + - delays + - none_keys + title: LiquidHandlerTransfer_Goal + type: object + result: + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerTransfer_Result + type: object + required: + - goal + title: LiquidHandlerTransfer + type: object + type: LiquidHandlerTransfer module: unilabos.devices.liquid_handling.prcxi.prcxi:PRCXI9300Handler status_types: reset_ok: bool From 9eb1f9823e650bf8dcec222c6e55ef3d36d52116 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Sat, 19 Jul 2025 00:03:02 +0800 Subject: [PATCH 78/96] registry fix --- unilabos/registry/devices/liquid_handler.yaml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/unilabos/registry/devices/liquid_handler.yaml b/unilabos/registry/devices/liquid_handler.yaml index 662d080..f5d7137 100644 --- a/unilabos/registry/devices/liquid_handler.yaml +++ b/unilabos/registry/devices/liquid_handler.yaml @@ -86,6 +86,9 @@ liquid_handler: use_channels: - 0 handles: [] + placeholder_keys: + reagent_sources: unilabos_resources + targets: unilabos_resources result: {} schema: description: '' @@ -3197,6 +3200,9 @@ liquid_handler: sample_id: '' type: '' handles: [] + placeholder_keys: + sources: unilabos_resources + waste_liquid: unilabos_resources result: {} schema: description: '' @@ -4991,6 +4997,10 @@ liquid_handler.biomek: handler_key: liquid-output io_type: source label: Liquid Output + placeholder_keys: + sources: unilabos_resources + targets: unilabos_resources + tip_racks: unilabos_resources result: {} schema: description: '' @@ -6946,6 +6956,9 @@ liquid_handler.prcxi: sample_id: '' type: '' handles: [] + placeholder_keys: + sources: unilabos_resources + waste_liquid: unilabos_resources result: {} schema: description: '' From 736f55765bac7e202f5f499282425a01b6b41720 Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Sat, 19 Jul 2025 00:09:59 +0800 Subject: [PATCH 79/96] Update --- deck.json | 13533 ++++++++++++++++ .../liquid_handler_abstract.py | 262 +- .../devices/liquid_handling/prcxi/prcxi.py | 111 +- 3 files changed, 13746 insertions(+), 160 deletions(-) create mode 100644 deck.json diff --git a/deck.json b/deck.json new file mode 100644 index 0000000..7a97961 --- /dev/null +++ b/deck.json @@ -0,0 +1,13533 @@ +[ + { + "id": "PRCXI_Deck", + "name": "PRCXI_Deck", + "sample_id": null, + "children": [ + "HPLCPlateT1", + "container_for_nothing1", + "container_for_nothing2", + "trash", + "container_for_nothing3", + "container_for_nothing", + "container_for_nothing4", + "RackT8", + "container_for_nothing5", + "container_for_nothing6", + "PlateT11", + "container_for_nothing7", + "container_for_nothing8" + ], + "parent": "lh_PRCXI_Deck", + "type": "deck", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Deck", + "size_x": 100, + "size_y": 100, + "size_z": 100, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "deck", + "barcode": null + }, + "data": {} + }, + { + "id": "HPLCPlateT1", + "name": "HPLCPlateT1", + "sample_id": null, + "children": [ + "HPLCPlateT1_A1", + "HPLCPlateT1_B1", + "HPLCPlateT1_C1", + "HPLCPlateT1_D1", + "HPLCPlateT1_E1", + "HPLCPlateT1_F1", + "HPLCPlateT1_G1", + "HPLCPlateT1_H1", + "HPLCPlateT1_A2", + "HPLCPlateT1_B2", + "HPLCPlateT1_C2", + "HPLCPlateT1_D2", + "HPLCPlateT1_E2", + "HPLCPlateT1_F2", + "HPLCPlateT1_G2", + "HPLCPlateT1_H2", + "HPLCPlateT1_A3", + "HPLCPlateT1_B3", + "HPLCPlateT1_C3", + "HPLCPlateT1_D3", + "HPLCPlateT1_E3", + "HPLCPlateT1_F3", + "HPLCPlateT1_G3", + "HPLCPlateT1_H3", + "HPLCPlateT1_A4", + "HPLCPlateT1_B4", + "HPLCPlateT1_C4", + "HPLCPlateT1_D4", + "HPLCPlateT1_E4", + "HPLCPlateT1_F4", + "HPLCPlateT1_G4", + "HPLCPlateT1_H4", + "HPLCPlateT1_A5", + "HPLCPlateT1_B5", + "HPLCPlateT1_C5", + "HPLCPlateT1_D5", + "HPLCPlateT1_E5", + "HPLCPlateT1_F5", + "HPLCPlateT1_G5", + "HPLCPlateT1_H5", + "HPLCPlateT1_A6", + "HPLCPlateT1_B6", + "HPLCPlateT1_C6", + "HPLCPlateT1_D6", + "HPLCPlateT1_E6", + "HPLCPlateT1_F6", + "HPLCPlateT1_G6", + "HPLCPlateT1_H6", + "HPLCPlateT1_A7", + "HPLCPlateT1_B7", + "HPLCPlateT1_C7", + "HPLCPlateT1_D7", + "HPLCPlateT1_E7", + "HPLCPlateT1_F7", + "HPLCPlateT1_G7", + "HPLCPlateT1_H7", + "HPLCPlateT1_A8", + "HPLCPlateT1_B8", + "HPLCPlateT1_C8", + "HPLCPlateT1_D8", + "HPLCPlateT1_E8", + "HPLCPlateT1_F8", + "HPLCPlateT1_G8", + "HPLCPlateT1_H8", + "HPLCPlateT1_A9", + "HPLCPlateT1_B9", + "HPLCPlateT1_C9", + "HPLCPlateT1_D9", + "HPLCPlateT1_E9", + "HPLCPlateT1_F9", + "HPLCPlateT1_G9", + "HPLCPlateT1_H9", + "HPLCPlateT1_A10", + "HPLCPlateT1_B10", + "HPLCPlateT1_C10", + "HPLCPlateT1_D10", + "HPLCPlateT1_E10", + "HPLCPlateT1_F10", + "HPLCPlateT1_G10", + "HPLCPlateT1_H10", + "HPLCPlateT1_A11", + "HPLCPlateT1_B11", + "HPLCPlateT1_C11", + "HPLCPlateT1_D11", + "HPLCPlateT1_E11", + "HPLCPlateT1_F11", + "HPLCPlateT1_G11", + "HPLCPlateT1_H11", + "HPLCPlateT1_A12", + "HPLCPlateT1_B12", + "HPLCPlateT1_C12", + "HPLCPlateT1_D12", + "HPLCPlateT1_E12", + "HPLCPlateT1_F12", + "HPLCPlateT1_G12", + "HPLCPlateT1_H12" + ], + "parent": "PRCXI_Deck", + "type": "plate", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} + }, + "data": { + "Material": { + "uuid": "548bbc3df0d4447586f2c19d2c0c0c55", + "Code": "HPLC01", + "Name": "HPLC料盘" + } + } + }, + { + "id": "HPLCPlateT1_A1", + "name": "HPLCPlateT1_A1", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_B1", + "name": "HPLCPlateT1_B1", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_C1", + "name": "HPLCPlateT1_C1", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_D1", + "name": "HPLCPlateT1_D1", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_E1", + "name": "HPLCPlateT1_E1", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_F1", + "name": "HPLCPlateT1_F1", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_G1", + "name": "HPLCPlateT1_G1", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_H1", + "name": "HPLCPlateT1_H1", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_A2", + "name": "HPLCPlateT1_A2", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_B2", + "name": "HPLCPlateT1_B2", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_C2", + "name": "HPLCPlateT1_C2", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_D2", + "name": "HPLCPlateT1_D2", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_E2", + "name": "HPLCPlateT1_E2", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_F2", + "name": "HPLCPlateT1_F2", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_G2", + "name": "HPLCPlateT1_G2", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_H2", + "name": "HPLCPlateT1_H2", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_A3", + "name": "HPLCPlateT1_A3", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_B3", + "name": "HPLCPlateT1_B3", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_C3", + "name": "HPLCPlateT1_C3", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_D3", + "name": "HPLCPlateT1_D3", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_E3", + "name": "HPLCPlateT1_E3", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_F3", + "name": "HPLCPlateT1_F3", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_G3", + "name": "HPLCPlateT1_G3", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_H3", + "name": "HPLCPlateT1_H3", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_A4", + "name": "HPLCPlateT1_A4", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_B4", + "name": "HPLCPlateT1_B4", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_C4", + "name": "HPLCPlateT1_C4", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_D4", + "name": "HPLCPlateT1_D4", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_E4", + "name": "HPLCPlateT1_E4", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_F4", + "name": "HPLCPlateT1_F4", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_G4", + "name": "HPLCPlateT1_G4", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_H4", + "name": "HPLCPlateT1_H4", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_A5", + "name": "HPLCPlateT1_A5", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_B5", + "name": "HPLCPlateT1_B5", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_C5", + "name": "HPLCPlateT1_C5", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_D5", + "name": "HPLCPlateT1_D5", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_E5", + "name": "HPLCPlateT1_E5", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_F5", + "name": "HPLCPlateT1_F5", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_G5", + "name": "HPLCPlateT1_G5", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_H5", + "name": "HPLCPlateT1_H5", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_A6", + "name": "HPLCPlateT1_A6", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_B6", + "name": "HPLCPlateT1_B6", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_C6", + "name": "HPLCPlateT1_C6", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_D6", + "name": "HPLCPlateT1_D6", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_E6", + "name": "HPLCPlateT1_E6", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_F6", + "name": "HPLCPlateT1_F6", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_G6", + "name": "HPLCPlateT1_G6", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_H6", + "name": "HPLCPlateT1_H6", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_A7", + "name": "HPLCPlateT1_A7", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_B7", + "name": "HPLCPlateT1_B7", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_C7", + "name": "HPLCPlateT1_C7", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_D7", + "name": "HPLCPlateT1_D7", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_E7", + "name": "HPLCPlateT1_E7", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_F7", + "name": "HPLCPlateT1_F7", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_G7", + "name": "HPLCPlateT1_G7", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_H7", + "name": "HPLCPlateT1_H7", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_A8", + "name": "HPLCPlateT1_A8", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_B8", + "name": "HPLCPlateT1_B8", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_C8", + "name": "HPLCPlateT1_C8", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_D8", + "name": "HPLCPlateT1_D8", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_E8", + "name": "HPLCPlateT1_E8", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_F8", + "name": "HPLCPlateT1_F8", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_G8", + "name": "HPLCPlateT1_G8", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_H8", + "name": "HPLCPlateT1_H8", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_A9", + "name": "HPLCPlateT1_A9", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_B9", + "name": "HPLCPlateT1_B9", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_C9", + "name": "HPLCPlateT1_C9", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_D9", + "name": "HPLCPlateT1_D9", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_E9", + "name": "HPLCPlateT1_E9", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_F9", + "name": "HPLCPlateT1_F9", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_G9", + "name": "HPLCPlateT1_G9", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_H9", + "name": "HPLCPlateT1_H9", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_A10", + "name": "HPLCPlateT1_A10", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_B10", + "name": "HPLCPlateT1_B10", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_C10", + "name": "HPLCPlateT1_C10", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_D10", + "name": "HPLCPlateT1_D10", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_E10", + "name": "HPLCPlateT1_E10", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_F10", + "name": "HPLCPlateT1_F10", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_G10", + "name": "HPLCPlateT1_G10", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_H10", + "name": "HPLCPlateT1_H10", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_A11", + "name": "HPLCPlateT1_A11", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_B11", + "name": "HPLCPlateT1_B11", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_C11", + "name": "HPLCPlateT1_C11", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_D11", + "name": "HPLCPlateT1_D11", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_E11", + "name": "HPLCPlateT1_E11", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_F11", + "name": "HPLCPlateT1_F11", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_G11", + "name": "HPLCPlateT1_G11", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_H11", + "name": "HPLCPlateT1_H11", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_A12", + "name": "HPLCPlateT1_A12", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_B12", + "name": "HPLCPlateT1_B12", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_C12", + "name": "HPLCPlateT1_C12", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_D12", + "name": "HPLCPlateT1_D12", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_E12", + "name": "HPLCPlateT1_E12", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_F12", + "name": "HPLCPlateT1_F12", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_G12", + "name": "HPLCPlateT1_G12", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "HPLCPlateT1_H12", + "name": "HPLCPlateT1_H12", + "sample_id": null, + "children": [], + "parent": "HPLCPlateT1", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [] + } + }, + { + "id": "container_for_nothing1", + "name": "container_for_nothing1", + "sample_id": null, + "children": [], + "parent": "PRCXI_Deck", + "type": "plate", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} + }, + "data": {} + }, + { + "id": "container_for_nothing2", + "name": "container_for_nothing2", + "sample_id": null, + "children": [], + "parent": "PRCXI_Deck", + "type": "plate", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} + }, + "data": {} + }, + { + "id": "trash", + "name": "trash", + "sample_id": null, + "children": [], + "parent": "PRCXI_Deck", + "type": "container", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Trash", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "trash", + "model": null, + "barcode": null, + "max_volume": "Infinity", + "material_z_thickness": 0, + "compute_volume_from_height": null, + "compute_height_from_volume": null + }, + "data": { + "liquids": [], + "pending_liquids": [], + "liquid_history": [], + "Material": { + "uuid": "730067cf07ae43849ddf4034299030e9" + } + } + }, + { + "id": "container_for_nothing3", + "name": "container_for_nothing3", + "sample_id": null, + "children": [], + "parent": "PRCXI_Deck", + "type": "plate", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} + }, + "data": {} + }, + { + "id": "container_for_nothing", + "name": "container_for_nothing", + "sample_id": null, + "children": [], + "parent": "PRCXI_Deck", + "type": "plate", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} + }, + "data": {} + }, + { + "id": "container_for_nothing4", + "name": "container_for_nothing4", + "sample_id": null, + "children": [], + "parent": "PRCXI_Deck", + "type": "plate", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} + }, + "data": {} + }, + { + "id": "RackT8", + "name": "RackT8", + "sample_id": null, + "children": [ + "name_A1", + "name_B1", + "name_C1", + "name_D1", + "name_E1", + "name_F1", + "name_G1", + "name_H1", + "name_A2", + "name_B2", + "name_C2", + "name_D2", + "name_E2", + "name_F2", + "name_G2", + "name_H2", + "name_A3", + "name_B3", + "name_C3", + "name_D3", + "name_E3", + "name_F3", + "name_G3", + "name_H3", + "name_A4", + "name_B4", + "name_C4", + "name_D4", + "name_E4", + "name_F4", + "name_G4", + "name_H4", + "name_A5", + "name_B5", + "name_C5", + "name_D5", + "name_E5", + "name_F5", + "name_G5", + "name_H5", + "name_A6", + "name_B6", + "name_C6", + "name_D6", + "name_E6", + "name_F6", + "name_G6", + "name_H6", + "name_A7", + "name_B7", + "name_C7", + "name_D7", + "name_E7", + "name_F7", + "name_G7", + "name_H7", + "name_A8", + "name_B8", + "name_C8", + "name_D8", + "name_E8", + "name_F8", + "name_G8", + "name_H8", + "name_A9", + "name_B9", + "name_C9", + "name_D9", + "name_E9", + "name_F9", + "name_G9", + "name_H9", + "name_A10", + "name_B10", + "name_C10", + "name_D10", + "name_E10", + "name_F10", + "name_G10", + "name_H10", + "name_A11", + "name_B11", + "name_C11", + "name_D11", + "name_E11", + "name_F11", + "name_G11", + "name_H11", + "name_A12", + "name_B12", + "name_C12", + "name_D12", + "name_E12", + "name_F12", + "name_G12", + "name_H12" + ], + "parent": "PRCXI_Deck", + "type": "container", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_rack", + "model": null, + "barcode": null, + "ordering": {} + }, + "data": { + "Material": { + "uuid": "068b3815e36b4a72a59bae017011b29f", + "Code": "ZX-001-10+", + "Name": "10μL加长 Tip头" + } + } + }, + { + "id": "name_A1", + "name": "name_A1", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 13.224, + "y": 73.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_B1", + "name": "name_B1", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 13.224, + "y": 64.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_C1", + "name": "name_C1", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 13.224, + "y": 55.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_D1", + "name": "name_D1", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 13.224, + "y": 46.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_E1", + "name": "name_E1", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 13.224, + "y": 37.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_F1", + "name": "name_F1", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 13.224, + "y": 28.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_G1", + "name": "name_G1", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 13.224, + "y": 19.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_H1", + "name": "name_H1", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 13.224, + "y": 10.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_A2", + "name": "name_A2", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 22.224, + "y": 73.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_B2", + "name": "name_B2", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 22.224, + "y": 64.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_C2", + "name": "name_C2", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 22.224, + "y": 55.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_D2", + "name": "name_D2", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 22.224, + "y": 46.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_E2", + "name": "name_E2", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 22.224, + "y": 37.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_F2", + "name": "name_F2", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 22.224, + "y": 28.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_G2", + "name": "name_G2", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 22.224, + "y": 19.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_H2", + "name": "name_H2", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 22.224, + "y": 10.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_A3", + "name": "name_A3", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 31.224, + "y": 73.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_B3", + "name": "name_B3", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 31.224, + "y": 64.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_C3", + "name": "name_C3", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 31.224, + "y": 55.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_D3", + "name": "name_D3", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 31.224, + "y": 46.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_E3", + "name": "name_E3", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 31.224, + "y": 37.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_F3", + "name": "name_F3", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 31.224, + "y": 28.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_G3", + "name": "name_G3", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 31.224, + "y": 19.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_H3", + "name": "name_H3", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 31.224, + "y": 10.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_A4", + "name": "name_A4", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 40.224, + "y": 73.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_B4", + "name": "name_B4", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 40.224, + "y": 64.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_C4", + "name": "name_C4", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 40.224, + "y": 55.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_D4", + "name": "name_D4", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 40.224, + "y": 46.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_E4", + "name": "name_E4", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 40.224, + "y": 37.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_F4", + "name": "name_F4", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 40.224, + "y": 28.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_G4", + "name": "name_G4", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 40.224, + "y": 19.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_H4", + "name": "name_H4", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 40.224, + "y": 10.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_A5", + "name": "name_A5", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 49.224, + "y": 73.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_B5", + "name": "name_B5", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 49.224, + "y": 64.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_C5", + "name": "name_C5", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 49.224, + "y": 55.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_D5", + "name": "name_D5", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 49.224, + "y": 46.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_E5", + "name": "name_E5", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 49.224, + "y": 37.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_F5", + "name": "name_F5", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 49.224, + "y": 28.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_G5", + "name": "name_G5", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 49.224, + "y": 19.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_H5", + "name": "name_H5", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 49.224, + "y": 10.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_A6", + "name": "name_A6", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 58.224, + "y": 73.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_B6", + "name": "name_B6", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 58.224, + "y": 64.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_C6", + "name": "name_C6", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 58.224, + "y": 55.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_D6", + "name": "name_D6", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 58.224, + "y": 46.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_E6", + "name": "name_E6", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 58.224, + "y": 37.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_F6", + "name": "name_F6", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 58.224, + "y": 28.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_G6", + "name": "name_G6", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 58.224, + "y": 19.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_H6", + "name": "name_H6", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 58.224, + "y": 10.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_A7", + "name": "name_A7", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 67.224, + "y": 73.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_B7", + "name": "name_B7", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 67.224, + "y": 64.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_C7", + "name": "name_C7", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 67.224, + "y": 55.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_D7", + "name": "name_D7", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 67.224, + "y": 46.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_E7", + "name": "name_E7", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 67.224, + "y": 37.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_F7", + "name": "name_F7", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 67.224, + "y": 28.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_G7", + "name": "name_G7", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 67.224, + "y": 19.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_H7", + "name": "name_H7", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 67.224, + "y": 10.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_A8", + "name": "name_A8", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 76.224, + "y": 73.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_B8", + "name": "name_B8", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 76.224, + "y": 64.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_C8", + "name": "name_C8", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 76.224, + "y": 55.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_D8", + "name": "name_D8", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 76.224, + "y": 46.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_E8", + "name": "name_E8", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 76.224, + "y": 37.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_F8", + "name": "name_F8", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 76.224, + "y": 28.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_G8", + "name": "name_G8", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 76.224, + "y": 19.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_H8", + "name": "name_H8", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 76.224, + "y": 10.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_A9", + "name": "name_A9", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 85.224, + "y": 73.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_B9", + "name": "name_B9", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 85.224, + "y": 64.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_C9", + "name": "name_C9", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 85.224, + "y": 55.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_D9", + "name": "name_D9", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 85.224, + "y": 46.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_E9", + "name": "name_E9", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 85.224, + "y": 37.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_F9", + "name": "name_F9", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 85.224, + "y": 28.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_G9", + "name": "name_G9", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 85.224, + "y": 19.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_H9", + "name": "name_H9", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 85.224, + "y": 10.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_A10", + "name": "name_A10", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 94.224, + "y": 73.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_B10", + "name": "name_B10", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 94.224, + "y": 64.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_C10", + "name": "name_C10", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 94.224, + "y": 55.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_D10", + "name": "name_D10", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 94.224, + "y": 46.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_E10", + "name": "name_E10", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 94.224, + "y": 37.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_F10", + "name": "name_F10", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 94.224, + "y": 28.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_G10", + "name": "name_G10", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 94.224, + "y": 19.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_H10", + "name": "name_H10", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 94.224, + "y": 10.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_A11", + "name": "name_A11", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 103.224, + "y": 73.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_B11", + "name": "name_B11", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 103.224, + "y": 64.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_C11", + "name": "name_C11", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 103.224, + "y": 55.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_D11", + "name": "name_D11", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 103.224, + "y": 46.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_E11", + "name": "name_E11", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 103.224, + "y": 37.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_F11", + "name": "name_F11", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 103.224, + "y": 28.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_G11", + "name": "name_G11", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 103.224, + "y": 19.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_H11", + "name": "name_H11", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 103.224, + "y": 10.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_A12", + "name": "name_A12", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 112.224, + "y": 73.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_B12", + "name": "name_B12", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 112.224, + "y": 64.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_C12", + "name": "name_C12", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 112.224, + "y": 55.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_D12", + "name": "name_D12", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 112.224, + "y": 46.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_E12", + "name": "name_E12", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 112.224, + "y": 37.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_F12", + "name": "name_F12", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 112.224, + "y": 28.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_G12", + "name": "name_G12", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 112.224, + "y": 19.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "name_H12", + "name": "name_H12", + "sample_id": null, + "children": [], + "parent": "RackT8", + "type": "container", + "class": "", + "position": { + "x": 112.224, + "y": 10.084, + "z": 25.49 + }, + "config": { + "type": "TipSpot", + "size_x": 2.312, + "size_y": 2.312, + "size_z": 0, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "tip_spot", + "model": null, + "barcode": null, + "prototype_tip": { + "type": "Tip", + "total_tip_length": 39.2, + "has_filter": false, + "maximal_volume": 10.0, + "fitting_depth": 3.29 + } + }, + "data": { + "tip": null, + "tip_state": null, + "pending_tip": null + } + }, + { + "id": "container_for_nothing5", + "name": "container_for_nothing5", + "sample_id": null, + "children": [], + "parent": "PRCXI_Deck", + "type": "plate", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} + }, + "data": {} + }, + { + "id": "container_for_nothing6", + "name": "container_for_nothing6", + "sample_id": null, + "children": [], + "parent": "PRCXI_Deck", + "type": "plate", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} + }, + "data": {} + }, + { + "id": "PlateT11", + "name": "PlateT11", + "sample_id": null, + "children": [ + "PlateT11_A1", + "PlateT11_B1", + "PlateT11_C1", + "PlateT11_D1", + "PlateT11_E1", + "PlateT11_F1", + "PlateT11_G1", + "PlateT11_H1", + "PlateT11_A2", + "PlateT11_B2", + "PlateT11_C2", + "PlateT11_D2", + "PlateT11_E2", + "PlateT11_F2", + "PlateT11_G2", + "PlateT11_H2", + "PlateT11_A3", + "PlateT11_B3", + "PlateT11_C3", + "PlateT11_D3", + "PlateT11_E3", + "PlateT11_F3", + "PlateT11_G3", + "PlateT11_H3", + "PlateT11_A4", + "PlateT11_B4", + "PlateT11_C4", + "PlateT11_D4", + "PlateT11_E4", + "PlateT11_F4", + "PlateT11_G4", + "PlateT11_H4", + "PlateT11_A5", + "PlateT11_B5", + "PlateT11_C5", + "PlateT11_D5", + "PlateT11_E5", + "PlateT11_F5", + "PlateT11_G5", + "PlateT11_H5", + "PlateT11_A6", + "PlateT11_B6", + "PlateT11_C6", + "PlateT11_D6", + "PlateT11_E6", + "PlateT11_F6", + "PlateT11_G6", + "PlateT11_H6", + "PlateT11_A7", + "PlateT11_B7", + "PlateT11_C7", + "PlateT11_D7", + "PlateT11_E7", + "PlateT11_F7", + "PlateT11_G7", + "PlateT11_H7", + "PlateT11_A8", + "PlateT11_B8", + "PlateT11_C8", + "PlateT11_D8", + "PlateT11_E8", + "PlateT11_F8", + "PlateT11_G8", + "PlateT11_H8", + "PlateT11_A9", + "PlateT11_B9", + "PlateT11_C9", + "PlateT11_D9", + "PlateT11_E9", + "PlateT11_F9", + "PlateT11_G9", + "PlateT11_H9", + "PlateT11_A10", + "PlateT11_B10", + "PlateT11_C10", + "PlateT11_D10", + "PlateT11_E10", + "PlateT11_F10", + "PlateT11_G10", + "PlateT11_H10", + "PlateT11_A11", + "PlateT11_B11", + "PlateT11_C11", + "PlateT11_D11", + "PlateT11_E11", + "PlateT11_F11", + "PlateT11_G11", + "PlateT11_H11", + "PlateT11_A12", + "PlateT11_B12", + "PlateT11_C12", + "PlateT11_D12", + "PlateT11_E12", + "PlateT11_F12", + "PlateT11_G12", + "PlateT11_H12" + ], + "parent": "PRCXI_Deck", + "type": "plate", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} + }, + "data": { + "Material": { + "uuid": "57b1e4711e9e4a32b529f3132fc5931f" + } + } + }, + { + "id": "PlateT11_A1", + "name": "PlateT11_A1", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + "Water", + 100 + ] + ], + "pending_liquids": [ + [ + "Water", + 100 + ] + ], + "liquid_history": [ + "Water" + ] + } + }, + { + "id": "PlateT11_B1", + "name": "PlateT11_B1", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C1", + "name": "PlateT11_C1", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D1", + "name": "PlateT11_D1", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E1", + "name": "PlateT11_E1", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F1", + "name": "PlateT11_F1", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G1", + "name": "PlateT11_G1", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H1", + "name": "PlateT11_H1", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 11.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_A2", + "name": "PlateT11_A2", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + "Water", + 100 + ] + ], + "pending_liquids": [ + [ + "Water", + 100 + ] + ], + "liquid_history": [ + "Water" + ] + } + }, + { + "id": "PlateT11_B2", + "name": "PlateT11_B2", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C2", + "name": "PlateT11_C2", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D2", + "name": "PlateT11_D2", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E2", + "name": "PlateT11_E2", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F2", + "name": "PlateT11_F2", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G2", + "name": "PlateT11_G2", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H2", + "name": "PlateT11_H2", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 20.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_A3", + "name": "PlateT11_A3", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + "Water", + 100 + ] + ], + "pending_liquids": [ + [ + "Water", + 100 + ] + ], + "liquid_history": [ + "Water" + ] + } + }, + { + "id": "PlateT11_B3", + "name": "PlateT11_B3", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C3", + "name": "PlateT11_C3", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D3", + "name": "PlateT11_D3", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E3", + "name": "PlateT11_E3", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F3", + "name": "PlateT11_F3", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G3", + "name": "PlateT11_G3", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H3", + "name": "PlateT11_H3", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 29.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_A4", + "name": "PlateT11_A4", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + "Water", + 100 + ] + ], + "pending_liquids": [ + [ + "Water", + 100 + ] + ], + "liquid_history": [ + "Water" + ] + } + }, + { + "id": "PlateT11_B4", + "name": "PlateT11_B4", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C4", + "name": "PlateT11_C4", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D4", + "name": "PlateT11_D4", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E4", + "name": "PlateT11_E4", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F4", + "name": "PlateT11_F4", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G4", + "name": "PlateT11_G4", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H4", + "name": "PlateT11_H4", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 38.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_A5", + "name": "PlateT11_A5", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + "Water", + 100 + ] + ], + "pending_liquids": [ + [ + "Water", + 100 + ] + ], + "liquid_history": [ + "Water" + ] + } + }, + { + "id": "PlateT11_B5", + "name": "PlateT11_B5", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C5", + "name": "PlateT11_C5", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D5", + "name": "PlateT11_D5", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E5", + "name": "PlateT11_E5", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F5", + "name": "PlateT11_F5", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G5", + "name": "PlateT11_G5", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H5", + "name": "PlateT11_H5", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 47.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_A6", + "name": "PlateT11_A6", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + "Water", + 100 + ] + ], + "pending_liquids": [ + [ + "Water", + 100 + ] + ], + "liquid_history": [ + "Water" + ] + } + }, + { + "id": "PlateT11_B6", + "name": "PlateT11_B6", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C6", + "name": "PlateT11_C6", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D6", + "name": "PlateT11_D6", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E6", + "name": "PlateT11_E6", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F6", + "name": "PlateT11_F6", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G6", + "name": "PlateT11_G6", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H6", + "name": "PlateT11_H6", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 56.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_A7", + "name": "PlateT11_A7", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_B7", + "name": "PlateT11_B7", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C7", + "name": "PlateT11_C7", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D7", + "name": "PlateT11_D7", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E7", + "name": "PlateT11_E7", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F7", + "name": "PlateT11_F7", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G7", + "name": "PlateT11_G7", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H7", + "name": "PlateT11_H7", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 65.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_A8", + "name": "PlateT11_A8", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_B8", + "name": "PlateT11_B8", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C8", + "name": "PlateT11_C8", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D8", + "name": "PlateT11_D8", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E8", + "name": "PlateT11_E8", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F8", + "name": "PlateT11_F8", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G8", + "name": "PlateT11_G8", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H8", + "name": "PlateT11_H8", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 74.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_A9", + "name": "PlateT11_A9", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_B9", + "name": "PlateT11_B9", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C9", + "name": "PlateT11_C9", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D9", + "name": "PlateT11_D9", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E9", + "name": "PlateT11_E9", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F9", + "name": "PlateT11_F9", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G9", + "name": "PlateT11_G9", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H9", + "name": "PlateT11_H9", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 83.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_A10", + "name": "PlateT11_A10", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_B10", + "name": "PlateT11_B10", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C10", + "name": "PlateT11_C10", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D10", + "name": "PlateT11_D10", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E10", + "name": "PlateT11_E10", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F10", + "name": "PlateT11_F10", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G10", + "name": "PlateT11_G10", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H10", + "name": "PlateT11_H10", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 92.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_A11", + "name": "PlateT11_A11", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_B11", + "name": "PlateT11_B11", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C11", + "name": "PlateT11_C11", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D11", + "name": "PlateT11_D11", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E11", + "name": "PlateT11_E11", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F11", + "name": "PlateT11_F11", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G11", + "name": "PlateT11_G11", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H11", + "name": "PlateT11_H11", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 101.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_A12", + "name": "PlateT11_A12", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 71.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_B12", + "name": "PlateT11_B12", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 62.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_C12", + "name": "PlateT11_C12", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 53.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_D12", + "name": "PlateT11_D12", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 44.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_E12", + "name": "PlateT11_E12", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 35.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_F12", + "name": "PlateT11_F12", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 26.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_G12", + "name": "PlateT11_G12", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 17.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "PlateT11_H12", + "name": "PlateT11_H12", + "sample_id": null, + "children": [], + "parent": "PlateT11", + "type": "well", + "class": "", + "position": { + "x": 110.9545, + "y": 8.8145, + "z": 3.55 + }, + "config": { + "type": "Well", + "size_x": 4.851, + "size_y": 4.851, + "size_z": 10.67, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "well", + "model": null, + "barcode": null, + "max_volume": 360, + "material_z_thickness": null, + "compute_volume_from_height": null, + "compute_height_from_volume": null, + "bottom_type": "unknown", + "cross_section_type": "circle" + }, + "data": { + "liquids": [ + [ + null, + 100 + ] + ], + "pending_liquids": [ + [ + null, + 100 + ] + ], + "liquid_history": [ + null + ] + } + }, + { + "id": "container_for_nothing7", + "name": "container_for_nothing7", + "sample_id": null, + "children": [], + "parent": "PRCXI_Deck", + "type": "plate", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} + }, + "data": {} + }, + { + "id": "container_for_nothing8", + "name": "container_for_nothing8", + "sample_id": null, + "children": [], + "parent": "PRCXI_Deck", + "type": "plate", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 50, + "size_y": 50, + "size_z": 10, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "plate", + "model": null, + "barcode": null, + "ordering": {} + }, + "data": {} + } +] \ 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 27535d2..242fcb3 100644 --- a/unilabos/devices/liquid_handling/liquid_handler_abstract.py +++ b/unilabos/devices/liquid_handling/liquid_handler_abstract.py @@ -590,14 +590,14 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): else: # 首先应该对任务分组,然后每次1个/8个进行操作处理 if len(use_channels) == 1 and self.backend.num_channels == 1: - tip = [] - for _ in range(len(use_channels)): - tip.extend(next(self.current_tip)) - await self.pick_up_tips(tip) - for _ in range(len(waste_liquid)): + for _ in range(len(sources)): + tip = [] + for __ in range(len(use_channels)): + tip.extend(next(self.current_tip)) + await self.pick_up_tips(tip) await self.aspirate( - resources=sources, + resources=[sources[_]], vols=[vols[_]], use_channels=use_channels, flow_rates=[flow_rates[0]] if flow_rates else None, @@ -608,8 +608,9 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): ) if delays is not None: await self.custom_delay(seconds=delays[0]) + await self.dispense( - resources=[waste_liquid[_]], + resources=[waste_liquid], vols=[vols[_]], use_channels=use_channels, flow_rates=[flow_rates[1]] if flow_rates else None, @@ -618,7 +619,7 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): liquid_height=[liquid_height[1]] if liquid_height else None, spread=spread, ) - await self.discard_tips() + await self.discard_tips() elif len(use_channels) == 8 and self.backend.num_channels == 8: tip = [] for _ in range(len(use_channels)): @@ -706,9 +707,9 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): mix_liquid_height: Optional[float] = None, none_keys: List[str] = [], ): - """A complete *add* (aspirate reagent → dispense into targets) operation.""" + # """A complete *add* (aspirate reagent → dispense into targets) operation.""" - try: + # # try: if is_96_well: pass # This mode is not verified. else: @@ -720,9 +721,9 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): tip = [] for _ in range(len(use_channels)): tip.extend(next(self.current_tip)) - - await self.pick_up_tips(tip) + await self.pick_up_tips(tip) for _ in range(len(targets)): + print(use_channels, reagent_sources) await self.aspirate( resources=reagent_sources, vols=[asp_vols[_]], @@ -733,6 +734,7 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): blow_out_air_volume=[blow_out_air_volume[0]] if blow_out_air_volume else None, spread=spread, ) + if delays is not None: await self.custom_delay(seconds=delays[0]) await self.dispense( @@ -749,7 +751,7 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): if delays is not None: await self.custom_delay(seconds=delays[1]) await self.mix( - targets=targets[_], + targets=[targets[_]], mix_time=mix_time, mix_vol=mix_vol, offsets=offsets if offsets else None, @@ -759,7 +761,7 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): if delays is not None: await self.custom_delay(seconds=delays[1]) await self.touch_tip(targets[_]) - + await self.discard_tips() elif len(use_channels) == 8: # 对于8个的情况,需要判断此时任务是不是能被8通道移液站来成功处理 @@ -825,9 +827,9 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): await self.discard_tips() - except Exception as e: - traceback.print_exc() - raise RuntimeError(f"Liquid addition failed: {e}") from e + # except Exception as e: + # traceback.print_exc() + # raise RuntimeError(f"Liquid addition failed: {e}") from e # --------------------------------------------------------------- # TRANSFER LIQUID ------------------------------------------------ @@ -872,126 +874,126 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): Set *True* to use the 96‑channel head. """ - try: - if is_96_well: - pass # This mode is not verified. - else: - if len(asp_vols) != len(targets): - raise ValueError(f"Length of `asp_vols` {len(asp_vols)} must match `targets` {len(targets)}.") - # 首先应该对任务分组,然后每次1个/8个进行操作处理 - if len(use_channels) == 1: + if is_96_well: + pass # This mode is not verified. + else: + if len(asp_vols) != len(targets): + raise ValueError(f"Length of `asp_vols` {len(asp_vols)} must match `targets` {len(targets)}.") + + # 首先应该对任务分组,然后每次1个/8个进行操作处理 + if len(use_channels) == 1: + for _ in range(len(targets)): + tip = [] + for ___ in range(len(use_channels)): + tip.extend(next(self.current_tip)) + await self.pick_up_tips(tip) + + await self.aspirate( + resources=[sources[_]], + vols=[asp_vols[_]], + use_channels=use_channels, + flow_rates=[asp_flow_rates[0]] if asp_flow_rates else None, + 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, + ) + if delays is not None: + await self.custom_delay(seconds=delays[0]) + await self.dispense( + resources=[targets[_]], + vols=[dis_vols[_]], + use_channels=use_channels, + flow_rates=[dis_flow_rates[1]] if dis_flow_rates else None, + offsets=[offsets[1]] if offsets else None, + blow_out_air_volume=[blow_out_air_volume[1]] if blow_out_air_volume else None, + liquid_height=[liquid_height[1]] if liquid_height else None, + spread=spread, + ) + if delays is not None: + await self.custom_delay(seconds=delays[1]) + await self.mix( + targets=[targets[_]], + mix_time=mix_times, + 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, + ) + if delays is not None: + await self.custom_delay(seconds=delays[1]) + await self.touch_tip(targets[_]) + await self.discard_tips() + + elif len(use_channels) == 8: + # 对于8个的情况,需要判断此时任务是不是能被8通道移液站来成功处理 + if len(targets) % 8 != 0: + raise ValueError(f"Length of `targets` {len(targets)} must be a multiple of 8 for 8-channel mode.") + + # 8个8个来取任务序列 + + for i in range(0, len(targets), 8): + # 取出8个任务 tip = [] for _ in range(len(use_channels)): tip.extend(next(self.current_tip)) await self.pick_up_tips(tip) + current_targets = targets[i:i + 8] + current_reagent_sources = sources[i:i + 8] + current_asp_vols = asp_vols[i:i + 8] + current_dis_vols = dis_vols[i:i + 8] + current_asp_flow_rates = asp_flow_rates[i:i + 8] + current_asp_offset = offsets[i:i + 8] if offsets else [None] * 8 + current_dis_offset = offsets[-i*8-8:len(offsets)-i*8] if offsets else [None] * 8 + current_asp_liquid_height = liquid_height[i:i + 8] if liquid_height else [None] * 8 + current_dis_liquid_height = liquid_height[-i*8-8:len(liquid_height)-i*8] if liquid_height else [None] * 8 + current_asp_blow_out_air_volume = blow_out_air_volume[i:i + 8] if blow_out_air_volume else [None] * 8 + current_dis_blow_out_air_volume = blow_out_air_volume[-i*8-8:len(blow_out_air_volume)-i*8] if blow_out_air_volume else [None] * 8 + current_dis_flow_rates = dis_flow_rates[i:i + 8] if dis_flow_rates else [None] * 8 - for _ in range(len(targets)): - await self.aspirate( - resources=sources, - vols=[asp_vols[_]], - use_channels=use_channels, - flow_rates=[asp_flow_rates[0]] if asp_flow_rates else None, - 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, - ) - if delays is not None: - await self.custom_delay(seconds=delays[0]) - await self.dispense( - resources=[targets[_]], - vols=[dis_vols[_]], - use_channels=use_channels, - flow_rates=[dis_flow_rates[1]] if dis_flow_rates else None, - offsets=[offsets[1]] if offsets else None, - blow_out_air_volume=[blow_out_air_volume[1]] if blow_out_air_volume else None, - liquid_height=[liquid_height[1]] if liquid_height else None, - spread=spread, - ) - if delays is not None: - await self.custom_delay(seconds=delays[1]) - await self.mix( - targets=targets[_], - mix_time=mix_times, - 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, - ) - if delays is not None: - await self.custom_delay(seconds=delays[1]) - await self.touch_tip(targets[_]) + await self.aspirate( + resources=current_reagent_sources, + vols=current_asp_vols, + use_channels=use_channels, + flow_rates=current_asp_flow_rates, + offsets=current_asp_offset, + blow_out_air_volume=current_asp_blow_out_air_volume, + liquid_height=current_asp_liquid_height, + spread=spread, + ) + + if delays is not None: + await self.custom_delay(seconds=delays[0]) + await self.dispense( + resources=current_targets, + vols=current_dis_vols, + use_channels=use_channels, + flow_rates=current_dis_flow_rates, + offsets=current_dis_offset, + blow_out_air_volume=current_dis_blow_out_air_volume, + liquid_height=current_dis_liquid_height, + spread=spread, + ) + if delays is not None: + await self.custom_delay(seconds=delays[1]) + + await self.mix( + targets=current_targets, + mix_time=mix_times, + 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, + ) + if delays is not None: + await self.custom_delay(seconds=delays[1]) + await self.touch_tip(current_targets) await self.discard_tips() - - elif len(use_channels) == 8: - # 对于8个的情况,需要判断此时任务是不是能被8通道移液站来成功处理 - if len(targets) % 8 != 0: - raise ValueError(f"Length of `targets` {len(targets)} must be a multiple of 8 for 8-channel mode.") - - # 8个8个来取任务序列 - - for i in range(0, len(targets), 8): - # 取出8个任务 - tip = [] - for _ in range(len(use_channels)): - tip.extend(next(self.current_tip)) - await self.pick_up_tips(tip) - current_targets = targets[i:i + 8] - current_reagent_sources = sources[i:i + 8] - current_asp_vols = asp_vols[i:i + 8] - current_dis_vols = dis_vols[i:i + 8] - current_asp_flow_rates = asp_flow_rates[i:i + 8] - current_asp_offset = offsets[i:i + 8] if offsets else [None] * 8 - current_dis_offset = offsets[-i*8-8:len(offsets)-i*8] if offsets else [None] * 8 - current_asp_liquid_height = liquid_height[i:i + 8] if liquid_height else [None] * 8 - current_dis_liquid_height = liquid_height[-i*8-8:len(liquid_height)-i*8] if liquid_height else [None] * 8 - current_asp_blow_out_air_volume = blow_out_air_volume[i:i + 8] if blow_out_air_volume else [None] * 8 - current_dis_blow_out_air_volume = blow_out_air_volume[-i*8-8:len(blow_out_air_volume)-i*8] if blow_out_air_volume else [None] * 8 - current_dis_flow_rates = dis_flow_rates[i:i + 8] if dis_flow_rates else [None] * 8 - - await self.aspirate( - resources=current_reagent_sources, - vols=current_asp_vols, - use_channels=use_channels, - flow_rates=current_asp_flow_rates, - offsets=current_asp_offset, - blow_out_air_volume=current_asp_blow_out_air_volume, - liquid_height=current_asp_liquid_height, - spread=spread, - ) - - if delays is not None: - await self.custom_delay(seconds=delays[0]) - await self.dispense( - resources=current_targets, - vols=current_dis_vols, - use_channels=use_channels, - flow_rates=current_dis_flow_rates, - offsets=current_dis_offset, - blow_out_air_volume=current_dis_blow_out_air_volume, - liquid_height=current_dis_liquid_height, - spread=spread, - ) - if delays is not None: - await self.custom_delay(seconds=delays[1]) - - await self.mix( - targets=current_targets, - mix_time=mix_times, - 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, - ) - if delays is not None: - await self.custom_delay(seconds=delays[1]) - await self.touch_tip(current_targets) - await self.discard_tips() - - except Exception as e: - traceback.print_exc() - raise RuntimeError(f"Liquid addition failed: {e}") from e + + # except Exception as e: + # traceback.print_exc() + # raise RuntimeError(f"Liquid addition failed: {e}") from e # --------------------------------------------------------------- diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index 3e791a1..925a84b 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -433,10 +433,14 @@ class PRCXI9300Backend(LiquidHandlerBackend): plate_indexes = [] for op in ops: - plate = op.resource.parent.parent + plate = op.resource.parent deck = plate.parent plate_index = deck.children.index(plate) + print(f"Plate index: {plate_index}, Plate name: {plate.name}") + print(f"Number of children in deck: {len(deck.children)}") + plate_indexes.append(plate_index) + if len(set(plate_indexes)) != 1: raise ValueError("All pickups must be from the same plate. Found different plates: " + str(plate_indexes)) @@ -447,7 +451,8 @@ class PRCXI9300Backend(LiquidHandlerBackend): tip_columns.append(tipspot_index // 8) if len(set(tip_columns)) != 1: raise ValueError("All pickups must be from the same tip column. Found different columns: " + str(tip_columns)) - + # print('111'*99) + # print(plate_indexes[0]) PlateNo = plate_indexes[0] + 1 hole_col = tip_columns[0] + 1 @@ -485,7 +490,7 @@ class PRCXI9300Backend(LiquidHandlerBackend): plate_indexes = [] for op in ops: - plate = op.resource.parent.parent + plate = op.resource.parent deck = plate.parent plate_index = deck.children.index(plate) plate_indexes.append(plate_index) @@ -532,11 +537,10 @@ class PRCXI9300Backend(LiquidHandlerBackend): """Mix liquid in the specified resources.""" - plate_indexes = [] for op in targets: - deck = op.parent.parent.parent - plate = op.parent.parent + deck = op.parent.parent + plate = op.parent plate_index = deck.children.index(plate) plate_indexes.append(plate_index) @@ -577,7 +581,7 @@ class PRCXI9300Backend(LiquidHandlerBackend): plate_indexes = [] for op in ops: - plate = op.resource.parent.parent + plate = op.resource.parent deck = plate.parent plate_index = deck.children.index(plate) plate_indexes.append(plate_index) @@ -617,7 +621,7 @@ class PRCXI9300Backend(LiquidHandlerBackend): plate_indexes = [] for op in ops: - plate = op.resource.parent.parent + plate = op.resource.parent deck = plate.parent plate_index = deck.children.index(plate) plate_indexes.append(plate_index) @@ -1244,7 +1248,7 @@ if __name__ == "__main__": handler = PRCXI9300Handler(deck=deck, host="10.181.102.13", port=9999, timeout=10.0, setup=False, debug=False, matrix_id="fd383e6d-2d0e-40b5-9c01-1b2870b1f1b1", - channel_num=1) + channel_num=1, axis="Right") # Initialize the handler with the deck and host settings handler.set_tiprack([plate8]) # Set the tip rack for the handler asyncio.run(handler.setup()) # Initialize the handler and setup the connection @@ -1262,32 +1266,79 @@ if __name__ == "__main__": print(plate11.get_well(0).tracker.get_used_volume()) asyncio.run(handler.create_protocol(protocol_name="Test Protocol")) # Initialize the backend and setup the connection - print(plate8.children[3]) - asyncio.run(handler.pick_up_tips([plate8.children[3]],[0])) - asyncio.run(handler.aspirate([plate11.children[0]],[10], [0])) - asyncio.run(handler.dispense([plate1.children[3]],[10],[0])) - asyncio.run(handler.mix([plate1.children[3]], mix_time=3, mix_vol=5, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) - asyncio.run(handler.discard_tips()) + + # asyncio.run(handler.pick_up_tips([plate8.children[8]],[0])) + # print(plate8.children[8]) + # # asyncio.run(handler.run_protocol()) + # asyncio.run(handler.aspirate([plate11.children[0]],[10], [0])) + # print(plate11.children[0]) + # # asyncio.run(handler.run_protocol()) + # asyncio.run(handler.dispense([plate1.children[0]],[10],[0])) + # print(plate1.children[0]) + # # asyncio.run(handler.run_protocol()) + # asyncio.run(handler.mix([plate1.children[0]], mix_time=3, mix_vol=5, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) + # print(plate1.children[0]) + # asyncio.run(handler.discard_tips()) + +# asyncio.run(handler.add_liquid( +# asp_vols=[10]*2, +# dis_vols=[10]*2, +# reagent_sources=[plate11.children[0]], +# targets=plate11.children[-2:], +# use_channels=[0], +# flow_rates=[None] * 4, +# offsets=[Coordinate(0, 0, 0)] * 4, +# liquid_height=[None] * 2, +# blow_out_air_volume=[None] * 2, +# delays=None, +# mix_time=3, +# mix_vol=5, +# spread="wide", +# )) + +# asyncio.run(handler.transfer_liquid( +# asp_vols=[10]*2, +# dis_vols=[10]*2, +# sources=plate11.children[:2], +# targets=plate11.children[-2:], +# use_channels=[0], +# offsets=[Coordinate(0, 0, 0)] * 4, +# liquid_height=[None] * 2, +# blow_out_air_volume=[None] * 2, +# delays=None, +# mix_times=3, +# mix_vol=5, +# spread="wide", +# tip_racks=[plate8] +# )) + + asyncio.run(handler.remove_liquid( + vols=[10]*2, + sources=plate11.children[:2], + waste_liquid=plate11.children[43], + use_channels=[0], + offsets=[Coordinate(0, 0, 0)] * 4, + liquid_height=[None] * 2, + blow_out_air_volume=[None] * 2, + delays=None, + spread="wide" + +)) + + + + + + + + + asyncio.run(handler.run_protocol()) # asyncio.run(handler.discard_tips()) # asyncio.run(handler.mix(well_containers.children[:8 # ], mix_time=3, mix_vol=50, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) #print(json.dumps(handler._unilabos_backend.steps_todo_list, indent=2)) # Print matrix info - # asyncio.run(handler.add_liquid( - # asp_vols=[100]*16, - # dis_vols=[100]*16, - # reagent_sources=final_plate_2.children[-16:], - # targets=final_plate_2.children[:16], - # use_channels=[0, 1, 2, 3, 4, 5, 6, 7], - # flow_rates=[None] * 32, - # offsets=[Coordinate(0, 0, 0)] * 32, - # liquid_height=[None] * 16, - # blow_out_air_volume=[None] * 16, - # delays=None, - # mix_time=3, - # mix_vol=50, - # spread="wide", - # )) + # asyncio.run(handler.remove_liquid( # vols=[100]*16, From dd89d00588d0dfe9b9b1fa8a7f2df65d2796325c Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Sat, 19 Jul 2025 00:22:00 +0800 Subject: [PATCH 80/96] Update prcxi.py --- unilabos/devices/liquid_handling/prcxi/prcxi.py | 1 - 1 file changed, 1 deletion(-) diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index 925a84b..602fa7a 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -1322,7 +1322,6 @@ if __name__ == "__main__": blow_out_air_volume=[None] * 2, delays=None, spread="wide" - )) From 2b7da0e396fd46cfc4926a0bc94d8968ab0df739 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Sat, 19 Jul 2025 00:54:24 +0800 Subject: [PATCH 81/96] SET TIP RACK --- unilabos/registry/devices/camera.yaml | 2 ++ unilabos/registry/registry.py | 4 +++- unilabos_msgs/CMakeLists.txt | 1 + unilabos_msgs/action/LiquidHandlerSetTipRack.action | 5 +++++ 4 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 unilabos_msgs/action/LiquidHandlerSetTipRack.action diff --git a/unilabos/registry/devices/camera.yaml b/unilabos/registry/devices/camera.yaml index 3e9cb1d..db3c845 100644 --- a/unilabos/registry/devices/camera.yaml +++ b/unilabos/registry/devices/camera.yaml @@ -47,6 +47,8 @@ camera: description: VideoPublisher摄像头设备节点,用于实时视频采集和流媒体发布。该设备通过OpenCV连接本地摄像头(如USB摄像头、内置摄像头等),定时采集视频帧并将其转换为ROS2的sensor_msgs/Image消息格式发布到视频话题。主要用于实验室自动化系统中的视觉监控、图像分析、实时观察等应用场景。支持可配置的摄像头索引、发布频率等参数。 handles: [] icon: '' + category: + - camera init_param_schema: config: properties: diff --git a/unilabos/registry/registry.py b/unilabos/registry/registry.py index 5fedfdb..36dd6b7 100644 --- a/unilabos/registry/registry.py +++ b/unilabos/registry/registry.py @@ -147,7 +147,8 @@ class Registry: logger.debug(f"[UniLab Registry] resources: {resource_path.exists()}, total: {len(files)}") current_resource_number = len(self.resource_type_registry) + 1 for i, file in enumerate(files): - data = yaml.safe_load(open(file, encoding="utf-8")) + with open(file, encoding="utf-8", mode="r") as f: + data = yaml.safe_load(io.StringIO(f.read())) if data: # 为每个资源添加文件路径信息 for resource_id, resource_info in data.items(): @@ -344,6 +345,7 @@ class Registry: } def load_device_types(self, path: os.PathLike, complete_registry: bool): + return abs_path = Path(path).absolute() devices_path = abs_path / "devices" device_comms_path = abs_path / "device_comms" diff --git a/unilabos_msgs/CMakeLists.txt b/unilabos_msgs/CMakeLists.txt index f8dd61c..1c37139 100644 --- a/unilabos_msgs/CMakeLists.txt +++ b/unilabos_msgs/CMakeLists.txt @@ -65,6 +65,7 @@ set(action_files "action/LiquidHandlerReturnTips.action" "action/LiquidHandlerReturnTips96.action" "action/LiquidHandlerSetLiquid.action" + "action/LiquidHandlerSetTipRack.action" "action/LiquidHandlerStamp.action" "action/LiquidHandlerTransfer.action" diff --git a/unilabos_msgs/action/LiquidHandlerSetTipRack.action b/unilabos_msgs/action/LiquidHandlerSetTipRack.action new file mode 100644 index 0000000..eb34fee --- /dev/null +++ b/unilabos_msgs/action/LiquidHandlerSetTipRack.action @@ -0,0 +1,5 @@ +Resource[] tip_racks +--- +string return_info +bool success +--- From 58bf6496b62130085aba63309fd4b1c9758136df Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Sat, 19 Jul 2025 01:02:39 +0800 Subject: [PATCH 82/96] bump version --- .gitignore | 2 +- README.md | 2 +- README_zh.md | 2 +- recipes/ros-humble-unilabos-msgs/recipe.yaml | 2 +- recipes/unilabos/recipe.yaml | 2 +- setup.py | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index c3147ec..5591f09 100644 --- a/.gitignore +++ b/.gitignore @@ -241,4 +241,4 @@ unilabos/device_mesh/view_robot.rviz # Certs **/.certs local_test2.py -ros-humble-unilabos-msgs-0.9.12-h6403a04_5.tar.bz2 +ros-humble-unilabos-msgs-0.9.13-h6403a04_5.tar.bz2 diff --git a/README.md b/README.md index 8568fb3..ab6320c 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.12-xxxxx.tar.bz2 +conda install ros-humble-unilabos-msgs-0.9.13-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 75dbddf..50084af 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.12-xxxxx.tar.bz2 +conda install ros-humble-unilabos-msgs-0.9.13-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 0ef4b2d..89738d0 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.12 + version: 0.9.13 source: path: ../../unilabos_msgs folder: ros-humble-unilabos-msgs/src/work diff --git a/recipes/unilabos/recipe.yaml b/recipes/unilabos/recipe.yaml index 720824f..2463cc5 100644 --- a/recipes/unilabos/recipe.yaml +++ b/recipes/unilabos/recipe.yaml @@ -1,6 +1,6 @@ package: name: unilabos - version: "0.9.12" + version: "0.9.13" source: path: ../.. diff --git a/setup.py b/setup.py index 6a4e5ef..7a0f97f 100644 --- a/setup.py +++ b/setup.py @@ -4,7 +4,7 @@ package_name = 'unilabos' setup( name=package_name, - version='0.9.12', + version='0.9.13', packages=find_packages(), include_package_data=True, install_requires=['setuptools'], From 73f33c82dbc4d2a4e42b18f5f8eab7b65164b326 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Sat, 19 Jul 2025 01:29:59 +0800 Subject: [PATCH 83/96] update registry version & category --- unilabos/registry/device_comms/serial.yaml | 5 +- unilabos/registry/devices/camera.yaml | 7 +- .../devices/characterization_optic.yaml | 10 ++- unilabos/registry/devices/hotel.yaml | 5 +- .../registry/devices/laiyu_add_solid.yaml | 5 +- unilabos/registry/devices/liquid_handler.yaml | 20 ++++-- unilabos/registry/devices/mock_devices.yaml | 50 ++++++++++--- unilabos/registry/devices/moveit_config.yaml | 10 ++- .../devices/organic_miscellaneous.yaml | 10 ++- unilabos/registry/devices/pump_and_valve.yaml | 15 +++- unilabos/registry/devices/robot_agv.yaml | 5 +- unilabos/registry/devices/robot_arm.yaml | 5 +- unilabos/registry/devices/robot_gripper.yaml | 10 ++- .../registry/devices/robot_linear_motion.yaml | 10 ++- unilabos/registry/devices/sim_nodes.yaml | 5 +- unilabos/registry/devices/temperature.yaml | 15 +++- .../registry/devices/vacuum_and_purge.yaml | 10 ++- unilabos/registry/devices/virtual_device.yaml | 70 +++++++++++++++---- unilabos/registry/devices/work_station.yaml | 5 +- unilabos/registry/devices/zhida_hplc.yaml | 5 +- unilabos/registry/registry.py | 33 +++++++-- 21 files changed, 247 insertions(+), 63 deletions(-) diff --git a/unilabos/registry/device_comms/serial.yaml b/unilabos/registry/device_comms/serial.yaml index 4e8f776..3bf2b02 100644 --- a/unilabos/registry/device_comms/serial.yaml +++ b/unilabos/registry/device_comms/serial.yaml @@ -1,4 +1,6 @@ serial: + category: + - serial class: action_value_mappings: auto-handle_serial_request: @@ -76,6 +78,7 @@ serial: module: unilabos.ros.nodes.presets.serial_node:ROS2SerialNode status_types: {} type: ros2 + config_info: [] description: Serial communication interface, used when sharing same serial port for multiple devices handles: [] @@ -100,4 +103,4 @@ serial: properties: {} required: [] type: object - version: 0.0.1 + version: 1.0.0 diff --git a/unilabos/registry/devices/camera.yaml b/unilabos/registry/devices/camera.yaml index db3c845..ea5337e 100644 --- a/unilabos/registry/devices/camera.yaml +++ b/unilabos/registry/devices/camera.yaml @@ -1,4 +1,6 @@ camera: + category: + - camera class: action_value_mappings: auto-destroy_node: @@ -44,11 +46,10 @@ camera: module: unilabos.ros.nodes.presets.camera:VideoPublisher status_types: {} type: ros2 + config_info: [] description: VideoPublisher摄像头设备节点,用于实时视频采集和流媒体发布。该设备通过OpenCV连接本地摄像头(如USB摄像头、内置摄像头等),定时采集视频帧并将其转换为ROS2的sensor_msgs/Image消息格式发布到视频话题。主要用于实验室自动化系统中的视觉监控、图像分析、实时观察等应用场景。支持可配置的摄像头索引、发布频率等参数。 handles: [] icon: '' - category: - - camera init_param_schema: config: properties: @@ -69,4 +70,4 @@ camera: properties: {} required: [] type: object - version: 0.0.1 + version: 1.0.0 diff --git a/unilabos/registry/devices/characterization_optic.yaml b/unilabos/registry/devices/characterization_optic.yaml index 88be207..5fef855 100644 --- a/unilabos/registry/devices/characterization_optic.yaml +++ b/unilabos/registry/devices/characterization_optic.yaml @@ -1,4 +1,6 @@ hplc.agilent: + category: + - characterization_optic class: action_value_mappings: auto-check_status: @@ -176,6 +178,7 @@ hplc.agilent: status_text: str success: bool type: python + config_info: [] description: 安捷伦高效液相色谱(HPLC)分析设备,用于复杂化合物的分离、检测和定量分析。该设备通过UI自动化技术控制安捷伦ChemStation软件,实现全自动的样品分析流程。具备序列启动、设备状态监控、数据文件提取、结果处理等功能。支持多样品批量处理和实时状态反馈,适用于药物分析、环境检测、食品安全、化学研究等需要高精度色谱分析的实验室应用。 handles: [] icon: '' @@ -215,8 +218,10 @@ hplc.agilent: - finish_status - data_file type: object - version: 0.0.1 + version: 1.0.0 raman_home_made: + category: + - characterization_optic class: action_value_mappings: auto-ccd_time: @@ -378,6 +383,7 @@ raman_home_made: module: unilabos.devices.raman_uv.home_made_raman:RamanObj status_types: {} type: python + config_info: [] description: 拉曼光谱分析设备,用于物质的分子结构和化学成分表征。该设备集成激光器和CCD检测器,通过串口通信控制激光功率和光谱采集。具备背景扣除、多次平均、自动数据处理等功能,支持高精度的拉曼光谱测量。适用于材料表征、化学分析、质量控制、研究开发等需要分子指纹识别和结构分析的实验应用。 handles: [] icon: '' @@ -402,4 +408,4 @@ raman_home_made: properties: {} required: [] type: object - version: 0.0.1 + version: 1.0.0 diff --git a/unilabos/registry/devices/hotel.yaml b/unilabos/registry/devices/hotel.yaml index 98a6785..204f021 100644 --- a/unilabos/registry/devices/hotel.yaml +++ b/unilabos/registry/devices/hotel.yaml @@ -1,10 +1,13 @@ hotel.thermo_orbitor_rs2_hotel: + category: + - hotel class: action_value_mappings: {} module: unilabos.devices.resource_container.container:HotelContainer status_types: rotation: String type: python + config_info: [] description: Thermo Orbitor RS2 Hotel容器设备,用于实验室样品的存储和管理。该设备通过HotelContainer类实现容器的旋转控制和状态监控,主要用于存储实验样品、试剂瓶或其他实验器具,支持旋转功能以便于样品的自动化存取。适用于需要有序存储和快速访问大量样品的实验室自动化场景。 handles: [] icon: '' @@ -29,4 +32,4 @@ hotel.thermo_orbitor_rs2_hotel: model: mesh: thermo_orbitor_rs2_hotel type: device - version: 0.0.1 + version: 1.0.0 diff --git a/unilabos/registry/devices/laiyu_add_solid.yaml b/unilabos/registry/devices/laiyu_add_solid.yaml index 07c802b..fbb654d 100644 --- a/unilabos/registry/devices/laiyu_add_solid.yaml +++ b/unilabos/registry/devices/laiyu_add_solid.yaml @@ -1,4 +1,6 @@ laiyu_add_solid: + category: + - laiyu_add_solid class: action_value_mappings: add_powder_tube: @@ -355,6 +357,7 @@ laiyu_add_solid: status_types: status: str type: python + config_info: [] description: 来渝固体粉末自动分装设备,用于实验室化学试剂的精确称量和分装。该设备通过Modbus RTU协议与控制系统通信,集成了精密天平、三轴运动平台、粉筒管理系统等组件。支持多种粉末试剂的自动拿取、精确称量、定点分装和归位操作。具备高精度称量、位置控制和批量处理能力,适用于化学合成、药物研发、材料制备等需要精确固体试剂配制的实验室应用场景。 handles: [] icon: '' @@ -379,4 +382,4 @@ laiyu_add_solid: required: - status type: object - version: 0.0.1 + version: 1.0.0 diff --git a/unilabos/registry/devices/liquid_handler.yaml b/unilabos/registry/devices/liquid_handler.yaml index f5d7137..b8a92ea 100644 --- a/unilabos/registry/devices/liquid_handler.yaml +++ b/unilabos/registry/devices/liquid_handler.yaml @@ -1,4 +1,6 @@ liquid_handler: + category: + - liquid_handler class: action_value_mappings: add_liquid: @@ -4357,6 +4359,7 @@ liquid_handler: module: unilabos.devices.liquid_handling.liquid_handler_abstract:LiquidHandlerAbstract status_types: {} type: python + config_info: [] description: Liquid handler device controlled by pylabrobot handles: input: @@ -4395,8 +4398,10 @@ liquid_handler: properties: {} required: [] type: object - version: 0.0.1 + version: 1.0.0 liquid_handler.biomek: + category: + - liquid_handler class: action_value_mappings: auto-create_resource: @@ -5361,6 +5366,7 @@ liquid_handler.biomek: status_types: success: String type: python + config_info: [] description: Biomek液体处理器设备,基于pylabrobot控制 handles: [] icon: icon_yiyezhan.webp @@ -5376,8 +5382,10 @@ liquid_handler.biomek: required: - success type: object - version: 0.0.1 + version: 1.0.0 liquid_handler.prcxi: + category: + - liquid_handler class: action_value_mappings: add_liquid: @@ -7928,6 +7936,7 @@ liquid_handler.prcxi: status_types: reset_ok: bool type: python + config_info: [] description: prcxi液体处理器设备,基于pylabrobot控制 handles: [] icon: icon_yiyezhan.webp @@ -7973,8 +7982,10 @@ liquid_handler.prcxi: required: - reset_ok type: object - version: 0.0.1 + version: 1.0.0 liquid_handler.revvity: + category: + - liquid_handler class: action_value_mappings: run: @@ -8130,6 +8141,7 @@ liquid_handler.revvity: status: str success: bool type: python + config_info: [] description: '' handles: [] icon: '' @@ -8148,4 +8160,4 @@ liquid_handler.revvity: - success - status type: object - version: 0.0.1 + version: 1.0.0 diff --git a/unilabos/registry/devices/mock_devices.yaml b/unilabos/registry/devices/mock_devices.yaml index 758abde..ec62986 100644 --- a/unilabos/registry/devices/mock_devices.yaml +++ b/unilabos/registry/devices/mock_devices.yaml @@ -1,4 +1,6 @@ mock_chiller: + category: + - mock_devices class: action_value_mappings: emergency_stop: @@ -325,6 +327,7 @@ mock_chiller: target_temperature: float vessel: str type: python + config_info: [] description: Mock Chiller Device handles: [] icon: '' @@ -364,8 +367,10 @@ mock_chiller: - purpose - status_info type: object - version: 0.0.1 + version: 1.0.0 mock_filter: + category: + - mock_devices class: action_value_mappings: auto-emergency_stop: @@ -743,6 +748,7 @@ mock_filter: temperature: float vessel: str type: python + config_info: [] description: Mock Filter Device handles: [] icon: '' @@ -803,8 +809,10 @@ mock_filter: - target_volume - status_info type: object - version: 0.0.1 + version: 1.0.0 mock_heater: + category: + - mock_devices class: action_value_mappings: auto-set_heating_power: @@ -1361,6 +1369,7 @@ mock_heater: target_temperature: float vessel: str type: python + config_info: [] description: Mock Heater Device handles: [] icon: '' @@ -1409,8 +1418,10 @@ mock_heater: - stir_speed - status_info type: object - version: 0.0.1 + version: 1.0.0 mock_pump: + category: + - mock_devices class: action_value_mappings: auto-emergency_stop: @@ -1887,6 +1898,7 @@ mock_pump: transfer_time: float transfer_volume: float type: python + config_info: [] description: Mock Pump Device handles: [] icon: '' @@ -1968,8 +1980,10 @@ mock_pump: - time_remaining - status_info type: object - version: 0.0.1 + version: 1.0.0 mock_rotavap: + category: + - mock_devices class: action_value_mappings: auto-emergency_stop: @@ -2296,6 +2310,7 @@ mock_rotavap: temperature: float vacuum_level: float type: python + config_info: [] description: Mock Rotavap Device handles: [] icon: '' @@ -2341,8 +2356,10 @@ mock_rotavap: - target_temperature - status_info type: object - version: 0.0.1 + version: 1.0.0 mock_separator: + category: + - mock_devices class: action_value_mappings: separate: @@ -3247,6 +3264,7 @@ mock_separator: valve_state: str waste_phase_to_vessel: str type: python + config_info: [] description: Simplified Mock Separator Device handles: [] icon: '' @@ -3325,8 +3343,10 @@ mock_separator: - time_remaining - status_info type: object - version: 0.0.1 + version: 1.0.0 mock_solenoid_valve: + category: + - mock_devices class: action_value_mappings: auto-is_closed: @@ -3481,6 +3501,7 @@ mock_solenoid_valve: status: str valve_status: str type: python + config_info: [] description: Mock Solenoid Valve Device handles: [] icon: '' @@ -3502,8 +3523,10 @@ mock_solenoid_valve: - status - valve_status type: object - version: 0.0.1 + version: 1.0.0 mock_stirrer: + category: + - mock_devices class: action_value_mappings: auto-emergency_stop: @@ -3749,6 +3772,7 @@ mock_stirrer: target_temperature: float temperature: float type: python + config_info: [] description: Mock Stirrer Device handles: [] icon: '' @@ -3797,8 +3821,10 @@ mock_stirrer: - max_temperature - status_info type: object - version: 0.0.1 + version: 1.0.0 mock_stirrer_new: + category: + - mock_devices class: action_value_mappings: start_stir: @@ -4279,6 +4305,7 @@ mock_stirrer_new: target_stir_speed: float vessel: str type: python + config_info: [] description: Mock Stirrer Device (Copy Version) handles: [] icon: '' @@ -4327,8 +4354,10 @@ mock_stirrer_new: - progress - status_info type: object - version: 0.0.1 + version: 1.0.0 mock_vacuum: + category: + - mock_devices class: action_value_mappings: auto-emergency_stop: @@ -4610,6 +4639,7 @@ mock_vacuum: target_vacuum: float vacuum_level: float type: python + config_info: [] description: Mock Vacuum Pump Device handles: [] icon: '' @@ -4652,4 +4682,4 @@ mock_vacuum: - max_pump_speed - status_info type: object - version: 0.0.1 + version: 1.0.0 diff --git a/unilabos/registry/devices/moveit_config.yaml b/unilabos/registry/devices/moveit_config.yaml index 3823524..eafa522 100644 --- a/unilabos/registry/devices/moveit_config.yaml +++ b/unilabos/registry/devices/moveit_config.yaml @@ -1,4 +1,6 @@ moveit.arm_slider: + category: + - moveit_config class: action_value_mappings: auto-check_tf_update_actions: @@ -321,6 +323,7 @@ moveit.arm_slider: module: unilabos.devices.ros_dev.moveit_interface:MoveitInterface status_types: {} type: python + config_info: [] description: 机械臂与滑块运动系统,基于MoveIt2运动规划框架的多自由度机械臂控制设备。该系统集成机械臂和线性滑块,通过ROS2和MoveIt2实现精确的轨迹规划和协调运动控制。支持笛卡尔空间和关节空间的运动规划、碰撞检测、逆运动学求解等功能。适用于复杂的pick-and-place操作、精密装配、多工位协作等需要高精度多轴协调运动的实验室自动化应用。 handles: [] icon: '' @@ -346,8 +349,10 @@ moveit.arm_slider: model: mesh: arm_slider type: device - version: 0.0.1 + version: 1.0.0 moveit.toyo_xyz: + category: + - moveit_config class: action_value_mappings: auto-check_tf_update_actions: @@ -670,6 +675,7 @@ moveit.toyo_xyz: module: unilabos.devices.ros_dev.moveit_interface:MoveitInterface status_types: {} type: python + config_info: [] description: 东洋XYZ三轴运动平台,基于MoveIt2运动规划框架的精密定位设备。该设备通过ROS2和MoveIt2实现三维空间的精确运动控制,支持复杂轨迹规划、多点定位、速度控制等功能。具备高精度定位、平稳运动、实时轨迹监控等特性。适用于精密加工、样品定位、检测扫描、自动化装配等需要高精度三维运动控制的实验室和工业应用场景。 handles: [] icon: '' @@ -695,4 +701,4 @@ moveit.toyo_xyz: model: mesh: toyo_xyz type: device - version: 0.0.1 + version: 1.0.0 diff --git a/unilabos/registry/devices/organic_miscellaneous.yaml b/unilabos/registry/devices/organic_miscellaneous.yaml index 8ae8418..c3e4aa2 100644 --- a/unilabos/registry/devices/organic_miscellaneous.yaml +++ b/unilabos/registry/devices/organic_miscellaneous.yaml @@ -1,4 +1,6 @@ rotavap.one: + category: + - organic_miscellaneous class: action_value_mappings: auto-cmd_write: @@ -140,6 +142,7 @@ rotavap.one: module: unilabos.devices.rotavap.rotavap_one:RotavapOne status_types: {} type: python + config_info: [] description: 旋转蒸发仪设备,用于有机化学实验中的溶剂回收和浓缩操作。该设备通过串口通信控制,集成旋转和真空泵功能,支持定时控制和自动化操作。具备旋转速度调节、真空度控制、温度管理等功能,实现高效的溶剂蒸发和回收。适用于有机合成、天然产物提取、药物制备等需要溶剂去除和浓缩的实验室应用场景。 handles: [] icon: '' @@ -158,8 +161,10 @@ rotavap.one: properties: {} required: [] type: object - version: 0.0.1 + version: 1.0.0 separator.homemade: + category: + - organic_miscellaneous class: action_value_mappings: auto-read_sensor_loop: @@ -446,6 +451,7 @@ separator.homemade: module: unilabos.devices.separator.homemade_grbl_conductivity:SeparatorController status_types: {} type: python + config_info: [] description: 液-液分离器设备,基于自制Grbl控制器的自动化分离系统。该设备集成搅拌、沉降、阀门控制和电导率传感器,通过串口通信实现精确的分离操作控制。支持自动搅拌、分层沉降、基于传感器反馈的智能分液等功能。适用于有机化学中的萃取分离、相分离、液-液提取等需要精确分离控制的实验应用。 handles: [] icon: '' @@ -470,4 +476,4 @@ separator.homemade: properties: {} required: [] type: object - version: 0.0.1 + version: 1.0.0 diff --git a/unilabos/registry/devices/pump_and_valve.yaml b/unilabos/registry/devices/pump_and_valve.yaml index 8d13551..7dcfa75 100644 --- a/unilabos/registry/devices/pump_and_valve.yaml +++ b/unilabos/registry/devices/pump_and_valve.yaml @@ -1,4 +1,6 @@ solenoid_valve: + category: + - pump_and_valve class: action_value_mappings: auto-close: @@ -170,6 +172,7 @@ solenoid_valve: status: str valve_position: str type: python + config_info: [] description: 电磁阀控制设备,用于精确的流体路径控制和开关操作。该设备通过串口通信控制电磁阀的开关状态,支持远程操作和状态监测。具备快速响应、可靠密封、状态反馈等特性,广泛应用于流体输送、样品进样、路径切换等需要精确流体控制的实验室自动化应用。 handles: [] icon: '' @@ -191,8 +194,10 @@ solenoid_valve: - status - valve_position type: object - version: 0.0.1 + version: 1.0.0 solenoid_valve.mock: + category: + - pump_and_valve class: action_value_mappings: auto-is_closed: @@ -328,6 +333,7 @@ solenoid_valve.mock: status: str valve_position: str type: python + config_info: [] description: 模拟电磁阀设备,用于系统测试和开发调试。该设备模拟真实电磁阀的开关操作和状态变化,提供与实际设备相同的控制接口和反馈机制。支持流体路径的虚拟控制,便于在没有实际硬件的情况下进行流体系统的集成测试和算法验证。适用于系统开发、流程调试和培训演示等场景。 handles: - data_type: fluid @@ -359,8 +365,10 @@ solenoid_valve.mock: - status - valve_position type: object - version: 0.0.1 + version: 1.0.0 syringe_pump_with_valve.runze: + category: + - pump_and_valve class: action_value_mappings: auto-close: @@ -754,6 +762,7 @@ syringe_pump_with_valve.runze: velocity_grade: String velocity_init: String type: python + config_info: [] description: 润泽精密注射泵设备,集成阀门控制的高精度流体输送系统。该设备通过串口通信控制,支持多种运行模式和精确的体积控制。具备可变速度控制、精密定位、阀门切换、实时状态监控等功能。适用于微量液体输送、精密进样、流速控制、化学反应进料等需要高精度流体操作的实验室自动化应用。 handles: [] icon: '' @@ -804,4 +813,4 @@ syringe_pump_with_valve.runze: - position - plunger_position type: object - version: 0.0.1 + version: 1.0.0 diff --git a/unilabos/registry/devices/robot_agv.yaml b/unilabos/registry/devices/robot_agv.yaml index d947de6..be4aa6c 100644 --- a/unilabos/registry/devices/robot_agv.yaml +++ b/unilabos/registry/devices/robot_agv.yaml @@ -1,4 +1,6 @@ agv.SEER: + category: + - robot_agv class: action_value_mappings: auto-send: @@ -82,6 +84,7 @@ agv.SEER: pose: list status: str type: python + config_info: [] description: SEER AGV自动导引车设备,用于实验室内物料和设备的自主移动运输。该AGV通过TCP socket与导航系统通信,具备精确的定位和路径规划能力。支持实时位置监控、状态查询和导航任务执行,可在预设的实验室环境中自主移动至指定位置。适用于样品运输、设备转移、多工位协作等实验室自动化物流场景。 handles: [] icon: '' @@ -103,4 +106,4 @@ agv.SEER: - pose - status type: object - version: 0.0.1 + version: 1.0.0 diff --git a/unilabos/registry/devices/robot_arm.yaml b/unilabos/registry/devices/robot_arm.yaml index 82fa0dd..e9bc94f 100644 --- a/unilabos/registry/devices/robot_arm.yaml +++ b/unilabos/registry/devices/robot_arm.yaml @@ -1,4 +1,6 @@ robotic_arm.UR: + category: + - robot_arm class: action_value_mappings: auto-arm_init: @@ -140,6 +142,7 @@ robotic_arm.UR: gripper_pose: float gripper_status: str type: python + config_info: [] description: Universal Robots机械臂设备,用于实验室精密操作和自动化作业。该设备集成了UR机械臂本体、Robotiq夹爪和RTDE通信接口,支持六自由度精确运动控制和力觉反馈。具备实时位置监控、状态反馈、轨迹规划等功能,可执行复杂的多点位运动任务。适用于样品抓取、精密装配、实验器具操作等需要高精度和高重复性的实验室自动化场景。 handles: [] icon: '' @@ -170,4 +173,4 @@ robotic_arm.UR: - arm_status - gripper_status type: object - version: 0.0.1 + version: 1.0.0 diff --git a/unilabos/registry/devices/robot_gripper.yaml b/unilabos/registry/devices/robot_gripper.yaml index 383bcff..2a2ccce 100644 --- a/unilabos/registry/devices/robot_gripper.yaml +++ b/unilabos/registry/devices/robot_gripper.yaml @@ -1,4 +1,6 @@ gripper.misumi_rz: + category: + - robot_gripper class: action_value_mappings: auto-data_loop: @@ -417,6 +419,7 @@ gripper.misumi_rz: status_types: status: str type: python + config_info: [] description: Misumi RZ系列电子夹爪设备,集成旋转和抓取双重功能的精密夹爪系统。该设备通过Modbus RTU协议与控制系统通信,支持位置、速度、力矩的精确控制。具备高精度的位置反馈、实时状态监控和故障检测功能。适用于需要精密抓取和旋转操作的实验室自动化场景,如样品管理、精密装配、器件操作等应用。 handles: [] icon: '' @@ -444,8 +447,10 @@ gripper.misumi_rz: required: - status type: object - version: 0.0.1 + version: 1.0.0 gripper.mock: + category: + - robot_gripper class: action_value_mappings: auto-edit_id: @@ -563,6 +568,7 @@ gripper.mock: torque: float velocity: float type: python + config_info: [] description: 模拟夹爪设备,用于系统测试和开发调试。该设备模拟真实夹爪的位置、速度、力矩等物理特性,支持虚拟的抓取和移动操作。提供与真实夹爪相同的接口和状态反馈,便于在没有实际硬件的情况下进行系统集成测试和算法验证。适用于软件开发、系统调试和培训演示等场景。 handles: [] icon: '' @@ -587,4 +593,4 @@ gripper.mock: - torque - status type: object - version: 0.0.1 + version: 1.0.0 diff --git a/unilabos/registry/devices/robot_linear_motion.yaml b/unilabos/registry/devices/robot_linear_motion.yaml index c33cace..3ca4e9a 100644 --- a/unilabos/registry/devices/robot_linear_motion.yaml +++ b/unilabos/registry/devices/robot_linear_motion.yaml @@ -1,4 +1,6 @@ linear_motion.grbl: + category: + - robot_linear_motion class: action_value_mappings: auto-initialize: @@ -430,6 +432,7 @@ linear_motion.grbl: spindle_speed: float status: str type: python + config_info: [] description: Grbl数控机床(CNC)设备,用于实验室精密加工和三轴定位操作。该设备基于Grbl固件,通过串口通信控制步进电机实现X、Y、Z三轴的精确运动。支持绝对定位、轨迹规划、主轴控制和实时状态监控。具备安全限位保护和运动平滑控制功能。适用于精密钻孔、铣削、雕刻、样品制备等需要高精度定位和加工的实验室应用场景。 handles: [] icon: '' @@ -466,8 +469,10 @@ linear_motion.grbl: - position - spindle_speed type: object - version: 0.0.1 + version: 1.0.0 motor.iCL42: + category: + - robot_linear_motion class: action_value_mappings: auto-execute_run_motor: @@ -604,6 +609,7 @@ motor.iCL42: motor_position: int success: bool type: python + config_info: [] description: iCL42步进电机驱动器,用于实验室设备的精密线性运动控制。该设备通过串口通信控制iCL42型步进电机驱动器,支持多种运动模式和精确的位置、速度控制。具备位置反馈、运行状态监控和故障检测功能。适用于自动进样器、样品传送、精密定位平台等需要准确线性运动控制的实验室自动化设备。 handles: [] icon: '' @@ -631,4 +637,4 @@ motor.iCL42: - is_executing_run - success type: object - version: 0.0.1 + version: 1.0.0 diff --git a/unilabos/registry/devices/sim_nodes.yaml b/unilabos/registry/devices/sim_nodes.yaml index 4476a02..f07966b 100644 --- a/unilabos/registry/devices/sim_nodes.yaml +++ b/unilabos/registry/devices/sim_nodes.yaml @@ -1,4 +1,6 @@ lh_joint_publisher: + category: + - sim_nodes class: action_value_mappings: auto-check_tf_update_actions: @@ -285,6 +287,7 @@ lh_joint_publisher: module: unilabos.devices.ros_dev.liquid_handler_joint_publisher:LiquidHandlerJointPublisher status_types: {} type: ros2 + config_info: [] description: 液体处理器关节发布器,用于ROS2仿真系统中的液体处理设备运动控制。该节点通过发布关节状态驱动仿真模型中的机械臂运动,支持三维坐标到关节空间的逆运动学转换、多关节协调控制、资源跟踪和TF变换。具备精确的位置控制、速度调节、pick-and-place操作等功能。适用于液体处理系统的虚拟仿真、运动规划验证、系统集成测试等应用场景。 handles: [] icon: '' @@ -309,4 +312,4 @@ lh_joint_publisher: properties: {} required: [] type: object - version: 0.0.1 + version: 1.0.0 diff --git a/unilabos/registry/devices/temperature.yaml b/unilabos/registry/devices/temperature.yaml index d09834d..95bdeed 100644 --- a/unilabos/registry/devices/temperature.yaml +++ b/unilabos/registry/devices/temperature.yaml @@ -1,4 +1,6 @@ chiller: + category: + - temperature class: action_value_mappings: auto-build_modbus_frame: @@ -156,6 +158,7 @@ chiller: module: unilabos.devices.temperature.chiller:Chiller status_types: {} type: python + config_info: [] description: 实验室制冷设备,用于精确的温度控制和冷却操作。该设备通过Modbus RTU协议与控制系统通信,支持精确的温度设定和监控。具备快速降温、恒温控制和温度保持功能,广泛应用于需要低温环境的化学反应、样品保存、结晶操作等实验场景。提供稳定可靠的冷却性能,确保实验过程的温度精度。 handles: [] icon: '' @@ -174,8 +177,10 @@ chiller: properties: {} required: [] type: object - version: 0.0.1 + version: 1.0.0 heaterstirrer.dalong: + category: + - temperature class: action_value_mappings: auto-close: @@ -523,6 +528,7 @@ heaterstirrer.dalong: temp_target: float temp_warning: float type: python + config_info: [] description: 大龙加热搅拌器,集成加热和搅拌双重功能的实验室设备。该设备通过串口通信控制,支持精确的温度调节、搅拌速度控制和安全保护功能。具备实时温度监测、目标温度设定、安全温度报警等特性。适用于化学合成、样品制备、反应控制等需要同时进行加热和搅拌的实验操作,提供稳定均匀的反应环境。 handles: [] icon: '' @@ -559,8 +565,10 @@ heaterstirrer.dalong: - temp_warning - temp_target type: object - version: 0.0.1 + version: 1.0.0 tempsensor: + category: + - temperature class: action_value_mappings: auto-build_modbus_request: @@ -719,6 +727,7 @@ tempsensor: status_types: value: float type: python + config_info: [] description: 高精度温度传感器设备,用于实验室环境和设备的温度监测。该传感器通过Modbus RTU协议与控制系统通信,提供实时准确的温度数据。具备高精度测量、报警温度设定、数据稳定性好等特点。适用于反应器监控、环境温度监测、设备保护等需要精确温度测量的实验场景,为实验安全和数据可靠性提供保障。 handles: [] icon: '' @@ -746,4 +755,4 @@ tempsensor: required: - value type: object - version: 0.0.1 + version: 1.0.0 diff --git a/unilabos/registry/devices/vacuum_and_purge.yaml b/unilabos/registry/devices/vacuum_and_purge.yaml index 85aefdc..a127a08 100644 --- a/unilabos/registry/devices/vacuum_and_purge.yaml +++ b/unilabos/registry/devices/vacuum_and_purge.yaml @@ -1,4 +1,6 @@ gas_source.mock: + category: + - vacuum_and_purge class: action_value_mappings: auto-is_closed: @@ -149,6 +151,7 @@ gas_source.mock: status_types: status: str type: python + config_info: [] description: 模拟气体源设备,用于系统测试和开发调试。该设备模拟真实气体源的开关控制和状态监测功能,支持气体供应的启停操作。提供与真实气体源相同的接口和状态反馈,便于在没有实际硬件的情况下进行系统集成测试和算法验证。适用于气路系统调试、软件开发和实验流程验证等场景。 handles: - data_key: fluid_out @@ -173,8 +176,10 @@ gas_source.mock: required: - status type: object - version: 0.0.1 + version: 1.0.0 vacuum_pump.mock: + category: + - vacuum_and_purge class: action_value_mappings: auto-is_closed: @@ -325,6 +330,7 @@ vacuum_pump.mock: status_types: status: str type: python + config_info: [] description: 模拟真空泵设备,用于系统测试和开发调试。该设备模拟真实真空泵的抽气功能和状态控制,支持真空系统的启停操作和状态监测。提供与真实真空泵相同的接口和控制逻辑,便于在没有实际硬件的情况下进行真空系统的集成测试。适用于真空工艺调试、软件开发和实验流程验证等场景。 handles: - data_key: fluid_in @@ -349,4 +355,4 @@ vacuum_pump.mock: required: - status type: object - version: 0.0.1 + version: 1.0.0 diff --git a/unilabos/registry/devices/virtual_device.yaml b/unilabos/registry/devices/virtual_device.yaml index 73a5901..572456a 100644 --- a/unilabos/registry/devices/virtual_device.yaml +++ b/unilabos/registry/devices/virtual_device.yaml @@ -1,4 +1,6 @@ virtual_centrifuge: + category: + - virtual_device class: action_value_mappings: auto-cleanup: @@ -222,6 +224,7 @@ virtual_centrifuge: target_temp: float time_remaining: float type: python + config_info: [] description: Virtual Centrifuge for CentrifugeProtocol Testing handles: - data_key: vessel @@ -282,8 +285,10 @@ virtual_centrifuge: - progress - message type: object - version: 0.0.1 + version: 1.0.0 virtual_column: + category: + - virtual_device class: action_value_mappings: auto-cleanup: @@ -609,6 +614,7 @@ virtual_column: progress: float status: str type: python + config_info: [] description: Virtual Column Chromatography Device for RunColumn Protocol Testing handles: - data_key: from_vessel @@ -674,8 +680,10 @@ virtual_column: - current_phase - final_volume type: object - version: 0.0.1 + version: 1.0.0 virtual_filter: + category: + - virtual_device class: action_value_mappings: auto-cleanup: @@ -1002,6 +1010,7 @@ virtual_filter: progress: float status: str type: python + config_info: [] description: Virtual Filter for FilterProtocol Testing handles: - data_key: vessel_in @@ -1069,8 +1078,10 @@ virtual_filter: - max_stir_speed - max_volume type: object - version: 0.0.1 + version: 1.0.0 virtual_gas_source: + category: + - virtual_device class: action_value_mappings: auto-cleanup: @@ -1261,6 +1272,7 @@ virtual_gas_source: status_types: status: str type: python + config_info: [] description: Virtual gas source handles: - data_key: fluid_out @@ -1288,8 +1300,10 @@ virtual_gas_source: required: - status type: object - version: 0.0.1 + version: 1.0.0 virtual_heatchill: + category: + - virtual_device class: action_value_mappings: auto-cleanup: @@ -1803,6 +1817,7 @@ virtual_heatchill: status: str stir_speed: float type: python + config_info: [] description: Virtual HeatChill for HeatChillProtocol Testing handles: - data_key: vessel @@ -1854,8 +1869,10 @@ virtual_heatchill: - min_temp - max_stir_speed type: object - version: 0.0.1 + version: 1.0.0 virtual_multiway_valve: + category: + - virtual_device class: action_value_mappings: auto-close: @@ -2155,6 +2172,7 @@ virtual_multiway_valve: valve_position: int valve_state: str type: python + config_info: [] description: Virtual 8-Way Valve for flow direction control handles: - data_key: fluid_in @@ -2275,8 +2293,10 @@ virtual_multiway_valve: - flow_path - info type: object - version: 0.0.1 + version: 1.0.0 virtual_pump: + category: + - virtual_device class: action_value_mappings: auto-clean_vessel: @@ -2741,6 +2761,7 @@ virtual_pump: transferred_volume: float valve_position: int type: python + config_info: [] description: Virtual Pump for PumpTransferProtocol Testing handles: - data_key: fluid_in @@ -2794,8 +2815,10 @@ virtual_pump: - transferred_volume - current_status type: object - version: 0.0.1 + version: 1.0.0 virtual_rotavap: + category: + - virtual_device class: action_value_mappings: auto-cleanup: @@ -3048,6 +3071,7 @@ virtual_rotavap: status: str vacuum_pressure: float type: python + config_info: [] description: Virtual Rotary Evaporator for EvaporateProtocol Testing handles: - data_key: vessel_in @@ -3121,8 +3145,10 @@ virtual_rotavap: - max_rotation_speed - remaining_time type: object - version: 0.0.1 + version: 1.0.0 virtual_separator: + category: + - virtual_device class: action_value_mappings: auto-cleanup: @@ -3938,6 +3964,7 @@ virtual_separator: stir_speed: float volume: float type: python + config_info: [] description: Virtual Separator for SeparateProtocol Testing handles: - data_key: from_vessel @@ -4013,8 +4040,10 @@ virtual_separator: - progress - message type: object - version: 0.0.1 + version: 1.0.0 virtual_solenoid_valve: + category: + - virtual_device class: action_value_mappings: auto-cleanup: @@ -4277,6 +4306,7 @@ virtual_solenoid_valve: valve_position: str valve_state: str type: python + config_info: [] description: Virtual Solenoid Valve for simple on/off flow control handles: - data_key: fluid_port_in @@ -4324,8 +4354,10 @@ virtual_solenoid_valve: - valve_position - state type: object - version: 0.0.1 + version: 1.0.0 virtual_solid_dispenser: + category: + - virtual_device class: action_value_mappings: add_solid: @@ -4656,6 +4688,7 @@ virtual_solid_dispenser: status: str total_operations: int type: python + config_info: [] description: Virtual Solid Dispenser for Add Protocol Testing - supports mass and molar additions handles: @@ -4704,8 +4737,10 @@ virtual_solid_dispenser: - total_operations - device_info type: object - version: 0.0.1 + version: 1.0.0 virtual_stirrer: + category: + - virtual_device class: action_value_mappings: auto-cleanup: @@ -5219,6 +5254,7 @@ virtual_stirrer: remaining_time: float status: str type: python + config_info: [] description: Virtual Stirrer for StirProtocol Testing handles: - data_key: vessel @@ -5270,8 +5306,10 @@ virtual_stirrer: - min_speed - device_info type: object - version: 0.0.1 + version: 1.0.0 virtual_transfer_pump: + category: + - virtual_device class: action_value_mappings: auto-aspirate: @@ -5728,6 +5766,7 @@ virtual_transfer_pump: status: str transfer_rate: float type: python + config_info: [] description: Virtual Transfer Pump for TransferProtocol Testing (Syringe-style) handles: - data_key: fluid_port @@ -5773,8 +5812,10 @@ virtual_transfer_pump: - remaining_capacity - pump_info type: object - version: 0.0.1 + version: 1.0.0 virtual_vacuum_pump: + category: + - virtual_device class: action_value_mappings: auto-cleanup: @@ -5965,6 +6006,7 @@ virtual_vacuum_pump: status_types: status: str type: python + config_info: [] description: Virtual vacuum pump handles: - data_key: fluid_in @@ -5992,4 +6034,4 @@ virtual_vacuum_pump: required: - status type: object - version: 0.0.1 + version: 1.0.0 diff --git a/unilabos/registry/devices/work_station.yaml b/unilabos/registry/devices/work_station.yaml index e9f33bb..7e861f5 100644 --- a/unilabos/registry/devices/work_station.yaml +++ b/unilabos/registry/devices/work_station.yaml @@ -1,4 +1,6 @@ workstation: + category: + - work_station class: action_value_mappings: AGVTransferProtocol: @@ -6033,6 +6035,7 @@ workstation: module: unilabos.ros.nodes.presets.protocol_node:ROS2ProtocolNode status_types: {} type: ros2 + config_info: [] description: Workstation handles: [] icon: '' @@ -6057,4 +6060,4 @@ workstation: properties: {} required: [] type: object - version: 0.0.1 + version: 1.0.0 diff --git a/unilabos/registry/devices/zhida_hplc.yaml b/unilabos/registry/devices/zhida_hplc.yaml index dc1e013..ade1c0f 100644 --- a/unilabos/registry/devices/zhida_hplc.yaml +++ b/unilabos/registry/devices/zhida_hplc.yaml @@ -1,4 +1,6 @@ zhida_hplc: + category: + - zhida_hplc class: action_value_mappings: abort: @@ -150,6 +152,7 @@ zhida_hplc: methods: dict status: dict type: python + config_info: [] description: 智达高效液相色谱(HPLC)分析设备,用于实验室样品的分离、检测和定量分析。该设备通过TCP socket与HPLC控制系统通信,支持远程控制和状态监控。具备自动进样、梯度洗脱、多检测器数据采集等功能,可执行复杂的色谱分析方法。适用于化学分析、药物检测、环境监测、生物样品分析等需要高精度分离分析的实验室应用场景。 handles: [] icon: '' @@ -177,4 +180,4 @@ zhida_hplc: - status - methods type: object - version: 0.0.1 + version: 1.0.0 diff --git a/unilabos/registry/registry.py b/unilabos/registry/registry.py index 36dd6b7..87793a0 100644 --- a/unilabos/registry/registry.py +++ b/unilabos/registry/registry.py @@ -12,7 +12,7 @@ import yaml from unilabos.ros.msgs.message_converter import msg_converter_manager, ros_action_to_json_schema, String from unilabos.utils import logger from unilabos.utils.decorator import singleton -from unilabos.utils.import_manager import get_enhanced_class_info +from unilabos.utils.import_manager import get_enhanced_class_info, get_class from unilabos.utils.type_check import NoAliasDumper DEFAULT_PATHS = [Path(__file__).absolute().parent] @@ -119,7 +119,7 @@ class Registry: }, }, }, - "version": "0.0.1", + "version": "1.0.0", "icon": "icon_device.webp", "registry_type": "device", "handles": [], @@ -153,14 +153,29 @@ class Registry: # 为每个资源添加文件路径信息 for resource_id, resource_info in data.items(): resource_info["file_path"] = str(file.absolute()).replace("\\", "/") - if "description" not in resource_info: - resource_info["description"] = "" + if "version" not in resource_info: + resource_info["version"] = "1.0.0" + if "category" not in resource_info: + resource_info["category"] = [file.stem] + elif file.stem not in resource_info["category"]: + resource_info["category"].append(file.stem) + if "config_info" not in resource_info: + resource_info["config_info"] = [] 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"] = {} + if complete_registry: + class_info = resource_info.get("class", {}) + if len(class_info) and "module" in class_info: + if class_info.get("type") == "pylabrobot": + res_class = get_class(class_info["module"]) + if callable(res_class) and not isinstance(res_class, type): # 有的是类,有的是函数,这里暂时只登记函数类的 + res_instance = res_class(res_class.__name__) + + print(res_instance) resource_info["registry_type"] = "resource" self.resource_type_registry.update(data) logger.debug( @@ -345,7 +360,7 @@ class Registry: } def load_device_types(self, path: os.PathLike, complete_registry: bool): - return + # return abs_path = Path(path).absolute() devices_path = abs_path / "devices" device_comms_path = abs_path / "device_comms" @@ -371,7 +386,13 @@ class Registry: for device_id, device_config in data.items(): # 添加文件路径信息 - 使用规范化的完整文件路径 if "version" not in device_config: - device_config["version"] = "0.0.1" + device_config["version"] = "1.0.0" + if "category" not in device_config: + device_config["category"] = [file.stem] + elif file.stem not in device_config["category"]: + device_config["category"].append(file.stem) + if "config_info" not in device_config: + device_config["config_info"] = [] if "description" not in device_config: device_config["description"] = "" if "icon" not in device_config: From 862f250e498c78d4a211f8f928fb3affb1ae8882 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Sat, 19 Jul 2025 01:31:33 +0800 Subject: [PATCH 84/96] update set tip rack --- unilabos/registry/devices/liquid_handler.yaml | 158 +++++++++++++++--- 1 file changed, 134 insertions(+), 24 deletions(-) diff --git a/unilabos/registry/devices/liquid_handler.yaml b/unilabos/registry/devices/liquid_handler.yaml index b8a92ea..513ee41 100644 --- a/unilabos/registry/devices/liquid_handler.yaml +++ b/unilabos/registry/devices/liquid_handler.yaml @@ -6120,30 +6120,6 @@ liquid_handler.prcxi: title: run_protocol参数 type: object type: UniLabJsonCommandAsync - auto-set_tiprack: - feedback: {} - goal: {} - goal_default: - tip_racks: null - handles: [] - result: {} - schema: - description: set_tiprack的参数schema - properties: - feedback: {} - goal: - properties: - tip_racks: - type: string - required: - - tip_racks - type: object - result: {} - required: - - goal - title: set_tiprack参数 - type: object - type: UniLabJsonCommand auto-touch_tip: feedback: {} goal: {} @@ -7361,6 +7337,140 @@ liquid_handler.prcxi: title: LiquidHandlerSetLiquid type: object type: LiquidHandlerSetLiquid + set_tiprack: + feedback: {} + goal: + tip_racks: tip_racks + goal_default: + tip_racks: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + handles: [] + placeholder_keys: + tip_racks: unilabos_devices + result: {} + schema: + description: '' + properties: + feedback: + properties: {} + required: [] + title: LiquidHandlerSetTipRack_Feedback + type: object + goal: + properties: + tip_racks: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + required: + - tip_racks + title: LiquidHandlerSetTipRack_Goal + type: object + result: + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerSetTipRack_Result + type: object + required: + - goal + title: LiquidHandlerSetTipRack + type: object + type: LiquidHandlerSetTipRack transfer: goal: aspiration_flow_rate: aspiration_flow_rate From ebe9e1b1f858c6dc835e053e91cf8e8c5ca64fd3 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Sat, 19 Jul 2025 01:54:53 +0800 Subject: [PATCH 85/96] =?UTF-8?q?yaml=20dump=E6=94=AF=E6=8C=81ordered=20di?= =?UTF-8?q?ct=EF=BC=8C=E6=94=AF=E6=8C=81config=5Finfo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- unilabos/registry/registry.py | 34 +- .../registry/resources/opentrons/deck.yaml | 15 +- .../resources/opentrons/plate_adapters.yaml | 40 +- .../registry/resources/opentrons/plates.yaml | 73075 +++++++++++++++- .../resources/opentrons/reservoirs.yaml | 1247 +- .../resources/opentrons/tip_racks.yaml | 61755 ++++++++++++- .../resources/opentrons/tube_racks.yaml | 16393 +++- .../registry/resources/organic/container.yaml | 55 +- unilabos/utils/type_check.py | 9 + 9 files changed, 152298 insertions(+), 325 deletions(-) diff --git a/unilabos/registry/registry.py b/unilabos/registry/registry.py index 87793a0..a7583e3 100644 --- a/unilabos/registry/registry.py +++ b/unilabos/registry/registry.py @@ -9,6 +9,7 @@ from typing import Any, Dict, List import yaml +from unilabos.resources.graphio import resource_plr_to_ulab, tree_to_list from unilabos.ros.msgs.message_converter import msg_converter_manager, ros_action_to_json_schema, String from unilabos.utils import logger from unilabos.utils.decorator import singleton @@ -65,7 +66,9 @@ class Registry: }, "feedback": {}, "result": {"success": "success"}, - "schema": ros_action_to_json_schema(self.ResourceCreateFromOuter, '用于创建或更新物料资源,每次传入多个物料信息。'), + "schema": ros_action_to_json_schema( + self.ResourceCreateFromOuter, "用于创建或更新物料资源,每次传入多个物料信息。" + ), "goal_default": yaml.safe_load( io.StringIO(get_yaml_from_goal_type(self.ResourceCreateFromOuter.Goal)) ), @@ -86,7 +89,9 @@ class Registry: }, "feedback": {}, "result": {"success": "success"}, - "schema": ros_action_to_json_schema(self.ResourceCreateFromOuterEasy, '用于创建或更新物料资源,每次传入一个物料信息。'), + "schema": ros_action_to_json_schema( + self.ResourceCreateFromOuterEasy, "用于创建或更新物料资源,每次传入一个物料信息。" + ), "goal_default": yaml.safe_load( io.StringIO(get_yaml_from_goal_type(self.ResourceCreateFromOuterEasy.Goal)) ), @@ -113,7 +118,9 @@ class Registry: "goal": {}, "feedback": {}, "result": {"latency_ms": "latency_ms", "time_diff_ms": "time_diff_ms"}, - "schema": ros_action_to_json_schema(self.EmptyIn, '用于测试延迟的动作,返回延迟时间和时间差。'), + "schema": ros_action_to_json_schema( + self.EmptyIn, "用于测试延迟的动作,返回延迟时间和时间差。" + ), "goal_default": {}, "handles": {}, }, @@ -149,6 +156,7 @@ class Registry: for i, file in enumerate(files): with open(file, encoding="utf-8", mode="r") as f: data = yaml.safe_load(io.StringIO(f.read())) + complete_data = {} if data: # 为每个资源添加文件路径信息 for resource_id, resource_info in data.items(): @@ -172,11 +180,21 @@ class Registry: if len(class_info) and "module" in class_info: if class_info.get("type") == "pylabrobot": res_class = get_class(class_info["module"]) - if callable(res_class) and not isinstance(res_class, type): # 有的是类,有的是函数,这里暂时只登记函数类的 + if callable(res_class) and not isinstance( + res_class, type + ): # 有的是类,有的是函数,这里暂时只登记函数类的 res_instance = res_class(res_class.__name__) - - print(res_instance) + res_ulr = tree_to_list([resource_plr_to_ulab(res_instance)]) + resource_info["config_info"] = res_ulr resource_info["registry_type"] = "resource" + complete_data[resource_id] = copy.deepcopy(dict(sorted(resource_info.items()))) # 稍后dump到文件 + + complete_data = dict(sorted(complete_data.items())) + complete_data = copy.deepcopy(complete_data) + if complete_registry: + with open(file, "w", encoding="utf-8") as f: + yaml.dump(complete_data, f, allow_unicode=True, default_flow_style=False, Dumper=NoAliasDumper) + self.resource_type_registry.update(data) logger.debug( f"[UniLab Registry] Resource-{current_resource_number} File-{i+1}/{len(files)} " @@ -462,7 +480,9 @@ class Registry: # 恢复原有的description信息(auto开头的不修改) for action_name, description in old_descriptions.items(): if action_name in device_config["class"]["action_value_mappings"]: # 有一些会被删除 - device_config["class"]["action_value_mappings"][action_name]["schema"]["description"] = description + device_config["class"]["action_value_mappings"][action_name]["schema"][ + "description" + ] = description device_config["init_param_schema"] = {} device_config["init_param_schema"]["config"] = self._generate_unilab_json_command_schema( enhanced_info["init_params"], "__init__" diff --git a/unilabos/registry/resources/opentrons/deck.yaml b/unilabos/registry/resources/opentrons/deck.yaml index 652240a..961b6e6 100644 --- a/unilabos/registry/resources/opentrons/deck.yaml +++ b/unilabos/registry/resources/opentrons/deck.yaml @@ -1,8 +1,17 @@ OTDeck: - description: Opentrons deck - class: + category: + - deck + class: module: pylabrobot.resources.opentrons.deck:OTDeck type: pylabrobot + config_info: [] + description: Opentrons deck + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/deck.yaml + handles: [] + icon: '' + init_param_schema: {} model: + mesh: opentrons_liquid_handler type: device - mesh: opentrons_liquid_handler \ No newline at end of file + registry_type: resource + version: 1.0.0 diff --git a/unilabos/registry/resources/opentrons/plate_adapters.yaml b/unilabos/registry/resources/opentrons/plate_adapters.yaml index e9c0d5a..806e5b3 100644 --- a/unilabos/registry/resources/opentrons/plate_adapters.yaml +++ b/unilabos/registry/resources/opentrons/plate_adapters.yaml @@ -1,5 +1,39 @@ Opentrons_96_adapter_Vb: - description: Opentrons 96 adapter Vb - class: + category: + - plate_adapters + class: module: pylabrobot.resources.opentrons.plate_adapters:Opentrons_96_adapter_Vb - type: pylabrobot \ No newline at end of file + type: pylabrobot + config_info: + - children: [] + class: '' + config: + barcode: null + category: plate_adapter + model: Opentrons_96_adapter_Vb + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.76 + size_y: 85.48 + size_z: 18.55 + type: PlateAdapter + data: {} + id: Opentrons_96_adapter_Vb + name: Opentrons_96_adapter_Vb + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: container + description: Opentrons 96 adapter Vb + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/plate_adapters.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 diff --git a/unilabos/registry/resources/opentrons/plates.yaml b/unilabos/registry/resources/opentrons/plates.yaml index 3783bc3..cc6d085 100644 --- a/unilabos/registry/resources/opentrons/plates.yaml +++ b/unilabos/registry/resources/opentrons/plates.yaml @@ -1,99 +1,72988 @@ -corning_6_wellplate_16point8ml_flat: - description: Corning 6 wellplate 16.8ml flat - class: - module: pylabrobot.resources.opentrons.plates:corning_6_wellplate_16point8ml_flat - type: pylabrobot - -corning_12_wellplate_6point9ml_flat: - description: Corning 12 wellplate 6.9ml flat - class: - module: pylabrobot.resources.opentrons.plates:corning_12_wellplate_6point9ml_flat - type: pylabrobot - -corning_24_wellplate_3point4ml_flat: - description: Corning 24 wellplate 3.4ml flat - class: - module: pylabrobot.resources.opentrons.plates:corning_24_wellplate_3point4ml_flat - type: pylabrobot - -corning_48_wellplate_1point6ml_flat: - description: Corning 48 wellplate 1.6ml flat - class: - module: pylabrobot.resources.opentrons.plates:corning_48_wellplate_1point6ml_flat - type: pylabrobot - -corning_96_wellplate_360ul_flat: - description: Corning 96 wellplate 360ul flat - class: - module: pylabrobot.resources.opentrons.plates:corning_96_wellplate_360ul_flat - type: pylabrobot - -corning_384_wellplate_112ul_flat: - description: Corning 384 wellplate 112ul flat - class: - module: pylabrobot.resources.opentrons.plates:corning_384_wellplate_112ul_flat - type: pylabrobot - -nest_96_wellplate_2ml_deep: - description: Nest 96 wellplate 2ml deep - class: - module: pylabrobot.resources.opentrons.plates:nest_96_wellplate_2ml_deep - type: pylabrobot - model: - type: resource - mesh: tecan_nested_tip_rack/meshes/plate.stl - mesh_tf: [0.064, 0.043, 0, -1.5708, 0, 1.5708] - -nest_96_wellplate_200ul_flat: - description: Nest 96 wellplate 200ul flat - class: - module: pylabrobot.resources.opentrons.plates:nest_96_wellplate_200ul_flat - type: pylabrobot - -nest_96_wellplate_100ul_pcr_full_skirt: - description: Nest 96 wellplate 100ul pcr full skirt - class: - module: pylabrobot.resources.opentrons.plates:nest_96_wellplate_100ul_pcr_full_skirt - type: pylabrobot - model: - type: resource - mesh: tecan_nested_tip_rack/meshes/plate.stl - mesh_tf: [0.064, 0.043, 0, -1.5708, 0, 1.5708] - children_mesh: generic_labware_tube_10_75/meshes/0_base.stl - children_mesh_tf: [0.0018, 0.0018, 0, -1.5708,0, 0] - appliedbiosystemsmicroamp_384_wellplate_40ul: - description: Applied Biosystems microamp 384 wellplate 40ul - class: + category: + - plates + class: module: pylabrobot.resources.opentrons.plates:appliedbiosystemsmicroamp_384_wellplate_40ul type: pylabrobot - -thermoscientificnunc_96_wellplate_1300ul: - description: Thermoscientific Nunc 96 wellplate 1300ul - class: - module: pylabrobot.resources.opentrons.plates:thermoscientificnunc_96_wellplate_1300ul - type: pylabrobot - -thermoscientificnunc_96_wellplate_2000ul: - description: Thermoscientific Nunc 96 wellplate 2000ul - class: - module: pylabrobot.resources.opentrons.plates:thermoscientificnunc_96_wellplate_2000ul - type: pylabrobot - -usascientific_96_wellplate_2point4ml_deep: - description: USAScientific 96 wellplate 2.4ml deep - class: - module: pylabrobot.resources.opentrons.plates:usascientific_96_wellplate_2point4ml_deep - type: pylabrobot - -biorad_96_wellplate_200ul_pcr: - description: BioRad 96 wellplate 200ul pcr - class: - module: pylabrobot.resources.opentrons.plates:biorad_96_wellplate_200ul_pcr - type: pylabrobot - + config_info: + - children: + - appliedbiosystemsmicroamp_384_wellplate_40ul_A1 + - appliedbiosystemsmicroamp_384_wellplate_40ul_B1 + - appliedbiosystemsmicroamp_384_wellplate_40ul_C1 + - appliedbiosystemsmicroamp_384_wellplate_40ul_D1 + - appliedbiosystemsmicroamp_384_wellplate_40ul_E1 + - appliedbiosystemsmicroamp_384_wellplate_40ul_F1 + - appliedbiosystemsmicroamp_384_wellplate_40ul_G1 + - appliedbiosystemsmicroamp_384_wellplate_40ul_H1 + - appliedbiosystemsmicroamp_384_wellplate_40ul_I1 + - appliedbiosystemsmicroamp_384_wellplate_40ul_J1 + - appliedbiosystemsmicroamp_384_wellplate_40ul_K1 + - appliedbiosystemsmicroamp_384_wellplate_40ul_L1 + - appliedbiosystemsmicroamp_384_wellplate_40ul_M1 + - appliedbiosystemsmicroamp_384_wellplate_40ul_N1 + - appliedbiosystemsmicroamp_384_wellplate_40ul_O1 + - appliedbiosystemsmicroamp_384_wellplate_40ul_P1 + - appliedbiosystemsmicroamp_384_wellplate_40ul_A2 + - appliedbiosystemsmicroamp_384_wellplate_40ul_B2 + - appliedbiosystemsmicroamp_384_wellplate_40ul_C2 + - appliedbiosystemsmicroamp_384_wellplate_40ul_D2 + - appliedbiosystemsmicroamp_384_wellplate_40ul_E2 + - appliedbiosystemsmicroamp_384_wellplate_40ul_F2 + - appliedbiosystemsmicroamp_384_wellplate_40ul_G2 + - appliedbiosystemsmicroamp_384_wellplate_40ul_H2 + - appliedbiosystemsmicroamp_384_wellplate_40ul_I2 + - appliedbiosystemsmicroamp_384_wellplate_40ul_J2 + - appliedbiosystemsmicroamp_384_wellplate_40ul_K2 + - appliedbiosystemsmicroamp_384_wellplate_40ul_L2 + - appliedbiosystemsmicroamp_384_wellplate_40ul_M2 + - appliedbiosystemsmicroamp_384_wellplate_40ul_N2 + - appliedbiosystemsmicroamp_384_wellplate_40ul_O2 + - appliedbiosystemsmicroamp_384_wellplate_40ul_P2 + - appliedbiosystemsmicroamp_384_wellplate_40ul_A3 + - appliedbiosystemsmicroamp_384_wellplate_40ul_B3 + - appliedbiosystemsmicroamp_384_wellplate_40ul_C3 + - appliedbiosystemsmicroamp_384_wellplate_40ul_D3 + - appliedbiosystemsmicroamp_384_wellplate_40ul_E3 + - appliedbiosystemsmicroamp_384_wellplate_40ul_F3 + - appliedbiosystemsmicroamp_384_wellplate_40ul_G3 + - appliedbiosystemsmicroamp_384_wellplate_40ul_H3 + - appliedbiosystemsmicroamp_384_wellplate_40ul_I3 + - appliedbiosystemsmicroamp_384_wellplate_40ul_J3 + - appliedbiosystemsmicroamp_384_wellplate_40ul_K3 + - appliedbiosystemsmicroamp_384_wellplate_40ul_L3 + - appliedbiosystemsmicroamp_384_wellplate_40ul_M3 + - appliedbiosystemsmicroamp_384_wellplate_40ul_N3 + - appliedbiosystemsmicroamp_384_wellplate_40ul_O3 + - appliedbiosystemsmicroamp_384_wellplate_40ul_P3 + - appliedbiosystemsmicroamp_384_wellplate_40ul_A4 + - appliedbiosystemsmicroamp_384_wellplate_40ul_B4 + - appliedbiosystemsmicroamp_384_wellplate_40ul_C4 + - appliedbiosystemsmicroamp_384_wellplate_40ul_D4 + - appliedbiosystemsmicroamp_384_wellplate_40ul_E4 + - appliedbiosystemsmicroamp_384_wellplate_40ul_F4 + - appliedbiosystemsmicroamp_384_wellplate_40ul_G4 + - appliedbiosystemsmicroamp_384_wellplate_40ul_H4 + - appliedbiosystemsmicroamp_384_wellplate_40ul_I4 + - appliedbiosystemsmicroamp_384_wellplate_40ul_J4 + - appliedbiosystemsmicroamp_384_wellplate_40ul_K4 + - appliedbiosystemsmicroamp_384_wellplate_40ul_L4 + - appliedbiosystemsmicroamp_384_wellplate_40ul_M4 + - appliedbiosystemsmicroamp_384_wellplate_40ul_N4 + - appliedbiosystemsmicroamp_384_wellplate_40ul_O4 + - appliedbiosystemsmicroamp_384_wellplate_40ul_P4 + - appliedbiosystemsmicroamp_384_wellplate_40ul_A5 + - appliedbiosystemsmicroamp_384_wellplate_40ul_B5 + - appliedbiosystemsmicroamp_384_wellplate_40ul_C5 + - appliedbiosystemsmicroamp_384_wellplate_40ul_D5 + - appliedbiosystemsmicroamp_384_wellplate_40ul_E5 + - appliedbiosystemsmicroamp_384_wellplate_40ul_F5 + - appliedbiosystemsmicroamp_384_wellplate_40ul_G5 + - appliedbiosystemsmicroamp_384_wellplate_40ul_H5 + - appliedbiosystemsmicroamp_384_wellplate_40ul_I5 + - appliedbiosystemsmicroamp_384_wellplate_40ul_J5 + - appliedbiosystemsmicroamp_384_wellplate_40ul_K5 + - appliedbiosystemsmicroamp_384_wellplate_40ul_L5 + - appliedbiosystemsmicroamp_384_wellplate_40ul_M5 + - appliedbiosystemsmicroamp_384_wellplate_40ul_N5 + - appliedbiosystemsmicroamp_384_wellplate_40ul_O5 + - appliedbiosystemsmicroamp_384_wellplate_40ul_P5 + - appliedbiosystemsmicroamp_384_wellplate_40ul_A6 + - appliedbiosystemsmicroamp_384_wellplate_40ul_B6 + - appliedbiosystemsmicroamp_384_wellplate_40ul_C6 + - appliedbiosystemsmicroamp_384_wellplate_40ul_D6 + - appliedbiosystemsmicroamp_384_wellplate_40ul_E6 + - appliedbiosystemsmicroamp_384_wellplate_40ul_F6 + - appliedbiosystemsmicroamp_384_wellplate_40ul_G6 + - appliedbiosystemsmicroamp_384_wellplate_40ul_H6 + - appliedbiosystemsmicroamp_384_wellplate_40ul_I6 + - appliedbiosystemsmicroamp_384_wellplate_40ul_J6 + - appliedbiosystemsmicroamp_384_wellplate_40ul_K6 + - appliedbiosystemsmicroamp_384_wellplate_40ul_L6 + - appliedbiosystemsmicroamp_384_wellplate_40ul_M6 + - appliedbiosystemsmicroamp_384_wellplate_40ul_N6 + - appliedbiosystemsmicroamp_384_wellplate_40ul_O6 + - appliedbiosystemsmicroamp_384_wellplate_40ul_P6 + - appliedbiosystemsmicroamp_384_wellplate_40ul_A7 + - appliedbiosystemsmicroamp_384_wellplate_40ul_B7 + - appliedbiosystemsmicroamp_384_wellplate_40ul_C7 + - appliedbiosystemsmicroamp_384_wellplate_40ul_D7 + - appliedbiosystemsmicroamp_384_wellplate_40ul_E7 + - appliedbiosystemsmicroamp_384_wellplate_40ul_F7 + - appliedbiosystemsmicroamp_384_wellplate_40ul_G7 + - appliedbiosystemsmicroamp_384_wellplate_40ul_H7 + - appliedbiosystemsmicroamp_384_wellplate_40ul_I7 + - appliedbiosystemsmicroamp_384_wellplate_40ul_J7 + - appliedbiosystemsmicroamp_384_wellplate_40ul_K7 + - appliedbiosystemsmicroamp_384_wellplate_40ul_L7 + - appliedbiosystemsmicroamp_384_wellplate_40ul_M7 + - appliedbiosystemsmicroamp_384_wellplate_40ul_N7 + - appliedbiosystemsmicroamp_384_wellplate_40ul_O7 + - appliedbiosystemsmicroamp_384_wellplate_40ul_P7 + - appliedbiosystemsmicroamp_384_wellplate_40ul_A8 + - appliedbiosystemsmicroamp_384_wellplate_40ul_B8 + - appliedbiosystemsmicroamp_384_wellplate_40ul_C8 + - appliedbiosystemsmicroamp_384_wellplate_40ul_D8 + - appliedbiosystemsmicroamp_384_wellplate_40ul_E8 + - appliedbiosystemsmicroamp_384_wellplate_40ul_F8 + - appliedbiosystemsmicroamp_384_wellplate_40ul_G8 + - appliedbiosystemsmicroamp_384_wellplate_40ul_H8 + - appliedbiosystemsmicroamp_384_wellplate_40ul_I8 + - appliedbiosystemsmicroamp_384_wellplate_40ul_J8 + - appliedbiosystemsmicroamp_384_wellplate_40ul_K8 + - appliedbiosystemsmicroamp_384_wellplate_40ul_L8 + - appliedbiosystemsmicroamp_384_wellplate_40ul_M8 + - appliedbiosystemsmicroamp_384_wellplate_40ul_N8 + - appliedbiosystemsmicroamp_384_wellplate_40ul_O8 + - appliedbiosystemsmicroamp_384_wellplate_40ul_P8 + - appliedbiosystemsmicroamp_384_wellplate_40ul_A9 + - appliedbiosystemsmicroamp_384_wellplate_40ul_B9 + - appliedbiosystemsmicroamp_384_wellplate_40ul_C9 + - appliedbiosystemsmicroamp_384_wellplate_40ul_D9 + - appliedbiosystemsmicroamp_384_wellplate_40ul_E9 + - appliedbiosystemsmicroamp_384_wellplate_40ul_F9 + - appliedbiosystemsmicroamp_384_wellplate_40ul_G9 + - appliedbiosystemsmicroamp_384_wellplate_40ul_H9 + - appliedbiosystemsmicroamp_384_wellplate_40ul_I9 + - appliedbiosystemsmicroamp_384_wellplate_40ul_J9 + - appliedbiosystemsmicroamp_384_wellplate_40ul_K9 + - appliedbiosystemsmicroamp_384_wellplate_40ul_L9 + - appliedbiosystemsmicroamp_384_wellplate_40ul_M9 + - appliedbiosystemsmicroamp_384_wellplate_40ul_N9 + - appliedbiosystemsmicroamp_384_wellplate_40ul_O9 + - appliedbiosystemsmicroamp_384_wellplate_40ul_P9 + - appliedbiosystemsmicroamp_384_wellplate_40ul_A10 + - appliedbiosystemsmicroamp_384_wellplate_40ul_B10 + - appliedbiosystemsmicroamp_384_wellplate_40ul_C10 + - appliedbiosystemsmicroamp_384_wellplate_40ul_D10 + - appliedbiosystemsmicroamp_384_wellplate_40ul_E10 + - appliedbiosystemsmicroamp_384_wellplate_40ul_F10 + - appliedbiosystemsmicroamp_384_wellplate_40ul_G10 + - appliedbiosystemsmicroamp_384_wellplate_40ul_H10 + - appliedbiosystemsmicroamp_384_wellplate_40ul_I10 + - appliedbiosystemsmicroamp_384_wellplate_40ul_J10 + - appliedbiosystemsmicroamp_384_wellplate_40ul_K10 + - appliedbiosystemsmicroamp_384_wellplate_40ul_L10 + - appliedbiosystemsmicroamp_384_wellplate_40ul_M10 + - appliedbiosystemsmicroamp_384_wellplate_40ul_N10 + - appliedbiosystemsmicroamp_384_wellplate_40ul_O10 + - appliedbiosystemsmicroamp_384_wellplate_40ul_P10 + - appliedbiosystemsmicroamp_384_wellplate_40ul_A11 + - appliedbiosystemsmicroamp_384_wellplate_40ul_B11 + - appliedbiosystemsmicroamp_384_wellplate_40ul_C11 + - appliedbiosystemsmicroamp_384_wellplate_40ul_D11 + - appliedbiosystemsmicroamp_384_wellplate_40ul_E11 + - appliedbiosystemsmicroamp_384_wellplate_40ul_F11 + - appliedbiosystemsmicroamp_384_wellplate_40ul_G11 + - appliedbiosystemsmicroamp_384_wellplate_40ul_H11 + - appliedbiosystemsmicroamp_384_wellplate_40ul_I11 + - appliedbiosystemsmicroamp_384_wellplate_40ul_J11 + - appliedbiosystemsmicroamp_384_wellplate_40ul_K11 + - appliedbiosystemsmicroamp_384_wellplate_40ul_L11 + - appliedbiosystemsmicroamp_384_wellplate_40ul_M11 + - appliedbiosystemsmicroamp_384_wellplate_40ul_N11 + - appliedbiosystemsmicroamp_384_wellplate_40ul_O11 + - appliedbiosystemsmicroamp_384_wellplate_40ul_P11 + - appliedbiosystemsmicroamp_384_wellplate_40ul_A12 + - appliedbiosystemsmicroamp_384_wellplate_40ul_B12 + - appliedbiosystemsmicroamp_384_wellplate_40ul_C12 + - appliedbiosystemsmicroamp_384_wellplate_40ul_D12 + - appliedbiosystemsmicroamp_384_wellplate_40ul_E12 + - appliedbiosystemsmicroamp_384_wellplate_40ul_F12 + - appliedbiosystemsmicroamp_384_wellplate_40ul_G12 + - appliedbiosystemsmicroamp_384_wellplate_40ul_H12 + - appliedbiosystemsmicroamp_384_wellplate_40ul_I12 + - appliedbiosystemsmicroamp_384_wellplate_40ul_J12 + - appliedbiosystemsmicroamp_384_wellplate_40ul_K12 + - appliedbiosystemsmicroamp_384_wellplate_40ul_L12 + - appliedbiosystemsmicroamp_384_wellplate_40ul_M12 + - appliedbiosystemsmicroamp_384_wellplate_40ul_N12 + - appliedbiosystemsmicroamp_384_wellplate_40ul_O12 + - appliedbiosystemsmicroamp_384_wellplate_40ul_P12 + - appliedbiosystemsmicroamp_384_wellplate_40ul_A13 + - appliedbiosystemsmicroamp_384_wellplate_40ul_B13 + - appliedbiosystemsmicroamp_384_wellplate_40ul_C13 + - appliedbiosystemsmicroamp_384_wellplate_40ul_D13 + - appliedbiosystemsmicroamp_384_wellplate_40ul_E13 + - appliedbiosystemsmicroamp_384_wellplate_40ul_F13 + - appliedbiosystemsmicroamp_384_wellplate_40ul_G13 + - appliedbiosystemsmicroamp_384_wellplate_40ul_H13 + - appliedbiosystemsmicroamp_384_wellplate_40ul_I13 + - appliedbiosystemsmicroamp_384_wellplate_40ul_J13 + - appliedbiosystemsmicroamp_384_wellplate_40ul_K13 + - appliedbiosystemsmicroamp_384_wellplate_40ul_L13 + - appliedbiosystemsmicroamp_384_wellplate_40ul_M13 + - appliedbiosystemsmicroamp_384_wellplate_40ul_N13 + - appliedbiosystemsmicroamp_384_wellplate_40ul_O13 + - appliedbiosystemsmicroamp_384_wellplate_40ul_P13 + - appliedbiosystemsmicroamp_384_wellplate_40ul_A14 + - appliedbiosystemsmicroamp_384_wellplate_40ul_B14 + - appliedbiosystemsmicroamp_384_wellplate_40ul_C14 + - appliedbiosystemsmicroamp_384_wellplate_40ul_D14 + - appliedbiosystemsmicroamp_384_wellplate_40ul_E14 + - appliedbiosystemsmicroamp_384_wellplate_40ul_F14 + - appliedbiosystemsmicroamp_384_wellplate_40ul_G14 + - appliedbiosystemsmicroamp_384_wellplate_40ul_H14 + - appliedbiosystemsmicroamp_384_wellplate_40ul_I14 + - appliedbiosystemsmicroamp_384_wellplate_40ul_J14 + - appliedbiosystemsmicroamp_384_wellplate_40ul_K14 + - appliedbiosystemsmicroamp_384_wellplate_40ul_L14 + - appliedbiosystemsmicroamp_384_wellplate_40ul_M14 + - appliedbiosystemsmicroamp_384_wellplate_40ul_N14 + - appliedbiosystemsmicroamp_384_wellplate_40ul_O14 + - appliedbiosystemsmicroamp_384_wellplate_40ul_P14 + - appliedbiosystemsmicroamp_384_wellplate_40ul_A15 + - appliedbiosystemsmicroamp_384_wellplate_40ul_B15 + - appliedbiosystemsmicroamp_384_wellplate_40ul_C15 + - appliedbiosystemsmicroamp_384_wellplate_40ul_D15 + - appliedbiosystemsmicroamp_384_wellplate_40ul_E15 + - appliedbiosystemsmicroamp_384_wellplate_40ul_F15 + - appliedbiosystemsmicroamp_384_wellplate_40ul_G15 + - appliedbiosystemsmicroamp_384_wellplate_40ul_H15 + - appliedbiosystemsmicroamp_384_wellplate_40ul_I15 + - appliedbiosystemsmicroamp_384_wellplate_40ul_J15 + - appliedbiosystemsmicroamp_384_wellplate_40ul_K15 + - appliedbiosystemsmicroamp_384_wellplate_40ul_L15 + - appliedbiosystemsmicroamp_384_wellplate_40ul_M15 + - appliedbiosystemsmicroamp_384_wellplate_40ul_N15 + - appliedbiosystemsmicroamp_384_wellplate_40ul_O15 + - appliedbiosystemsmicroamp_384_wellplate_40ul_P15 + - appliedbiosystemsmicroamp_384_wellplate_40ul_A16 + - appliedbiosystemsmicroamp_384_wellplate_40ul_B16 + - appliedbiosystemsmicroamp_384_wellplate_40ul_C16 + - appliedbiosystemsmicroamp_384_wellplate_40ul_D16 + - appliedbiosystemsmicroamp_384_wellplate_40ul_E16 + - appliedbiosystemsmicroamp_384_wellplate_40ul_F16 + - appliedbiosystemsmicroamp_384_wellplate_40ul_G16 + - appliedbiosystemsmicroamp_384_wellplate_40ul_H16 + - appliedbiosystemsmicroamp_384_wellplate_40ul_I16 + - appliedbiosystemsmicroamp_384_wellplate_40ul_J16 + - appliedbiosystemsmicroamp_384_wellplate_40ul_K16 + - appliedbiosystemsmicroamp_384_wellplate_40ul_L16 + - appliedbiosystemsmicroamp_384_wellplate_40ul_M16 + - appliedbiosystemsmicroamp_384_wellplate_40ul_N16 + - appliedbiosystemsmicroamp_384_wellplate_40ul_O16 + - appliedbiosystemsmicroamp_384_wellplate_40ul_P16 + - appliedbiosystemsmicroamp_384_wellplate_40ul_A17 + - appliedbiosystemsmicroamp_384_wellplate_40ul_B17 + - appliedbiosystemsmicroamp_384_wellplate_40ul_C17 + - appliedbiosystemsmicroamp_384_wellplate_40ul_D17 + - appliedbiosystemsmicroamp_384_wellplate_40ul_E17 + - appliedbiosystemsmicroamp_384_wellplate_40ul_F17 + - appliedbiosystemsmicroamp_384_wellplate_40ul_G17 + - appliedbiosystemsmicroamp_384_wellplate_40ul_H17 + - appliedbiosystemsmicroamp_384_wellplate_40ul_I17 + - appliedbiosystemsmicroamp_384_wellplate_40ul_J17 + - appliedbiosystemsmicroamp_384_wellplate_40ul_K17 + - appliedbiosystemsmicroamp_384_wellplate_40ul_L17 + - appliedbiosystemsmicroamp_384_wellplate_40ul_M17 + - appliedbiosystemsmicroamp_384_wellplate_40ul_N17 + - appliedbiosystemsmicroamp_384_wellplate_40ul_O17 + - appliedbiosystemsmicroamp_384_wellplate_40ul_P17 + - appliedbiosystemsmicroamp_384_wellplate_40ul_A18 + - appliedbiosystemsmicroamp_384_wellplate_40ul_B18 + - appliedbiosystemsmicroamp_384_wellplate_40ul_C18 + - appliedbiosystemsmicroamp_384_wellplate_40ul_D18 + - appliedbiosystemsmicroamp_384_wellplate_40ul_E18 + - appliedbiosystemsmicroamp_384_wellplate_40ul_F18 + - appliedbiosystemsmicroamp_384_wellplate_40ul_G18 + - appliedbiosystemsmicroamp_384_wellplate_40ul_H18 + - appliedbiosystemsmicroamp_384_wellplate_40ul_I18 + - appliedbiosystemsmicroamp_384_wellplate_40ul_J18 + - appliedbiosystemsmicroamp_384_wellplate_40ul_K18 + - appliedbiosystemsmicroamp_384_wellplate_40ul_L18 + - appliedbiosystemsmicroamp_384_wellplate_40ul_M18 + - appliedbiosystemsmicroamp_384_wellplate_40ul_N18 + - appliedbiosystemsmicroamp_384_wellplate_40ul_O18 + - appliedbiosystemsmicroamp_384_wellplate_40ul_P18 + - appliedbiosystemsmicroamp_384_wellplate_40ul_A19 + - appliedbiosystemsmicroamp_384_wellplate_40ul_B19 + - appliedbiosystemsmicroamp_384_wellplate_40ul_C19 + - appliedbiosystemsmicroamp_384_wellplate_40ul_D19 + - appliedbiosystemsmicroamp_384_wellplate_40ul_E19 + - appliedbiosystemsmicroamp_384_wellplate_40ul_F19 + - appliedbiosystemsmicroamp_384_wellplate_40ul_G19 + - appliedbiosystemsmicroamp_384_wellplate_40ul_H19 + - appliedbiosystemsmicroamp_384_wellplate_40ul_I19 + - appliedbiosystemsmicroamp_384_wellplate_40ul_J19 + - appliedbiosystemsmicroamp_384_wellplate_40ul_K19 + - appliedbiosystemsmicroamp_384_wellplate_40ul_L19 + - appliedbiosystemsmicroamp_384_wellplate_40ul_M19 + - appliedbiosystemsmicroamp_384_wellplate_40ul_N19 + - appliedbiosystemsmicroamp_384_wellplate_40ul_O19 + - appliedbiosystemsmicroamp_384_wellplate_40ul_P19 + - appliedbiosystemsmicroamp_384_wellplate_40ul_A20 + - appliedbiosystemsmicroamp_384_wellplate_40ul_B20 + - appliedbiosystemsmicroamp_384_wellplate_40ul_C20 + - appliedbiosystemsmicroamp_384_wellplate_40ul_D20 + - appliedbiosystemsmicroamp_384_wellplate_40ul_E20 + - appliedbiosystemsmicroamp_384_wellplate_40ul_F20 + - appliedbiosystemsmicroamp_384_wellplate_40ul_G20 + - appliedbiosystemsmicroamp_384_wellplate_40ul_H20 + - appliedbiosystemsmicroamp_384_wellplate_40ul_I20 + - appliedbiosystemsmicroamp_384_wellplate_40ul_J20 + - appliedbiosystemsmicroamp_384_wellplate_40ul_K20 + - appliedbiosystemsmicroamp_384_wellplate_40ul_L20 + - appliedbiosystemsmicroamp_384_wellplate_40ul_M20 + - appliedbiosystemsmicroamp_384_wellplate_40ul_N20 + - appliedbiosystemsmicroamp_384_wellplate_40ul_O20 + - appliedbiosystemsmicroamp_384_wellplate_40ul_P20 + - appliedbiosystemsmicroamp_384_wellplate_40ul_A21 + - appliedbiosystemsmicroamp_384_wellplate_40ul_B21 + - appliedbiosystemsmicroamp_384_wellplate_40ul_C21 + - appliedbiosystemsmicroamp_384_wellplate_40ul_D21 + - appliedbiosystemsmicroamp_384_wellplate_40ul_E21 + - appliedbiosystemsmicroamp_384_wellplate_40ul_F21 + - appliedbiosystemsmicroamp_384_wellplate_40ul_G21 + - appliedbiosystemsmicroamp_384_wellplate_40ul_H21 + - appliedbiosystemsmicroamp_384_wellplate_40ul_I21 + - appliedbiosystemsmicroamp_384_wellplate_40ul_J21 + - appliedbiosystemsmicroamp_384_wellplate_40ul_K21 + - appliedbiosystemsmicroamp_384_wellplate_40ul_L21 + - appliedbiosystemsmicroamp_384_wellplate_40ul_M21 + - appliedbiosystemsmicroamp_384_wellplate_40ul_N21 + - appliedbiosystemsmicroamp_384_wellplate_40ul_O21 + - appliedbiosystemsmicroamp_384_wellplate_40ul_P21 + - appliedbiosystemsmicroamp_384_wellplate_40ul_A22 + - appliedbiosystemsmicroamp_384_wellplate_40ul_B22 + - appliedbiosystemsmicroamp_384_wellplate_40ul_C22 + - appliedbiosystemsmicroamp_384_wellplate_40ul_D22 + - appliedbiosystemsmicroamp_384_wellplate_40ul_E22 + - appliedbiosystemsmicroamp_384_wellplate_40ul_F22 + - appliedbiosystemsmicroamp_384_wellplate_40ul_G22 + - appliedbiosystemsmicroamp_384_wellplate_40ul_H22 + - appliedbiosystemsmicroamp_384_wellplate_40ul_I22 + - appliedbiosystemsmicroamp_384_wellplate_40ul_J22 + - appliedbiosystemsmicroamp_384_wellplate_40ul_K22 + - appliedbiosystemsmicroamp_384_wellplate_40ul_L22 + - appliedbiosystemsmicroamp_384_wellplate_40ul_M22 + - appliedbiosystemsmicroamp_384_wellplate_40ul_N22 + - appliedbiosystemsmicroamp_384_wellplate_40ul_O22 + - appliedbiosystemsmicroamp_384_wellplate_40ul_P22 + - appliedbiosystemsmicroamp_384_wellplate_40ul_A23 + - appliedbiosystemsmicroamp_384_wellplate_40ul_B23 + - appliedbiosystemsmicroamp_384_wellplate_40ul_C23 + - appliedbiosystemsmicroamp_384_wellplate_40ul_D23 + - appliedbiosystemsmicroamp_384_wellplate_40ul_E23 + - appliedbiosystemsmicroamp_384_wellplate_40ul_F23 + - appliedbiosystemsmicroamp_384_wellplate_40ul_G23 + - appliedbiosystemsmicroamp_384_wellplate_40ul_H23 + - appliedbiosystemsmicroamp_384_wellplate_40ul_I23 + - appliedbiosystemsmicroamp_384_wellplate_40ul_J23 + - appliedbiosystemsmicroamp_384_wellplate_40ul_K23 + - appliedbiosystemsmicroamp_384_wellplate_40ul_L23 + - appliedbiosystemsmicroamp_384_wellplate_40ul_M23 + - appliedbiosystemsmicroamp_384_wellplate_40ul_N23 + - appliedbiosystemsmicroamp_384_wellplate_40ul_O23 + - appliedbiosystemsmicroamp_384_wellplate_40ul_P23 + - appliedbiosystemsmicroamp_384_wellplate_40ul_A24 + - appliedbiosystemsmicroamp_384_wellplate_40ul_B24 + - appliedbiosystemsmicroamp_384_wellplate_40ul_C24 + - appliedbiosystemsmicroamp_384_wellplate_40ul_D24 + - appliedbiosystemsmicroamp_384_wellplate_40ul_E24 + - appliedbiosystemsmicroamp_384_wellplate_40ul_F24 + - appliedbiosystemsmicroamp_384_wellplate_40ul_G24 + - appliedbiosystemsmicroamp_384_wellplate_40ul_H24 + - appliedbiosystemsmicroamp_384_wellplate_40ul_I24 + - appliedbiosystemsmicroamp_384_wellplate_40ul_J24 + - appliedbiosystemsmicroamp_384_wellplate_40ul_K24 + - appliedbiosystemsmicroamp_384_wellplate_40ul_L24 + - appliedbiosystemsmicroamp_384_wellplate_40ul_M24 + - appliedbiosystemsmicroamp_384_wellplate_40ul_N24 + - appliedbiosystemsmicroamp_384_wellplate_40ul_O24 + - appliedbiosystemsmicroamp_384_wellplate_40ul_P24 + class: '' + config: + barcode: null + category: plate + model: Applied Biosystems MicroAmp 384 Well Plate 40 µL + ordering: + A1: appliedbiosystemsmicroamp_384_wellplate_40ul_A1 + B1: appliedbiosystemsmicroamp_384_wellplate_40ul_B1 + C1: appliedbiosystemsmicroamp_384_wellplate_40ul_C1 + D1: appliedbiosystemsmicroamp_384_wellplate_40ul_D1 + E1: appliedbiosystemsmicroamp_384_wellplate_40ul_E1 + F1: appliedbiosystemsmicroamp_384_wellplate_40ul_F1 + G1: appliedbiosystemsmicroamp_384_wellplate_40ul_G1 + H1: appliedbiosystemsmicroamp_384_wellplate_40ul_H1 + I1: appliedbiosystemsmicroamp_384_wellplate_40ul_I1 + J1: appliedbiosystemsmicroamp_384_wellplate_40ul_J1 + K1: appliedbiosystemsmicroamp_384_wellplate_40ul_K1 + L1: appliedbiosystemsmicroamp_384_wellplate_40ul_L1 + M1: appliedbiosystemsmicroamp_384_wellplate_40ul_M1 + N1: appliedbiosystemsmicroamp_384_wellplate_40ul_N1 + O1: appliedbiosystemsmicroamp_384_wellplate_40ul_O1 + P1: appliedbiosystemsmicroamp_384_wellplate_40ul_P1 + A2: appliedbiosystemsmicroamp_384_wellplate_40ul_A2 + B2: appliedbiosystemsmicroamp_384_wellplate_40ul_B2 + C2: appliedbiosystemsmicroamp_384_wellplate_40ul_C2 + D2: appliedbiosystemsmicroamp_384_wellplate_40ul_D2 + E2: appliedbiosystemsmicroamp_384_wellplate_40ul_E2 + F2: appliedbiosystemsmicroamp_384_wellplate_40ul_F2 + G2: appliedbiosystemsmicroamp_384_wellplate_40ul_G2 + H2: appliedbiosystemsmicroamp_384_wellplate_40ul_H2 + I2: appliedbiosystemsmicroamp_384_wellplate_40ul_I2 + J2: appliedbiosystemsmicroamp_384_wellplate_40ul_J2 + K2: appliedbiosystemsmicroamp_384_wellplate_40ul_K2 + L2: appliedbiosystemsmicroamp_384_wellplate_40ul_L2 + M2: appliedbiosystemsmicroamp_384_wellplate_40ul_M2 + N2: appliedbiosystemsmicroamp_384_wellplate_40ul_N2 + O2: appliedbiosystemsmicroamp_384_wellplate_40ul_O2 + P2: appliedbiosystemsmicroamp_384_wellplate_40ul_P2 + A3: appliedbiosystemsmicroamp_384_wellplate_40ul_A3 + B3: appliedbiosystemsmicroamp_384_wellplate_40ul_B3 + C3: appliedbiosystemsmicroamp_384_wellplate_40ul_C3 + D3: appliedbiosystemsmicroamp_384_wellplate_40ul_D3 + E3: appliedbiosystemsmicroamp_384_wellplate_40ul_E3 + F3: appliedbiosystemsmicroamp_384_wellplate_40ul_F3 + G3: appliedbiosystemsmicroamp_384_wellplate_40ul_G3 + H3: appliedbiosystemsmicroamp_384_wellplate_40ul_H3 + I3: appliedbiosystemsmicroamp_384_wellplate_40ul_I3 + J3: appliedbiosystemsmicroamp_384_wellplate_40ul_J3 + K3: appliedbiosystemsmicroamp_384_wellplate_40ul_K3 + L3: appliedbiosystemsmicroamp_384_wellplate_40ul_L3 + M3: appliedbiosystemsmicroamp_384_wellplate_40ul_M3 + N3: appliedbiosystemsmicroamp_384_wellplate_40ul_N3 + O3: appliedbiosystemsmicroamp_384_wellplate_40ul_O3 + P3: appliedbiosystemsmicroamp_384_wellplate_40ul_P3 + A4: appliedbiosystemsmicroamp_384_wellplate_40ul_A4 + B4: appliedbiosystemsmicroamp_384_wellplate_40ul_B4 + C4: appliedbiosystemsmicroamp_384_wellplate_40ul_C4 + D4: appliedbiosystemsmicroamp_384_wellplate_40ul_D4 + E4: appliedbiosystemsmicroamp_384_wellplate_40ul_E4 + F4: appliedbiosystemsmicroamp_384_wellplate_40ul_F4 + G4: appliedbiosystemsmicroamp_384_wellplate_40ul_G4 + H4: appliedbiosystemsmicroamp_384_wellplate_40ul_H4 + I4: appliedbiosystemsmicroamp_384_wellplate_40ul_I4 + J4: appliedbiosystemsmicroamp_384_wellplate_40ul_J4 + K4: appliedbiosystemsmicroamp_384_wellplate_40ul_K4 + L4: appliedbiosystemsmicroamp_384_wellplate_40ul_L4 + M4: appliedbiosystemsmicroamp_384_wellplate_40ul_M4 + N4: appliedbiosystemsmicroamp_384_wellplate_40ul_N4 + O4: appliedbiosystemsmicroamp_384_wellplate_40ul_O4 + P4: appliedbiosystemsmicroamp_384_wellplate_40ul_P4 + A5: appliedbiosystemsmicroamp_384_wellplate_40ul_A5 + B5: appliedbiosystemsmicroamp_384_wellplate_40ul_B5 + C5: appliedbiosystemsmicroamp_384_wellplate_40ul_C5 + D5: appliedbiosystemsmicroamp_384_wellplate_40ul_D5 + E5: appliedbiosystemsmicroamp_384_wellplate_40ul_E5 + F5: appliedbiosystemsmicroamp_384_wellplate_40ul_F5 + G5: appliedbiosystemsmicroamp_384_wellplate_40ul_G5 + H5: appliedbiosystemsmicroamp_384_wellplate_40ul_H5 + I5: appliedbiosystemsmicroamp_384_wellplate_40ul_I5 + J5: appliedbiosystemsmicroamp_384_wellplate_40ul_J5 + K5: appliedbiosystemsmicroamp_384_wellplate_40ul_K5 + L5: appliedbiosystemsmicroamp_384_wellplate_40ul_L5 + M5: appliedbiosystemsmicroamp_384_wellplate_40ul_M5 + N5: appliedbiosystemsmicroamp_384_wellplate_40ul_N5 + O5: appliedbiosystemsmicroamp_384_wellplate_40ul_O5 + P5: appliedbiosystemsmicroamp_384_wellplate_40ul_P5 + A6: appliedbiosystemsmicroamp_384_wellplate_40ul_A6 + B6: appliedbiosystemsmicroamp_384_wellplate_40ul_B6 + C6: appliedbiosystemsmicroamp_384_wellplate_40ul_C6 + D6: appliedbiosystemsmicroamp_384_wellplate_40ul_D6 + E6: appliedbiosystemsmicroamp_384_wellplate_40ul_E6 + F6: appliedbiosystemsmicroamp_384_wellplate_40ul_F6 + G6: appliedbiosystemsmicroamp_384_wellplate_40ul_G6 + H6: appliedbiosystemsmicroamp_384_wellplate_40ul_H6 + I6: appliedbiosystemsmicroamp_384_wellplate_40ul_I6 + J6: appliedbiosystemsmicroamp_384_wellplate_40ul_J6 + K6: appliedbiosystemsmicroamp_384_wellplate_40ul_K6 + L6: appliedbiosystemsmicroamp_384_wellplate_40ul_L6 + M6: appliedbiosystemsmicroamp_384_wellplate_40ul_M6 + N6: appliedbiosystemsmicroamp_384_wellplate_40ul_N6 + O6: appliedbiosystemsmicroamp_384_wellplate_40ul_O6 + P6: appliedbiosystemsmicroamp_384_wellplate_40ul_P6 + A7: appliedbiosystemsmicroamp_384_wellplate_40ul_A7 + B7: appliedbiosystemsmicroamp_384_wellplate_40ul_B7 + C7: appliedbiosystemsmicroamp_384_wellplate_40ul_C7 + D7: appliedbiosystemsmicroamp_384_wellplate_40ul_D7 + E7: appliedbiosystemsmicroamp_384_wellplate_40ul_E7 + F7: appliedbiosystemsmicroamp_384_wellplate_40ul_F7 + G7: appliedbiosystemsmicroamp_384_wellplate_40ul_G7 + H7: appliedbiosystemsmicroamp_384_wellplate_40ul_H7 + I7: appliedbiosystemsmicroamp_384_wellplate_40ul_I7 + J7: appliedbiosystemsmicroamp_384_wellplate_40ul_J7 + K7: appliedbiosystemsmicroamp_384_wellplate_40ul_K7 + L7: appliedbiosystemsmicroamp_384_wellplate_40ul_L7 + M7: appliedbiosystemsmicroamp_384_wellplate_40ul_M7 + N7: appliedbiosystemsmicroamp_384_wellplate_40ul_N7 + O7: appliedbiosystemsmicroamp_384_wellplate_40ul_O7 + P7: appliedbiosystemsmicroamp_384_wellplate_40ul_P7 + A8: appliedbiosystemsmicroamp_384_wellplate_40ul_A8 + B8: appliedbiosystemsmicroamp_384_wellplate_40ul_B8 + C8: appliedbiosystemsmicroamp_384_wellplate_40ul_C8 + D8: appliedbiosystemsmicroamp_384_wellplate_40ul_D8 + E8: appliedbiosystemsmicroamp_384_wellplate_40ul_E8 + F8: appliedbiosystemsmicroamp_384_wellplate_40ul_F8 + G8: appliedbiosystemsmicroamp_384_wellplate_40ul_G8 + H8: appliedbiosystemsmicroamp_384_wellplate_40ul_H8 + I8: appliedbiosystemsmicroamp_384_wellplate_40ul_I8 + J8: appliedbiosystemsmicroamp_384_wellplate_40ul_J8 + K8: appliedbiosystemsmicroamp_384_wellplate_40ul_K8 + L8: appliedbiosystemsmicroamp_384_wellplate_40ul_L8 + M8: appliedbiosystemsmicroamp_384_wellplate_40ul_M8 + N8: appliedbiosystemsmicroamp_384_wellplate_40ul_N8 + O8: appliedbiosystemsmicroamp_384_wellplate_40ul_O8 + P8: appliedbiosystemsmicroamp_384_wellplate_40ul_P8 + A9: appliedbiosystemsmicroamp_384_wellplate_40ul_A9 + B9: appliedbiosystemsmicroamp_384_wellplate_40ul_B9 + C9: appliedbiosystemsmicroamp_384_wellplate_40ul_C9 + D9: appliedbiosystemsmicroamp_384_wellplate_40ul_D9 + E9: appliedbiosystemsmicroamp_384_wellplate_40ul_E9 + F9: appliedbiosystemsmicroamp_384_wellplate_40ul_F9 + G9: appliedbiosystemsmicroamp_384_wellplate_40ul_G9 + H9: appliedbiosystemsmicroamp_384_wellplate_40ul_H9 + I9: appliedbiosystemsmicroamp_384_wellplate_40ul_I9 + J9: appliedbiosystemsmicroamp_384_wellplate_40ul_J9 + K9: appliedbiosystemsmicroamp_384_wellplate_40ul_K9 + L9: appliedbiosystemsmicroamp_384_wellplate_40ul_L9 + M9: appliedbiosystemsmicroamp_384_wellplate_40ul_M9 + N9: appliedbiosystemsmicroamp_384_wellplate_40ul_N9 + O9: appliedbiosystemsmicroamp_384_wellplate_40ul_O9 + P9: appliedbiosystemsmicroamp_384_wellplate_40ul_P9 + A10: appliedbiosystemsmicroamp_384_wellplate_40ul_A10 + B10: appliedbiosystemsmicroamp_384_wellplate_40ul_B10 + C10: appliedbiosystemsmicroamp_384_wellplate_40ul_C10 + D10: appliedbiosystemsmicroamp_384_wellplate_40ul_D10 + E10: appliedbiosystemsmicroamp_384_wellplate_40ul_E10 + F10: appliedbiosystemsmicroamp_384_wellplate_40ul_F10 + G10: appliedbiosystemsmicroamp_384_wellplate_40ul_G10 + H10: appliedbiosystemsmicroamp_384_wellplate_40ul_H10 + I10: appliedbiosystemsmicroamp_384_wellplate_40ul_I10 + J10: appliedbiosystemsmicroamp_384_wellplate_40ul_J10 + K10: appliedbiosystemsmicroamp_384_wellplate_40ul_K10 + L10: appliedbiosystemsmicroamp_384_wellplate_40ul_L10 + M10: appliedbiosystemsmicroamp_384_wellplate_40ul_M10 + N10: appliedbiosystemsmicroamp_384_wellplate_40ul_N10 + O10: appliedbiosystemsmicroamp_384_wellplate_40ul_O10 + P10: appliedbiosystemsmicroamp_384_wellplate_40ul_P10 + A11: appliedbiosystemsmicroamp_384_wellplate_40ul_A11 + B11: appliedbiosystemsmicroamp_384_wellplate_40ul_B11 + C11: appliedbiosystemsmicroamp_384_wellplate_40ul_C11 + D11: appliedbiosystemsmicroamp_384_wellplate_40ul_D11 + E11: appliedbiosystemsmicroamp_384_wellplate_40ul_E11 + F11: appliedbiosystemsmicroamp_384_wellplate_40ul_F11 + G11: appliedbiosystemsmicroamp_384_wellplate_40ul_G11 + H11: appliedbiosystemsmicroamp_384_wellplate_40ul_H11 + I11: appliedbiosystemsmicroamp_384_wellplate_40ul_I11 + J11: appliedbiosystemsmicroamp_384_wellplate_40ul_J11 + K11: appliedbiosystemsmicroamp_384_wellplate_40ul_K11 + L11: appliedbiosystemsmicroamp_384_wellplate_40ul_L11 + M11: appliedbiosystemsmicroamp_384_wellplate_40ul_M11 + N11: appliedbiosystemsmicroamp_384_wellplate_40ul_N11 + O11: appliedbiosystemsmicroamp_384_wellplate_40ul_O11 + P11: appliedbiosystemsmicroamp_384_wellplate_40ul_P11 + A12: appliedbiosystemsmicroamp_384_wellplate_40ul_A12 + B12: appliedbiosystemsmicroamp_384_wellplate_40ul_B12 + C12: appliedbiosystemsmicroamp_384_wellplate_40ul_C12 + D12: appliedbiosystemsmicroamp_384_wellplate_40ul_D12 + E12: appliedbiosystemsmicroamp_384_wellplate_40ul_E12 + F12: appliedbiosystemsmicroamp_384_wellplate_40ul_F12 + G12: appliedbiosystemsmicroamp_384_wellplate_40ul_G12 + H12: appliedbiosystemsmicroamp_384_wellplate_40ul_H12 + I12: appliedbiosystemsmicroamp_384_wellplate_40ul_I12 + J12: appliedbiosystemsmicroamp_384_wellplate_40ul_J12 + K12: appliedbiosystemsmicroamp_384_wellplate_40ul_K12 + L12: appliedbiosystemsmicroamp_384_wellplate_40ul_L12 + M12: appliedbiosystemsmicroamp_384_wellplate_40ul_M12 + N12: appliedbiosystemsmicroamp_384_wellplate_40ul_N12 + O12: appliedbiosystemsmicroamp_384_wellplate_40ul_O12 + P12: appliedbiosystemsmicroamp_384_wellplate_40ul_P12 + A13: appliedbiosystemsmicroamp_384_wellplate_40ul_A13 + B13: appliedbiosystemsmicroamp_384_wellplate_40ul_B13 + C13: appliedbiosystemsmicroamp_384_wellplate_40ul_C13 + D13: appliedbiosystemsmicroamp_384_wellplate_40ul_D13 + E13: appliedbiosystemsmicroamp_384_wellplate_40ul_E13 + F13: appliedbiosystemsmicroamp_384_wellplate_40ul_F13 + G13: appliedbiosystemsmicroamp_384_wellplate_40ul_G13 + H13: appliedbiosystemsmicroamp_384_wellplate_40ul_H13 + I13: appliedbiosystemsmicroamp_384_wellplate_40ul_I13 + J13: appliedbiosystemsmicroamp_384_wellplate_40ul_J13 + K13: appliedbiosystemsmicroamp_384_wellplate_40ul_K13 + L13: appliedbiosystemsmicroamp_384_wellplate_40ul_L13 + M13: appliedbiosystemsmicroamp_384_wellplate_40ul_M13 + N13: appliedbiosystemsmicroamp_384_wellplate_40ul_N13 + O13: appliedbiosystemsmicroamp_384_wellplate_40ul_O13 + P13: appliedbiosystemsmicroamp_384_wellplate_40ul_P13 + A14: appliedbiosystemsmicroamp_384_wellplate_40ul_A14 + B14: appliedbiosystemsmicroamp_384_wellplate_40ul_B14 + C14: appliedbiosystemsmicroamp_384_wellplate_40ul_C14 + D14: appliedbiosystemsmicroamp_384_wellplate_40ul_D14 + E14: appliedbiosystemsmicroamp_384_wellplate_40ul_E14 + F14: appliedbiosystemsmicroamp_384_wellplate_40ul_F14 + G14: appliedbiosystemsmicroamp_384_wellplate_40ul_G14 + H14: appliedbiosystemsmicroamp_384_wellplate_40ul_H14 + I14: appliedbiosystemsmicroamp_384_wellplate_40ul_I14 + J14: appliedbiosystemsmicroamp_384_wellplate_40ul_J14 + K14: appliedbiosystemsmicroamp_384_wellplate_40ul_K14 + L14: appliedbiosystemsmicroamp_384_wellplate_40ul_L14 + M14: appliedbiosystemsmicroamp_384_wellplate_40ul_M14 + N14: appliedbiosystemsmicroamp_384_wellplate_40ul_N14 + O14: appliedbiosystemsmicroamp_384_wellplate_40ul_O14 + P14: appliedbiosystemsmicroamp_384_wellplate_40ul_P14 + A15: appliedbiosystemsmicroamp_384_wellplate_40ul_A15 + B15: appliedbiosystemsmicroamp_384_wellplate_40ul_B15 + C15: appliedbiosystemsmicroamp_384_wellplate_40ul_C15 + D15: appliedbiosystemsmicroamp_384_wellplate_40ul_D15 + E15: appliedbiosystemsmicroamp_384_wellplate_40ul_E15 + F15: appliedbiosystemsmicroamp_384_wellplate_40ul_F15 + G15: appliedbiosystemsmicroamp_384_wellplate_40ul_G15 + H15: appliedbiosystemsmicroamp_384_wellplate_40ul_H15 + I15: appliedbiosystemsmicroamp_384_wellplate_40ul_I15 + J15: appliedbiosystemsmicroamp_384_wellplate_40ul_J15 + K15: appliedbiosystemsmicroamp_384_wellplate_40ul_K15 + L15: appliedbiosystemsmicroamp_384_wellplate_40ul_L15 + M15: appliedbiosystemsmicroamp_384_wellplate_40ul_M15 + N15: appliedbiosystemsmicroamp_384_wellplate_40ul_N15 + O15: appliedbiosystemsmicroamp_384_wellplate_40ul_O15 + P15: appliedbiosystemsmicroamp_384_wellplate_40ul_P15 + A16: appliedbiosystemsmicroamp_384_wellplate_40ul_A16 + B16: appliedbiosystemsmicroamp_384_wellplate_40ul_B16 + C16: appliedbiosystemsmicroamp_384_wellplate_40ul_C16 + D16: appliedbiosystemsmicroamp_384_wellplate_40ul_D16 + E16: appliedbiosystemsmicroamp_384_wellplate_40ul_E16 + F16: appliedbiosystemsmicroamp_384_wellplate_40ul_F16 + G16: appliedbiosystemsmicroamp_384_wellplate_40ul_G16 + H16: appliedbiosystemsmicroamp_384_wellplate_40ul_H16 + I16: appliedbiosystemsmicroamp_384_wellplate_40ul_I16 + J16: appliedbiosystemsmicroamp_384_wellplate_40ul_J16 + K16: appliedbiosystemsmicroamp_384_wellplate_40ul_K16 + L16: appliedbiosystemsmicroamp_384_wellplate_40ul_L16 + M16: appliedbiosystemsmicroamp_384_wellplate_40ul_M16 + N16: appliedbiosystemsmicroamp_384_wellplate_40ul_N16 + O16: appliedbiosystemsmicroamp_384_wellplate_40ul_O16 + P16: appliedbiosystemsmicroamp_384_wellplate_40ul_P16 + A17: appliedbiosystemsmicroamp_384_wellplate_40ul_A17 + B17: appliedbiosystemsmicroamp_384_wellplate_40ul_B17 + C17: appliedbiosystemsmicroamp_384_wellplate_40ul_C17 + D17: appliedbiosystemsmicroamp_384_wellplate_40ul_D17 + E17: appliedbiosystemsmicroamp_384_wellplate_40ul_E17 + F17: appliedbiosystemsmicroamp_384_wellplate_40ul_F17 + G17: appliedbiosystemsmicroamp_384_wellplate_40ul_G17 + H17: appliedbiosystemsmicroamp_384_wellplate_40ul_H17 + I17: appliedbiosystemsmicroamp_384_wellplate_40ul_I17 + J17: appliedbiosystemsmicroamp_384_wellplate_40ul_J17 + K17: appliedbiosystemsmicroamp_384_wellplate_40ul_K17 + L17: appliedbiosystemsmicroamp_384_wellplate_40ul_L17 + M17: appliedbiosystemsmicroamp_384_wellplate_40ul_M17 + N17: appliedbiosystemsmicroamp_384_wellplate_40ul_N17 + O17: appliedbiosystemsmicroamp_384_wellplate_40ul_O17 + P17: appliedbiosystemsmicroamp_384_wellplate_40ul_P17 + A18: appliedbiosystemsmicroamp_384_wellplate_40ul_A18 + B18: appliedbiosystemsmicroamp_384_wellplate_40ul_B18 + C18: appliedbiosystemsmicroamp_384_wellplate_40ul_C18 + D18: appliedbiosystemsmicroamp_384_wellplate_40ul_D18 + E18: appliedbiosystemsmicroamp_384_wellplate_40ul_E18 + F18: appliedbiosystemsmicroamp_384_wellplate_40ul_F18 + G18: appliedbiosystemsmicroamp_384_wellplate_40ul_G18 + H18: appliedbiosystemsmicroamp_384_wellplate_40ul_H18 + I18: appliedbiosystemsmicroamp_384_wellplate_40ul_I18 + J18: appliedbiosystemsmicroamp_384_wellplate_40ul_J18 + K18: appliedbiosystemsmicroamp_384_wellplate_40ul_K18 + L18: appliedbiosystemsmicroamp_384_wellplate_40ul_L18 + M18: appliedbiosystemsmicroamp_384_wellplate_40ul_M18 + N18: appliedbiosystemsmicroamp_384_wellplate_40ul_N18 + O18: appliedbiosystemsmicroamp_384_wellplate_40ul_O18 + P18: appliedbiosystemsmicroamp_384_wellplate_40ul_P18 + A19: appliedbiosystemsmicroamp_384_wellplate_40ul_A19 + B19: appliedbiosystemsmicroamp_384_wellplate_40ul_B19 + C19: appliedbiosystemsmicroamp_384_wellplate_40ul_C19 + D19: appliedbiosystemsmicroamp_384_wellplate_40ul_D19 + E19: appliedbiosystemsmicroamp_384_wellplate_40ul_E19 + F19: appliedbiosystemsmicroamp_384_wellplate_40ul_F19 + G19: appliedbiosystemsmicroamp_384_wellplate_40ul_G19 + H19: appliedbiosystemsmicroamp_384_wellplate_40ul_H19 + I19: appliedbiosystemsmicroamp_384_wellplate_40ul_I19 + J19: appliedbiosystemsmicroamp_384_wellplate_40ul_J19 + K19: appliedbiosystemsmicroamp_384_wellplate_40ul_K19 + L19: appliedbiosystemsmicroamp_384_wellplate_40ul_L19 + M19: appliedbiosystemsmicroamp_384_wellplate_40ul_M19 + N19: appliedbiosystemsmicroamp_384_wellplate_40ul_N19 + O19: appliedbiosystemsmicroamp_384_wellplate_40ul_O19 + P19: appliedbiosystemsmicroamp_384_wellplate_40ul_P19 + A20: appliedbiosystemsmicroamp_384_wellplate_40ul_A20 + B20: appliedbiosystemsmicroamp_384_wellplate_40ul_B20 + C20: appliedbiosystemsmicroamp_384_wellplate_40ul_C20 + D20: appliedbiosystemsmicroamp_384_wellplate_40ul_D20 + E20: appliedbiosystemsmicroamp_384_wellplate_40ul_E20 + F20: appliedbiosystemsmicroamp_384_wellplate_40ul_F20 + G20: appliedbiosystemsmicroamp_384_wellplate_40ul_G20 + H20: appliedbiosystemsmicroamp_384_wellplate_40ul_H20 + I20: appliedbiosystemsmicroamp_384_wellplate_40ul_I20 + J20: appliedbiosystemsmicroamp_384_wellplate_40ul_J20 + K20: appliedbiosystemsmicroamp_384_wellplate_40ul_K20 + L20: appliedbiosystemsmicroamp_384_wellplate_40ul_L20 + M20: appliedbiosystemsmicroamp_384_wellplate_40ul_M20 + N20: appliedbiosystemsmicroamp_384_wellplate_40ul_N20 + O20: appliedbiosystemsmicroamp_384_wellplate_40ul_O20 + P20: appliedbiosystemsmicroamp_384_wellplate_40ul_P20 + A21: appliedbiosystemsmicroamp_384_wellplate_40ul_A21 + B21: appliedbiosystemsmicroamp_384_wellplate_40ul_B21 + C21: appliedbiosystemsmicroamp_384_wellplate_40ul_C21 + D21: appliedbiosystemsmicroamp_384_wellplate_40ul_D21 + E21: appliedbiosystemsmicroamp_384_wellplate_40ul_E21 + F21: appliedbiosystemsmicroamp_384_wellplate_40ul_F21 + G21: appliedbiosystemsmicroamp_384_wellplate_40ul_G21 + H21: appliedbiosystemsmicroamp_384_wellplate_40ul_H21 + I21: appliedbiosystemsmicroamp_384_wellplate_40ul_I21 + J21: appliedbiosystemsmicroamp_384_wellplate_40ul_J21 + K21: appliedbiosystemsmicroamp_384_wellplate_40ul_K21 + L21: appliedbiosystemsmicroamp_384_wellplate_40ul_L21 + M21: appliedbiosystemsmicroamp_384_wellplate_40ul_M21 + N21: appliedbiosystemsmicroamp_384_wellplate_40ul_N21 + O21: appliedbiosystemsmicroamp_384_wellplate_40ul_O21 + P21: appliedbiosystemsmicroamp_384_wellplate_40ul_P21 + A22: appliedbiosystemsmicroamp_384_wellplate_40ul_A22 + B22: appliedbiosystemsmicroamp_384_wellplate_40ul_B22 + C22: appliedbiosystemsmicroamp_384_wellplate_40ul_C22 + D22: appliedbiosystemsmicroamp_384_wellplate_40ul_D22 + E22: appliedbiosystemsmicroamp_384_wellplate_40ul_E22 + F22: appliedbiosystemsmicroamp_384_wellplate_40ul_F22 + G22: appliedbiosystemsmicroamp_384_wellplate_40ul_G22 + H22: appliedbiosystemsmicroamp_384_wellplate_40ul_H22 + I22: appliedbiosystemsmicroamp_384_wellplate_40ul_I22 + J22: appliedbiosystemsmicroamp_384_wellplate_40ul_J22 + K22: appliedbiosystemsmicroamp_384_wellplate_40ul_K22 + L22: appliedbiosystemsmicroamp_384_wellplate_40ul_L22 + M22: appliedbiosystemsmicroamp_384_wellplate_40ul_M22 + N22: appliedbiosystemsmicroamp_384_wellplate_40ul_N22 + O22: appliedbiosystemsmicroamp_384_wellplate_40ul_O22 + P22: appliedbiosystemsmicroamp_384_wellplate_40ul_P22 + A23: appliedbiosystemsmicroamp_384_wellplate_40ul_A23 + B23: appliedbiosystemsmicroamp_384_wellplate_40ul_B23 + C23: appliedbiosystemsmicroamp_384_wellplate_40ul_C23 + D23: appliedbiosystemsmicroamp_384_wellplate_40ul_D23 + E23: appliedbiosystemsmicroamp_384_wellplate_40ul_E23 + F23: appliedbiosystemsmicroamp_384_wellplate_40ul_F23 + G23: appliedbiosystemsmicroamp_384_wellplate_40ul_G23 + H23: appliedbiosystemsmicroamp_384_wellplate_40ul_H23 + I23: appliedbiosystemsmicroamp_384_wellplate_40ul_I23 + J23: appliedbiosystemsmicroamp_384_wellplate_40ul_J23 + K23: appliedbiosystemsmicroamp_384_wellplate_40ul_K23 + L23: appliedbiosystemsmicroamp_384_wellplate_40ul_L23 + M23: appliedbiosystemsmicroamp_384_wellplate_40ul_M23 + N23: appliedbiosystemsmicroamp_384_wellplate_40ul_N23 + O23: appliedbiosystemsmicroamp_384_wellplate_40ul_O23 + P23: appliedbiosystemsmicroamp_384_wellplate_40ul_P23 + A24: appliedbiosystemsmicroamp_384_wellplate_40ul_A24 + B24: appliedbiosystemsmicroamp_384_wellplate_40ul_B24 + C24: appliedbiosystemsmicroamp_384_wellplate_40ul_C24 + D24: appliedbiosystemsmicroamp_384_wellplate_40ul_D24 + E24: appliedbiosystemsmicroamp_384_wellplate_40ul_E24 + F24: appliedbiosystemsmicroamp_384_wellplate_40ul_F24 + G24: appliedbiosystemsmicroamp_384_wellplate_40ul_G24 + H24: appliedbiosystemsmicroamp_384_wellplate_40ul_H24 + I24: appliedbiosystemsmicroamp_384_wellplate_40ul_I24 + J24: appliedbiosystemsmicroamp_384_wellplate_40ul_J24 + K24: appliedbiosystemsmicroamp_384_wellplate_40ul_K24 + L24: appliedbiosystemsmicroamp_384_wellplate_40ul_L24 + M24: appliedbiosystemsmicroamp_384_wellplate_40ul_M24 + N24: appliedbiosystemsmicroamp_384_wellplate_40ul_N24 + O24: appliedbiosystemsmicroamp_384_wellplate_40ul_O24 + P24: appliedbiosystemsmicroamp_384_wellplate_40ul_P24 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.8 + size_y: 85.5 + size_z: 9.7 + type: Plate + data: {} + id: appliedbiosystemsmicroamp_384_wellplate_40ul + name: appliedbiosystemsmicroamp_384_wellplate_40ul + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: plate + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_A1 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_A1 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 11.029 + y: 75.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_B1 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_B1 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 11.029 + y: 70.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_C1 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_C1 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 11.029 + y: 66.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_D1 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_D1 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 11.029 + y: 61.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_E1 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_E1 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 11.029 + y: 57.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_F1 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_F1 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 11.029 + y: 52.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_G1 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_G1 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 11.029 + y: 48.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_H1 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_H1 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 11.029 + y: 43.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_I1 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_I1 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 11.029 + y: 39.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_J1 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_J1 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 11.029 + y: 34.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_K1 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_K1 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 11.029 + y: 30.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_L1 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_L1 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 11.029 + y: 25.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_M1 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_M1 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 11.029 + y: 21.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_N1 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_N1 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 11.029 + y: 16.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_O1 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_O1 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 11.029 + y: 12.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_P1 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_P1 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 11.029 + y: 7.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_A2 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_A2 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 15.529 + y: 75.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_B2 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_B2 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 15.529 + y: 70.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_C2 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_C2 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 15.529 + y: 66.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_D2 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_D2 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 15.529 + y: 61.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_E2 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_E2 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 15.529 + y: 57.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_F2 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_F2 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 15.529 + y: 52.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_G2 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_G2 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 15.529 + y: 48.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_H2 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_H2 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 15.529 + y: 43.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_I2 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_I2 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 15.529 + y: 39.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_J2 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_J2 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 15.529 + y: 34.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_K2 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_K2 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 15.529 + y: 30.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_L2 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_L2 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 15.529 + y: 25.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_M2 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_M2 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 15.529 + y: 21.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_N2 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_N2 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 15.529 + y: 16.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_O2 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_O2 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 15.529 + y: 12.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_P2 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_P2 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 15.529 + y: 7.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_A3 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_A3 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 20.029 + y: 75.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_B3 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_B3 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 20.029 + y: 70.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_C3 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_C3 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 20.029 + y: 66.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_D3 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_D3 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 20.029 + y: 61.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_E3 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_E3 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 20.029 + y: 57.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_F3 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_F3 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 20.029 + y: 52.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_G3 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_G3 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 20.029 + y: 48.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_H3 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_H3 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 20.029 + y: 43.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_I3 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_I3 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 20.029 + y: 39.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_J3 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_J3 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 20.029 + y: 34.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_K3 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_K3 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 20.029 + y: 30.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_L3 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_L3 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 20.029 + y: 25.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_M3 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_M3 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 20.029 + y: 21.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_N3 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_N3 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 20.029 + y: 16.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_O3 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_O3 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 20.029 + y: 12.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_P3 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_P3 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 20.029 + y: 7.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_A4 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_A4 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 24.529 + y: 75.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_B4 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_B4 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 24.529 + y: 70.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_C4 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_C4 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 24.529 + y: 66.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_D4 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_D4 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 24.529 + y: 61.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_E4 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_E4 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 24.529 + y: 57.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_F4 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_F4 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 24.529 + y: 52.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_G4 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_G4 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 24.529 + y: 48.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_H4 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_H4 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 24.529 + y: 43.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_I4 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_I4 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 24.529 + y: 39.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_J4 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_J4 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 24.529 + y: 34.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_K4 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_K4 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 24.529 + y: 30.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_L4 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_L4 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 24.529 + y: 25.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_M4 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_M4 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 24.529 + y: 21.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_N4 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_N4 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 24.529 + y: 16.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_O4 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_O4 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 24.529 + y: 12.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_P4 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_P4 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 24.529 + y: 7.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_A5 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_A5 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 29.029 + y: 75.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_B5 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_B5 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 29.029 + y: 70.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_C5 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_C5 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 29.029 + y: 66.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_D5 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_D5 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 29.029 + y: 61.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_E5 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_E5 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 29.029 + y: 57.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_F5 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_F5 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 29.029 + y: 52.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_G5 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_G5 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 29.029 + y: 48.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_H5 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_H5 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 29.029 + y: 43.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_I5 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_I5 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 29.029 + y: 39.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_J5 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_J5 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 29.029 + y: 34.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_K5 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_K5 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 29.029 + y: 30.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_L5 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_L5 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 29.029 + y: 25.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_M5 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_M5 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 29.029 + y: 21.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_N5 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_N5 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 29.029 + y: 16.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_O5 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_O5 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 29.029 + y: 12.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_P5 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_P5 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 29.029 + y: 7.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_A6 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_A6 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 33.529 + y: 75.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_B6 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_B6 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 33.529 + y: 70.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_C6 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_C6 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 33.529 + y: 66.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_D6 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_D6 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 33.529 + y: 61.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_E6 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_E6 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 33.529 + y: 57.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_F6 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_F6 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 33.529 + y: 52.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_G6 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_G6 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 33.529 + y: 48.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_H6 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_H6 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 33.529 + y: 43.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_I6 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_I6 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 33.529 + y: 39.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_J6 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_J6 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 33.529 + y: 34.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_K6 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_K6 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 33.529 + y: 30.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_L6 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_L6 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 33.529 + y: 25.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_M6 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_M6 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 33.529 + y: 21.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_N6 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_N6 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 33.529 + y: 16.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_O6 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_O6 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 33.529 + y: 12.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_P6 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_P6 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 33.529 + y: 7.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_A7 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_A7 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 38.029 + y: 75.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_B7 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_B7 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 38.029 + y: 70.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_C7 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_C7 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 38.029 + y: 66.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_D7 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_D7 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 38.029 + y: 61.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_E7 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_E7 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 38.029 + y: 57.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_F7 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_F7 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 38.029 + y: 52.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_G7 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_G7 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 38.029 + y: 48.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_H7 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_H7 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 38.029 + y: 43.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_I7 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_I7 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 38.029 + y: 39.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_J7 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_J7 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 38.029 + y: 34.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_K7 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_K7 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 38.029 + y: 30.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_L7 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_L7 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 38.029 + y: 25.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_M7 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_M7 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 38.029 + y: 21.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_N7 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_N7 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 38.029 + y: 16.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_O7 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_O7 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 38.029 + y: 12.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_P7 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_P7 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 38.029 + y: 7.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_A8 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_A8 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 42.529 + y: 75.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_B8 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_B8 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 42.529 + y: 70.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_C8 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_C8 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 42.529 + y: 66.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_D8 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_D8 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 42.529 + y: 61.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_E8 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_E8 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 42.529 + y: 57.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_F8 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_F8 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 42.529 + y: 52.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_G8 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_G8 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 42.529 + y: 48.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_H8 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_H8 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 42.529 + y: 43.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_I8 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_I8 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 42.529 + y: 39.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_J8 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_J8 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 42.529 + y: 34.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_K8 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_K8 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 42.529 + y: 30.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_L8 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_L8 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 42.529 + y: 25.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_M8 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_M8 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 42.529 + y: 21.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_N8 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_N8 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 42.529 + y: 16.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_O8 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_O8 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 42.529 + y: 12.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_P8 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_P8 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 42.529 + y: 7.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_A9 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_A9 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 47.029 + y: 75.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_B9 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_B9 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 47.029 + y: 70.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_C9 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_C9 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 47.029 + y: 66.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_D9 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_D9 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 47.029 + y: 61.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_E9 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_E9 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 47.029 + y: 57.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_F9 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_F9 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 47.029 + y: 52.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_G9 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_G9 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 47.029 + y: 48.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_H9 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_H9 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 47.029 + y: 43.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_I9 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_I9 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 47.029 + y: 39.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_J9 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_J9 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 47.029 + y: 34.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_K9 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_K9 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 47.029 + y: 30.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_L9 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_L9 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 47.029 + y: 25.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_M9 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_M9 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 47.029 + y: 21.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_N9 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_N9 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 47.029 + y: 16.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_O9 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_O9 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 47.029 + y: 12.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_P9 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_P9 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 47.029 + y: 7.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_A10 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_A10 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 51.529 + y: 75.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_B10 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_B10 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 51.529 + y: 70.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_C10 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_C10 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 51.529 + y: 66.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_D10 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_D10 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 51.529 + y: 61.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_E10 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_E10 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 51.529 + y: 57.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_F10 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_F10 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 51.529 + y: 52.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_G10 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_G10 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 51.529 + y: 48.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_H10 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_H10 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 51.529 + y: 43.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_I10 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_I10 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 51.529 + y: 39.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_J10 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_J10 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 51.529 + y: 34.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_K10 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_K10 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 51.529 + y: 30.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_L10 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_L10 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 51.529 + y: 25.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_M10 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_M10 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 51.529 + y: 21.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_N10 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_N10 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 51.529 + y: 16.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_O10 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_O10 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 51.529 + y: 12.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_P10 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_P10 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 51.529 + y: 7.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_A11 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_A11 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 56.029 + y: 75.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_B11 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_B11 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 56.029 + y: 70.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_C11 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_C11 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 56.029 + y: 66.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_D11 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_D11 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 56.029 + y: 61.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_E11 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_E11 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 56.029 + y: 57.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_F11 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_F11 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 56.029 + y: 52.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_G11 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_G11 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 56.029 + y: 48.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_H11 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_H11 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 56.029 + y: 43.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_I11 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_I11 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 56.029 + y: 39.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_J11 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_J11 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 56.029 + y: 34.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_K11 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_K11 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 56.029 + y: 30.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_L11 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_L11 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 56.029 + y: 25.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_M11 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_M11 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 56.029 + y: 21.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_N11 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_N11 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 56.029 + y: 16.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_O11 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_O11 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 56.029 + y: 12.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_P11 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_P11 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 56.029 + y: 7.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_A12 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_A12 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 60.529 + y: 75.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_B12 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_B12 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 60.529 + y: 70.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_C12 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_C12 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 60.529 + y: 66.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_D12 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_D12 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 60.529 + y: 61.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_E12 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_E12 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 60.529 + y: 57.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_F12 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_F12 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 60.529 + y: 52.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_G12 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_G12 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 60.529 + y: 48.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_H12 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_H12 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 60.529 + y: 43.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_I12 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_I12 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 60.529 + y: 39.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_J12 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_J12 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 60.529 + y: 34.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_K12 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_K12 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 60.529 + y: 30.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_L12 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_L12 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 60.529 + y: 25.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_M12 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_M12 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 60.529 + y: 21.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_N12 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_N12 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 60.529 + y: 16.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_O12 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_O12 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 60.529 + y: 12.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_P12 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_P12 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 60.529 + y: 7.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_A13 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_A13 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 65.029 + y: 75.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_B13 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_B13 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 65.029 + y: 70.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_C13 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_C13 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 65.029 + y: 66.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_D13 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_D13 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 65.029 + y: 61.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_E13 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_E13 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 65.029 + y: 57.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_F13 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_F13 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 65.029 + y: 52.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_G13 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_G13 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 65.029 + y: 48.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_H13 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_H13 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 65.029 + y: 43.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_I13 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_I13 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 65.029 + y: 39.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_J13 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_J13 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 65.029 + y: 34.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_K13 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_K13 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 65.029 + y: 30.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_L13 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_L13 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 65.029 + y: 25.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_M13 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_M13 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 65.029 + y: 21.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_N13 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_N13 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 65.029 + y: 16.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_O13 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_O13 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 65.029 + y: 12.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_P13 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_P13 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 65.029 + y: 7.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_A14 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_A14 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 69.529 + y: 75.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_B14 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_B14 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 69.529 + y: 70.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_C14 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_C14 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 69.529 + y: 66.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_D14 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_D14 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 69.529 + y: 61.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_E14 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_E14 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 69.529 + y: 57.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_F14 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_F14 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 69.529 + y: 52.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_G14 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_G14 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 69.529 + y: 48.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_H14 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_H14 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 69.529 + y: 43.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_I14 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_I14 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 69.529 + y: 39.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_J14 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_J14 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 69.529 + y: 34.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_K14 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_K14 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 69.529 + y: 30.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_L14 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_L14 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 69.529 + y: 25.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_M14 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_M14 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 69.529 + y: 21.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_N14 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_N14 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 69.529 + y: 16.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_O14 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_O14 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 69.529 + y: 12.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_P14 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_P14 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 69.529 + y: 7.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_A15 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_A15 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 74.029 + y: 75.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_B15 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_B15 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 74.029 + y: 70.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_C15 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_C15 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 74.029 + y: 66.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_D15 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_D15 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 74.029 + y: 61.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_E15 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_E15 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 74.029 + y: 57.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_F15 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_F15 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 74.029 + y: 52.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_G15 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_G15 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 74.029 + y: 48.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_H15 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_H15 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 74.029 + y: 43.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_I15 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_I15 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 74.029 + y: 39.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_J15 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_J15 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 74.029 + y: 34.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_K15 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_K15 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 74.029 + y: 30.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_L15 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_L15 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 74.029 + y: 25.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_M15 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_M15 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 74.029 + y: 21.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_N15 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_N15 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 74.029 + y: 16.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_O15 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_O15 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 74.029 + y: 12.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_P15 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_P15 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 74.029 + y: 7.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_A16 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_A16 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 78.529 + y: 75.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_B16 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_B16 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 78.529 + y: 70.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_C16 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_C16 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 78.529 + y: 66.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_D16 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_D16 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 78.529 + y: 61.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_E16 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_E16 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 78.529 + y: 57.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_F16 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_F16 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 78.529 + y: 52.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_G16 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_G16 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 78.529 + y: 48.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_H16 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_H16 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 78.529 + y: 43.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_I16 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_I16 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 78.529 + y: 39.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_J16 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_J16 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 78.529 + y: 34.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_K16 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_K16 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 78.529 + y: 30.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_L16 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_L16 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 78.529 + y: 25.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_M16 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_M16 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 78.529 + y: 21.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_N16 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_N16 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 78.529 + y: 16.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_O16 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_O16 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 78.529 + y: 12.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_P16 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_P16 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 78.529 + y: 7.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_A17 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_A17 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 83.029 + y: 75.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_B17 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_B17 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 83.029 + y: 70.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_C17 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_C17 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 83.029 + y: 66.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_D17 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_D17 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 83.029 + y: 61.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_E17 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_E17 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 83.029 + y: 57.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_F17 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_F17 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 83.029 + y: 52.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_G17 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_G17 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 83.029 + y: 48.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_H17 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_H17 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 83.029 + y: 43.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_I17 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_I17 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 83.029 + y: 39.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_J17 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_J17 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 83.029 + y: 34.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_K17 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_K17 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 83.029 + y: 30.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_L17 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_L17 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 83.029 + y: 25.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_M17 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_M17 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 83.029 + y: 21.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_N17 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_N17 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 83.029 + y: 16.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_O17 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_O17 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 83.029 + y: 12.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_P17 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_P17 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 83.029 + y: 7.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_A18 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_A18 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 87.529 + y: 75.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_B18 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_B18 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 87.529 + y: 70.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_C18 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_C18 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 87.529 + y: 66.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_D18 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_D18 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 87.529 + y: 61.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_E18 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_E18 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 87.529 + y: 57.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_F18 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_F18 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 87.529 + y: 52.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_G18 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_G18 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 87.529 + y: 48.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_H18 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_H18 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 87.529 + y: 43.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_I18 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_I18 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 87.529 + y: 39.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_J18 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_J18 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 87.529 + y: 34.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_K18 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_K18 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 87.529 + y: 30.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_L18 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_L18 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 87.529 + y: 25.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_M18 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_M18 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 87.529 + y: 21.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_N18 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_N18 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 87.529 + y: 16.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_O18 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_O18 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 87.529 + y: 12.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_P18 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_P18 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 87.529 + y: 7.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_A19 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_A19 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 92.029 + y: 75.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_B19 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_B19 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 92.029 + y: 70.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_C19 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_C19 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 92.029 + y: 66.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_D19 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_D19 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 92.029 + y: 61.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_E19 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_E19 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 92.029 + y: 57.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_F19 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_F19 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 92.029 + y: 52.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_G19 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_G19 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 92.029 + y: 48.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_H19 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_H19 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 92.029 + y: 43.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_I19 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_I19 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 92.029 + y: 39.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_J19 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_J19 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 92.029 + y: 34.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_K19 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_K19 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 92.029 + y: 30.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_L19 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_L19 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 92.029 + y: 25.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_M19 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_M19 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 92.029 + y: 21.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_N19 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_N19 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 92.029 + y: 16.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_O19 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_O19 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 92.029 + y: 12.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_P19 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_P19 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 92.029 + y: 7.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_A20 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_A20 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 96.529 + y: 75.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_B20 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_B20 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 96.529 + y: 70.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_C20 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_C20 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 96.529 + y: 66.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_D20 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_D20 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 96.529 + y: 61.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_E20 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_E20 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 96.529 + y: 57.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_F20 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_F20 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 96.529 + y: 52.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_G20 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_G20 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 96.529 + y: 48.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_H20 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_H20 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 96.529 + y: 43.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_I20 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_I20 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 96.529 + y: 39.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_J20 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_J20 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 96.529 + y: 34.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_K20 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_K20 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 96.529 + y: 30.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_L20 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_L20 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 96.529 + y: 25.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_M20 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_M20 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 96.529 + y: 21.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_N20 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_N20 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 96.529 + y: 16.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_O20 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_O20 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 96.529 + y: 12.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_P20 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_P20 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 96.529 + y: 7.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_A21 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_A21 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 101.029 + y: 75.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_B21 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_B21 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 101.029 + y: 70.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_C21 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_C21 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 101.029 + y: 66.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_D21 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_D21 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 101.029 + y: 61.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_E21 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_E21 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 101.029 + y: 57.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_F21 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_F21 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 101.029 + y: 52.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_G21 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_G21 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 101.029 + y: 48.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_H21 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_H21 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 101.029 + y: 43.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_I21 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_I21 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 101.029 + y: 39.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_J21 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_J21 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 101.029 + y: 34.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_K21 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_K21 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 101.029 + y: 30.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_L21 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_L21 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 101.029 + y: 25.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_M21 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_M21 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 101.029 + y: 21.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_N21 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_N21 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 101.029 + y: 16.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_O21 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_O21 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 101.029 + y: 12.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_P21 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_P21 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 101.029 + y: 7.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_A22 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_A22 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 105.529 + y: 75.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_B22 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_B22 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 105.529 + y: 70.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_C22 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_C22 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 105.529 + y: 66.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_D22 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_D22 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 105.529 + y: 61.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_E22 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_E22 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 105.529 + y: 57.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_F22 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_F22 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 105.529 + y: 52.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_G22 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_G22 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 105.529 + y: 48.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_H22 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_H22 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 105.529 + y: 43.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_I22 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_I22 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 105.529 + y: 39.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_J22 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_J22 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 105.529 + y: 34.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_K22 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_K22 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 105.529 + y: 30.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_L22 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_L22 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 105.529 + y: 25.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_M22 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_M22 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 105.529 + y: 21.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_N22 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_N22 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 105.529 + y: 16.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_O22 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_O22 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 105.529 + y: 12.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_P22 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_P22 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 105.529 + y: 7.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_A23 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_A23 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 110.029 + y: 75.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_B23 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_B23 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 110.029 + y: 70.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_C23 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_C23 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 110.029 + y: 66.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_D23 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_D23 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 110.029 + y: 61.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_E23 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_E23 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 110.029 + y: 57.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_F23 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_F23 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 110.029 + y: 52.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_G23 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_G23 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 110.029 + y: 48.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_H23 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_H23 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 110.029 + y: 43.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_I23 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_I23 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 110.029 + y: 39.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_J23 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_J23 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 110.029 + y: 34.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_K23 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_K23 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 110.029 + y: 30.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_L23 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_L23 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 110.029 + y: 25.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_M23 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_M23 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 110.029 + y: 21.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_N23 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_N23 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 110.029 + y: 16.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_O23 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_O23 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 110.029 + y: 12.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_P23 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_P23 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 110.029 + y: 7.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_A24 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_A24 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 114.529 + y: 75.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_B24 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_B24 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 114.529 + y: 70.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_C24 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_C24 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 114.529 + y: 66.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_D24 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_D24 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 114.529 + y: 61.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_E24 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_E24 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 114.529 + y: 57.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_F24 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_F24 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 114.529 + y: 52.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_G24 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_G24 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 114.529 + y: 48.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_H24 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_H24 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 114.529 + y: 43.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_I24 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_I24 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 114.529 + y: 39.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_J24 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_J24 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 114.529 + y: 34.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_K24 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_K24 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 114.529 + y: 30.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_L24 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_L24 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 114.529 + y: 25.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_M24 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_M24 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 114.529 + y: 21.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_N24 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_N24 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 114.529 + y: 16.879 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_O24 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_O24 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 114.529 + y: 12.379 + z: 0.61 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 40 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.242 + size_y: 2.242 + size_z: 9.09 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: appliedbiosystemsmicroamp_384_wellplate_40ul_P24 + name: appliedbiosystemsmicroamp_384_wellplate_40ul_P24 + parent: appliedbiosystemsmicroamp_384_wellplate_40ul + position: + x: 114.529 + y: 7.879 + z: 0.61 + sample_id: null + type: well + description: Applied Biosystems microamp 384 wellplate 40ul + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/plates.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 biorad_384_wellplate_50ul: - description: BioRad 384 wellplate 50ul - class: + category: + - plates + class: module: pylabrobot.resources.opentrons.plates:biorad_384_wellplate_50ul type: pylabrobot + config_info: + - children: + - biorad_384_wellplate_50ul_A1 + - biorad_384_wellplate_50ul_B1 + - biorad_384_wellplate_50ul_C1 + - biorad_384_wellplate_50ul_D1 + - biorad_384_wellplate_50ul_E1 + - biorad_384_wellplate_50ul_F1 + - biorad_384_wellplate_50ul_G1 + - biorad_384_wellplate_50ul_H1 + - biorad_384_wellplate_50ul_I1 + - biorad_384_wellplate_50ul_J1 + - biorad_384_wellplate_50ul_K1 + - biorad_384_wellplate_50ul_L1 + - biorad_384_wellplate_50ul_M1 + - biorad_384_wellplate_50ul_N1 + - biorad_384_wellplate_50ul_O1 + - biorad_384_wellplate_50ul_P1 + - biorad_384_wellplate_50ul_A2 + - biorad_384_wellplate_50ul_B2 + - biorad_384_wellplate_50ul_C2 + - biorad_384_wellplate_50ul_D2 + - biorad_384_wellplate_50ul_E2 + - biorad_384_wellplate_50ul_F2 + - biorad_384_wellplate_50ul_G2 + - biorad_384_wellplate_50ul_H2 + - biorad_384_wellplate_50ul_I2 + - biorad_384_wellplate_50ul_J2 + - biorad_384_wellplate_50ul_K2 + - biorad_384_wellplate_50ul_L2 + - biorad_384_wellplate_50ul_M2 + - biorad_384_wellplate_50ul_N2 + - biorad_384_wellplate_50ul_O2 + - biorad_384_wellplate_50ul_P2 + - biorad_384_wellplate_50ul_A3 + - biorad_384_wellplate_50ul_B3 + - biorad_384_wellplate_50ul_C3 + - biorad_384_wellplate_50ul_D3 + - biorad_384_wellplate_50ul_E3 + - biorad_384_wellplate_50ul_F3 + - biorad_384_wellplate_50ul_G3 + - biorad_384_wellplate_50ul_H3 + - biorad_384_wellplate_50ul_I3 + - biorad_384_wellplate_50ul_J3 + - biorad_384_wellplate_50ul_K3 + - biorad_384_wellplate_50ul_L3 + - biorad_384_wellplate_50ul_M3 + - biorad_384_wellplate_50ul_N3 + - biorad_384_wellplate_50ul_O3 + - biorad_384_wellplate_50ul_P3 + - biorad_384_wellplate_50ul_A4 + - biorad_384_wellplate_50ul_B4 + - biorad_384_wellplate_50ul_C4 + - biorad_384_wellplate_50ul_D4 + - biorad_384_wellplate_50ul_E4 + - biorad_384_wellplate_50ul_F4 + - biorad_384_wellplate_50ul_G4 + - biorad_384_wellplate_50ul_H4 + - biorad_384_wellplate_50ul_I4 + - biorad_384_wellplate_50ul_J4 + - biorad_384_wellplate_50ul_K4 + - biorad_384_wellplate_50ul_L4 + - biorad_384_wellplate_50ul_M4 + - biorad_384_wellplate_50ul_N4 + - biorad_384_wellplate_50ul_O4 + - biorad_384_wellplate_50ul_P4 + - biorad_384_wellplate_50ul_A5 + - biorad_384_wellplate_50ul_B5 + - biorad_384_wellplate_50ul_C5 + - biorad_384_wellplate_50ul_D5 + - biorad_384_wellplate_50ul_E5 + - biorad_384_wellplate_50ul_F5 + - biorad_384_wellplate_50ul_G5 + - biorad_384_wellplate_50ul_H5 + - biorad_384_wellplate_50ul_I5 + - biorad_384_wellplate_50ul_J5 + - biorad_384_wellplate_50ul_K5 + - biorad_384_wellplate_50ul_L5 + - biorad_384_wellplate_50ul_M5 + - biorad_384_wellplate_50ul_N5 + - biorad_384_wellplate_50ul_O5 + - biorad_384_wellplate_50ul_P5 + - biorad_384_wellplate_50ul_A6 + - biorad_384_wellplate_50ul_B6 + - biorad_384_wellplate_50ul_C6 + - biorad_384_wellplate_50ul_D6 + - biorad_384_wellplate_50ul_E6 + - biorad_384_wellplate_50ul_F6 + - biorad_384_wellplate_50ul_G6 + - biorad_384_wellplate_50ul_H6 + - biorad_384_wellplate_50ul_I6 + - biorad_384_wellplate_50ul_J6 + - biorad_384_wellplate_50ul_K6 + - biorad_384_wellplate_50ul_L6 + - biorad_384_wellplate_50ul_M6 + - biorad_384_wellplate_50ul_N6 + - biorad_384_wellplate_50ul_O6 + - biorad_384_wellplate_50ul_P6 + - biorad_384_wellplate_50ul_A7 + - biorad_384_wellplate_50ul_B7 + - biorad_384_wellplate_50ul_C7 + - biorad_384_wellplate_50ul_D7 + - biorad_384_wellplate_50ul_E7 + - biorad_384_wellplate_50ul_F7 + - biorad_384_wellplate_50ul_G7 + - biorad_384_wellplate_50ul_H7 + - biorad_384_wellplate_50ul_I7 + - biorad_384_wellplate_50ul_J7 + - biorad_384_wellplate_50ul_K7 + - biorad_384_wellplate_50ul_L7 + - biorad_384_wellplate_50ul_M7 + - biorad_384_wellplate_50ul_N7 + - biorad_384_wellplate_50ul_O7 + - biorad_384_wellplate_50ul_P7 + - biorad_384_wellplate_50ul_A8 + - biorad_384_wellplate_50ul_B8 + - biorad_384_wellplate_50ul_C8 + - biorad_384_wellplate_50ul_D8 + - biorad_384_wellplate_50ul_E8 + - biorad_384_wellplate_50ul_F8 + - biorad_384_wellplate_50ul_G8 + - biorad_384_wellplate_50ul_H8 + - biorad_384_wellplate_50ul_I8 + - biorad_384_wellplate_50ul_J8 + - biorad_384_wellplate_50ul_K8 + - biorad_384_wellplate_50ul_L8 + - biorad_384_wellplate_50ul_M8 + - biorad_384_wellplate_50ul_N8 + - biorad_384_wellplate_50ul_O8 + - biorad_384_wellplate_50ul_P8 + - biorad_384_wellplate_50ul_A9 + - biorad_384_wellplate_50ul_B9 + - biorad_384_wellplate_50ul_C9 + - biorad_384_wellplate_50ul_D9 + - biorad_384_wellplate_50ul_E9 + - biorad_384_wellplate_50ul_F9 + - biorad_384_wellplate_50ul_G9 + - biorad_384_wellplate_50ul_H9 + - biorad_384_wellplate_50ul_I9 + - biorad_384_wellplate_50ul_J9 + - biorad_384_wellplate_50ul_K9 + - biorad_384_wellplate_50ul_L9 + - biorad_384_wellplate_50ul_M9 + - biorad_384_wellplate_50ul_N9 + - biorad_384_wellplate_50ul_O9 + - biorad_384_wellplate_50ul_P9 + - biorad_384_wellplate_50ul_A10 + - biorad_384_wellplate_50ul_B10 + - biorad_384_wellplate_50ul_C10 + - biorad_384_wellplate_50ul_D10 + - biorad_384_wellplate_50ul_E10 + - biorad_384_wellplate_50ul_F10 + - biorad_384_wellplate_50ul_G10 + - biorad_384_wellplate_50ul_H10 + - biorad_384_wellplate_50ul_I10 + - biorad_384_wellplate_50ul_J10 + - biorad_384_wellplate_50ul_K10 + - biorad_384_wellplate_50ul_L10 + - biorad_384_wellplate_50ul_M10 + - biorad_384_wellplate_50ul_N10 + - biorad_384_wellplate_50ul_O10 + - biorad_384_wellplate_50ul_P10 + - biorad_384_wellplate_50ul_A11 + - biorad_384_wellplate_50ul_B11 + - biorad_384_wellplate_50ul_C11 + - biorad_384_wellplate_50ul_D11 + - biorad_384_wellplate_50ul_E11 + - biorad_384_wellplate_50ul_F11 + - biorad_384_wellplate_50ul_G11 + - biorad_384_wellplate_50ul_H11 + - biorad_384_wellplate_50ul_I11 + - biorad_384_wellplate_50ul_J11 + - biorad_384_wellplate_50ul_K11 + - biorad_384_wellplate_50ul_L11 + - biorad_384_wellplate_50ul_M11 + - biorad_384_wellplate_50ul_N11 + - biorad_384_wellplate_50ul_O11 + - biorad_384_wellplate_50ul_P11 + - biorad_384_wellplate_50ul_A12 + - biorad_384_wellplate_50ul_B12 + - biorad_384_wellplate_50ul_C12 + - biorad_384_wellplate_50ul_D12 + - biorad_384_wellplate_50ul_E12 + - biorad_384_wellplate_50ul_F12 + - biorad_384_wellplate_50ul_G12 + - biorad_384_wellplate_50ul_H12 + - biorad_384_wellplate_50ul_I12 + - biorad_384_wellplate_50ul_J12 + - biorad_384_wellplate_50ul_K12 + - biorad_384_wellplate_50ul_L12 + - biorad_384_wellplate_50ul_M12 + - biorad_384_wellplate_50ul_N12 + - biorad_384_wellplate_50ul_O12 + - biorad_384_wellplate_50ul_P12 + - biorad_384_wellplate_50ul_A13 + - biorad_384_wellplate_50ul_B13 + - biorad_384_wellplate_50ul_C13 + - biorad_384_wellplate_50ul_D13 + - biorad_384_wellplate_50ul_E13 + - biorad_384_wellplate_50ul_F13 + - biorad_384_wellplate_50ul_G13 + - biorad_384_wellplate_50ul_H13 + - biorad_384_wellplate_50ul_I13 + - biorad_384_wellplate_50ul_J13 + - biorad_384_wellplate_50ul_K13 + - biorad_384_wellplate_50ul_L13 + - biorad_384_wellplate_50ul_M13 + - biorad_384_wellplate_50ul_N13 + - biorad_384_wellplate_50ul_O13 + - biorad_384_wellplate_50ul_P13 + - biorad_384_wellplate_50ul_A14 + - biorad_384_wellplate_50ul_B14 + - biorad_384_wellplate_50ul_C14 + - biorad_384_wellplate_50ul_D14 + - biorad_384_wellplate_50ul_E14 + - biorad_384_wellplate_50ul_F14 + - biorad_384_wellplate_50ul_G14 + - biorad_384_wellplate_50ul_H14 + - biorad_384_wellplate_50ul_I14 + - biorad_384_wellplate_50ul_J14 + - biorad_384_wellplate_50ul_K14 + - biorad_384_wellplate_50ul_L14 + - biorad_384_wellplate_50ul_M14 + - biorad_384_wellplate_50ul_N14 + - biorad_384_wellplate_50ul_O14 + - biorad_384_wellplate_50ul_P14 + - biorad_384_wellplate_50ul_A15 + - biorad_384_wellplate_50ul_B15 + - biorad_384_wellplate_50ul_C15 + - biorad_384_wellplate_50ul_D15 + - biorad_384_wellplate_50ul_E15 + - biorad_384_wellplate_50ul_F15 + - biorad_384_wellplate_50ul_G15 + - biorad_384_wellplate_50ul_H15 + - biorad_384_wellplate_50ul_I15 + - biorad_384_wellplate_50ul_J15 + - biorad_384_wellplate_50ul_K15 + - biorad_384_wellplate_50ul_L15 + - biorad_384_wellplate_50ul_M15 + - biorad_384_wellplate_50ul_N15 + - biorad_384_wellplate_50ul_O15 + - biorad_384_wellplate_50ul_P15 + - biorad_384_wellplate_50ul_A16 + - biorad_384_wellplate_50ul_B16 + - biorad_384_wellplate_50ul_C16 + - biorad_384_wellplate_50ul_D16 + - biorad_384_wellplate_50ul_E16 + - biorad_384_wellplate_50ul_F16 + - biorad_384_wellplate_50ul_G16 + - biorad_384_wellplate_50ul_H16 + - biorad_384_wellplate_50ul_I16 + - biorad_384_wellplate_50ul_J16 + - biorad_384_wellplate_50ul_K16 + - biorad_384_wellplate_50ul_L16 + - biorad_384_wellplate_50ul_M16 + - biorad_384_wellplate_50ul_N16 + - biorad_384_wellplate_50ul_O16 + - biorad_384_wellplate_50ul_P16 + - biorad_384_wellplate_50ul_A17 + - biorad_384_wellplate_50ul_B17 + - biorad_384_wellplate_50ul_C17 + - biorad_384_wellplate_50ul_D17 + - biorad_384_wellplate_50ul_E17 + - biorad_384_wellplate_50ul_F17 + - biorad_384_wellplate_50ul_G17 + - biorad_384_wellplate_50ul_H17 + - biorad_384_wellplate_50ul_I17 + - biorad_384_wellplate_50ul_J17 + - biorad_384_wellplate_50ul_K17 + - biorad_384_wellplate_50ul_L17 + - biorad_384_wellplate_50ul_M17 + - biorad_384_wellplate_50ul_N17 + - biorad_384_wellplate_50ul_O17 + - biorad_384_wellplate_50ul_P17 + - biorad_384_wellplate_50ul_A18 + - biorad_384_wellplate_50ul_B18 + - biorad_384_wellplate_50ul_C18 + - biorad_384_wellplate_50ul_D18 + - biorad_384_wellplate_50ul_E18 + - biorad_384_wellplate_50ul_F18 + - biorad_384_wellplate_50ul_G18 + - biorad_384_wellplate_50ul_H18 + - biorad_384_wellplate_50ul_I18 + - biorad_384_wellplate_50ul_J18 + - biorad_384_wellplate_50ul_K18 + - biorad_384_wellplate_50ul_L18 + - biorad_384_wellplate_50ul_M18 + - biorad_384_wellplate_50ul_N18 + - biorad_384_wellplate_50ul_O18 + - biorad_384_wellplate_50ul_P18 + - biorad_384_wellplate_50ul_A19 + - biorad_384_wellplate_50ul_B19 + - biorad_384_wellplate_50ul_C19 + - biorad_384_wellplate_50ul_D19 + - biorad_384_wellplate_50ul_E19 + - biorad_384_wellplate_50ul_F19 + - biorad_384_wellplate_50ul_G19 + - biorad_384_wellplate_50ul_H19 + - biorad_384_wellplate_50ul_I19 + - biorad_384_wellplate_50ul_J19 + - biorad_384_wellplate_50ul_K19 + - biorad_384_wellplate_50ul_L19 + - biorad_384_wellplate_50ul_M19 + - biorad_384_wellplate_50ul_N19 + - biorad_384_wellplate_50ul_O19 + - biorad_384_wellplate_50ul_P19 + - biorad_384_wellplate_50ul_A20 + - biorad_384_wellplate_50ul_B20 + - biorad_384_wellplate_50ul_C20 + - biorad_384_wellplate_50ul_D20 + - biorad_384_wellplate_50ul_E20 + - biorad_384_wellplate_50ul_F20 + - biorad_384_wellplate_50ul_G20 + - biorad_384_wellplate_50ul_H20 + - biorad_384_wellplate_50ul_I20 + - biorad_384_wellplate_50ul_J20 + - biorad_384_wellplate_50ul_K20 + - biorad_384_wellplate_50ul_L20 + - biorad_384_wellplate_50ul_M20 + - biorad_384_wellplate_50ul_N20 + - biorad_384_wellplate_50ul_O20 + - biorad_384_wellplate_50ul_P20 + - biorad_384_wellplate_50ul_A21 + - biorad_384_wellplate_50ul_B21 + - biorad_384_wellplate_50ul_C21 + - biorad_384_wellplate_50ul_D21 + - biorad_384_wellplate_50ul_E21 + - biorad_384_wellplate_50ul_F21 + - biorad_384_wellplate_50ul_G21 + - biorad_384_wellplate_50ul_H21 + - biorad_384_wellplate_50ul_I21 + - biorad_384_wellplate_50ul_J21 + - biorad_384_wellplate_50ul_K21 + - biorad_384_wellplate_50ul_L21 + - biorad_384_wellplate_50ul_M21 + - biorad_384_wellplate_50ul_N21 + - biorad_384_wellplate_50ul_O21 + - biorad_384_wellplate_50ul_P21 + - biorad_384_wellplate_50ul_A22 + - biorad_384_wellplate_50ul_B22 + - biorad_384_wellplate_50ul_C22 + - biorad_384_wellplate_50ul_D22 + - biorad_384_wellplate_50ul_E22 + - biorad_384_wellplate_50ul_F22 + - biorad_384_wellplate_50ul_G22 + - biorad_384_wellplate_50ul_H22 + - biorad_384_wellplate_50ul_I22 + - biorad_384_wellplate_50ul_J22 + - biorad_384_wellplate_50ul_K22 + - biorad_384_wellplate_50ul_L22 + - biorad_384_wellplate_50ul_M22 + - biorad_384_wellplate_50ul_N22 + - biorad_384_wellplate_50ul_O22 + - biorad_384_wellplate_50ul_P22 + - biorad_384_wellplate_50ul_A23 + - biorad_384_wellplate_50ul_B23 + - biorad_384_wellplate_50ul_C23 + - biorad_384_wellplate_50ul_D23 + - biorad_384_wellplate_50ul_E23 + - biorad_384_wellplate_50ul_F23 + - biorad_384_wellplate_50ul_G23 + - biorad_384_wellplate_50ul_H23 + - biorad_384_wellplate_50ul_I23 + - biorad_384_wellplate_50ul_J23 + - biorad_384_wellplate_50ul_K23 + - biorad_384_wellplate_50ul_L23 + - biorad_384_wellplate_50ul_M23 + - biorad_384_wellplate_50ul_N23 + - biorad_384_wellplate_50ul_O23 + - biorad_384_wellplate_50ul_P23 + - biorad_384_wellplate_50ul_A24 + - biorad_384_wellplate_50ul_B24 + - biorad_384_wellplate_50ul_C24 + - biorad_384_wellplate_50ul_D24 + - biorad_384_wellplate_50ul_E24 + - biorad_384_wellplate_50ul_F24 + - biorad_384_wellplate_50ul_G24 + - biorad_384_wellplate_50ul_H24 + - biorad_384_wellplate_50ul_I24 + - biorad_384_wellplate_50ul_J24 + - biorad_384_wellplate_50ul_K24 + - biorad_384_wellplate_50ul_L24 + - biorad_384_wellplate_50ul_M24 + - biorad_384_wellplate_50ul_N24 + - biorad_384_wellplate_50ul_O24 + - biorad_384_wellplate_50ul_P24 + class: '' + config: + barcode: null + category: plate + model: Bio-Rad 384 Well Plate 50 µL + ordering: + A1: biorad_384_wellplate_50ul_A1 + B1: biorad_384_wellplate_50ul_B1 + C1: biorad_384_wellplate_50ul_C1 + D1: biorad_384_wellplate_50ul_D1 + E1: biorad_384_wellplate_50ul_E1 + F1: biorad_384_wellplate_50ul_F1 + G1: biorad_384_wellplate_50ul_G1 + H1: biorad_384_wellplate_50ul_H1 + I1: biorad_384_wellplate_50ul_I1 + J1: biorad_384_wellplate_50ul_J1 + K1: biorad_384_wellplate_50ul_K1 + L1: biorad_384_wellplate_50ul_L1 + M1: biorad_384_wellplate_50ul_M1 + N1: biorad_384_wellplate_50ul_N1 + O1: biorad_384_wellplate_50ul_O1 + P1: biorad_384_wellplate_50ul_P1 + A2: biorad_384_wellplate_50ul_A2 + B2: biorad_384_wellplate_50ul_B2 + C2: biorad_384_wellplate_50ul_C2 + D2: biorad_384_wellplate_50ul_D2 + E2: biorad_384_wellplate_50ul_E2 + F2: biorad_384_wellplate_50ul_F2 + G2: biorad_384_wellplate_50ul_G2 + H2: biorad_384_wellplate_50ul_H2 + I2: biorad_384_wellplate_50ul_I2 + J2: biorad_384_wellplate_50ul_J2 + K2: biorad_384_wellplate_50ul_K2 + L2: biorad_384_wellplate_50ul_L2 + M2: biorad_384_wellplate_50ul_M2 + N2: biorad_384_wellplate_50ul_N2 + O2: biorad_384_wellplate_50ul_O2 + P2: biorad_384_wellplate_50ul_P2 + A3: biorad_384_wellplate_50ul_A3 + B3: biorad_384_wellplate_50ul_B3 + C3: biorad_384_wellplate_50ul_C3 + D3: biorad_384_wellplate_50ul_D3 + E3: biorad_384_wellplate_50ul_E3 + F3: biorad_384_wellplate_50ul_F3 + G3: biorad_384_wellplate_50ul_G3 + H3: biorad_384_wellplate_50ul_H3 + I3: biorad_384_wellplate_50ul_I3 + J3: biorad_384_wellplate_50ul_J3 + K3: biorad_384_wellplate_50ul_K3 + L3: biorad_384_wellplate_50ul_L3 + M3: biorad_384_wellplate_50ul_M3 + N3: biorad_384_wellplate_50ul_N3 + O3: biorad_384_wellplate_50ul_O3 + P3: biorad_384_wellplate_50ul_P3 + A4: biorad_384_wellplate_50ul_A4 + B4: biorad_384_wellplate_50ul_B4 + C4: biorad_384_wellplate_50ul_C4 + D4: biorad_384_wellplate_50ul_D4 + E4: biorad_384_wellplate_50ul_E4 + F4: biorad_384_wellplate_50ul_F4 + G4: biorad_384_wellplate_50ul_G4 + H4: biorad_384_wellplate_50ul_H4 + I4: biorad_384_wellplate_50ul_I4 + J4: biorad_384_wellplate_50ul_J4 + K4: biorad_384_wellplate_50ul_K4 + L4: biorad_384_wellplate_50ul_L4 + M4: biorad_384_wellplate_50ul_M4 + N4: biorad_384_wellplate_50ul_N4 + O4: biorad_384_wellplate_50ul_O4 + P4: biorad_384_wellplate_50ul_P4 + A5: biorad_384_wellplate_50ul_A5 + B5: biorad_384_wellplate_50ul_B5 + C5: biorad_384_wellplate_50ul_C5 + D5: biorad_384_wellplate_50ul_D5 + E5: biorad_384_wellplate_50ul_E5 + F5: biorad_384_wellplate_50ul_F5 + G5: biorad_384_wellplate_50ul_G5 + H5: biorad_384_wellplate_50ul_H5 + I5: biorad_384_wellplate_50ul_I5 + J5: biorad_384_wellplate_50ul_J5 + K5: biorad_384_wellplate_50ul_K5 + L5: biorad_384_wellplate_50ul_L5 + M5: biorad_384_wellplate_50ul_M5 + N5: biorad_384_wellplate_50ul_N5 + O5: biorad_384_wellplate_50ul_O5 + P5: biorad_384_wellplate_50ul_P5 + A6: biorad_384_wellplate_50ul_A6 + B6: biorad_384_wellplate_50ul_B6 + C6: biorad_384_wellplate_50ul_C6 + D6: biorad_384_wellplate_50ul_D6 + E6: biorad_384_wellplate_50ul_E6 + F6: biorad_384_wellplate_50ul_F6 + G6: biorad_384_wellplate_50ul_G6 + H6: biorad_384_wellplate_50ul_H6 + I6: biorad_384_wellplate_50ul_I6 + J6: biorad_384_wellplate_50ul_J6 + K6: biorad_384_wellplate_50ul_K6 + L6: biorad_384_wellplate_50ul_L6 + M6: biorad_384_wellplate_50ul_M6 + N6: biorad_384_wellplate_50ul_N6 + O6: biorad_384_wellplate_50ul_O6 + P6: biorad_384_wellplate_50ul_P6 + A7: biorad_384_wellplate_50ul_A7 + B7: biorad_384_wellplate_50ul_B7 + C7: biorad_384_wellplate_50ul_C7 + D7: biorad_384_wellplate_50ul_D7 + E7: biorad_384_wellplate_50ul_E7 + F7: biorad_384_wellplate_50ul_F7 + G7: biorad_384_wellplate_50ul_G7 + H7: biorad_384_wellplate_50ul_H7 + I7: biorad_384_wellplate_50ul_I7 + J7: biorad_384_wellplate_50ul_J7 + K7: biorad_384_wellplate_50ul_K7 + L7: biorad_384_wellplate_50ul_L7 + M7: biorad_384_wellplate_50ul_M7 + N7: biorad_384_wellplate_50ul_N7 + O7: biorad_384_wellplate_50ul_O7 + P7: biorad_384_wellplate_50ul_P7 + A8: biorad_384_wellplate_50ul_A8 + B8: biorad_384_wellplate_50ul_B8 + C8: biorad_384_wellplate_50ul_C8 + D8: biorad_384_wellplate_50ul_D8 + E8: biorad_384_wellplate_50ul_E8 + F8: biorad_384_wellplate_50ul_F8 + G8: biorad_384_wellplate_50ul_G8 + H8: biorad_384_wellplate_50ul_H8 + I8: biorad_384_wellplate_50ul_I8 + J8: biorad_384_wellplate_50ul_J8 + K8: biorad_384_wellplate_50ul_K8 + L8: biorad_384_wellplate_50ul_L8 + M8: biorad_384_wellplate_50ul_M8 + N8: biorad_384_wellplate_50ul_N8 + O8: biorad_384_wellplate_50ul_O8 + P8: biorad_384_wellplate_50ul_P8 + A9: biorad_384_wellplate_50ul_A9 + B9: biorad_384_wellplate_50ul_B9 + C9: biorad_384_wellplate_50ul_C9 + D9: biorad_384_wellplate_50ul_D9 + E9: biorad_384_wellplate_50ul_E9 + F9: biorad_384_wellplate_50ul_F9 + G9: biorad_384_wellplate_50ul_G9 + H9: biorad_384_wellplate_50ul_H9 + I9: biorad_384_wellplate_50ul_I9 + J9: biorad_384_wellplate_50ul_J9 + K9: biorad_384_wellplate_50ul_K9 + L9: biorad_384_wellplate_50ul_L9 + M9: biorad_384_wellplate_50ul_M9 + N9: biorad_384_wellplate_50ul_N9 + O9: biorad_384_wellplate_50ul_O9 + P9: biorad_384_wellplate_50ul_P9 + A10: biorad_384_wellplate_50ul_A10 + B10: biorad_384_wellplate_50ul_B10 + C10: biorad_384_wellplate_50ul_C10 + D10: biorad_384_wellplate_50ul_D10 + E10: biorad_384_wellplate_50ul_E10 + F10: biorad_384_wellplate_50ul_F10 + G10: biorad_384_wellplate_50ul_G10 + H10: biorad_384_wellplate_50ul_H10 + I10: biorad_384_wellplate_50ul_I10 + J10: biorad_384_wellplate_50ul_J10 + K10: biorad_384_wellplate_50ul_K10 + L10: biorad_384_wellplate_50ul_L10 + M10: biorad_384_wellplate_50ul_M10 + N10: biorad_384_wellplate_50ul_N10 + O10: biorad_384_wellplate_50ul_O10 + P10: biorad_384_wellplate_50ul_P10 + A11: biorad_384_wellplate_50ul_A11 + B11: biorad_384_wellplate_50ul_B11 + C11: biorad_384_wellplate_50ul_C11 + D11: biorad_384_wellplate_50ul_D11 + E11: biorad_384_wellplate_50ul_E11 + F11: biorad_384_wellplate_50ul_F11 + G11: biorad_384_wellplate_50ul_G11 + H11: biorad_384_wellplate_50ul_H11 + I11: biorad_384_wellplate_50ul_I11 + J11: biorad_384_wellplate_50ul_J11 + K11: biorad_384_wellplate_50ul_K11 + L11: biorad_384_wellplate_50ul_L11 + M11: biorad_384_wellplate_50ul_M11 + N11: biorad_384_wellplate_50ul_N11 + O11: biorad_384_wellplate_50ul_O11 + P11: biorad_384_wellplate_50ul_P11 + A12: biorad_384_wellplate_50ul_A12 + B12: biorad_384_wellplate_50ul_B12 + C12: biorad_384_wellplate_50ul_C12 + D12: biorad_384_wellplate_50ul_D12 + E12: biorad_384_wellplate_50ul_E12 + F12: biorad_384_wellplate_50ul_F12 + G12: biorad_384_wellplate_50ul_G12 + H12: biorad_384_wellplate_50ul_H12 + I12: biorad_384_wellplate_50ul_I12 + J12: biorad_384_wellplate_50ul_J12 + K12: biorad_384_wellplate_50ul_K12 + L12: biorad_384_wellplate_50ul_L12 + M12: biorad_384_wellplate_50ul_M12 + N12: biorad_384_wellplate_50ul_N12 + O12: biorad_384_wellplate_50ul_O12 + P12: biorad_384_wellplate_50ul_P12 + A13: biorad_384_wellplate_50ul_A13 + B13: biorad_384_wellplate_50ul_B13 + C13: biorad_384_wellplate_50ul_C13 + D13: biorad_384_wellplate_50ul_D13 + E13: biorad_384_wellplate_50ul_E13 + F13: biorad_384_wellplate_50ul_F13 + G13: biorad_384_wellplate_50ul_G13 + H13: biorad_384_wellplate_50ul_H13 + I13: biorad_384_wellplate_50ul_I13 + J13: biorad_384_wellplate_50ul_J13 + K13: biorad_384_wellplate_50ul_K13 + L13: biorad_384_wellplate_50ul_L13 + M13: biorad_384_wellplate_50ul_M13 + N13: biorad_384_wellplate_50ul_N13 + O13: biorad_384_wellplate_50ul_O13 + P13: biorad_384_wellplate_50ul_P13 + A14: biorad_384_wellplate_50ul_A14 + B14: biorad_384_wellplate_50ul_B14 + C14: biorad_384_wellplate_50ul_C14 + D14: biorad_384_wellplate_50ul_D14 + E14: biorad_384_wellplate_50ul_E14 + F14: biorad_384_wellplate_50ul_F14 + G14: biorad_384_wellplate_50ul_G14 + H14: biorad_384_wellplate_50ul_H14 + I14: biorad_384_wellplate_50ul_I14 + J14: biorad_384_wellplate_50ul_J14 + K14: biorad_384_wellplate_50ul_K14 + L14: biorad_384_wellplate_50ul_L14 + M14: biorad_384_wellplate_50ul_M14 + N14: biorad_384_wellplate_50ul_N14 + O14: biorad_384_wellplate_50ul_O14 + P14: biorad_384_wellplate_50ul_P14 + A15: biorad_384_wellplate_50ul_A15 + B15: biorad_384_wellplate_50ul_B15 + C15: biorad_384_wellplate_50ul_C15 + D15: biorad_384_wellplate_50ul_D15 + E15: biorad_384_wellplate_50ul_E15 + F15: biorad_384_wellplate_50ul_F15 + G15: biorad_384_wellplate_50ul_G15 + H15: biorad_384_wellplate_50ul_H15 + I15: biorad_384_wellplate_50ul_I15 + J15: biorad_384_wellplate_50ul_J15 + K15: biorad_384_wellplate_50ul_K15 + L15: biorad_384_wellplate_50ul_L15 + M15: biorad_384_wellplate_50ul_M15 + N15: biorad_384_wellplate_50ul_N15 + O15: biorad_384_wellplate_50ul_O15 + P15: biorad_384_wellplate_50ul_P15 + A16: biorad_384_wellplate_50ul_A16 + B16: biorad_384_wellplate_50ul_B16 + C16: biorad_384_wellplate_50ul_C16 + D16: biorad_384_wellplate_50ul_D16 + E16: biorad_384_wellplate_50ul_E16 + F16: biorad_384_wellplate_50ul_F16 + G16: biorad_384_wellplate_50ul_G16 + H16: biorad_384_wellplate_50ul_H16 + I16: biorad_384_wellplate_50ul_I16 + J16: biorad_384_wellplate_50ul_J16 + K16: biorad_384_wellplate_50ul_K16 + L16: biorad_384_wellplate_50ul_L16 + M16: biorad_384_wellplate_50ul_M16 + N16: biorad_384_wellplate_50ul_N16 + O16: biorad_384_wellplate_50ul_O16 + P16: biorad_384_wellplate_50ul_P16 + A17: biorad_384_wellplate_50ul_A17 + B17: biorad_384_wellplate_50ul_B17 + C17: biorad_384_wellplate_50ul_C17 + D17: biorad_384_wellplate_50ul_D17 + E17: biorad_384_wellplate_50ul_E17 + F17: biorad_384_wellplate_50ul_F17 + G17: biorad_384_wellplate_50ul_G17 + H17: biorad_384_wellplate_50ul_H17 + I17: biorad_384_wellplate_50ul_I17 + J17: biorad_384_wellplate_50ul_J17 + K17: biorad_384_wellplate_50ul_K17 + L17: biorad_384_wellplate_50ul_L17 + M17: biorad_384_wellplate_50ul_M17 + N17: biorad_384_wellplate_50ul_N17 + O17: biorad_384_wellplate_50ul_O17 + P17: biorad_384_wellplate_50ul_P17 + A18: biorad_384_wellplate_50ul_A18 + B18: biorad_384_wellplate_50ul_B18 + C18: biorad_384_wellplate_50ul_C18 + D18: biorad_384_wellplate_50ul_D18 + E18: biorad_384_wellplate_50ul_E18 + F18: biorad_384_wellplate_50ul_F18 + G18: biorad_384_wellplate_50ul_G18 + H18: biorad_384_wellplate_50ul_H18 + I18: biorad_384_wellplate_50ul_I18 + J18: biorad_384_wellplate_50ul_J18 + K18: biorad_384_wellplate_50ul_K18 + L18: biorad_384_wellplate_50ul_L18 + M18: biorad_384_wellplate_50ul_M18 + N18: biorad_384_wellplate_50ul_N18 + O18: biorad_384_wellplate_50ul_O18 + P18: biorad_384_wellplate_50ul_P18 + A19: biorad_384_wellplate_50ul_A19 + B19: biorad_384_wellplate_50ul_B19 + C19: biorad_384_wellplate_50ul_C19 + D19: biorad_384_wellplate_50ul_D19 + E19: biorad_384_wellplate_50ul_E19 + F19: biorad_384_wellplate_50ul_F19 + G19: biorad_384_wellplate_50ul_G19 + H19: biorad_384_wellplate_50ul_H19 + I19: biorad_384_wellplate_50ul_I19 + J19: biorad_384_wellplate_50ul_J19 + K19: biorad_384_wellplate_50ul_K19 + L19: biorad_384_wellplate_50ul_L19 + M19: biorad_384_wellplate_50ul_M19 + N19: biorad_384_wellplate_50ul_N19 + O19: biorad_384_wellplate_50ul_O19 + P19: biorad_384_wellplate_50ul_P19 + A20: biorad_384_wellplate_50ul_A20 + B20: biorad_384_wellplate_50ul_B20 + C20: biorad_384_wellplate_50ul_C20 + D20: biorad_384_wellplate_50ul_D20 + E20: biorad_384_wellplate_50ul_E20 + F20: biorad_384_wellplate_50ul_F20 + G20: biorad_384_wellplate_50ul_G20 + H20: biorad_384_wellplate_50ul_H20 + I20: biorad_384_wellplate_50ul_I20 + J20: biorad_384_wellplate_50ul_J20 + K20: biorad_384_wellplate_50ul_K20 + L20: biorad_384_wellplate_50ul_L20 + M20: biorad_384_wellplate_50ul_M20 + N20: biorad_384_wellplate_50ul_N20 + O20: biorad_384_wellplate_50ul_O20 + P20: biorad_384_wellplate_50ul_P20 + A21: biorad_384_wellplate_50ul_A21 + B21: biorad_384_wellplate_50ul_B21 + C21: biorad_384_wellplate_50ul_C21 + D21: biorad_384_wellplate_50ul_D21 + E21: biorad_384_wellplate_50ul_E21 + F21: biorad_384_wellplate_50ul_F21 + G21: biorad_384_wellplate_50ul_G21 + H21: biorad_384_wellplate_50ul_H21 + I21: biorad_384_wellplate_50ul_I21 + J21: biorad_384_wellplate_50ul_J21 + K21: biorad_384_wellplate_50ul_K21 + L21: biorad_384_wellplate_50ul_L21 + M21: biorad_384_wellplate_50ul_M21 + N21: biorad_384_wellplate_50ul_N21 + O21: biorad_384_wellplate_50ul_O21 + P21: biorad_384_wellplate_50ul_P21 + A22: biorad_384_wellplate_50ul_A22 + B22: biorad_384_wellplate_50ul_B22 + C22: biorad_384_wellplate_50ul_C22 + D22: biorad_384_wellplate_50ul_D22 + E22: biorad_384_wellplate_50ul_E22 + F22: biorad_384_wellplate_50ul_F22 + G22: biorad_384_wellplate_50ul_G22 + H22: biorad_384_wellplate_50ul_H22 + I22: biorad_384_wellplate_50ul_I22 + J22: biorad_384_wellplate_50ul_J22 + K22: biorad_384_wellplate_50ul_K22 + L22: biorad_384_wellplate_50ul_L22 + M22: biorad_384_wellplate_50ul_M22 + N22: biorad_384_wellplate_50ul_N22 + O22: biorad_384_wellplate_50ul_O22 + P22: biorad_384_wellplate_50ul_P22 + A23: biorad_384_wellplate_50ul_A23 + B23: biorad_384_wellplate_50ul_B23 + C23: biorad_384_wellplate_50ul_C23 + D23: biorad_384_wellplate_50ul_D23 + E23: biorad_384_wellplate_50ul_E23 + F23: biorad_384_wellplate_50ul_F23 + G23: biorad_384_wellplate_50ul_G23 + H23: biorad_384_wellplate_50ul_H23 + I23: biorad_384_wellplate_50ul_I23 + J23: biorad_384_wellplate_50ul_J23 + K23: biorad_384_wellplate_50ul_K23 + L23: biorad_384_wellplate_50ul_L23 + M23: biorad_384_wellplate_50ul_M23 + N23: biorad_384_wellplate_50ul_N23 + O23: biorad_384_wellplate_50ul_O23 + P23: biorad_384_wellplate_50ul_P23 + A24: biorad_384_wellplate_50ul_A24 + B24: biorad_384_wellplate_50ul_B24 + C24: biorad_384_wellplate_50ul_C24 + D24: biorad_384_wellplate_50ul_D24 + E24: biorad_384_wellplate_50ul_E24 + F24: biorad_384_wellplate_50ul_F24 + G24: biorad_384_wellplate_50ul_G24 + H24: biorad_384_wellplate_50ul_H24 + I24: biorad_384_wellplate_50ul_I24 + J24: biorad_384_wellplate_50ul_J24 + K24: biorad_384_wellplate_50ul_K24 + L24: biorad_384_wellplate_50ul_L24 + M24: biorad_384_wellplate_50ul_M24 + N24: biorad_384_wellplate_50ul_N24 + O24: biorad_384_wellplate_50ul_O24 + P24: biorad_384_wellplate_50ul_P24 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.76 + size_y: 85.48 + size_z: 10.4 + type: Plate + data: {} + id: biorad_384_wellplate_50ul + name: biorad_384_wellplate_50ul + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: plate + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_A1 + name: biorad_384_wellplate_50ul_A1 + parent: biorad_384_wellplate_50ul + position: + x: 11.034 + y: 75.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_B1 + name: biorad_384_wellplate_50ul_B1 + parent: biorad_384_wellplate_50ul + position: + x: 11.034 + y: 70.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_C1 + name: biorad_384_wellplate_50ul_C1 + parent: biorad_384_wellplate_50ul + position: + x: 11.034 + y: 66.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_D1 + name: biorad_384_wellplate_50ul_D1 + parent: biorad_384_wellplate_50ul + position: + x: 11.034 + y: 61.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_E1 + name: biorad_384_wellplate_50ul_E1 + parent: biorad_384_wellplate_50ul + position: + x: 11.034 + y: 57.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_F1 + name: biorad_384_wellplate_50ul_F1 + parent: biorad_384_wellplate_50ul + position: + x: 11.034 + y: 52.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_G1 + name: biorad_384_wellplate_50ul_G1 + parent: biorad_384_wellplate_50ul + position: + x: 11.034 + y: 48.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_H1 + name: biorad_384_wellplate_50ul_H1 + parent: biorad_384_wellplate_50ul + position: + x: 11.034 + y: 43.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_I1 + name: biorad_384_wellplate_50ul_I1 + parent: biorad_384_wellplate_50ul + position: + x: 11.034 + y: 39.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_J1 + name: biorad_384_wellplate_50ul_J1 + parent: biorad_384_wellplate_50ul + position: + x: 11.034 + y: 34.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_K1 + name: biorad_384_wellplate_50ul_K1 + parent: biorad_384_wellplate_50ul + position: + x: 11.034 + y: 30.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_L1 + name: biorad_384_wellplate_50ul_L1 + parent: biorad_384_wellplate_50ul + position: + x: 11.034 + y: 25.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_M1 + name: biorad_384_wellplate_50ul_M1 + parent: biorad_384_wellplate_50ul + position: + x: 11.034 + y: 21.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_N1 + name: biorad_384_wellplate_50ul_N1 + parent: biorad_384_wellplate_50ul + position: + x: 11.034 + y: 16.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_O1 + name: biorad_384_wellplate_50ul_O1 + parent: biorad_384_wellplate_50ul + position: + x: 11.034 + y: 12.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_P1 + name: biorad_384_wellplate_50ul_P1 + parent: biorad_384_wellplate_50ul + position: + x: 11.034 + y: 7.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_A2 + name: biorad_384_wellplate_50ul_A2 + parent: biorad_384_wellplate_50ul + position: + x: 15.534 + y: 75.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_B2 + name: biorad_384_wellplate_50ul_B2 + parent: biorad_384_wellplate_50ul + position: + x: 15.534 + y: 70.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_C2 + name: biorad_384_wellplate_50ul_C2 + parent: biorad_384_wellplate_50ul + position: + x: 15.534 + y: 66.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_D2 + name: biorad_384_wellplate_50ul_D2 + parent: biorad_384_wellplate_50ul + position: + x: 15.534 + y: 61.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_E2 + name: biorad_384_wellplate_50ul_E2 + parent: biorad_384_wellplate_50ul + position: + x: 15.534 + y: 57.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_F2 + name: biorad_384_wellplate_50ul_F2 + parent: biorad_384_wellplate_50ul + position: + x: 15.534 + y: 52.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_G2 + name: biorad_384_wellplate_50ul_G2 + parent: biorad_384_wellplate_50ul + position: + x: 15.534 + y: 48.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_H2 + name: biorad_384_wellplate_50ul_H2 + parent: biorad_384_wellplate_50ul + position: + x: 15.534 + y: 43.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_I2 + name: biorad_384_wellplate_50ul_I2 + parent: biorad_384_wellplate_50ul + position: + x: 15.534 + y: 39.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_J2 + name: biorad_384_wellplate_50ul_J2 + parent: biorad_384_wellplate_50ul + position: + x: 15.534 + y: 34.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_K2 + name: biorad_384_wellplate_50ul_K2 + parent: biorad_384_wellplate_50ul + position: + x: 15.534 + y: 30.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_L2 + name: biorad_384_wellplate_50ul_L2 + parent: biorad_384_wellplate_50ul + position: + x: 15.534 + y: 25.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_M2 + name: biorad_384_wellplate_50ul_M2 + parent: biorad_384_wellplate_50ul + position: + x: 15.534 + y: 21.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_N2 + name: biorad_384_wellplate_50ul_N2 + parent: biorad_384_wellplate_50ul + position: + x: 15.534 + y: 16.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_O2 + name: biorad_384_wellplate_50ul_O2 + parent: biorad_384_wellplate_50ul + position: + x: 15.534 + y: 12.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_P2 + name: biorad_384_wellplate_50ul_P2 + parent: biorad_384_wellplate_50ul + position: + x: 15.534 + y: 7.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_A3 + name: biorad_384_wellplate_50ul_A3 + parent: biorad_384_wellplate_50ul + position: + x: 20.034 + y: 75.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_B3 + name: biorad_384_wellplate_50ul_B3 + parent: biorad_384_wellplate_50ul + position: + x: 20.034 + y: 70.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_C3 + name: biorad_384_wellplate_50ul_C3 + parent: biorad_384_wellplate_50ul + position: + x: 20.034 + y: 66.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_D3 + name: biorad_384_wellplate_50ul_D3 + parent: biorad_384_wellplate_50ul + position: + x: 20.034 + y: 61.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_E3 + name: biorad_384_wellplate_50ul_E3 + parent: biorad_384_wellplate_50ul + position: + x: 20.034 + y: 57.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_F3 + name: biorad_384_wellplate_50ul_F3 + parent: biorad_384_wellplate_50ul + position: + x: 20.034 + y: 52.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_G3 + name: biorad_384_wellplate_50ul_G3 + parent: biorad_384_wellplate_50ul + position: + x: 20.034 + y: 48.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_H3 + name: biorad_384_wellplate_50ul_H3 + parent: biorad_384_wellplate_50ul + position: + x: 20.034 + y: 43.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_I3 + name: biorad_384_wellplate_50ul_I3 + parent: biorad_384_wellplate_50ul + position: + x: 20.034 + y: 39.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_J3 + name: biorad_384_wellplate_50ul_J3 + parent: biorad_384_wellplate_50ul + position: + x: 20.034 + y: 34.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_K3 + name: biorad_384_wellplate_50ul_K3 + parent: biorad_384_wellplate_50ul + position: + x: 20.034 + y: 30.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_L3 + name: biorad_384_wellplate_50ul_L3 + parent: biorad_384_wellplate_50ul + position: + x: 20.034 + y: 25.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_M3 + name: biorad_384_wellplate_50ul_M3 + parent: biorad_384_wellplate_50ul + position: + x: 20.034 + y: 21.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_N3 + name: biorad_384_wellplate_50ul_N3 + parent: biorad_384_wellplate_50ul + position: + x: 20.034 + y: 16.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_O3 + name: biorad_384_wellplate_50ul_O3 + parent: biorad_384_wellplate_50ul + position: + x: 20.034 + y: 12.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_P3 + name: biorad_384_wellplate_50ul_P3 + parent: biorad_384_wellplate_50ul + position: + x: 20.034 + y: 7.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_A4 + name: biorad_384_wellplate_50ul_A4 + parent: biorad_384_wellplate_50ul + position: + x: 24.534 + y: 75.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_B4 + name: biorad_384_wellplate_50ul_B4 + parent: biorad_384_wellplate_50ul + position: + x: 24.534 + y: 70.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_C4 + name: biorad_384_wellplate_50ul_C4 + parent: biorad_384_wellplate_50ul + position: + x: 24.534 + y: 66.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_D4 + name: biorad_384_wellplate_50ul_D4 + parent: biorad_384_wellplate_50ul + position: + x: 24.534 + y: 61.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_E4 + name: biorad_384_wellplate_50ul_E4 + parent: biorad_384_wellplate_50ul + position: + x: 24.534 + y: 57.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_F4 + name: biorad_384_wellplate_50ul_F4 + parent: biorad_384_wellplate_50ul + position: + x: 24.534 + y: 52.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_G4 + name: biorad_384_wellplate_50ul_G4 + parent: biorad_384_wellplate_50ul + position: + x: 24.534 + y: 48.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_H4 + name: biorad_384_wellplate_50ul_H4 + parent: biorad_384_wellplate_50ul + position: + x: 24.534 + y: 43.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_I4 + name: biorad_384_wellplate_50ul_I4 + parent: biorad_384_wellplate_50ul + position: + x: 24.534 + y: 39.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_J4 + name: biorad_384_wellplate_50ul_J4 + parent: biorad_384_wellplate_50ul + position: + x: 24.534 + y: 34.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_K4 + name: biorad_384_wellplate_50ul_K4 + parent: biorad_384_wellplate_50ul + position: + x: 24.534 + y: 30.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_L4 + name: biorad_384_wellplate_50ul_L4 + parent: biorad_384_wellplate_50ul + position: + x: 24.534 + y: 25.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_M4 + name: biorad_384_wellplate_50ul_M4 + parent: biorad_384_wellplate_50ul + position: + x: 24.534 + y: 21.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_N4 + name: biorad_384_wellplate_50ul_N4 + parent: biorad_384_wellplate_50ul + position: + x: 24.534 + y: 16.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_O4 + name: biorad_384_wellplate_50ul_O4 + parent: biorad_384_wellplate_50ul + position: + x: 24.534 + y: 12.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_P4 + name: biorad_384_wellplate_50ul_P4 + parent: biorad_384_wellplate_50ul + position: + x: 24.534 + y: 7.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_A5 + name: biorad_384_wellplate_50ul_A5 + parent: biorad_384_wellplate_50ul + position: + x: 29.034 + y: 75.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_B5 + name: biorad_384_wellplate_50ul_B5 + parent: biorad_384_wellplate_50ul + position: + x: 29.034 + y: 70.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_C5 + name: biorad_384_wellplate_50ul_C5 + parent: biorad_384_wellplate_50ul + position: + x: 29.034 + y: 66.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_D5 + name: biorad_384_wellplate_50ul_D5 + parent: biorad_384_wellplate_50ul + position: + x: 29.034 + y: 61.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_E5 + name: biorad_384_wellplate_50ul_E5 + parent: biorad_384_wellplate_50ul + position: + x: 29.034 + y: 57.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_F5 + name: biorad_384_wellplate_50ul_F5 + parent: biorad_384_wellplate_50ul + position: + x: 29.034 + y: 52.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_G5 + name: biorad_384_wellplate_50ul_G5 + parent: biorad_384_wellplate_50ul + position: + x: 29.034 + y: 48.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_H5 + name: biorad_384_wellplate_50ul_H5 + parent: biorad_384_wellplate_50ul + position: + x: 29.034 + y: 43.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_I5 + name: biorad_384_wellplate_50ul_I5 + parent: biorad_384_wellplate_50ul + position: + x: 29.034 + y: 39.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_J5 + name: biorad_384_wellplate_50ul_J5 + parent: biorad_384_wellplate_50ul + position: + x: 29.034 + y: 34.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_K5 + name: biorad_384_wellplate_50ul_K5 + parent: biorad_384_wellplate_50ul + position: + x: 29.034 + y: 30.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_L5 + name: biorad_384_wellplate_50ul_L5 + parent: biorad_384_wellplate_50ul + position: + x: 29.034 + y: 25.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_M5 + name: biorad_384_wellplate_50ul_M5 + parent: biorad_384_wellplate_50ul + position: + x: 29.034 + y: 21.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_N5 + name: biorad_384_wellplate_50ul_N5 + parent: biorad_384_wellplate_50ul + position: + x: 29.034 + y: 16.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_O5 + name: biorad_384_wellplate_50ul_O5 + parent: biorad_384_wellplate_50ul + position: + x: 29.034 + y: 12.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_P5 + name: biorad_384_wellplate_50ul_P5 + parent: biorad_384_wellplate_50ul + position: + x: 29.034 + y: 7.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_A6 + name: biorad_384_wellplate_50ul_A6 + parent: biorad_384_wellplate_50ul + position: + x: 33.534 + y: 75.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_B6 + name: biorad_384_wellplate_50ul_B6 + parent: biorad_384_wellplate_50ul + position: + x: 33.534 + y: 70.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_C6 + name: biorad_384_wellplate_50ul_C6 + parent: biorad_384_wellplate_50ul + position: + x: 33.534 + y: 66.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_D6 + name: biorad_384_wellplate_50ul_D6 + parent: biorad_384_wellplate_50ul + position: + x: 33.534 + y: 61.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_E6 + name: biorad_384_wellplate_50ul_E6 + parent: biorad_384_wellplate_50ul + position: + x: 33.534 + y: 57.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_F6 + name: biorad_384_wellplate_50ul_F6 + parent: biorad_384_wellplate_50ul + position: + x: 33.534 + y: 52.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_G6 + name: biorad_384_wellplate_50ul_G6 + parent: biorad_384_wellplate_50ul + position: + x: 33.534 + y: 48.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_H6 + name: biorad_384_wellplate_50ul_H6 + parent: biorad_384_wellplate_50ul + position: + x: 33.534 + y: 43.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_I6 + name: biorad_384_wellplate_50ul_I6 + parent: biorad_384_wellplate_50ul + position: + x: 33.534 + y: 39.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_J6 + name: biorad_384_wellplate_50ul_J6 + parent: biorad_384_wellplate_50ul + position: + x: 33.534 + y: 34.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_K6 + name: biorad_384_wellplate_50ul_K6 + parent: biorad_384_wellplate_50ul + position: + x: 33.534 + y: 30.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_L6 + name: biorad_384_wellplate_50ul_L6 + parent: biorad_384_wellplate_50ul + position: + x: 33.534 + y: 25.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_M6 + name: biorad_384_wellplate_50ul_M6 + parent: biorad_384_wellplate_50ul + position: + x: 33.534 + y: 21.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_N6 + name: biorad_384_wellplate_50ul_N6 + parent: biorad_384_wellplate_50ul + position: + x: 33.534 + y: 16.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_O6 + name: biorad_384_wellplate_50ul_O6 + parent: biorad_384_wellplate_50ul + position: + x: 33.534 + y: 12.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_P6 + name: biorad_384_wellplate_50ul_P6 + parent: biorad_384_wellplate_50ul + position: + x: 33.534 + y: 7.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_A7 + name: biorad_384_wellplate_50ul_A7 + parent: biorad_384_wellplate_50ul + position: + x: 38.034 + y: 75.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_B7 + name: biorad_384_wellplate_50ul_B7 + parent: biorad_384_wellplate_50ul + position: + x: 38.034 + y: 70.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_C7 + name: biorad_384_wellplate_50ul_C7 + parent: biorad_384_wellplate_50ul + position: + x: 38.034 + y: 66.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_D7 + name: biorad_384_wellplate_50ul_D7 + parent: biorad_384_wellplate_50ul + position: + x: 38.034 + y: 61.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_E7 + name: biorad_384_wellplate_50ul_E7 + parent: biorad_384_wellplate_50ul + position: + x: 38.034 + y: 57.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_F7 + name: biorad_384_wellplate_50ul_F7 + parent: biorad_384_wellplate_50ul + position: + x: 38.034 + y: 52.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_G7 + name: biorad_384_wellplate_50ul_G7 + parent: biorad_384_wellplate_50ul + position: + x: 38.034 + y: 48.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_H7 + name: biorad_384_wellplate_50ul_H7 + parent: biorad_384_wellplate_50ul + position: + x: 38.034 + y: 43.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_I7 + name: biorad_384_wellplate_50ul_I7 + parent: biorad_384_wellplate_50ul + position: + x: 38.034 + y: 39.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_J7 + name: biorad_384_wellplate_50ul_J7 + parent: biorad_384_wellplate_50ul + position: + x: 38.034 + y: 34.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_K7 + name: biorad_384_wellplate_50ul_K7 + parent: biorad_384_wellplate_50ul + position: + x: 38.034 + y: 30.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_L7 + name: biorad_384_wellplate_50ul_L7 + parent: biorad_384_wellplate_50ul + position: + x: 38.034 + y: 25.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_M7 + name: biorad_384_wellplate_50ul_M7 + parent: biorad_384_wellplate_50ul + position: + x: 38.034 + y: 21.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_N7 + name: biorad_384_wellplate_50ul_N7 + parent: biorad_384_wellplate_50ul + position: + x: 38.034 + y: 16.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_O7 + name: biorad_384_wellplate_50ul_O7 + parent: biorad_384_wellplate_50ul + position: + x: 38.034 + y: 12.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_P7 + name: biorad_384_wellplate_50ul_P7 + parent: biorad_384_wellplate_50ul + position: + x: 38.034 + y: 7.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_A8 + name: biorad_384_wellplate_50ul_A8 + parent: biorad_384_wellplate_50ul + position: + x: 42.534 + y: 75.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_B8 + name: biorad_384_wellplate_50ul_B8 + parent: biorad_384_wellplate_50ul + position: + x: 42.534 + y: 70.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_C8 + name: biorad_384_wellplate_50ul_C8 + parent: biorad_384_wellplate_50ul + position: + x: 42.534 + y: 66.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_D8 + name: biorad_384_wellplate_50ul_D8 + parent: biorad_384_wellplate_50ul + position: + x: 42.534 + y: 61.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_E8 + name: biorad_384_wellplate_50ul_E8 + parent: biorad_384_wellplate_50ul + position: + x: 42.534 + y: 57.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_F8 + name: biorad_384_wellplate_50ul_F8 + parent: biorad_384_wellplate_50ul + position: + x: 42.534 + y: 52.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_G8 + name: biorad_384_wellplate_50ul_G8 + parent: biorad_384_wellplate_50ul + position: + x: 42.534 + y: 48.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_H8 + name: biorad_384_wellplate_50ul_H8 + parent: biorad_384_wellplate_50ul + position: + x: 42.534 + y: 43.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_I8 + name: biorad_384_wellplate_50ul_I8 + parent: biorad_384_wellplate_50ul + position: + x: 42.534 + y: 39.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_J8 + name: biorad_384_wellplate_50ul_J8 + parent: biorad_384_wellplate_50ul + position: + x: 42.534 + y: 34.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_K8 + name: biorad_384_wellplate_50ul_K8 + parent: biorad_384_wellplate_50ul + position: + x: 42.534 + y: 30.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_L8 + name: biorad_384_wellplate_50ul_L8 + parent: biorad_384_wellplate_50ul + position: + x: 42.534 + y: 25.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_M8 + name: biorad_384_wellplate_50ul_M8 + parent: biorad_384_wellplate_50ul + position: + x: 42.534 + y: 21.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_N8 + name: biorad_384_wellplate_50ul_N8 + parent: biorad_384_wellplate_50ul + position: + x: 42.534 + y: 16.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_O8 + name: biorad_384_wellplate_50ul_O8 + parent: biorad_384_wellplate_50ul + position: + x: 42.534 + y: 12.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_P8 + name: biorad_384_wellplate_50ul_P8 + parent: biorad_384_wellplate_50ul + position: + x: 42.534 + y: 7.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_A9 + name: biorad_384_wellplate_50ul_A9 + parent: biorad_384_wellplate_50ul + position: + x: 47.034 + y: 75.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_B9 + name: biorad_384_wellplate_50ul_B9 + parent: biorad_384_wellplate_50ul + position: + x: 47.034 + y: 70.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_C9 + name: biorad_384_wellplate_50ul_C9 + parent: biorad_384_wellplate_50ul + position: + x: 47.034 + y: 66.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_D9 + name: biorad_384_wellplate_50ul_D9 + parent: biorad_384_wellplate_50ul + position: + x: 47.034 + y: 61.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_E9 + name: biorad_384_wellplate_50ul_E9 + parent: biorad_384_wellplate_50ul + position: + x: 47.034 + y: 57.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_F9 + name: biorad_384_wellplate_50ul_F9 + parent: biorad_384_wellplate_50ul + position: + x: 47.034 + y: 52.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_G9 + name: biorad_384_wellplate_50ul_G9 + parent: biorad_384_wellplate_50ul + position: + x: 47.034 + y: 48.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_H9 + name: biorad_384_wellplate_50ul_H9 + parent: biorad_384_wellplate_50ul + position: + x: 47.034 + y: 43.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_I9 + name: biorad_384_wellplate_50ul_I9 + parent: biorad_384_wellplate_50ul + position: + x: 47.034 + y: 39.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_J9 + name: biorad_384_wellplate_50ul_J9 + parent: biorad_384_wellplate_50ul + position: + x: 47.034 + y: 34.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_K9 + name: biorad_384_wellplate_50ul_K9 + parent: biorad_384_wellplate_50ul + position: + x: 47.034 + y: 30.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_L9 + name: biorad_384_wellplate_50ul_L9 + parent: biorad_384_wellplate_50ul + position: + x: 47.034 + y: 25.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_M9 + name: biorad_384_wellplate_50ul_M9 + parent: biorad_384_wellplate_50ul + position: + x: 47.034 + y: 21.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_N9 + name: biorad_384_wellplate_50ul_N9 + parent: biorad_384_wellplate_50ul + position: + x: 47.034 + y: 16.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_O9 + name: biorad_384_wellplate_50ul_O9 + parent: biorad_384_wellplate_50ul + position: + x: 47.034 + y: 12.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_P9 + name: biorad_384_wellplate_50ul_P9 + parent: biorad_384_wellplate_50ul + position: + x: 47.034 + y: 7.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_A10 + name: biorad_384_wellplate_50ul_A10 + parent: biorad_384_wellplate_50ul + position: + x: 51.534 + y: 75.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_B10 + name: biorad_384_wellplate_50ul_B10 + parent: biorad_384_wellplate_50ul + position: + x: 51.534 + y: 70.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_C10 + name: biorad_384_wellplate_50ul_C10 + parent: biorad_384_wellplate_50ul + position: + x: 51.534 + y: 66.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_D10 + name: biorad_384_wellplate_50ul_D10 + parent: biorad_384_wellplate_50ul + position: + x: 51.534 + y: 61.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_E10 + name: biorad_384_wellplate_50ul_E10 + parent: biorad_384_wellplate_50ul + position: + x: 51.534 + y: 57.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_F10 + name: biorad_384_wellplate_50ul_F10 + parent: biorad_384_wellplate_50ul + position: + x: 51.534 + y: 52.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_G10 + name: biorad_384_wellplate_50ul_G10 + parent: biorad_384_wellplate_50ul + position: + x: 51.534 + y: 48.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_H10 + name: biorad_384_wellplate_50ul_H10 + parent: biorad_384_wellplate_50ul + position: + x: 51.534 + y: 43.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_I10 + name: biorad_384_wellplate_50ul_I10 + parent: biorad_384_wellplate_50ul + position: + x: 51.534 + y: 39.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_J10 + name: biorad_384_wellplate_50ul_J10 + parent: biorad_384_wellplate_50ul + position: + x: 51.534 + y: 34.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_K10 + name: biorad_384_wellplate_50ul_K10 + parent: biorad_384_wellplate_50ul + position: + x: 51.534 + y: 30.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_L10 + name: biorad_384_wellplate_50ul_L10 + parent: biorad_384_wellplate_50ul + position: + x: 51.534 + y: 25.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_M10 + name: biorad_384_wellplate_50ul_M10 + parent: biorad_384_wellplate_50ul + position: + x: 51.534 + y: 21.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_N10 + name: biorad_384_wellplate_50ul_N10 + parent: biorad_384_wellplate_50ul + position: + x: 51.534 + y: 16.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_O10 + name: biorad_384_wellplate_50ul_O10 + parent: biorad_384_wellplate_50ul + position: + x: 51.534 + y: 12.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_P10 + name: biorad_384_wellplate_50ul_P10 + parent: biorad_384_wellplate_50ul + position: + x: 51.534 + y: 7.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_A11 + name: biorad_384_wellplate_50ul_A11 + parent: biorad_384_wellplate_50ul + position: + x: 56.034 + y: 75.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_B11 + name: biorad_384_wellplate_50ul_B11 + parent: biorad_384_wellplate_50ul + position: + x: 56.034 + y: 70.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_C11 + name: biorad_384_wellplate_50ul_C11 + parent: biorad_384_wellplate_50ul + position: + x: 56.034 + y: 66.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_D11 + name: biorad_384_wellplate_50ul_D11 + parent: biorad_384_wellplate_50ul + position: + x: 56.034 + y: 61.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_E11 + name: biorad_384_wellplate_50ul_E11 + parent: biorad_384_wellplate_50ul + position: + x: 56.034 + y: 57.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_F11 + name: biorad_384_wellplate_50ul_F11 + parent: biorad_384_wellplate_50ul + position: + x: 56.034 + y: 52.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_G11 + name: biorad_384_wellplate_50ul_G11 + parent: biorad_384_wellplate_50ul + position: + x: 56.034 + y: 48.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_H11 + name: biorad_384_wellplate_50ul_H11 + parent: biorad_384_wellplate_50ul + position: + x: 56.034 + y: 43.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_I11 + name: biorad_384_wellplate_50ul_I11 + parent: biorad_384_wellplate_50ul + position: + x: 56.034 + y: 39.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_J11 + name: biorad_384_wellplate_50ul_J11 + parent: biorad_384_wellplate_50ul + position: + x: 56.034 + y: 34.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_K11 + name: biorad_384_wellplate_50ul_K11 + parent: biorad_384_wellplate_50ul + position: + x: 56.034 + y: 30.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_L11 + name: biorad_384_wellplate_50ul_L11 + parent: biorad_384_wellplate_50ul + position: + x: 56.034 + y: 25.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_M11 + name: biorad_384_wellplate_50ul_M11 + parent: biorad_384_wellplate_50ul + position: + x: 56.034 + y: 21.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_N11 + name: biorad_384_wellplate_50ul_N11 + parent: biorad_384_wellplate_50ul + position: + x: 56.034 + y: 16.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_O11 + name: biorad_384_wellplate_50ul_O11 + parent: biorad_384_wellplate_50ul + position: + x: 56.034 + y: 12.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_P11 + name: biorad_384_wellplate_50ul_P11 + parent: biorad_384_wellplate_50ul + position: + x: 56.034 + y: 7.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_A12 + name: biorad_384_wellplate_50ul_A12 + parent: biorad_384_wellplate_50ul + position: + x: 60.534 + y: 75.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_B12 + name: biorad_384_wellplate_50ul_B12 + parent: biorad_384_wellplate_50ul + position: + x: 60.534 + y: 70.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_C12 + name: biorad_384_wellplate_50ul_C12 + parent: biorad_384_wellplate_50ul + position: + x: 60.534 + y: 66.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_D12 + name: biorad_384_wellplate_50ul_D12 + parent: biorad_384_wellplate_50ul + position: + x: 60.534 + y: 61.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_E12 + name: biorad_384_wellplate_50ul_E12 + parent: biorad_384_wellplate_50ul + position: + x: 60.534 + y: 57.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_F12 + name: biorad_384_wellplate_50ul_F12 + parent: biorad_384_wellplate_50ul + position: + x: 60.534 + y: 52.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_G12 + name: biorad_384_wellplate_50ul_G12 + parent: biorad_384_wellplate_50ul + position: + x: 60.534 + y: 48.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_H12 + name: biorad_384_wellplate_50ul_H12 + parent: biorad_384_wellplate_50ul + position: + x: 60.534 + y: 43.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_I12 + name: biorad_384_wellplate_50ul_I12 + parent: biorad_384_wellplate_50ul + position: + x: 60.534 + y: 39.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_J12 + name: biorad_384_wellplate_50ul_J12 + parent: biorad_384_wellplate_50ul + position: + x: 60.534 + y: 34.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_K12 + name: biorad_384_wellplate_50ul_K12 + parent: biorad_384_wellplate_50ul + position: + x: 60.534 + y: 30.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_L12 + name: biorad_384_wellplate_50ul_L12 + parent: biorad_384_wellplate_50ul + position: + x: 60.534 + y: 25.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_M12 + name: biorad_384_wellplate_50ul_M12 + parent: biorad_384_wellplate_50ul + position: + x: 60.534 + y: 21.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_N12 + name: biorad_384_wellplate_50ul_N12 + parent: biorad_384_wellplate_50ul + position: + x: 60.534 + y: 16.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_O12 + name: biorad_384_wellplate_50ul_O12 + parent: biorad_384_wellplate_50ul + position: + x: 60.534 + y: 12.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_P12 + name: biorad_384_wellplate_50ul_P12 + parent: biorad_384_wellplate_50ul + position: + x: 60.534 + y: 7.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_A13 + name: biorad_384_wellplate_50ul_A13 + parent: biorad_384_wellplate_50ul + position: + x: 65.034 + y: 75.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_B13 + name: biorad_384_wellplate_50ul_B13 + parent: biorad_384_wellplate_50ul + position: + x: 65.034 + y: 70.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_C13 + name: biorad_384_wellplate_50ul_C13 + parent: biorad_384_wellplate_50ul + position: + x: 65.034 + y: 66.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_D13 + name: biorad_384_wellplate_50ul_D13 + parent: biorad_384_wellplate_50ul + position: + x: 65.034 + y: 61.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_E13 + name: biorad_384_wellplate_50ul_E13 + parent: biorad_384_wellplate_50ul + position: + x: 65.034 + y: 57.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_F13 + name: biorad_384_wellplate_50ul_F13 + parent: biorad_384_wellplate_50ul + position: + x: 65.034 + y: 52.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_G13 + name: biorad_384_wellplate_50ul_G13 + parent: biorad_384_wellplate_50ul + position: + x: 65.034 + y: 48.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_H13 + name: biorad_384_wellplate_50ul_H13 + parent: biorad_384_wellplate_50ul + position: + x: 65.034 + y: 43.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_I13 + name: biorad_384_wellplate_50ul_I13 + parent: biorad_384_wellplate_50ul + position: + x: 65.034 + y: 39.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_J13 + name: biorad_384_wellplate_50ul_J13 + parent: biorad_384_wellplate_50ul + position: + x: 65.034 + y: 34.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_K13 + name: biorad_384_wellplate_50ul_K13 + parent: biorad_384_wellplate_50ul + position: + x: 65.034 + y: 30.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_L13 + name: biorad_384_wellplate_50ul_L13 + parent: biorad_384_wellplate_50ul + position: + x: 65.034 + y: 25.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_M13 + name: biorad_384_wellplate_50ul_M13 + parent: biorad_384_wellplate_50ul + position: + x: 65.034 + y: 21.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_N13 + name: biorad_384_wellplate_50ul_N13 + parent: biorad_384_wellplate_50ul + position: + x: 65.034 + y: 16.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_O13 + name: biorad_384_wellplate_50ul_O13 + parent: biorad_384_wellplate_50ul + position: + x: 65.034 + y: 12.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_P13 + name: biorad_384_wellplate_50ul_P13 + parent: biorad_384_wellplate_50ul + position: + x: 65.034 + y: 7.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_A14 + name: biorad_384_wellplate_50ul_A14 + parent: biorad_384_wellplate_50ul + position: + x: 69.534 + y: 75.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_B14 + name: biorad_384_wellplate_50ul_B14 + parent: biorad_384_wellplate_50ul + position: + x: 69.534 + y: 70.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_C14 + name: biorad_384_wellplate_50ul_C14 + parent: biorad_384_wellplate_50ul + position: + x: 69.534 + y: 66.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_D14 + name: biorad_384_wellplate_50ul_D14 + parent: biorad_384_wellplate_50ul + position: + x: 69.534 + y: 61.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_E14 + name: biorad_384_wellplate_50ul_E14 + parent: biorad_384_wellplate_50ul + position: + x: 69.534 + y: 57.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_F14 + name: biorad_384_wellplate_50ul_F14 + parent: biorad_384_wellplate_50ul + position: + x: 69.534 + y: 52.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_G14 + name: biorad_384_wellplate_50ul_G14 + parent: biorad_384_wellplate_50ul + position: + x: 69.534 + y: 48.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_H14 + name: biorad_384_wellplate_50ul_H14 + parent: biorad_384_wellplate_50ul + position: + x: 69.534 + y: 43.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_I14 + name: biorad_384_wellplate_50ul_I14 + parent: biorad_384_wellplate_50ul + position: + x: 69.534 + y: 39.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_J14 + name: biorad_384_wellplate_50ul_J14 + parent: biorad_384_wellplate_50ul + position: + x: 69.534 + y: 34.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_K14 + name: biorad_384_wellplate_50ul_K14 + parent: biorad_384_wellplate_50ul + position: + x: 69.534 + y: 30.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_L14 + name: biorad_384_wellplate_50ul_L14 + parent: biorad_384_wellplate_50ul + position: + x: 69.534 + y: 25.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_M14 + name: biorad_384_wellplate_50ul_M14 + parent: biorad_384_wellplate_50ul + position: + x: 69.534 + y: 21.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_N14 + name: biorad_384_wellplate_50ul_N14 + parent: biorad_384_wellplate_50ul + position: + x: 69.534 + y: 16.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_O14 + name: biorad_384_wellplate_50ul_O14 + parent: biorad_384_wellplate_50ul + position: + x: 69.534 + y: 12.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_P14 + name: biorad_384_wellplate_50ul_P14 + parent: biorad_384_wellplate_50ul + position: + x: 69.534 + y: 7.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_A15 + name: biorad_384_wellplate_50ul_A15 + parent: biorad_384_wellplate_50ul + position: + x: 74.034 + y: 75.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_B15 + name: biorad_384_wellplate_50ul_B15 + parent: biorad_384_wellplate_50ul + position: + x: 74.034 + y: 70.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_C15 + name: biorad_384_wellplate_50ul_C15 + parent: biorad_384_wellplate_50ul + position: + x: 74.034 + y: 66.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_D15 + name: biorad_384_wellplate_50ul_D15 + parent: biorad_384_wellplate_50ul + position: + x: 74.034 + y: 61.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_E15 + name: biorad_384_wellplate_50ul_E15 + parent: biorad_384_wellplate_50ul + position: + x: 74.034 + y: 57.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_F15 + name: biorad_384_wellplate_50ul_F15 + parent: biorad_384_wellplate_50ul + position: + x: 74.034 + y: 52.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_G15 + name: biorad_384_wellplate_50ul_G15 + parent: biorad_384_wellplate_50ul + position: + x: 74.034 + y: 48.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_H15 + name: biorad_384_wellplate_50ul_H15 + parent: biorad_384_wellplate_50ul + position: + x: 74.034 + y: 43.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_I15 + name: biorad_384_wellplate_50ul_I15 + parent: biorad_384_wellplate_50ul + position: + x: 74.034 + y: 39.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_J15 + name: biorad_384_wellplate_50ul_J15 + parent: biorad_384_wellplate_50ul + position: + x: 74.034 + y: 34.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_K15 + name: biorad_384_wellplate_50ul_K15 + parent: biorad_384_wellplate_50ul + position: + x: 74.034 + y: 30.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_L15 + name: biorad_384_wellplate_50ul_L15 + parent: biorad_384_wellplate_50ul + position: + x: 74.034 + y: 25.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_M15 + name: biorad_384_wellplate_50ul_M15 + parent: biorad_384_wellplate_50ul + position: + x: 74.034 + y: 21.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_N15 + name: biorad_384_wellplate_50ul_N15 + parent: biorad_384_wellplate_50ul + position: + x: 74.034 + y: 16.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_O15 + name: biorad_384_wellplate_50ul_O15 + parent: biorad_384_wellplate_50ul + position: + x: 74.034 + y: 12.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_P15 + name: biorad_384_wellplate_50ul_P15 + parent: biorad_384_wellplate_50ul + position: + x: 74.034 + y: 7.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_A16 + name: biorad_384_wellplate_50ul_A16 + parent: biorad_384_wellplate_50ul + position: + x: 78.534 + y: 75.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_B16 + name: biorad_384_wellplate_50ul_B16 + parent: biorad_384_wellplate_50ul + position: + x: 78.534 + y: 70.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_C16 + name: biorad_384_wellplate_50ul_C16 + parent: biorad_384_wellplate_50ul + position: + x: 78.534 + y: 66.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_D16 + name: biorad_384_wellplate_50ul_D16 + parent: biorad_384_wellplate_50ul + position: + x: 78.534 + y: 61.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_E16 + name: biorad_384_wellplate_50ul_E16 + parent: biorad_384_wellplate_50ul + position: + x: 78.534 + y: 57.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_F16 + name: biorad_384_wellplate_50ul_F16 + parent: biorad_384_wellplate_50ul + position: + x: 78.534 + y: 52.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_G16 + name: biorad_384_wellplate_50ul_G16 + parent: biorad_384_wellplate_50ul + position: + x: 78.534 + y: 48.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_H16 + name: biorad_384_wellplate_50ul_H16 + parent: biorad_384_wellplate_50ul + position: + x: 78.534 + y: 43.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_I16 + name: biorad_384_wellplate_50ul_I16 + parent: biorad_384_wellplate_50ul + position: + x: 78.534 + y: 39.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_J16 + name: biorad_384_wellplate_50ul_J16 + parent: biorad_384_wellplate_50ul + position: + x: 78.534 + y: 34.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_K16 + name: biorad_384_wellplate_50ul_K16 + parent: biorad_384_wellplate_50ul + position: + x: 78.534 + y: 30.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_L16 + name: biorad_384_wellplate_50ul_L16 + parent: biorad_384_wellplate_50ul + position: + x: 78.534 + y: 25.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_M16 + name: biorad_384_wellplate_50ul_M16 + parent: biorad_384_wellplate_50ul + position: + x: 78.534 + y: 21.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_N16 + name: biorad_384_wellplate_50ul_N16 + parent: biorad_384_wellplate_50ul + position: + x: 78.534 + y: 16.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_O16 + name: biorad_384_wellplate_50ul_O16 + parent: biorad_384_wellplate_50ul + position: + x: 78.534 + y: 12.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_P16 + name: biorad_384_wellplate_50ul_P16 + parent: biorad_384_wellplate_50ul + position: + x: 78.534 + y: 7.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_A17 + name: biorad_384_wellplate_50ul_A17 + parent: biorad_384_wellplate_50ul + position: + x: 83.034 + y: 75.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_B17 + name: biorad_384_wellplate_50ul_B17 + parent: biorad_384_wellplate_50ul + position: + x: 83.034 + y: 70.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_C17 + name: biorad_384_wellplate_50ul_C17 + parent: biorad_384_wellplate_50ul + position: + x: 83.034 + y: 66.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_D17 + name: biorad_384_wellplate_50ul_D17 + parent: biorad_384_wellplate_50ul + position: + x: 83.034 + y: 61.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_E17 + name: biorad_384_wellplate_50ul_E17 + parent: biorad_384_wellplate_50ul + position: + x: 83.034 + y: 57.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_F17 + name: biorad_384_wellplate_50ul_F17 + parent: biorad_384_wellplate_50ul + position: + x: 83.034 + y: 52.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_G17 + name: biorad_384_wellplate_50ul_G17 + parent: biorad_384_wellplate_50ul + position: + x: 83.034 + y: 48.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_H17 + name: biorad_384_wellplate_50ul_H17 + parent: biorad_384_wellplate_50ul + position: + x: 83.034 + y: 43.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_I17 + name: biorad_384_wellplate_50ul_I17 + parent: biorad_384_wellplate_50ul + position: + x: 83.034 + y: 39.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_J17 + name: biorad_384_wellplate_50ul_J17 + parent: biorad_384_wellplate_50ul + position: + x: 83.034 + y: 34.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_K17 + name: biorad_384_wellplate_50ul_K17 + parent: biorad_384_wellplate_50ul + position: + x: 83.034 + y: 30.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_L17 + name: biorad_384_wellplate_50ul_L17 + parent: biorad_384_wellplate_50ul + position: + x: 83.034 + y: 25.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_M17 + name: biorad_384_wellplate_50ul_M17 + parent: biorad_384_wellplate_50ul + position: + x: 83.034 + y: 21.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_N17 + name: biorad_384_wellplate_50ul_N17 + parent: biorad_384_wellplate_50ul + position: + x: 83.034 + y: 16.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_O17 + name: biorad_384_wellplate_50ul_O17 + parent: biorad_384_wellplate_50ul + position: + x: 83.034 + y: 12.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_P17 + name: biorad_384_wellplate_50ul_P17 + parent: biorad_384_wellplate_50ul + position: + x: 83.034 + y: 7.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_A18 + name: biorad_384_wellplate_50ul_A18 + parent: biorad_384_wellplate_50ul + position: + x: 87.534 + y: 75.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_B18 + name: biorad_384_wellplate_50ul_B18 + parent: biorad_384_wellplate_50ul + position: + x: 87.534 + y: 70.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_C18 + name: biorad_384_wellplate_50ul_C18 + parent: biorad_384_wellplate_50ul + position: + x: 87.534 + y: 66.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_D18 + name: biorad_384_wellplate_50ul_D18 + parent: biorad_384_wellplate_50ul + position: + x: 87.534 + y: 61.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_E18 + name: biorad_384_wellplate_50ul_E18 + parent: biorad_384_wellplate_50ul + position: + x: 87.534 + y: 57.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_F18 + name: biorad_384_wellplate_50ul_F18 + parent: biorad_384_wellplate_50ul + position: + x: 87.534 + y: 52.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_G18 + name: biorad_384_wellplate_50ul_G18 + parent: biorad_384_wellplate_50ul + position: + x: 87.534 + y: 48.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_H18 + name: biorad_384_wellplate_50ul_H18 + parent: biorad_384_wellplate_50ul + position: + x: 87.534 + y: 43.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_I18 + name: biorad_384_wellplate_50ul_I18 + parent: biorad_384_wellplate_50ul + position: + x: 87.534 + y: 39.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_J18 + name: biorad_384_wellplate_50ul_J18 + parent: biorad_384_wellplate_50ul + position: + x: 87.534 + y: 34.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_K18 + name: biorad_384_wellplate_50ul_K18 + parent: biorad_384_wellplate_50ul + position: + x: 87.534 + y: 30.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_L18 + name: biorad_384_wellplate_50ul_L18 + parent: biorad_384_wellplate_50ul + position: + x: 87.534 + y: 25.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_M18 + name: biorad_384_wellplate_50ul_M18 + parent: biorad_384_wellplate_50ul + position: + x: 87.534 + y: 21.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_N18 + name: biorad_384_wellplate_50ul_N18 + parent: biorad_384_wellplate_50ul + position: + x: 87.534 + y: 16.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_O18 + name: biorad_384_wellplate_50ul_O18 + parent: biorad_384_wellplate_50ul + position: + x: 87.534 + y: 12.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_P18 + name: biorad_384_wellplate_50ul_P18 + parent: biorad_384_wellplate_50ul + position: + x: 87.534 + y: 7.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_A19 + name: biorad_384_wellplate_50ul_A19 + parent: biorad_384_wellplate_50ul + position: + x: 92.034 + y: 75.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_B19 + name: biorad_384_wellplate_50ul_B19 + parent: biorad_384_wellplate_50ul + position: + x: 92.034 + y: 70.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_C19 + name: biorad_384_wellplate_50ul_C19 + parent: biorad_384_wellplate_50ul + position: + x: 92.034 + y: 66.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_D19 + name: biorad_384_wellplate_50ul_D19 + parent: biorad_384_wellplate_50ul + position: + x: 92.034 + y: 61.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_E19 + name: biorad_384_wellplate_50ul_E19 + parent: biorad_384_wellplate_50ul + position: + x: 92.034 + y: 57.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_F19 + name: biorad_384_wellplate_50ul_F19 + parent: biorad_384_wellplate_50ul + position: + x: 92.034 + y: 52.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_G19 + name: biorad_384_wellplate_50ul_G19 + parent: biorad_384_wellplate_50ul + position: + x: 92.034 + y: 48.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_H19 + name: biorad_384_wellplate_50ul_H19 + parent: biorad_384_wellplate_50ul + position: + x: 92.034 + y: 43.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_I19 + name: biorad_384_wellplate_50ul_I19 + parent: biorad_384_wellplate_50ul + position: + x: 92.034 + y: 39.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_J19 + name: biorad_384_wellplate_50ul_J19 + parent: biorad_384_wellplate_50ul + position: + x: 92.034 + y: 34.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_K19 + name: biorad_384_wellplate_50ul_K19 + parent: biorad_384_wellplate_50ul + position: + x: 92.034 + y: 30.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_L19 + name: biorad_384_wellplate_50ul_L19 + parent: biorad_384_wellplate_50ul + position: + x: 92.034 + y: 25.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_M19 + name: biorad_384_wellplate_50ul_M19 + parent: biorad_384_wellplate_50ul + position: + x: 92.034 + y: 21.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_N19 + name: biorad_384_wellplate_50ul_N19 + parent: biorad_384_wellplate_50ul + position: + x: 92.034 + y: 16.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_O19 + name: biorad_384_wellplate_50ul_O19 + parent: biorad_384_wellplate_50ul + position: + x: 92.034 + y: 12.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_P19 + name: biorad_384_wellplate_50ul_P19 + parent: biorad_384_wellplate_50ul + position: + x: 92.034 + y: 7.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_A20 + name: biorad_384_wellplate_50ul_A20 + parent: biorad_384_wellplate_50ul + position: + x: 96.534 + y: 75.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_B20 + name: biorad_384_wellplate_50ul_B20 + parent: biorad_384_wellplate_50ul + position: + x: 96.534 + y: 70.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_C20 + name: biorad_384_wellplate_50ul_C20 + parent: biorad_384_wellplate_50ul + position: + x: 96.534 + y: 66.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_D20 + name: biorad_384_wellplate_50ul_D20 + parent: biorad_384_wellplate_50ul + position: + x: 96.534 + y: 61.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_E20 + name: biorad_384_wellplate_50ul_E20 + parent: biorad_384_wellplate_50ul + position: + x: 96.534 + y: 57.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_F20 + name: biorad_384_wellplate_50ul_F20 + parent: biorad_384_wellplate_50ul + position: + x: 96.534 + y: 52.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_G20 + name: biorad_384_wellplate_50ul_G20 + parent: biorad_384_wellplate_50ul + position: + x: 96.534 + y: 48.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_H20 + name: biorad_384_wellplate_50ul_H20 + parent: biorad_384_wellplate_50ul + position: + x: 96.534 + y: 43.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_I20 + name: biorad_384_wellplate_50ul_I20 + parent: biorad_384_wellplate_50ul + position: + x: 96.534 + y: 39.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_J20 + name: biorad_384_wellplate_50ul_J20 + parent: biorad_384_wellplate_50ul + position: + x: 96.534 + y: 34.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_K20 + name: biorad_384_wellplate_50ul_K20 + parent: biorad_384_wellplate_50ul + position: + x: 96.534 + y: 30.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_L20 + name: biorad_384_wellplate_50ul_L20 + parent: biorad_384_wellplate_50ul + position: + x: 96.534 + y: 25.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_M20 + name: biorad_384_wellplate_50ul_M20 + parent: biorad_384_wellplate_50ul + position: + x: 96.534 + y: 21.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_N20 + name: biorad_384_wellplate_50ul_N20 + parent: biorad_384_wellplate_50ul + position: + x: 96.534 + y: 16.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_O20 + name: biorad_384_wellplate_50ul_O20 + parent: biorad_384_wellplate_50ul + position: + x: 96.534 + y: 12.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_P20 + name: biorad_384_wellplate_50ul_P20 + parent: biorad_384_wellplate_50ul + position: + x: 96.534 + y: 7.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_A21 + name: biorad_384_wellplate_50ul_A21 + parent: biorad_384_wellplate_50ul + position: + x: 101.034 + y: 75.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_B21 + name: biorad_384_wellplate_50ul_B21 + parent: biorad_384_wellplate_50ul + position: + x: 101.034 + y: 70.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_C21 + name: biorad_384_wellplate_50ul_C21 + parent: biorad_384_wellplate_50ul + position: + x: 101.034 + y: 66.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_D21 + name: biorad_384_wellplate_50ul_D21 + parent: biorad_384_wellplate_50ul + position: + x: 101.034 + y: 61.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_E21 + name: biorad_384_wellplate_50ul_E21 + parent: biorad_384_wellplate_50ul + position: + x: 101.034 + y: 57.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_F21 + name: biorad_384_wellplate_50ul_F21 + parent: biorad_384_wellplate_50ul + position: + x: 101.034 + y: 52.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_G21 + name: biorad_384_wellplate_50ul_G21 + parent: biorad_384_wellplate_50ul + position: + x: 101.034 + y: 48.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_H21 + name: biorad_384_wellplate_50ul_H21 + parent: biorad_384_wellplate_50ul + position: + x: 101.034 + y: 43.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_I21 + name: biorad_384_wellplate_50ul_I21 + parent: biorad_384_wellplate_50ul + position: + x: 101.034 + y: 39.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_J21 + name: biorad_384_wellplate_50ul_J21 + parent: biorad_384_wellplate_50ul + position: + x: 101.034 + y: 34.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_K21 + name: biorad_384_wellplate_50ul_K21 + parent: biorad_384_wellplate_50ul + position: + x: 101.034 + y: 30.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_L21 + name: biorad_384_wellplate_50ul_L21 + parent: biorad_384_wellplate_50ul + position: + x: 101.034 + y: 25.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_M21 + name: biorad_384_wellplate_50ul_M21 + parent: biorad_384_wellplate_50ul + position: + x: 101.034 + y: 21.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_N21 + name: biorad_384_wellplate_50ul_N21 + parent: biorad_384_wellplate_50ul + position: + x: 101.034 + y: 16.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_O21 + name: biorad_384_wellplate_50ul_O21 + parent: biorad_384_wellplate_50ul + position: + x: 101.034 + y: 12.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_P21 + name: biorad_384_wellplate_50ul_P21 + parent: biorad_384_wellplate_50ul + position: + x: 101.034 + y: 7.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_A22 + name: biorad_384_wellplate_50ul_A22 + parent: biorad_384_wellplate_50ul + position: + x: 105.534 + y: 75.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_B22 + name: biorad_384_wellplate_50ul_B22 + parent: biorad_384_wellplate_50ul + position: + x: 105.534 + y: 70.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_C22 + name: biorad_384_wellplate_50ul_C22 + parent: biorad_384_wellplate_50ul + position: + x: 105.534 + y: 66.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_D22 + name: biorad_384_wellplate_50ul_D22 + parent: biorad_384_wellplate_50ul + position: + x: 105.534 + y: 61.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_E22 + name: biorad_384_wellplate_50ul_E22 + parent: biorad_384_wellplate_50ul + position: + x: 105.534 + y: 57.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_F22 + name: biorad_384_wellplate_50ul_F22 + parent: biorad_384_wellplate_50ul + position: + x: 105.534 + y: 52.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_G22 + name: biorad_384_wellplate_50ul_G22 + parent: biorad_384_wellplate_50ul + position: + x: 105.534 + y: 48.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_H22 + name: biorad_384_wellplate_50ul_H22 + parent: biorad_384_wellplate_50ul + position: + x: 105.534 + y: 43.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_I22 + name: biorad_384_wellplate_50ul_I22 + parent: biorad_384_wellplate_50ul + position: + x: 105.534 + y: 39.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_J22 + name: biorad_384_wellplate_50ul_J22 + parent: biorad_384_wellplate_50ul + position: + x: 105.534 + y: 34.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_K22 + name: biorad_384_wellplate_50ul_K22 + parent: biorad_384_wellplate_50ul + position: + x: 105.534 + y: 30.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_L22 + name: biorad_384_wellplate_50ul_L22 + parent: biorad_384_wellplate_50ul + position: + x: 105.534 + y: 25.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_M22 + name: biorad_384_wellplate_50ul_M22 + parent: biorad_384_wellplate_50ul + position: + x: 105.534 + y: 21.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_N22 + name: biorad_384_wellplate_50ul_N22 + parent: biorad_384_wellplate_50ul + position: + x: 105.534 + y: 16.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_O22 + name: biorad_384_wellplate_50ul_O22 + parent: biorad_384_wellplate_50ul + position: + x: 105.534 + y: 12.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_P22 + name: biorad_384_wellplate_50ul_P22 + parent: biorad_384_wellplate_50ul + position: + x: 105.534 + y: 7.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_A23 + name: biorad_384_wellplate_50ul_A23 + parent: biorad_384_wellplate_50ul + position: + x: 110.034 + y: 75.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_B23 + name: biorad_384_wellplate_50ul_B23 + parent: biorad_384_wellplate_50ul + position: + x: 110.034 + y: 70.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_C23 + name: biorad_384_wellplate_50ul_C23 + parent: biorad_384_wellplate_50ul + position: + x: 110.034 + y: 66.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_D23 + name: biorad_384_wellplate_50ul_D23 + parent: biorad_384_wellplate_50ul + position: + x: 110.034 + y: 61.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_E23 + name: biorad_384_wellplate_50ul_E23 + parent: biorad_384_wellplate_50ul + position: + x: 110.034 + y: 57.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_F23 + name: biorad_384_wellplate_50ul_F23 + parent: biorad_384_wellplate_50ul + position: + x: 110.034 + y: 52.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_G23 + name: biorad_384_wellplate_50ul_G23 + parent: biorad_384_wellplate_50ul + position: + x: 110.034 + y: 48.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_H23 + name: biorad_384_wellplate_50ul_H23 + parent: biorad_384_wellplate_50ul + position: + x: 110.034 + y: 43.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_I23 + name: biorad_384_wellplate_50ul_I23 + parent: biorad_384_wellplate_50ul + position: + x: 110.034 + y: 39.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_J23 + name: biorad_384_wellplate_50ul_J23 + parent: biorad_384_wellplate_50ul + position: + x: 110.034 + y: 34.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_K23 + name: biorad_384_wellplate_50ul_K23 + parent: biorad_384_wellplate_50ul + position: + x: 110.034 + y: 30.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_L23 + name: biorad_384_wellplate_50ul_L23 + parent: biorad_384_wellplate_50ul + position: + x: 110.034 + y: 25.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_M23 + name: biorad_384_wellplate_50ul_M23 + parent: biorad_384_wellplate_50ul + position: + x: 110.034 + y: 21.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_N23 + name: biorad_384_wellplate_50ul_N23 + parent: biorad_384_wellplate_50ul + position: + x: 110.034 + y: 16.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_O23 + name: biorad_384_wellplate_50ul_O23 + parent: biorad_384_wellplate_50ul + position: + x: 110.034 + y: 12.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_P23 + name: biorad_384_wellplate_50ul_P23 + parent: biorad_384_wellplate_50ul + position: + x: 110.034 + y: 7.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_A24 + name: biorad_384_wellplate_50ul_A24 + parent: biorad_384_wellplate_50ul + position: + x: 114.534 + y: 75.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_B24 + name: biorad_384_wellplate_50ul_B24 + parent: biorad_384_wellplate_50ul + position: + x: 114.534 + y: 70.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_C24 + name: biorad_384_wellplate_50ul_C24 + parent: biorad_384_wellplate_50ul + position: + x: 114.534 + y: 66.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_D24 + name: biorad_384_wellplate_50ul_D24 + parent: biorad_384_wellplate_50ul + position: + x: 114.534 + y: 61.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_E24 + name: biorad_384_wellplate_50ul_E24 + parent: biorad_384_wellplate_50ul + position: + x: 114.534 + y: 57.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_F24 + name: biorad_384_wellplate_50ul_F24 + parent: biorad_384_wellplate_50ul + position: + x: 114.534 + y: 52.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_G24 + name: biorad_384_wellplate_50ul_G24 + parent: biorad_384_wellplate_50ul + position: + x: 114.534 + y: 48.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_H24 + name: biorad_384_wellplate_50ul_H24 + parent: biorad_384_wellplate_50ul + position: + x: 114.534 + y: 43.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_I24 + name: biorad_384_wellplate_50ul_I24 + parent: biorad_384_wellplate_50ul + position: + x: 114.534 + y: 39.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_J24 + name: biorad_384_wellplate_50ul_J24 + parent: biorad_384_wellplate_50ul + position: + x: 114.534 + y: 34.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_K24 + name: biorad_384_wellplate_50ul_K24 + parent: biorad_384_wellplate_50ul + position: + x: 114.534 + y: 30.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_L24 + name: biorad_384_wellplate_50ul_L24 + parent: biorad_384_wellplate_50ul + position: + x: 114.534 + y: 25.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_M24 + name: biorad_384_wellplate_50ul_M24 + parent: biorad_384_wellplate_50ul + position: + x: 114.534 + y: 21.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_N24 + name: biorad_384_wellplate_50ul_N24 + parent: biorad_384_wellplate_50ul + position: + x: 114.534 + y: 16.894 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_O24 + name: biorad_384_wellplate_50ul_O24 + parent: biorad_384_wellplate_50ul + position: + x: 114.534 + y: 12.394 + z: 1.05 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 50 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.192 + size_y: 2.192 + size_z: 9.35 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_384_wellplate_50ul_P24 + name: biorad_384_wellplate_50ul_P24 + parent: biorad_384_wellplate_50ul + position: + x: 114.534 + y: 7.894 + z: 1.05 + sample_id: null + type: well + description: BioRad 384 wellplate 50ul + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/plates.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +biorad_96_wellplate_200ul_pcr: + category: + - plates + class: + module: pylabrobot.resources.opentrons.plates:biorad_96_wellplate_200ul_pcr + type: pylabrobot + config_info: + - children: + - biorad_96_wellplate_200ul_pcr_A1 + - biorad_96_wellplate_200ul_pcr_B1 + - biorad_96_wellplate_200ul_pcr_C1 + - biorad_96_wellplate_200ul_pcr_D1 + - biorad_96_wellplate_200ul_pcr_E1 + - biorad_96_wellplate_200ul_pcr_F1 + - biorad_96_wellplate_200ul_pcr_G1 + - biorad_96_wellplate_200ul_pcr_H1 + - biorad_96_wellplate_200ul_pcr_A2 + - biorad_96_wellplate_200ul_pcr_B2 + - biorad_96_wellplate_200ul_pcr_C2 + - biorad_96_wellplate_200ul_pcr_D2 + - biorad_96_wellplate_200ul_pcr_E2 + - biorad_96_wellplate_200ul_pcr_F2 + - biorad_96_wellplate_200ul_pcr_G2 + - biorad_96_wellplate_200ul_pcr_H2 + - biorad_96_wellplate_200ul_pcr_A3 + - biorad_96_wellplate_200ul_pcr_B3 + - biorad_96_wellplate_200ul_pcr_C3 + - biorad_96_wellplate_200ul_pcr_D3 + - biorad_96_wellplate_200ul_pcr_E3 + - biorad_96_wellplate_200ul_pcr_F3 + - biorad_96_wellplate_200ul_pcr_G3 + - biorad_96_wellplate_200ul_pcr_H3 + - biorad_96_wellplate_200ul_pcr_A4 + - biorad_96_wellplate_200ul_pcr_B4 + - biorad_96_wellplate_200ul_pcr_C4 + - biorad_96_wellplate_200ul_pcr_D4 + - biorad_96_wellplate_200ul_pcr_E4 + - biorad_96_wellplate_200ul_pcr_F4 + - biorad_96_wellplate_200ul_pcr_G4 + - biorad_96_wellplate_200ul_pcr_H4 + - biorad_96_wellplate_200ul_pcr_A5 + - biorad_96_wellplate_200ul_pcr_B5 + - biorad_96_wellplate_200ul_pcr_C5 + - biorad_96_wellplate_200ul_pcr_D5 + - biorad_96_wellplate_200ul_pcr_E5 + - biorad_96_wellplate_200ul_pcr_F5 + - biorad_96_wellplate_200ul_pcr_G5 + - biorad_96_wellplate_200ul_pcr_H5 + - biorad_96_wellplate_200ul_pcr_A6 + - biorad_96_wellplate_200ul_pcr_B6 + - biorad_96_wellplate_200ul_pcr_C6 + - biorad_96_wellplate_200ul_pcr_D6 + - biorad_96_wellplate_200ul_pcr_E6 + - biorad_96_wellplate_200ul_pcr_F6 + - biorad_96_wellplate_200ul_pcr_G6 + - biorad_96_wellplate_200ul_pcr_H6 + - biorad_96_wellplate_200ul_pcr_A7 + - biorad_96_wellplate_200ul_pcr_B7 + - biorad_96_wellplate_200ul_pcr_C7 + - biorad_96_wellplate_200ul_pcr_D7 + - biorad_96_wellplate_200ul_pcr_E7 + - biorad_96_wellplate_200ul_pcr_F7 + - biorad_96_wellplate_200ul_pcr_G7 + - biorad_96_wellplate_200ul_pcr_H7 + - biorad_96_wellplate_200ul_pcr_A8 + - biorad_96_wellplate_200ul_pcr_B8 + - biorad_96_wellplate_200ul_pcr_C8 + - biorad_96_wellplate_200ul_pcr_D8 + - biorad_96_wellplate_200ul_pcr_E8 + - biorad_96_wellplate_200ul_pcr_F8 + - biorad_96_wellplate_200ul_pcr_G8 + - biorad_96_wellplate_200ul_pcr_H8 + - biorad_96_wellplate_200ul_pcr_A9 + - biorad_96_wellplate_200ul_pcr_B9 + - biorad_96_wellplate_200ul_pcr_C9 + - biorad_96_wellplate_200ul_pcr_D9 + - biorad_96_wellplate_200ul_pcr_E9 + - biorad_96_wellplate_200ul_pcr_F9 + - biorad_96_wellplate_200ul_pcr_G9 + - biorad_96_wellplate_200ul_pcr_H9 + - biorad_96_wellplate_200ul_pcr_A10 + - biorad_96_wellplate_200ul_pcr_B10 + - biorad_96_wellplate_200ul_pcr_C10 + - biorad_96_wellplate_200ul_pcr_D10 + - biorad_96_wellplate_200ul_pcr_E10 + - biorad_96_wellplate_200ul_pcr_F10 + - biorad_96_wellplate_200ul_pcr_G10 + - biorad_96_wellplate_200ul_pcr_H10 + - biorad_96_wellplate_200ul_pcr_A11 + - biorad_96_wellplate_200ul_pcr_B11 + - biorad_96_wellplate_200ul_pcr_C11 + - biorad_96_wellplate_200ul_pcr_D11 + - biorad_96_wellplate_200ul_pcr_E11 + - biorad_96_wellplate_200ul_pcr_F11 + - biorad_96_wellplate_200ul_pcr_G11 + - biorad_96_wellplate_200ul_pcr_H11 + - biorad_96_wellplate_200ul_pcr_A12 + - biorad_96_wellplate_200ul_pcr_B12 + - biorad_96_wellplate_200ul_pcr_C12 + - biorad_96_wellplate_200ul_pcr_D12 + - biorad_96_wellplate_200ul_pcr_E12 + - biorad_96_wellplate_200ul_pcr_F12 + - biorad_96_wellplate_200ul_pcr_G12 + - biorad_96_wellplate_200ul_pcr_H12 + class: '' + config: + barcode: null + category: plate + model: Bio-Rad 96 Well Plate 200 µL PCR + ordering: + A1: biorad_96_wellplate_200ul_pcr_A1 + B1: biorad_96_wellplate_200ul_pcr_B1 + C1: biorad_96_wellplate_200ul_pcr_C1 + D1: biorad_96_wellplate_200ul_pcr_D1 + E1: biorad_96_wellplate_200ul_pcr_E1 + F1: biorad_96_wellplate_200ul_pcr_F1 + G1: biorad_96_wellplate_200ul_pcr_G1 + H1: biorad_96_wellplate_200ul_pcr_H1 + A2: biorad_96_wellplate_200ul_pcr_A2 + B2: biorad_96_wellplate_200ul_pcr_B2 + C2: biorad_96_wellplate_200ul_pcr_C2 + D2: biorad_96_wellplate_200ul_pcr_D2 + E2: biorad_96_wellplate_200ul_pcr_E2 + F2: biorad_96_wellplate_200ul_pcr_F2 + G2: biorad_96_wellplate_200ul_pcr_G2 + H2: biorad_96_wellplate_200ul_pcr_H2 + A3: biorad_96_wellplate_200ul_pcr_A3 + B3: biorad_96_wellplate_200ul_pcr_B3 + C3: biorad_96_wellplate_200ul_pcr_C3 + D3: biorad_96_wellplate_200ul_pcr_D3 + E3: biorad_96_wellplate_200ul_pcr_E3 + F3: biorad_96_wellplate_200ul_pcr_F3 + G3: biorad_96_wellplate_200ul_pcr_G3 + H3: biorad_96_wellplate_200ul_pcr_H3 + A4: biorad_96_wellplate_200ul_pcr_A4 + B4: biorad_96_wellplate_200ul_pcr_B4 + C4: biorad_96_wellplate_200ul_pcr_C4 + D4: biorad_96_wellplate_200ul_pcr_D4 + E4: biorad_96_wellplate_200ul_pcr_E4 + F4: biorad_96_wellplate_200ul_pcr_F4 + G4: biorad_96_wellplate_200ul_pcr_G4 + H4: biorad_96_wellplate_200ul_pcr_H4 + A5: biorad_96_wellplate_200ul_pcr_A5 + B5: biorad_96_wellplate_200ul_pcr_B5 + C5: biorad_96_wellplate_200ul_pcr_C5 + D5: biorad_96_wellplate_200ul_pcr_D5 + E5: biorad_96_wellplate_200ul_pcr_E5 + F5: biorad_96_wellplate_200ul_pcr_F5 + G5: biorad_96_wellplate_200ul_pcr_G5 + H5: biorad_96_wellplate_200ul_pcr_H5 + A6: biorad_96_wellplate_200ul_pcr_A6 + B6: biorad_96_wellplate_200ul_pcr_B6 + C6: biorad_96_wellplate_200ul_pcr_C6 + D6: biorad_96_wellplate_200ul_pcr_D6 + E6: biorad_96_wellplate_200ul_pcr_E6 + F6: biorad_96_wellplate_200ul_pcr_F6 + G6: biorad_96_wellplate_200ul_pcr_G6 + H6: biorad_96_wellplate_200ul_pcr_H6 + A7: biorad_96_wellplate_200ul_pcr_A7 + B7: biorad_96_wellplate_200ul_pcr_B7 + C7: biorad_96_wellplate_200ul_pcr_C7 + D7: biorad_96_wellplate_200ul_pcr_D7 + E7: biorad_96_wellplate_200ul_pcr_E7 + F7: biorad_96_wellplate_200ul_pcr_F7 + G7: biorad_96_wellplate_200ul_pcr_G7 + H7: biorad_96_wellplate_200ul_pcr_H7 + A8: biorad_96_wellplate_200ul_pcr_A8 + B8: biorad_96_wellplate_200ul_pcr_B8 + C8: biorad_96_wellplate_200ul_pcr_C8 + D8: biorad_96_wellplate_200ul_pcr_D8 + E8: biorad_96_wellplate_200ul_pcr_E8 + F8: biorad_96_wellplate_200ul_pcr_F8 + G8: biorad_96_wellplate_200ul_pcr_G8 + H8: biorad_96_wellplate_200ul_pcr_H8 + A9: biorad_96_wellplate_200ul_pcr_A9 + B9: biorad_96_wellplate_200ul_pcr_B9 + C9: biorad_96_wellplate_200ul_pcr_C9 + D9: biorad_96_wellplate_200ul_pcr_D9 + E9: biorad_96_wellplate_200ul_pcr_E9 + F9: biorad_96_wellplate_200ul_pcr_F9 + G9: biorad_96_wellplate_200ul_pcr_G9 + H9: biorad_96_wellplate_200ul_pcr_H9 + A10: biorad_96_wellplate_200ul_pcr_A10 + B10: biorad_96_wellplate_200ul_pcr_B10 + C10: biorad_96_wellplate_200ul_pcr_C10 + D10: biorad_96_wellplate_200ul_pcr_D10 + E10: biorad_96_wellplate_200ul_pcr_E10 + F10: biorad_96_wellplate_200ul_pcr_F10 + G10: biorad_96_wellplate_200ul_pcr_G10 + H10: biorad_96_wellplate_200ul_pcr_H10 + A11: biorad_96_wellplate_200ul_pcr_A11 + B11: biorad_96_wellplate_200ul_pcr_B11 + C11: biorad_96_wellplate_200ul_pcr_C11 + D11: biorad_96_wellplate_200ul_pcr_D11 + E11: biorad_96_wellplate_200ul_pcr_E11 + F11: biorad_96_wellplate_200ul_pcr_F11 + G11: biorad_96_wellplate_200ul_pcr_G11 + H11: biorad_96_wellplate_200ul_pcr_H11 + A12: biorad_96_wellplate_200ul_pcr_A12 + B12: biorad_96_wellplate_200ul_pcr_B12 + C12: biorad_96_wellplate_200ul_pcr_C12 + D12: biorad_96_wellplate_200ul_pcr_D12 + E12: biorad_96_wellplate_200ul_pcr_E12 + F12: biorad_96_wellplate_200ul_pcr_F12 + G12: biorad_96_wellplate_200ul_pcr_G12 + H12: biorad_96_wellplate_200ul_pcr_H12 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.76 + size_y: 85.48 + size_z: 16.06 + type: Plate + data: {} + id: biorad_96_wellplate_200ul_pcr + name: biorad_96_wellplate_200ul_pcr + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: plate + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_A1 + name: biorad_96_wellplate_200ul_pcr_A1 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 12.4495 + y: 72.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_B1 + name: biorad_96_wellplate_200ul_pcr_B1 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 12.4495 + y: 63.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_C1 + name: biorad_96_wellplate_200ul_pcr_C1 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 12.4495 + y: 54.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_D1 + name: biorad_96_wellplate_200ul_pcr_D1 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 12.4495 + y: 45.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_E1 + name: biorad_96_wellplate_200ul_pcr_E1 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 12.4495 + y: 36.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_F1 + name: biorad_96_wellplate_200ul_pcr_F1 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 12.4495 + y: 27.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_G1 + name: biorad_96_wellplate_200ul_pcr_G1 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 12.4495 + y: 18.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_H1 + name: biorad_96_wellplate_200ul_pcr_H1 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 12.4495 + y: 9.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_A2 + name: biorad_96_wellplate_200ul_pcr_A2 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 21.4495 + y: 72.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_B2 + name: biorad_96_wellplate_200ul_pcr_B2 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 21.4495 + y: 63.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_C2 + name: biorad_96_wellplate_200ul_pcr_C2 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 21.4495 + y: 54.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_D2 + name: biorad_96_wellplate_200ul_pcr_D2 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 21.4495 + y: 45.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_E2 + name: biorad_96_wellplate_200ul_pcr_E2 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 21.4495 + y: 36.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_F2 + name: biorad_96_wellplate_200ul_pcr_F2 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 21.4495 + y: 27.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_G2 + name: biorad_96_wellplate_200ul_pcr_G2 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 21.4495 + y: 18.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_H2 + name: biorad_96_wellplate_200ul_pcr_H2 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 21.4495 + y: 9.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_A3 + name: biorad_96_wellplate_200ul_pcr_A3 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 30.4495 + y: 72.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_B3 + name: biorad_96_wellplate_200ul_pcr_B3 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 30.4495 + y: 63.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_C3 + name: biorad_96_wellplate_200ul_pcr_C3 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 30.4495 + y: 54.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_D3 + name: biorad_96_wellplate_200ul_pcr_D3 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 30.4495 + y: 45.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_E3 + name: biorad_96_wellplate_200ul_pcr_E3 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 30.4495 + y: 36.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_F3 + name: biorad_96_wellplate_200ul_pcr_F3 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 30.4495 + y: 27.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_G3 + name: biorad_96_wellplate_200ul_pcr_G3 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 30.4495 + y: 18.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_H3 + name: biorad_96_wellplate_200ul_pcr_H3 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 30.4495 + y: 9.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_A4 + name: biorad_96_wellplate_200ul_pcr_A4 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 39.4495 + y: 72.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_B4 + name: biorad_96_wellplate_200ul_pcr_B4 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 39.4495 + y: 63.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_C4 + name: biorad_96_wellplate_200ul_pcr_C4 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 39.4495 + y: 54.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_D4 + name: biorad_96_wellplate_200ul_pcr_D4 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 39.4495 + y: 45.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_E4 + name: biorad_96_wellplate_200ul_pcr_E4 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 39.4495 + y: 36.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_F4 + name: biorad_96_wellplate_200ul_pcr_F4 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 39.4495 + y: 27.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_G4 + name: biorad_96_wellplate_200ul_pcr_G4 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 39.4495 + y: 18.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_H4 + name: biorad_96_wellplate_200ul_pcr_H4 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 39.4495 + y: 9.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_A5 + name: biorad_96_wellplate_200ul_pcr_A5 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 48.4495 + y: 72.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_B5 + name: biorad_96_wellplate_200ul_pcr_B5 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 48.4495 + y: 63.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_C5 + name: biorad_96_wellplate_200ul_pcr_C5 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 48.4495 + y: 54.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_D5 + name: biorad_96_wellplate_200ul_pcr_D5 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 48.4495 + y: 45.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_E5 + name: biorad_96_wellplate_200ul_pcr_E5 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 48.4495 + y: 36.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_F5 + name: biorad_96_wellplate_200ul_pcr_F5 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 48.4495 + y: 27.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_G5 + name: biorad_96_wellplate_200ul_pcr_G5 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 48.4495 + y: 18.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_H5 + name: biorad_96_wellplate_200ul_pcr_H5 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 48.4495 + y: 9.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_A6 + name: biorad_96_wellplate_200ul_pcr_A6 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 57.4495 + y: 72.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_B6 + name: biorad_96_wellplate_200ul_pcr_B6 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 57.4495 + y: 63.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_C6 + name: biorad_96_wellplate_200ul_pcr_C6 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 57.4495 + y: 54.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_D6 + name: biorad_96_wellplate_200ul_pcr_D6 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 57.4495 + y: 45.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_E6 + name: biorad_96_wellplate_200ul_pcr_E6 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 57.4495 + y: 36.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_F6 + name: biorad_96_wellplate_200ul_pcr_F6 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 57.4495 + y: 27.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_G6 + name: biorad_96_wellplate_200ul_pcr_G6 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 57.4495 + y: 18.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_H6 + name: biorad_96_wellplate_200ul_pcr_H6 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 57.4495 + y: 9.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_A7 + name: biorad_96_wellplate_200ul_pcr_A7 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 66.4495 + y: 72.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_B7 + name: biorad_96_wellplate_200ul_pcr_B7 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 66.4495 + y: 63.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_C7 + name: biorad_96_wellplate_200ul_pcr_C7 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 66.4495 + y: 54.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_D7 + name: biorad_96_wellplate_200ul_pcr_D7 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 66.4495 + y: 45.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_E7 + name: biorad_96_wellplate_200ul_pcr_E7 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 66.4495 + y: 36.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_F7 + name: biorad_96_wellplate_200ul_pcr_F7 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 66.4495 + y: 27.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_G7 + name: biorad_96_wellplate_200ul_pcr_G7 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 66.4495 + y: 18.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_H7 + name: biorad_96_wellplate_200ul_pcr_H7 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 66.4495 + y: 9.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_A8 + name: biorad_96_wellplate_200ul_pcr_A8 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 75.4495 + y: 72.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_B8 + name: biorad_96_wellplate_200ul_pcr_B8 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 75.4495 + y: 63.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_C8 + name: biorad_96_wellplate_200ul_pcr_C8 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 75.4495 + y: 54.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_D8 + name: biorad_96_wellplate_200ul_pcr_D8 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 75.4495 + y: 45.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_E8 + name: biorad_96_wellplate_200ul_pcr_E8 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 75.4495 + y: 36.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_F8 + name: biorad_96_wellplate_200ul_pcr_F8 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 75.4495 + y: 27.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_G8 + name: biorad_96_wellplate_200ul_pcr_G8 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 75.4495 + y: 18.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_H8 + name: biorad_96_wellplate_200ul_pcr_H8 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 75.4495 + y: 9.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_A9 + name: biorad_96_wellplate_200ul_pcr_A9 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 84.4495 + y: 72.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_B9 + name: biorad_96_wellplate_200ul_pcr_B9 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 84.4495 + y: 63.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_C9 + name: biorad_96_wellplate_200ul_pcr_C9 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 84.4495 + y: 54.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_D9 + name: biorad_96_wellplate_200ul_pcr_D9 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 84.4495 + y: 45.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_E9 + name: biorad_96_wellplate_200ul_pcr_E9 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 84.4495 + y: 36.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_F9 + name: biorad_96_wellplate_200ul_pcr_F9 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 84.4495 + y: 27.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_G9 + name: biorad_96_wellplate_200ul_pcr_G9 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 84.4495 + y: 18.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_H9 + name: biorad_96_wellplate_200ul_pcr_H9 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 84.4495 + y: 9.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_A10 + name: biorad_96_wellplate_200ul_pcr_A10 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 93.4495 + y: 72.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_B10 + name: biorad_96_wellplate_200ul_pcr_B10 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 93.4495 + y: 63.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_C10 + name: biorad_96_wellplate_200ul_pcr_C10 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 93.4495 + y: 54.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_D10 + name: biorad_96_wellplate_200ul_pcr_D10 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 93.4495 + y: 45.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_E10 + name: biorad_96_wellplate_200ul_pcr_E10 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 93.4495 + y: 36.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_F10 + name: biorad_96_wellplate_200ul_pcr_F10 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 93.4495 + y: 27.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_G10 + name: biorad_96_wellplate_200ul_pcr_G10 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 93.4495 + y: 18.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_H10 + name: biorad_96_wellplate_200ul_pcr_H10 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 93.4495 + y: 9.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_A11 + name: biorad_96_wellplate_200ul_pcr_A11 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 102.4495 + y: 72.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_B11 + name: biorad_96_wellplate_200ul_pcr_B11 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 102.4495 + y: 63.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_C11 + name: biorad_96_wellplate_200ul_pcr_C11 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 102.4495 + y: 54.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_D11 + name: biorad_96_wellplate_200ul_pcr_D11 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 102.4495 + y: 45.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_E11 + name: biorad_96_wellplate_200ul_pcr_E11 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 102.4495 + y: 36.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_F11 + name: biorad_96_wellplate_200ul_pcr_F11 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 102.4495 + y: 27.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_G11 + name: biorad_96_wellplate_200ul_pcr_G11 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 102.4495 + y: 18.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_H11 + name: biorad_96_wellplate_200ul_pcr_H11 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 102.4495 + y: 9.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_A12 + name: biorad_96_wellplate_200ul_pcr_A12 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 111.4495 + y: 72.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_B12 + name: biorad_96_wellplate_200ul_pcr_B12 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 111.4495 + y: 63.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_C12 + name: biorad_96_wellplate_200ul_pcr_C12 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 111.4495 + y: 54.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_D12 + name: biorad_96_wellplate_200ul_pcr_D12 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 111.4495 + y: 45.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_E12 + name: biorad_96_wellplate_200ul_pcr_E12 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 111.4495 + y: 36.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_F12 + name: biorad_96_wellplate_200ul_pcr_F12 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 111.4495 + y: 27.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_G12 + name: biorad_96_wellplate_200ul_pcr_G12 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 111.4495 + y: 18.3095 + z: 1.25 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.861 + size_y: 3.861 + size_z: 14.81 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: biorad_96_wellplate_200ul_pcr_H12 + name: biorad_96_wellplate_200ul_pcr_H12 + parent: biorad_96_wellplate_200ul_pcr + position: + x: 111.4495 + y: 9.3095 + z: 1.25 + sample_id: null + type: well + description: BioRad 96 wellplate 200ul pcr + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/plates.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +corning_12_wellplate_6point9ml_flat: + category: + - plates + class: + module: pylabrobot.resources.opentrons.plates:corning_12_wellplate_6point9ml_flat + type: pylabrobot + config_info: + - children: + - corning_12_wellplate_6point9ml_flat_A1 + - corning_12_wellplate_6point9ml_flat_B1 + - corning_12_wellplate_6point9ml_flat_C1 + - corning_12_wellplate_6point9ml_flat_A2 + - corning_12_wellplate_6point9ml_flat_B2 + - corning_12_wellplate_6point9ml_flat_C2 + - corning_12_wellplate_6point9ml_flat_A3 + - corning_12_wellplate_6point9ml_flat_B3 + - corning_12_wellplate_6point9ml_flat_C3 + - corning_12_wellplate_6point9ml_flat_A4 + - corning_12_wellplate_6point9ml_flat_B4 + - corning_12_wellplate_6point9ml_flat_C4 + class: '' + config: + barcode: null + category: plate + model: Corning 12 Well Plate 6.9 mL Flat + ordering: + A1: corning_12_wellplate_6point9ml_flat_A1 + B1: corning_12_wellplate_6point9ml_flat_B1 + C1: corning_12_wellplate_6point9ml_flat_C1 + A2: corning_12_wellplate_6point9ml_flat_A2 + B2: corning_12_wellplate_6point9ml_flat_B2 + C2: corning_12_wellplate_6point9ml_flat_C2 + A3: corning_12_wellplate_6point9ml_flat_A3 + B3: corning_12_wellplate_6point9ml_flat_B3 + C3: corning_12_wellplate_6point9ml_flat_C3 + A4: corning_12_wellplate_6point9ml_flat_A4 + B4: corning_12_wellplate_6point9ml_flat_B4 + C4: corning_12_wellplate_6point9ml_flat_C4 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.89 + size_y: 85.6 + size_z: 20.02 + type: Plate + data: {} + id: corning_12_wellplate_6point9ml_flat + name: corning_12_wellplate_6point9ml_flat + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: plate + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 6900 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 16.073 + size_y: 16.073 + size_z: 17.53 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_12_wellplate_6point9ml_flat_A1 + name: corning_12_wellplate_6point9ml_flat_A1 + parent: corning_12_wellplate_6point9ml_flat + position: + x: 16.9035 + y: 60.7735 + z: 2.49 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 6900 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 16.073 + size_y: 16.073 + size_z: 17.53 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_12_wellplate_6point9ml_flat_B1 + name: corning_12_wellplate_6point9ml_flat_B1 + parent: corning_12_wellplate_6point9ml_flat + position: + x: 16.9035 + y: 34.7635 + z: 2.49 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 6900 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 16.073 + size_y: 16.073 + size_z: 17.53 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_12_wellplate_6point9ml_flat_C1 + name: corning_12_wellplate_6point9ml_flat_C1 + parent: corning_12_wellplate_6point9ml_flat + position: + x: 16.9035 + y: 8.7535 + z: 2.49 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 6900 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 16.073 + size_y: 16.073 + size_z: 17.53 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_12_wellplate_6point9ml_flat_A2 + name: corning_12_wellplate_6point9ml_flat_A2 + parent: corning_12_wellplate_6point9ml_flat + position: + x: 42.9135 + y: 60.7735 + z: 2.49 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 6900 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 16.073 + size_y: 16.073 + size_z: 17.53 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_12_wellplate_6point9ml_flat_B2 + name: corning_12_wellplate_6point9ml_flat_B2 + parent: corning_12_wellplate_6point9ml_flat + position: + x: 42.9135 + y: 34.7635 + z: 2.49 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 6900 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 16.073 + size_y: 16.073 + size_z: 17.53 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_12_wellplate_6point9ml_flat_C2 + name: corning_12_wellplate_6point9ml_flat_C2 + parent: corning_12_wellplate_6point9ml_flat + position: + x: 42.9135 + y: 8.7535 + z: 2.49 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 6900 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 16.073 + size_y: 16.073 + size_z: 17.53 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_12_wellplate_6point9ml_flat_A3 + name: corning_12_wellplate_6point9ml_flat_A3 + parent: corning_12_wellplate_6point9ml_flat + position: + x: 68.9235 + y: 60.7735 + z: 2.49 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 6900 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 16.073 + size_y: 16.073 + size_z: 17.53 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_12_wellplate_6point9ml_flat_B3 + name: corning_12_wellplate_6point9ml_flat_B3 + parent: corning_12_wellplate_6point9ml_flat + position: + x: 68.9235 + y: 34.7635 + z: 2.49 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 6900 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 16.073 + size_y: 16.073 + size_z: 17.53 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_12_wellplate_6point9ml_flat_C3 + name: corning_12_wellplate_6point9ml_flat_C3 + parent: corning_12_wellplate_6point9ml_flat + position: + x: 68.9235 + y: 8.7535 + z: 2.49 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 6900 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 16.073 + size_y: 16.073 + size_z: 17.53 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_12_wellplate_6point9ml_flat_A4 + name: corning_12_wellplate_6point9ml_flat_A4 + parent: corning_12_wellplate_6point9ml_flat + position: + x: 94.9335 + y: 60.7735 + z: 2.49 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 6900 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 16.073 + size_y: 16.073 + size_z: 17.53 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_12_wellplate_6point9ml_flat_B4 + name: corning_12_wellplate_6point9ml_flat_B4 + parent: corning_12_wellplate_6point9ml_flat + position: + x: 94.9335 + y: 34.7635 + z: 2.49 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 6900 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 16.073 + size_y: 16.073 + size_z: 17.53 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_12_wellplate_6point9ml_flat_C4 + name: corning_12_wellplate_6point9ml_flat_C4 + parent: corning_12_wellplate_6point9ml_flat + position: + x: 94.9335 + y: 8.7535 + z: 2.49 + sample_id: null + type: well + description: Corning 12 wellplate 6.9ml flat + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/plates.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +corning_24_wellplate_3point4ml_flat: + category: + - plates + class: + module: pylabrobot.resources.opentrons.plates:corning_24_wellplate_3point4ml_flat + type: pylabrobot + config_info: + - children: + - corning_24_wellplate_3point4ml_flat_A1 + - corning_24_wellplate_3point4ml_flat_B1 + - corning_24_wellplate_3point4ml_flat_C1 + - corning_24_wellplate_3point4ml_flat_D1 + - corning_24_wellplate_3point4ml_flat_A2 + - corning_24_wellplate_3point4ml_flat_B2 + - corning_24_wellplate_3point4ml_flat_C2 + - corning_24_wellplate_3point4ml_flat_D2 + - corning_24_wellplate_3point4ml_flat_A3 + - corning_24_wellplate_3point4ml_flat_B3 + - corning_24_wellplate_3point4ml_flat_C3 + - corning_24_wellplate_3point4ml_flat_D3 + - corning_24_wellplate_3point4ml_flat_A4 + - corning_24_wellplate_3point4ml_flat_B4 + - corning_24_wellplate_3point4ml_flat_C4 + - corning_24_wellplate_3point4ml_flat_D4 + - corning_24_wellplate_3point4ml_flat_A5 + - corning_24_wellplate_3point4ml_flat_B5 + - corning_24_wellplate_3point4ml_flat_C5 + - corning_24_wellplate_3point4ml_flat_D5 + - corning_24_wellplate_3point4ml_flat_A6 + - corning_24_wellplate_3point4ml_flat_B6 + - corning_24_wellplate_3point4ml_flat_C6 + - corning_24_wellplate_3point4ml_flat_D6 + class: '' + config: + barcode: null + category: plate + model: Corning 24 Well Plate 3.4 mL Flat + ordering: + A1: corning_24_wellplate_3point4ml_flat_A1 + B1: corning_24_wellplate_3point4ml_flat_B1 + C1: corning_24_wellplate_3point4ml_flat_C1 + D1: corning_24_wellplate_3point4ml_flat_D1 + A2: corning_24_wellplate_3point4ml_flat_A2 + B2: corning_24_wellplate_3point4ml_flat_B2 + C2: corning_24_wellplate_3point4ml_flat_C2 + D2: corning_24_wellplate_3point4ml_flat_D2 + A3: corning_24_wellplate_3point4ml_flat_A3 + B3: corning_24_wellplate_3point4ml_flat_B3 + C3: corning_24_wellplate_3point4ml_flat_C3 + D3: corning_24_wellplate_3point4ml_flat_D3 + A4: corning_24_wellplate_3point4ml_flat_A4 + B4: corning_24_wellplate_3point4ml_flat_B4 + C4: corning_24_wellplate_3point4ml_flat_C4 + D4: corning_24_wellplate_3point4ml_flat_D4 + A5: corning_24_wellplate_3point4ml_flat_A5 + B5: corning_24_wellplate_3point4ml_flat_B5 + C5: corning_24_wellplate_3point4ml_flat_C5 + D5: corning_24_wellplate_3point4ml_flat_D5 + A6: corning_24_wellplate_3point4ml_flat_A6 + B6: corning_24_wellplate_3point4ml_flat_B6 + C6: corning_24_wellplate_3point4ml_flat_C6 + D6: corning_24_wellplate_3point4ml_flat_D6 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.76 + size_y: 85.47 + size_z: 20.27 + type: Plate + data: {} + id: corning_24_wellplate_3point4ml_flat + name: corning_24_wellplate_3point4ml_flat + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: plate + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 3400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 11.498 + size_y: 11.498 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_24_wellplate_3point4ml_flat_A1 + name: corning_24_wellplate_3point4ml_flat_A1 + parent: corning_24_wellplate_3point4ml_flat + position: + x: 11.731 + y: 65.921 + z: 2.87 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 3400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 11.498 + size_y: 11.498 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_24_wellplate_3point4ml_flat_B1 + name: corning_24_wellplate_3point4ml_flat_B1 + parent: corning_24_wellplate_3point4ml_flat + position: + x: 11.731 + y: 46.621 + z: 2.87 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 3400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 11.498 + size_y: 11.498 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_24_wellplate_3point4ml_flat_C1 + name: corning_24_wellplate_3point4ml_flat_C1 + parent: corning_24_wellplate_3point4ml_flat + position: + x: 11.731 + y: 27.321 + z: 2.87 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 3400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 11.498 + size_y: 11.498 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_24_wellplate_3point4ml_flat_D1 + name: corning_24_wellplate_3point4ml_flat_D1 + parent: corning_24_wellplate_3point4ml_flat + position: + x: 11.731 + y: 8.021 + z: 2.87 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 3400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 11.498 + size_y: 11.498 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_24_wellplate_3point4ml_flat_A2 + name: corning_24_wellplate_3point4ml_flat_A2 + parent: corning_24_wellplate_3point4ml_flat + position: + x: 31.031 + y: 65.921 + z: 2.87 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 3400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 11.498 + size_y: 11.498 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_24_wellplate_3point4ml_flat_B2 + name: corning_24_wellplate_3point4ml_flat_B2 + parent: corning_24_wellplate_3point4ml_flat + position: + x: 31.031 + y: 46.621 + z: 2.87 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 3400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 11.498 + size_y: 11.498 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_24_wellplate_3point4ml_flat_C2 + name: corning_24_wellplate_3point4ml_flat_C2 + parent: corning_24_wellplate_3point4ml_flat + position: + x: 31.031 + y: 27.321 + z: 2.87 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 3400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 11.498 + size_y: 11.498 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_24_wellplate_3point4ml_flat_D2 + name: corning_24_wellplate_3point4ml_flat_D2 + parent: corning_24_wellplate_3point4ml_flat + position: + x: 31.031 + y: 8.021 + z: 2.87 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 3400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 11.498 + size_y: 11.498 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_24_wellplate_3point4ml_flat_A3 + name: corning_24_wellplate_3point4ml_flat_A3 + parent: corning_24_wellplate_3point4ml_flat + position: + x: 50.331 + y: 65.921 + z: 2.87 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 3400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 11.498 + size_y: 11.498 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_24_wellplate_3point4ml_flat_B3 + name: corning_24_wellplate_3point4ml_flat_B3 + parent: corning_24_wellplate_3point4ml_flat + position: + x: 50.331 + y: 46.621 + z: 2.87 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 3400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 11.498 + size_y: 11.498 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_24_wellplate_3point4ml_flat_C3 + name: corning_24_wellplate_3point4ml_flat_C3 + parent: corning_24_wellplate_3point4ml_flat + position: + x: 50.331 + y: 27.321 + z: 2.87 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 3400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 11.498 + size_y: 11.498 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_24_wellplate_3point4ml_flat_D3 + name: corning_24_wellplate_3point4ml_flat_D3 + parent: corning_24_wellplate_3point4ml_flat + position: + x: 50.331 + y: 8.021 + z: 2.87 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 3400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 11.498 + size_y: 11.498 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_24_wellplate_3point4ml_flat_A4 + name: corning_24_wellplate_3point4ml_flat_A4 + parent: corning_24_wellplate_3point4ml_flat + position: + x: 69.631 + y: 65.921 + z: 2.87 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 3400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 11.498 + size_y: 11.498 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_24_wellplate_3point4ml_flat_B4 + name: corning_24_wellplate_3point4ml_flat_B4 + parent: corning_24_wellplate_3point4ml_flat + position: + x: 69.631 + y: 46.621 + z: 2.87 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 3400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 11.498 + size_y: 11.498 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_24_wellplate_3point4ml_flat_C4 + name: corning_24_wellplate_3point4ml_flat_C4 + parent: corning_24_wellplate_3point4ml_flat + position: + x: 69.631 + y: 27.321 + z: 2.87 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 3400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 11.498 + size_y: 11.498 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_24_wellplate_3point4ml_flat_D4 + name: corning_24_wellplate_3point4ml_flat_D4 + parent: corning_24_wellplate_3point4ml_flat + position: + x: 69.631 + y: 8.021 + z: 2.87 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 3400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 11.498 + size_y: 11.498 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_24_wellplate_3point4ml_flat_A5 + name: corning_24_wellplate_3point4ml_flat_A5 + parent: corning_24_wellplate_3point4ml_flat + position: + x: 88.931 + y: 65.921 + z: 2.87 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 3400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 11.498 + size_y: 11.498 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_24_wellplate_3point4ml_flat_B5 + name: corning_24_wellplate_3point4ml_flat_B5 + parent: corning_24_wellplate_3point4ml_flat + position: + x: 88.931 + y: 46.621 + z: 2.87 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 3400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 11.498 + size_y: 11.498 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_24_wellplate_3point4ml_flat_C5 + name: corning_24_wellplate_3point4ml_flat_C5 + parent: corning_24_wellplate_3point4ml_flat + position: + x: 88.931 + y: 27.321 + z: 2.87 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 3400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 11.498 + size_y: 11.498 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_24_wellplate_3point4ml_flat_D5 + name: corning_24_wellplate_3point4ml_flat_D5 + parent: corning_24_wellplate_3point4ml_flat + position: + x: 88.931 + y: 8.021 + z: 2.87 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 3400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 11.498 + size_y: 11.498 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_24_wellplate_3point4ml_flat_A6 + name: corning_24_wellplate_3point4ml_flat_A6 + parent: corning_24_wellplate_3point4ml_flat + position: + x: 108.231 + y: 65.921 + z: 2.87 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 3400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 11.498 + size_y: 11.498 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_24_wellplate_3point4ml_flat_B6 + name: corning_24_wellplate_3point4ml_flat_B6 + parent: corning_24_wellplate_3point4ml_flat + position: + x: 108.231 + y: 46.621 + z: 2.87 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 3400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 11.498 + size_y: 11.498 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_24_wellplate_3point4ml_flat_C6 + name: corning_24_wellplate_3point4ml_flat_C6 + parent: corning_24_wellplate_3point4ml_flat + position: + x: 108.231 + y: 27.321 + z: 2.87 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 3400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 11.498 + size_y: 11.498 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_24_wellplate_3point4ml_flat_D6 + name: corning_24_wellplate_3point4ml_flat_D6 + parent: corning_24_wellplate_3point4ml_flat + position: + x: 108.231 + y: 8.021 + z: 2.87 + sample_id: null + type: well + description: Corning 24 wellplate 3.4ml flat + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/plates.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +corning_384_wellplate_112ul_flat: + category: + - plates + class: + module: pylabrobot.resources.opentrons.plates:corning_384_wellplate_112ul_flat + type: pylabrobot + config_info: + - children: + - corning_384_wellplate_112ul_flat_A1 + - corning_384_wellplate_112ul_flat_B1 + - corning_384_wellplate_112ul_flat_C1 + - corning_384_wellplate_112ul_flat_D1 + - corning_384_wellplate_112ul_flat_E1 + - corning_384_wellplate_112ul_flat_F1 + - corning_384_wellplate_112ul_flat_G1 + - corning_384_wellplate_112ul_flat_H1 + - corning_384_wellplate_112ul_flat_I1 + - corning_384_wellplate_112ul_flat_J1 + - corning_384_wellplate_112ul_flat_K1 + - corning_384_wellplate_112ul_flat_L1 + - corning_384_wellplate_112ul_flat_M1 + - corning_384_wellplate_112ul_flat_N1 + - corning_384_wellplate_112ul_flat_O1 + - corning_384_wellplate_112ul_flat_P1 + - corning_384_wellplate_112ul_flat_A2 + - corning_384_wellplate_112ul_flat_B2 + - corning_384_wellplate_112ul_flat_C2 + - corning_384_wellplate_112ul_flat_D2 + - corning_384_wellplate_112ul_flat_E2 + - corning_384_wellplate_112ul_flat_F2 + - corning_384_wellplate_112ul_flat_G2 + - corning_384_wellplate_112ul_flat_H2 + - corning_384_wellplate_112ul_flat_I2 + - corning_384_wellplate_112ul_flat_J2 + - corning_384_wellplate_112ul_flat_K2 + - corning_384_wellplate_112ul_flat_L2 + - corning_384_wellplate_112ul_flat_M2 + - corning_384_wellplate_112ul_flat_N2 + - corning_384_wellplate_112ul_flat_O2 + - corning_384_wellplate_112ul_flat_P2 + - corning_384_wellplate_112ul_flat_A3 + - corning_384_wellplate_112ul_flat_B3 + - corning_384_wellplate_112ul_flat_C3 + - corning_384_wellplate_112ul_flat_D3 + - corning_384_wellplate_112ul_flat_E3 + - corning_384_wellplate_112ul_flat_F3 + - corning_384_wellplate_112ul_flat_G3 + - corning_384_wellplate_112ul_flat_H3 + - corning_384_wellplate_112ul_flat_I3 + - corning_384_wellplate_112ul_flat_J3 + - corning_384_wellplate_112ul_flat_K3 + - corning_384_wellplate_112ul_flat_L3 + - corning_384_wellplate_112ul_flat_M3 + - corning_384_wellplate_112ul_flat_N3 + - corning_384_wellplate_112ul_flat_O3 + - corning_384_wellplate_112ul_flat_P3 + - corning_384_wellplate_112ul_flat_A4 + - corning_384_wellplate_112ul_flat_B4 + - corning_384_wellplate_112ul_flat_C4 + - corning_384_wellplate_112ul_flat_D4 + - corning_384_wellplate_112ul_flat_E4 + - corning_384_wellplate_112ul_flat_F4 + - corning_384_wellplate_112ul_flat_G4 + - corning_384_wellplate_112ul_flat_H4 + - corning_384_wellplate_112ul_flat_I4 + - corning_384_wellplate_112ul_flat_J4 + - corning_384_wellplate_112ul_flat_K4 + - corning_384_wellplate_112ul_flat_L4 + - corning_384_wellplate_112ul_flat_M4 + - corning_384_wellplate_112ul_flat_N4 + - corning_384_wellplate_112ul_flat_O4 + - corning_384_wellplate_112ul_flat_P4 + - corning_384_wellplate_112ul_flat_A5 + - corning_384_wellplate_112ul_flat_B5 + - corning_384_wellplate_112ul_flat_C5 + - corning_384_wellplate_112ul_flat_D5 + - corning_384_wellplate_112ul_flat_E5 + - corning_384_wellplate_112ul_flat_F5 + - corning_384_wellplate_112ul_flat_G5 + - corning_384_wellplate_112ul_flat_H5 + - corning_384_wellplate_112ul_flat_I5 + - corning_384_wellplate_112ul_flat_J5 + - corning_384_wellplate_112ul_flat_K5 + - corning_384_wellplate_112ul_flat_L5 + - corning_384_wellplate_112ul_flat_M5 + - corning_384_wellplate_112ul_flat_N5 + - corning_384_wellplate_112ul_flat_O5 + - corning_384_wellplate_112ul_flat_P5 + - corning_384_wellplate_112ul_flat_A6 + - corning_384_wellplate_112ul_flat_B6 + - corning_384_wellplate_112ul_flat_C6 + - corning_384_wellplate_112ul_flat_D6 + - corning_384_wellplate_112ul_flat_E6 + - corning_384_wellplate_112ul_flat_F6 + - corning_384_wellplate_112ul_flat_G6 + - corning_384_wellplate_112ul_flat_H6 + - corning_384_wellplate_112ul_flat_I6 + - corning_384_wellplate_112ul_flat_J6 + - corning_384_wellplate_112ul_flat_K6 + - corning_384_wellplate_112ul_flat_L6 + - corning_384_wellplate_112ul_flat_M6 + - corning_384_wellplate_112ul_flat_N6 + - corning_384_wellplate_112ul_flat_O6 + - corning_384_wellplate_112ul_flat_P6 + - corning_384_wellplate_112ul_flat_A7 + - corning_384_wellplate_112ul_flat_B7 + - corning_384_wellplate_112ul_flat_C7 + - corning_384_wellplate_112ul_flat_D7 + - corning_384_wellplate_112ul_flat_E7 + - corning_384_wellplate_112ul_flat_F7 + - corning_384_wellplate_112ul_flat_G7 + - corning_384_wellplate_112ul_flat_H7 + - corning_384_wellplate_112ul_flat_I7 + - corning_384_wellplate_112ul_flat_J7 + - corning_384_wellplate_112ul_flat_K7 + - corning_384_wellplate_112ul_flat_L7 + - corning_384_wellplate_112ul_flat_M7 + - corning_384_wellplate_112ul_flat_N7 + - corning_384_wellplate_112ul_flat_O7 + - corning_384_wellplate_112ul_flat_P7 + - corning_384_wellplate_112ul_flat_A8 + - corning_384_wellplate_112ul_flat_B8 + - corning_384_wellplate_112ul_flat_C8 + - corning_384_wellplate_112ul_flat_D8 + - corning_384_wellplate_112ul_flat_E8 + - corning_384_wellplate_112ul_flat_F8 + - corning_384_wellplate_112ul_flat_G8 + - corning_384_wellplate_112ul_flat_H8 + - corning_384_wellplate_112ul_flat_I8 + - corning_384_wellplate_112ul_flat_J8 + - corning_384_wellplate_112ul_flat_K8 + - corning_384_wellplate_112ul_flat_L8 + - corning_384_wellplate_112ul_flat_M8 + - corning_384_wellplate_112ul_flat_N8 + - corning_384_wellplate_112ul_flat_O8 + - corning_384_wellplate_112ul_flat_P8 + - corning_384_wellplate_112ul_flat_A9 + - corning_384_wellplate_112ul_flat_B9 + - corning_384_wellplate_112ul_flat_C9 + - corning_384_wellplate_112ul_flat_D9 + - corning_384_wellplate_112ul_flat_E9 + - corning_384_wellplate_112ul_flat_F9 + - corning_384_wellplate_112ul_flat_G9 + - corning_384_wellplate_112ul_flat_H9 + - corning_384_wellplate_112ul_flat_I9 + - corning_384_wellplate_112ul_flat_J9 + - corning_384_wellplate_112ul_flat_K9 + - corning_384_wellplate_112ul_flat_L9 + - corning_384_wellplate_112ul_flat_M9 + - corning_384_wellplate_112ul_flat_N9 + - corning_384_wellplate_112ul_flat_O9 + - corning_384_wellplate_112ul_flat_P9 + - corning_384_wellplate_112ul_flat_A10 + - corning_384_wellplate_112ul_flat_B10 + - corning_384_wellplate_112ul_flat_C10 + - corning_384_wellplate_112ul_flat_D10 + - corning_384_wellplate_112ul_flat_E10 + - corning_384_wellplate_112ul_flat_F10 + - corning_384_wellplate_112ul_flat_G10 + - corning_384_wellplate_112ul_flat_H10 + - corning_384_wellplate_112ul_flat_I10 + - corning_384_wellplate_112ul_flat_J10 + - corning_384_wellplate_112ul_flat_K10 + - corning_384_wellplate_112ul_flat_L10 + - corning_384_wellplate_112ul_flat_M10 + - corning_384_wellplate_112ul_flat_N10 + - corning_384_wellplate_112ul_flat_O10 + - corning_384_wellplate_112ul_flat_P10 + - corning_384_wellplate_112ul_flat_A11 + - corning_384_wellplate_112ul_flat_B11 + - corning_384_wellplate_112ul_flat_C11 + - corning_384_wellplate_112ul_flat_D11 + - corning_384_wellplate_112ul_flat_E11 + - corning_384_wellplate_112ul_flat_F11 + - corning_384_wellplate_112ul_flat_G11 + - corning_384_wellplate_112ul_flat_H11 + - corning_384_wellplate_112ul_flat_I11 + - corning_384_wellplate_112ul_flat_J11 + - corning_384_wellplate_112ul_flat_K11 + - corning_384_wellplate_112ul_flat_L11 + - corning_384_wellplate_112ul_flat_M11 + - corning_384_wellplate_112ul_flat_N11 + - corning_384_wellplate_112ul_flat_O11 + - corning_384_wellplate_112ul_flat_P11 + - corning_384_wellplate_112ul_flat_A12 + - corning_384_wellplate_112ul_flat_B12 + - corning_384_wellplate_112ul_flat_C12 + - corning_384_wellplate_112ul_flat_D12 + - corning_384_wellplate_112ul_flat_E12 + - corning_384_wellplate_112ul_flat_F12 + - corning_384_wellplate_112ul_flat_G12 + - corning_384_wellplate_112ul_flat_H12 + - corning_384_wellplate_112ul_flat_I12 + - corning_384_wellplate_112ul_flat_J12 + - corning_384_wellplate_112ul_flat_K12 + - corning_384_wellplate_112ul_flat_L12 + - corning_384_wellplate_112ul_flat_M12 + - corning_384_wellplate_112ul_flat_N12 + - corning_384_wellplate_112ul_flat_O12 + - corning_384_wellplate_112ul_flat_P12 + - corning_384_wellplate_112ul_flat_A13 + - corning_384_wellplate_112ul_flat_B13 + - corning_384_wellplate_112ul_flat_C13 + - corning_384_wellplate_112ul_flat_D13 + - corning_384_wellplate_112ul_flat_E13 + - corning_384_wellplate_112ul_flat_F13 + - corning_384_wellplate_112ul_flat_G13 + - corning_384_wellplate_112ul_flat_H13 + - corning_384_wellplate_112ul_flat_I13 + - corning_384_wellplate_112ul_flat_J13 + - corning_384_wellplate_112ul_flat_K13 + - corning_384_wellplate_112ul_flat_L13 + - corning_384_wellplate_112ul_flat_M13 + - corning_384_wellplate_112ul_flat_N13 + - corning_384_wellplate_112ul_flat_O13 + - corning_384_wellplate_112ul_flat_P13 + - corning_384_wellplate_112ul_flat_A14 + - corning_384_wellplate_112ul_flat_B14 + - corning_384_wellplate_112ul_flat_C14 + - corning_384_wellplate_112ul_flat_D14 + - corning_384_wellplate_112ul_flat_E14 + - corning_384_wellplate_112ul_flat_F14 + - corning_384_wellplate_112ul_flat_G14 + - corning_384_wellplate_112ul_flat_H14 + - corning_384_wellplate_112ul_flat_I14 + - corning_384_wellplate_112ul_flat_J14 + - corning_384_wellplate_112ul_flat_K14 + - corning_384_wellplate_112ul_flat_L14 + - corning_384_wellplate_112ul_flat_M14 + - corning_384_wellplate_112ul_flat_N14 + - corning_384_wellplate_112ul_flat_O14 + - corning_384_wellplate_112ul_flat_P14 + - corning_384_wellplate_112ul_flat_A15 + - corning_384_wellplate_112ul_flat_B15 + - corning_384_wellplate_112ul_flat_C15 + - corning_384_wellplate_112ul_flat_D15 + - corning_384_wellplate_112ul_flat_E15 + - corning_384_wellplate_112ul_flat_F15 + - corning_384_wellplate_112ul_flat_G15 + - corning_384_wellplate_112ul_flat_H15 + - corning_384_wellplate_112ul_flat_I15 + - corning_384_wellplate_112ul_flat_J15 + - corning_384_wellplate_112ul_flat_K15 + - corning_384_wellplate_112ul_flat_L15 + - corning_384_wellplate_112ul_flat_M15 + - corning_384_wellplate_112ul_flat_N15 + - corning_384_wellplate_112ul_flat_O15 + - corning_384_wellplate_112ul_flat_P15 + - corning_384_wellplate_112ul_flat_A16 + - corning_384_wellplate_112ul_flat_B16 + - corning_384_wellplate_112ul_flat_C16 + - corning_384_wellplate_112ul_flat_D16 + - corning_384_wellplate_112ul_flat_E16 + - corning_384_wellplate_112ul_flat_F16 + - corning_384_wellplate_112ul_flat_G16 + - corning_384_wellplate_112ul_flat_H16 + - corning_384_wellplate_112ul_flat_I16 + - corning_384_wellplate_112ul_flat_J16 + - corning_384_wellplate_112ul_flat_K16 + - corning_384_wellplate_112ul_flat_L16 + - corning_384_wellplate_112ul_flat_M16 + - corning_384_wellplate_112ul_flat_N16 + - corning_384_wellplate_112ul_flat_O16 + - corning_384_wellplate_112ul_flat_P16 + - corning_384_wellplate_112ul_flat_A17 + - corning_384_wellplate_112ul_flat_B17 + - corning_384_wellplate_112ul_flat_C17 + - corning_384_wellplate_112ul_flat_D17 + - corning_384_wellplate_112ul_flat_E17 + - corning_384_wellplate_112ul_flat_F17 + - corning_384_wellplate_112ul_flat_G17 + - corning_384_wellplate_112ul_flat_H17 + - corning_384_wellplate_112ul_flat_I17 + - corning_384_wellplate_112ul_flat_J17 + - corning_384_wellplate_112ul_flat_K17 + - corning_384_wellplate_112ul_flat_L17 + - corning_384_wellplate_112ul_flat_M17 + - corning_384_wellplate_112ul_flat_N17 + - corning_384_wellplate_112ul_flat_O17 + - corning_384_wellplate_112ul_flat_P17 + - corning_384_wellplate_112ul_flat_A18 + - corning_384_wellplate_112ul_flat_B18 + - corning_384_wellplate_112ul_flat_C18 + - corning_384_wellplate_112ul_flat_D18 + - corning_384_wellplate_112ul_flat_E18 + - corning_384_wellplate_112ul_flat_F18 + - corning_384_wellplate_112ul_flat_G18 + - corning_384_wellplate_112ul_flat_H18 + - corning_384_wellplate_112ul_flat_I18 + - corning_384_wellplate_112ul_flat_J18 + - corning_384_wellplate_112ul_flat_K18 + - corning_384_wellplate_112ul_flat_L18 + - corning_384_wellplate_112ul_flat_M18 + - corning_384_wellplate_112ul_flat_N18 + - corning_384_wellplate_112ul_flat_O18 + - corning_384_wellplate_112ul_flat_P18 + - corning_384_wellplate_112ul_flat_A19 + - corning_384_wellplate_112ul_flat_B19 + - corning_384_wellplate_112ul_flat_C19 + - corning_384_wellplate_112ul_flat_D19 + - corning_384_wellplate_112ul_flat_E19 + - corning_384_wellplate_112ul_flat_F19 + - corning_384_wellplate_112ul_flat_G19 + - corning_384_wellplate_112ul_flat_H19 + - corning_384_wellplate_112ul_flat_I19 + - corning_384_wellplate_112ul_flat_J19 + - corning_384_wellplate_112ul_flat_K19 + - corning_384_wellplate_112ul_flat_L19 + - corning_384_wellplate_112ul_flat_M19 + - corning_384_wellplate_112ul_flat_N19 + - corning_384_wellplate_112ul_flat_O19 + - corning_384_wellplate_112ul_flat_P19 + - corning_384_wellplate_112ul_flat_A20 + - corning_384_wellplate_112ul_flat_B20 + - corning_384_wellplate_112ul_flat_C20 + - corning_384_wellplate_112ul_flat_D20 + - corning_384_wellplate_112ul_flat_E20 + - corning_384_wellplate_112ul_flat_F20 + - corning_384_wellplate_112ul_flat_G20 + - corning_384_wellplate_112ul_flat_H20 + - corning_384_wellplate_112ul_flat_I20 + - corning_384_wellplate_112ul_flat_J20 + - corning_384_wellplate_112ul_flat_K20 + - corning_384_wellplate_112ul_flat_L20 + - corning_384_wellplate_112ul_flat_M20 + - corning_384_wellplate_112ul_flat_N20 + - corning_384_wellplate_112ul_flat_O20 + - corning_384_wellplate_112ul_flat_P20 + - corning_384_wellplate_112ul_flat_A21 + - corning_384_wellplate_112ul_flat_B21 + - corning_384_wellplate_112ul_flat_C21 + - corning_384_wellplate_112ul_flat_D21 + - corning_384_wellplate_112ul_flat_E21 + - corning_384_wellplate_112ul_flat_F21 + - corning_384_wellplate_112ul_flat_G21 + - corning_384_wellplate_112ul_flat_H21 + - corning_384_wellplate_112ul_flat_I21 + - corning_384_wellplate_112ul_flat_J21 + - corning_384_wellplate_112ul_flat_K21 + - corning_384_wellplate_112ul_flat_L21 + - corning_384_wellplate_112ul_flat_M21 + - corning_384_wellplate_112ul_flat_N21 + - corning_384_wellplate_112ul_flat_O21 + - corning_384_wellplate_112ul_flat_P21 + - corning_384_wellplate_112ul_flat_A22 + - corning_384_wellplate_112ul_flat_B22 + - corning_384_wellplate_112ul_flat_C22 + - corning_384_wellplate_112ul_flat_D22 + - corning_384_wellplate_112ul_flat_E22 + - corning_384_wellplate_112ul_flat_F22 + - corning_384_wellplate_112ul_flat_G22 + - corning_384_wellplate_112ul_flat_H22 + - corning_384_wellplate_112ul_flat_I22 + - corning_384_wellplate_112ul_flat_J22 + - corning_384_wellplate_112ul_flat_K22 + - corning_384_wellplate_112ul_flat_L22 + - corning_384_wellplate_112ul_flat_M22 + - corning_384_wellplate_112ul_flat_N22 + - corning_384_wellplate_112ul_flat_O22 + - corning_384_wellplate_112ul_flat_P22 + - corning_384_wellplate_112ul_flat_A23 + - corning_384_wellplate_112ul_flat_B23 + - corning_384_wellplate_112ul_flat_C23 + - corning_384_wellplate_112ul_flat_D23 + - corning_384_wellplate_112ul_flat_E23 + - corning_384_wellplate_112ul_flat_F23 + - corning_384_wellplate_112ul_flat_G23 + - corning_384_wellplate_112ul_flat_H23 + - corning_384_wellplate_112ul_flat_I23 + - corning_384_wellplate_112ul_flat_J23 + - corning_384_wellplate_112ul_flat_K23 + - corning_384_wellplate_112ul_flat_L23 + - corning_384_wellplate_112ul_flat_M23 + - corning_384_wellplate_112ul_flat_N23 + - corning_384_wellplate_112ul_flat_O23 + - corning_384_wellplate_112ul_flat_P23 + - corning_384_wellplate_112ul_flat_A24 + - corning_384_wellplate_112ul_flat_B24 + - corning_384_wellplate_112ul_flat_C24 + - corning_384_wellplate_112ul_flat_D24 + - corning_384_wellplate_112ul_flat_E24 + - corning_384_wellplate_112ul_flat_F24 + - corning_384_wellplate_112ul_flat_G24 + - corning_384_wellplate_112ul_flat_H24 + - corning_384_wellplate_112ul_flat_I24 + - corning_384_wellplate_112ul_flat_J24 + - corning_384_wellplate_112ul_flat_K24 + - corning_384_wellplate_112ul_flat_L24 + - corning_384_wellplate_112ul_flat_M24 + - corning_384_wellplate_112ul_flat_N24 + - corning_384_wellplate_112ul_flat_O24 + - corning_384_wellplate_112ul_flat_P24 + class: '' + config: + barcode: null + category: plate + model: Corning 384 Well Plate 112 µL Flat + ordering: + A1: corning_384_wellplate_112ul_flat_A1 + B1: corning_384_wellplate_112ul_flat_B1 + C1: corning_384_wellplate_112ul_flat_C1 + D1: corning_384_wellplate_112ul_flat_D1 + E1: corning_384_wellplate_112ul_flat_E1 + F1: corning_384_wellplate_112ul_flat_F1 + G1: corning_384_wellplate_112ul_flat_G1 + H1: corning_384_wellplate_112ul_flat_H1 + I1: corning_384_wellplate_112ul_flat_I1 + J1: corning_384_wellplate_112ul_flat_J1 + K1: corning_384_wellplate_112ul_flat_K1 + L1: corning_384_wellplate_112ul_flat_L1 + M1: corning_384_wellplate_112ul_flat_M1 + N1: corning_384_wellplate_112ul_flat_N1 + O1: corning_384_wellplate_112ul_flat_O1 + P1: corning_384_wellplate_112ul_flat_P1 + A2: corning_384_wellplate_112ul_flat_A2 + B2: corning_384_wellplate_112ul_flat_B2 + C2: corning_384_wellplate_112ul_flat_C2 + D2: corning_384_wellplate_112ul_flat_D2 + E2: corning_384_wellplate_112ul_flat_E2 + F2: corning_384_wellplate_112ul_flat_F2 + G2: corning_384_wellplate_112ul_flat_G2 + H2: corning_384_wellplate_112ul_flat_H2 + I2: corning_384_wellplate_112ul_flat_I2 + J2: corning_384_wellplate_112ul_flat_J2 + K2: corning_384_wellplate_112ul_flat_K2 + L2: corning_384_wellplate_112ul_flat_L2 + M2: corning_384_wellplate_112ul_flat_M2 + N2: corning_384_wellplate_112ul_flat_N2 + O2: corning_384_wellplate_112ul_flat_O2 + P2: corning_384_wellplate_112ul_flat_P2 + A3: corning_384_wellplate_112ul_flat_A3 + B3: corning_384_wellplate_112ul_flat_B3 + C3: corning_384_wellplate_112ul_flat_C3 + D3: corning_384_wellplate_112ul_flat_D3 + E3: corning_384_wellplate_112ul_flat_E3 + F3: corning_384_wellplate_112ul_flat_F3 + G3: corning_384_wellplate_112ul_flat_G3 + H3: corning_384_wellplate_112ul_flat_H3 + I3: corning_384_wellplate_112ul_flat_I3 + J3: corning_384_wellplate_112ul_flat_J3 + K3: corning_384_wellplate_112ul_flat_K3 + L3: corning_384_wellplate_112ul_flat_L3 + M3: corning_384_wellplate_112ul_flat_M3 + N3: corning_384_wellplate_112ul_flat_N3 + O3: corning_384_wellplate_112ul_flat_O3 + P3: corning_384_wellplate_112ul_flat_P3 + A4: corning_384_wellplate_112ul_flat_A4 + B4: corning_384_wellplate_112ul_flat_B4 + C4: corning_384_wellplate_112ul_flat_C4 + D4: corning_384_wellplate_112ul_flat_D4 + E4: corning_384_wellplate_112ul_flat_E4 + F4: corning_384_wellplate_112ul_flat_F4 + G4: corning_384_wellplate_112ul_flat_G4 + H4: corning_384_wellplate_112ul_flat_H4 + I4: corning_384_wellplate_112ul_flat_I4 + J4: corning_384_wellplate_112ul_flat_J4 + K4: corning_384_wellplate_112ul_flat_K4 + L4: corning_384_wellplate_112ul_flat_L4 + M4: corning_384_wellplate_112ul_flat_M4 + N4: corning_384_wellplate_112ul_flat_N4 + O4: corning_384_wellplate_112ul_flat_O4 + P4: corning_384_wellplate_112ul_flat_P4 + A5: corning_384_wellplate_112ul_flat_A5 + B5: corning_384_wellplate_112ul_flat_B5 + C5: corning_384_wellplate_112ul_flat_C5 + D5: corning_384_wellplate_112ul_flat_D5 + E5: corning_384_wellplate_112ul_flat_E5 + F5: corning_384_wellplate_112ul_flat_F5 + G5: corning_384_wellplate_112ul_flat_G5 + H5: corning_384_wellplate_112ul_flat_H5 + I5: corning_384_wellplate_112ul_flat_I5 + J5: corning_384_wellplate_112ul_flat_J5 + K5: corning_384_wellplate_112ul_flat_K5 + L5: corning_384_wellplate_112ul_flat_L5 + M5: corning_384_wellplate_112ul_flat_M5 + N5: corning_384_wellplate_112ul_flat_N5 + O5: corning_384_wellplate_112ul_flat_O5 + P5: corning_384_wellplate_112ul_flat_P5 + A6: corning_384_wellplate_112ul_flat_A6 + B6: corning_384_wellplate_112ul_flat_B6 + C6: corning_384_wellplate_112ul_flat_C6 + D6: corning_384_wellplate_112ul_flat_D6 + E6: corning_384_wellplate_112ul_flat_E6 + F6: corning_384_wellplate_112ul_flat_F6 + G6: corning_384_wellplate_112ul_flat_G6 + H6: corning_384_wellplate_112ul_flat_H6 + I6: corning_384_wellplate_112ul_flat_I6 + J6: corning_384_wellplate_112ul_flat_J6 + K6: corning_384_wellplate_112ul_flat_K6 + L6: corning_384_wellplate_112ul_flat_L6 + M6: corning_384_wellplate_112ul_flat_M6 + N6: corning_384_wellplate_112ul_flat_N6 + O6: corning_384_wellplate_112ul_flat_O6 + P6: corning_384_wellplate_112ul_flat_P6 + A7: corning_384_wellplate_112ul_flat_A7 + B7: corning_384_wellplate_112ul_flat_B7 + C7: corning_384_wellplate_112ul_flat_C7 + D7: corning_384_wellplate_112ul_flat_D7 + E7: corning_384_wellplate_112ul_flat_E7 + F7: corning_384_wellplate_112ul_flat_F7 + G7: corning_384_wellplate_112ul_flat_G7 + H7: corning_384_wellplate_112ul_flat_H7 + I7: corning_384_wellplate_112ul_flat_I7 + J7: corning_384_wellplate_112ul_flat_J7 + K7: corning_384_wellplate_112ul_flat_K7 + L7: corning_384_wellplate_112ul_flat_L7 + M7: corning_384_wellplate_112ul_flat_M7 + N7: corning_384_wellplate_112ul_flat_N7 + O7: corning_384_wellplate_112ul_flat_O7 + P7: corning_384_wellplate_112ul_flat_P7 + A8: corning_384_wellplate_112ul_flat_A8 + B8: corning_384_wellplate_112ul_flat_B8 + C8: corning_384_wellplate_112ul_flat_C8 + D8: corning_384_wellplate_112ul_flat_D8 + E8: corning_384_wellplate_112ul_flat_E8 + F8: corning_384_wellplate_112ul_flat_F8 + G8: corning_384_wellplate_112ul_flat_G8 + H8: corning_384_wellplate_112ul_flat_H8 + I8: corning_384_wellplate_112ul_flat_I8 + J8: corning_384_wellplate_112ul_flat_J8 + K8: corning_384_wellplate_112ul_flat_K8 + L8: corning_384_wellplate_112ul_flat_L8 + M8: corning_384_wellplate_112ul_flat_M8 + N8: corning_384_wellplate_112ul_flat_N8 + O8: corning_384_wellplate_112ul_flat_O8 + P8: corning_384_wellplate_112ul_flat_P8 + A9: corning_384_wellplate_112ul_flat_A9 + B9: corning_384_wellplate_112ul_flat_B9 + C9: corning_384_wellplate_112ul_flat_C9 + D9: corning_384_wellplate_112ul_flat_D9 + E9: corning_384_wellplate_112ul_flat_E9 + F9: corning_384_wellplate_112ul_flat_F9 + G9: corning_384_wellplate_112ul_flat_G9 + H9: corning_384_wellplate_112ul_flat_H9 + I9: corning_384_wellplate_112ul_flat_I9 + J9: corning_384_wellplate_112ul_flat_J9 + K9: corning_384_wellplate_112ul_flat_K9 + L9: corning_384_wellplate_112ul_flat_L9 + M9: corning_384_wellplate_112ul_flat_M9 + N9: corning_384_wellplate_112ul_flat_N9 + O9: corning_384_wellplate_112ul_flat_O9 + P9: corning_384_wellplate_112ul_flat_P9 + A10: corning_384_wellplate_112ul_flat_A10 + B10: corning_384_wellplate_112ul_flat_B10 + C10: corning_384_wellplate_112ul_flat_C10 + D10: corning_384_wellplate_112ul_flat_D10 + E10: corning_384_wellplate_112ul_flat_E10 + F10: corning_384_wellplate_112ul_flat_F10 + G10: corning_384_wellplate_112ul_flat_G10 + H10: corning_384_wellplate_112ul_flat_H10 + I10: corning_384_wellplate_112ul_flat_I10 + J10: corning_384_wellplate_112ul_flat_J10 + K10: corning_384_wellplate_112ul_flat_K10 + L10: corning_384_wellplate_112ul_flat_L10 + M10: corning_384_wellplate_112ul_flat_M10 + N10: corning_384_wellplate_112ul_flat_N10 + O10: corning_384_wellplate_112ul_flat_O10 + P10: corning_384_wellplate_112ul_flat_P10 + A11: corning_384_wellplate_112ul_flat_A11 + B11: corning_384_wellplate_112ul_flat_B11 + C11: corning_384_wellplate_112ul_flat_C11 + D11: corning_384_wellplate_112ul_flat_D11 + E11: corning_384_wellplate_112ul_flat_E11 + F11: corning_384_wellplate_112ul_flat_F11 + G11: corning_384_wellplate_112ul_flat_G11 + H11: corning_384_wellplate_112ul_flat_H11 + I11: corning_384_wellplate_112ul_flat_I11 + J11: corning_384_wellplate_112ul_flat_J11 + K11: corning_384_wellplate_112ul_flat_K11 + L11: corning_384_wellplate_112ul_flat_L11 + M11: corning_384_wellplate_112ul_flat_M11 + N11: corning_384_wellplate_112ul_flat_N11 + O11: corning_384_wellplate_112ul_flat_O11 + P11: corning_384_wellplate_112ul_flat_P11 + A12: corning_384_wellplate_112ul_flat_A12 + B12: corning_384_wellplate_112ul_flat_B12 + C12: corning_384_wellplate_112ul_flat_C12 + D12: corning_384_wellplate_112ul_flat_D12 + E12: corning_384_wellplate_112ul_flat_E12 + F12: corning_384_wellplate_112ul_flat_F12 + G12: corning_384_wellplate_112ul_flat_G12 + H12: corning_384_wellplate_112ul_flat_H12 + I12: corning_384_wellplate_112ul_flat_I12 + J12: corning_384_wellplate_112ul_flat_J12 + K12: corning_384_wellplate_112ul_flat_K12 + L12: corning_384_wellplate_112ul_flat_L12 + M12: corning_384_wellplate_112ul_flat_M12 + N12: corning_384_wellplate_112ul_flat_N12 + O12: corning_384_wellplate_112ul_flat_O12 + P12: corning_384_wellplate_112ul_flat_P12 + A13: corning_384_wellplate_112ul_flat_A13 + B13: corning_384_wellplate_112ul_flat_B13 + C13: corning_384_wellplate_112ul_flat_C13 + D13: corning_384_wellplate_112ul_flat_D13 + E13: corning_384_wellplate_112ul_flat_E13 + F13: corning_384_wellplate_112ul_flat_F13 + G13: corning_384_wellplate_112ul_flat_G13 + H13: corning_384_wellplate_112ul_flat_H13 + I13: corning_384_wellplate_112ul_flat_I13 + J13: corning_384_wellplate_112ul_flat_J13 + K13: corning_384_wellplate_112ul_flat_K13 + L13: corning_384_wellplate_112ul_flat_L13 + M13: corning_384_wellplate_112ul_flat_M13 + N13: corning_384_wellplate_112ul_flat_N13 + O13: corning_384_wellplate_112ul_flat_O13 + P13: corning_384_wellplate_112ul_flat_P13 + A14: corning_384_wellplate_112ul_flat_A14 + B14: corning_384_wellplate_112ul_flat_B14 + C14: corning_384_wellplate_112ul_flat_C14 + D14: corning_384_wellplate_112ul_flat_D14 + E14: corning_384_wellplate_112ul_flat_E14 + F14: corning_384_wellplate_112ul_flat_F14 + G14: corning_384_wellplate_112ul_flat_G14 + H14: corning_384_wellplate_112ul_flat_H14 + I14: corning_384_wellplate_112ul_flat_I14 + J14: corning_384_wellplate_112ul_flat_J14 + K14: corning_384_wellplate_112ul_flat_K14 + L14: corning_384_wellplate_112ul_flat_L14 + M14: corning_384_wellplate_112ul_flat_M14 + N14: corning_384_wellplate_112ul_flat_N14 + O14: corning_384_wellplate_112ul_flat_O14 + P14: corning_384_wellplate_112ul_flat_P14 + A15: corning_384_wellplate_112ul_flat_A15 + B15: corning_384_wellplate_112ul_flat_B15 + C15: corning_384_wellplate_112ul_flat_C15 + D15: corning_384_wellplate_112ul_flat_D15 + E15: corning_384_wellplate_112ul_flat_E15 + F15: corning_384_wellplate_112ul_flat_F15 + G15: corning_384_wellplate_112ul_flat_G15 + H15: corning_384_wellplate_112ul_flat_H15 + I15: corning_384_wellplate_112ul_flat_I15 + J15: corning_384_wellplate_112ul_flat_J15 + K15: corning_384_wellplate_112ul_flat_K15 + L15: corning_384_wellplate_112ul_flat_L15 + M15: corning_384_wellplate_112ul_flat_M15 + N15: corning_384_wellplate_112ul_flat_N15 + O15: corning_384_wellplate_112ul_flat_O15 + P15: corning_384_wellplate_112ul_flat_P15 + A16: corning_384_wellplate_112ul_flat_A16 + B16: corning_384_wellplate_112ul_flat_B16 + C16: corning_384_wellplate_112ul_flat_C16 + D16: corning_384_wellplate_112ul_flat_D16 + E16: corning_384_wellplate_112ul_flat_E16 + F16: corning_384_wellplate_112ul_flat_F16 + G16: corning_384_wellplate_112ul_flat_G16 + H16: corning_384_wellplate_112ul_flat_H16 + I16: corning_384_wellplate_112ul_flat_I16 + J16: corning_384_wellplate_112ul_flat_J16 + K16: corning_384_wellplate_112ul_flat_K16 + L16: corning_384_wellplate_112ul_flat_L16 + M16: corning_384_wellplate_112ul_flat_M16 + N16: corning_384_wellplate_112ul_flat_N16 + O16: corning_384_wellplate_112ul_flat_O16 + P16: corning_384_wellplate_112ul_flat_P16 + A17: corning_384_wellplate_112ul_flat_A17 + B17: corning_384_wellplate_112ul_flat_B17 + C17: corning_384_wellplate_112ul_flat_C17 + D17: corning_384_wellplate_112ul_flat_D17 + E17: corning_384_wellplate_112ul_flat_E17 + F17: corning_384_wellplate_112ul_flat_F17 + G17: corning_384_wellplate_112ul_flat_G17 + H17: corning_384_wellplate_112ul_flat_H17 + I17: corning_384_wellplate_112ul_flat_I17 + J17: corning_384_wellplate_112ul_flat_J17 + K17: corning_384_wellplate_112ul_flat_K17 + L17: corning_384_wellplate_112ul_flat_L17 + M17: corning_384_wellplate_112ul_flat_M17 + N17: corning_384_wellplate_112ul_flat_N17 + O17: corning_384_wellplate_112ul_flat_O17 + P17: corning_384_wellplate_112ul_flat_P17 + A18: corning_384_wellplate_112ul_flat_A18 + B18: corning_384_wellplate_112ul_flat_B18 + C18: corning_384_wellplate_112ul_flat_C18 + D18: corning_384_wellplate_112ul_flat_D18 + E18: corning_384_wellplate_112ul_flat_E18 + F18: corning_384_wellplate_112ul_flat_F18 + G18: corning_384_wellplate_112ul_flat_G18 + H18: corning_384_wellplate_112ul_flat_H18 + I18: corning_384_wellplate_112ul_flat_I18 + J18: corning_384_wellplate_112ul_flat_J18 + K18: corning_384_wellplate_112ul_flat_K18 + L18: corning_384_wellplate_112ul_flat_L18 + M18: corning_384_wellplate_112ul_flat_M18 + N18: corning_384_wellplate_112ul_flat_N18 + O18: corning_384_wellplate_112ul_flat_O18 + P18: corning_384_wellplate_112ul_flat_P18 + A19: corning_384_wellplate_112ul_flat_A19 + B19: corning_384_wellplate_112ul_flat_B19 + C19: corning_384_wellplate_112ul_flat_C19 + D19: corning_384_wellplate_112ul_flat_D19 + E19: corning_384_wellplate_112ul_flat_E19 + F19: corning_384_wellplate_112ul_flat_F19 + G19: corning_384_wellplate_112ul_flat_G19 + H19: corning_384_wellplate_112ul_flat_H19 + I19: corning_384_wellplate_112ul_flat_I19 + J19: corning_384_wellplate_112ul_flat_J19 + K19: corning_384_wellplate_112ul_flat_K19 + L19: corning_384_wellplate_112ul_flat_L19 + M19: corning_384_wellplate_112ul_flat_M19 + N19: corning_384_wellplate_112ul_flat_N19 + O19: corning_384_wellplate_112ul_flat_O19 + P19: corning_384_wellplate_112ul_flat_P19 + A20: corning_384_wellplate_112ul_flat_A20 + B20: corning_384_wellplate_112ul_flat_B20 + C20: corning_384_wellplate_112ul_flat_C20 + D20: corning_384_wellplate_112ul_flat_D20 + E20: corning_384_wellplate_112ul_flat_E20 + F20: corning_384_wellplate_112ul_flat_F20 + G20: corning_384_wellplate_112ul_flat_G20 + H20: corning_384_wellplate_112ul_flat_H20 + I20: corning_384_wellplate_112ul_flat_I20 + J20: corning_384_wellplate_112ul_flat_J20 + K20: corning_384_wellplate_112ul_flat_K20 + L20: corning_384_wellplate_112ul_flat_L20 + M20: corning_384_wellplate_112ul_flat_M20 + N20: corning_384_wellplate_112ul_flat_N20 + O20: corning_384_wellplate_112ul_flat_O20 + P20: corning_384_wellplate_112ul_flat_P20 + A21: corning_384_wellplate_112ul_flat_A21 + B21: corning_384_wellplate_112ul_flat_B21 + C21: corning_384_wellplate_112ul_flat_C21 + D21: corning_384_wellplate_112ul_flat_D21 + E21: corning_384_wellplate_112ul_flat_E21 + F21: corning_384_wellplate_112ul_flat_F21 + G21: corning_384_wellplate_112ul_flat_G21 + H21: corning_384_wellplate_112ul_flat_H21 + I21: corning_384_wellplate_112ul_flat_I21 + J21: corning_384_wellplate_112ul_flat_J21 + K21: corning_384_wellplate_112ul_flat_K21 + L21: corning_384_wellplate_112ul_flat_L21 + M21: corning_384_wellplate_112ul_flat_M21 + N21: corning_384_wellplate_112ul_flat_N21 + O21: corning_384_wellplate_112ul_flat_O21 + P21: corning_384_wellplate_112ul_flat_P21 + A22: corning_384_wellplate_112ul_flat_A22 + B22: corning_384_wellplate_112ul_flat_B22 + C22: corning_384_wellplate_112ul_flat_C22 + D22: corning_384_wellplate_112ul_flat_D22 + E22: corning_384_wellplate_112ul_flat_E22 + F22: corning_384_wellplate_112ul_flat_F22 + G22: corning_384_wellplate_112ul_flat_G22 + H22: corning_384_wellplate_112ul_flat_H22 + I22: corning_384_wellplate_112ul_flat_I22 + J22: corning_384_wellplate_112ul_flat_J22 + K22: corning_384_wellplate_112ul_flat_K22 + L22: corning_384_wellplate_112ul_flat_L22 + M22: corning_384_wellplate_112ul_flat_M22 + N22: corning_384_wellplate_112ul_flat_N22 + O22: corning_384_wellplate_112ul_flat_O22 + P22: corning_384_wellplate_112ul_flat_P22 + A23: corning_384_wellplate_112ul_flat_A23 + B23: corning_384_wellplate_112ul_flat_B23 + C23: corning_384_wellplate_112ul_flat_C23 + D23: corning_384_wellplate_112ul_flat_D23 + E23: corning_384_wellplate_112ul_flat_E23 + F23: corning_384_wellplate_112ul_flat_F23 + G23: corning_384_wellplate_112ul_flat_G23 + H23: corning_384_wellplate_112ul_flat_H23 + I23: corning_384_wellplate_112ul_flat_I23 + J23: corning_384_wellplate_112ul_flat_J23 + K23: corning_384_wellplate_112ul_flat_K23 + L23: corning_384_wellplate_112ul_flat_L23 + M23: corning_384_wellplate_112ul_flat_M23 + N23: corning_384_wellplate_112ul_flat_N23 + O23: corning_384_wellplate_112ul_flat_O23 + P23: corning_384_wellplate_112ul_flat_P23 + A24: corning_384_wellplate_112ul_flat_A24 + B24: corning_384_wellplate_112ul_flat_B24 + C24: corning_384_wellplate_112ul_flat_C24 + D24: corning_384_wellplate_112ul_flat_D24 + E24: corning_384_wellplate_112ul_flat_E24 + F24: corning_384_wellplate_112ul_flat_F24 + G24: corning_384_wellplate_112ul_flat_G24 + H24: corning_384_wellplate_112ul_flat_H24 + I24: corning_384_wellplate_112ul_flat_I24 + J24: corning_384_wellplate_112ul_flat_J24 + K24: corning_384_wellplate_112ul_flat_K24 + L24: corning_384_wellplate_112ul_flat_L24 + M24: corning_384_wellplate_112ul_flat_M24 + N24: corning_384_wellplate_112ul_flat_N24 + O24: corning_384_wellplate_112ul_flat_O24 + P24: corning_384_wellplate_112ul_flat_P24 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.76 + size_y: 85.47 + size_z: 14.22 + type: Plate + data: {} + id: corning_384_wellplate_112ul_flat + name: corning_384_wellplate_112ul_flat + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: plate + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_A1 + name: corning_384_wellplate_112ul_flat_A1 + parent: corning_384_wellplate_112ul_flat + position: + x: 10.305 + y: 74.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_B1 + name: corning_384_wellplate_112ul_flat_B1 + parent: corning_384_wellplate_112ul_flat + position: + x: 10.305 + y: 70.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_C1 + name: corning_384_wellplate_112ul_flat_C1 + parent: corning_384_wellplate_112ul_flat + position: + x: 10.305 + y: 65.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_D1 + name: corning_384_wellplate_112ul_flat_D1 + parent: corning_384_wellplate_112ul_flat + position: + x: 10.305 + y: 61.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_E1 + name: corning_384_wellplate_112ul_flat_E1 + parent: corning_384_wellplate_112ul_flat + position: + x: 10.305 + y: 56.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_F1 + name: corning_384_wellplate_112ul_flat_F1 + parent: corning_384_wellplate_112ul_flat + position: + x: 10.305 + y: 52.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_G1 + name: corning_384_wellplate_112ul_flat_G1 + parent: corning_384_wellplate_112ul_flat + position: + x: 10.305 + y: 47.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_H1 + name: corning_384_wellplate_112ul_flat_H1 + parent: corning_384_wellplate_112ul_flat + position: + x: 10.305 + y: 43.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_I1 + name: corning_384_wellplate_112ul_flat_I1 + parent: corning_384_wellplate_112ul_flat + position: + x: 10.305 + y: 38.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_J1 + name: corning_384_wellplate_112ul_flat_J1 + parent: corning_384_wellplate_112ul_flat + position: + x: 10.305 + y: 34.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_K1 + name: corning_384_wellplate_112ul_flat_K1 + parent: corning_384_wellplate_112ul_flat + position: + x: 10.305 + y: 29.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_L1 + name: corning_384_wellplate_112ul_flat_L1 + parent: corning_384_wellplate_112ul_flat + position: + x: 10.305 + y: 25.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_M1 + name: corning_384_wellplate_112ul_flat_M1 + parent: corning_384_wellplate_112ul_flat + position: + x: 10.305 + y: 20.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_N1 + name: corning_384_wellplate_112ul_flat_N1 + parent: corning_384_wellplate_112ul_flat + position: + x: 10.305 + y: 16.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_O1 + name: corning_384_wellplate_112ul_flat_O1 + parent: corning_384_wellplate_112ul_flat + position: + x: 10.305 + y: 11.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_P1 + name: corning_384_wellplate_112ul_flat_P1 + parent: corning_384_wellplate_112ul_flat + position: + x: 10.305 + y: 7.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_A2 + name: corning_384_wellplate_112ul_flat_A2 + parent: corning_384_wellplate_112ul_flat + position: + x: 14.805 + y: 74.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_B2 + name: corning_384_wellplate_112ul_flat_B2 + parent: corning_384_wellplate_112ul_flat + position: + x: 14.805 + y: 70.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_C2 + name: corning_384_wellplate_112ul_flat_C2 + parent: corning_384_wellplate_112ul_flat + position: + x: 14.805 + y: 65.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_D2 + name: corning_384_wellplate_112ul_flat_D2 + parent: corning_384_wellplate_112ul_flat + position: + x: 14.805 + y: 61.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_E2 + name: corning_384_wellplate_112ul_flat_E2 + parent: corning_384_wellplate_112ul_flat + position: + x: 14.805 + y: 56.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_F2 + name: corning_384_wellplate_112ul_flat_F2 + parent: corning_384_wellplate_112ul_flat + position: + x: 14.805 + y: 52.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_G2 + name: corning_384_wellplate_112ul_flat_G2 + parent: corning_384_wellplate_112ul_flat + position: + x: 14.805 + y: 47.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_H2 + name: corning_384_wellplate_112ul_flat_H2 + parent: corning_384_wellplate_112ul_flat + position: + x: 14.805 + y: 43.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_I2 + name: corning_384_wellplate_112ul_flat_I2 + parent: corning_384_wellplate_112ul_flat + position: + x: 14.805 + y: 38.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_J2 + name: corning_384_wellplate_112ul_flat_J2 + parent: corning_384_wellplate_112ul_flat + position: + x: 14.805 + y: 34.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_K2 + name: corning_384_wellplate_112ul_flat_K2 + parent: corning_384_wellplate_112ul_flat + position: + x: 14.805 + y: 29.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_L2 + name: corning_384_wellplate_112ul_flat_L2 + parent: corning_384_wellplate_112ul_flat + position: + x: 14.805 + y: 25.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_M2 + name: corning_384_wellplate_112ul_flat_M2 + parent: corning_384_wellplate_112ul_flat + position: + x: 14.805 + y: 20.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_N2 + name: corning_384_wellplate_112ul_flat_N2 + parent: corning_384_wellplate_112ul_flat + position: + x: 14.805 + y: 16.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_O2 + name: corning_384_wellplate_112ul_flat_O2 + parent: corning_384_wellplate_112ul_flat + position: + x: 14.805 + y: 11.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_P2 + name: corning_384_wellplate_112ul_flat_P2 + parent: corning_384_wellplate_112ul_flat + position: + x: 14.805 + y: 7.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_A3 + name: corning_384_wellplate_112ul_flat_A3 + parent: corning_384_wellplate_112ul_flat + position: + x: 19.305 + y: 74.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_B3 + name: corning_384_wellplate_112ul_flat_B3 + parent: corning_384_wellplate_112ul_flat + position: + x: 19.305 + y: 70.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_C3 + name: corning_384_wellplate_112ul_flat_C3 + parent: corning_384_wellplate_112ul_flat + position: + x: 19.305 + y: 65.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_D3 + name: corning_384_wellplate_112ul_flat_D3 + parent: corning_384_wellplate_112ul_flat + position: + x: 19.305 + y: 61.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_E3 + name: corning_384_wellplate_112ul_flat_E3 + parent: corning_384_wellplate_112ul_flat + position: + x: 19.305 + y: 56.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_F3 + name: corning_384_wellplate_112ul_flat_F3 + parent: corning_384_wellplate_112ul_flat + position: + x: 19.305 + y: 52.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_G3 + name: corning_384_wellplate_112ul_flat_G3 + parent: corning_384_wellplate_112ul_flat + position: + x: 19.305 + y: 47.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_H3 + name: corning_384_wellplate_112ul_flat_H3 + parent: corning_384_wellplate_112ul_flat + position: + x: 19.305 + y: 43.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_I3 + name: corning_384_wellplate_112ul_flat_I3 + parent: corning_384_wellplate_112ul_flat + position: + x: 19.305 + y: 38.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_J3 + name: corning_384_wellplate_112ul_flat_J3 + parent: corning_384_wellplate_112ul_flat + position: + x: 19.305 + y: 34.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_K3 + name: corning_384_wellplate_112ul_flat_K3 + parent: corning_384_wellplate_112ul_flat + position: + x: 19.305 + y: 29.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_L3 + name: corning_384_wellplate_112ul_flat_L3 + parent: corning_384_wellplate_112ul_flat + position: + x: 19.305 + y: 25.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_M3 + name: corning_384_wellplate_112ul_flat_M3 + parent: corning_384_wellplate_112ul_flat + position: + x: 19.305 + y: 20.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_N3 + name: corning_384_wellplate_112ul_flat_N3 + parent: corning_384_wellplate_112ul_flat + position: + x: 19.305 + y: 16.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_O3 + name: corning_384_wellplate_112ul_flat_O3 + parent: corning_384_wellplate_112ul_flat + position: + x: 19.305 + y: 11.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_P3 + name: corning_384_wellplate_112ul_flat_P3 + parent: corning_384_wellplate_112ul_flat + position: + x: 19.305 + y: 7.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_A4 + name: corning_384_wellplate_112ul_flat_A4 + parent: corning_384_wellplate_112ul_flat + position: + x: 23.805 + y: 74.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_B4 + name: corning_384_wellplate_112ul_flat_B4 + parent: corning_384_wellplate_112ul_flat + position: + x: 23.805 + y: 70.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_C4 + name: corning_384_wellplate_112ul_flat_C4 + parent: corning_384_wellplate_112ul_flat + position: + x: 23.805 + y: 65.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_D4 + name: corning_384_wellplate_112ul_flat_D4 + parent: corning_384_wellplate_112ul_flat + position: + x: 23.805 + y: 61.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_E4 + name: corning_384_wellplate_112ul_flat_E4 + parent: corning_384_wellplate_112ul_flat + position: + x: 23.805 + y: 56.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_F4 + name: corning_384_wellplate_112ul_flat_F4 + parent: corning_384_wellplate_112ul_flat + position: + x: 23.805 + y: 52.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_G4 + name: corning_384_wellplate_112ul_flat_G4 + parent: corning_384_wellplate_112ul_flat + position: + x: 23.805 + y: 47.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_H4 + name: corning_384_wellplate_112ul_flat_H4 + parent: corning_384_wellplate_112ul_flat + position: + x: 23.805 + y: 43.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_I4 + name: corning_384_wellplate_112ul_flat_I4 + parent: corning_384_wellplate_112ul_flat + position: + x: 23.805 + y: 38.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_J4 + name: corning_384_wellplate_112ul_flat_J4 + parent: corning_384_wellplate_112ul_flat + position: + x: 23.805 + y: 34.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_K4 + name: corning_384_wellplate_112ul_flat_K4 + parent: corning_384_wellplate_112ul_flat + position: + x: 23.805 + y: 29.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_L4 + name: corning_384_wellplate_112ul_flat_L4 + parent: corning_384_wellplate_112ul_flat + position: + x: 23.805 + y: 25.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_M4 + name: corning_384_wellplate_112ul_flat_M4 + parent: corning_384_wellplate_112ul_flat + position: + x: 23.805 + y: 20.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_N4 + name: corning_384_wellplate_112ul_flat_N4 + parent: corning_384_wellplate_112ul_flat + position: + x: 23.805 + y: 16.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_O4 + name: corning_384_wellplate_112ul_flat_O4 + parent: corning_384_wellplate_112ul_flat + position: + x: 23.805 + y: 11.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_P4 + name: corning_384_wellplate_112ul_flat_P4 + parent: corning_384_wellplate_112ul_flat + position: + x: 23.805 + y: 7.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_A5 + name: corning_384_wellplate_112ul_flat_A5 + parent: corning_384_wellplate_112ul_flat + position: + x: 28.305 + y: 74.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_B5 + name: corning_384_wellplate_112ul_flat_B5 + parent: corning_384_wellplate_112ul_flat + position: + x: 28.305 + y: 70.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_C5 + name: corning_384_wellplate_112ul_flat_C5 + parent: corning_384_wellplate_112ul_flat + position: + x: 28.305 + y: 65.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_D5 + name: corning_384_wellplate_112ul_flat_D5 + parent: corning_384_wellplate_112ul_flat + position: + x: 28.305 + y: 61.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_E5 + name: corning_384_wellplate_112ul_flat_E5 + parent: corning_384_wellplate_112ul_flat + position: + x: 28.305 + y: 56.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_F5 + name: corning_384_wellplate_112ul_flat_F5 + parent: corning_384_wellplate_112ul_flat + position: + x: 28.305 + y: 52.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_G5 + name: corning_384_wellplate_112ul_flat_G5 + parent: corning_384_wellplate_112ul_flat + position: + x: 28.305 + y: 47.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_H5 + name: corning_384_wellplate_112ul_flat_H5 + parent: corning_384_wellplate_112ul_flat + position: + x: 28.305 + y: 43.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_I5 + name: corning_384_wellplate_112ul_flat_I5 + parent: corning_384_wellplate_112ul_flat + position: + x: 28.305 + y: 38.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_J5 + name: corning_384_wellplate_112ul_flat_J5 + parent: corning_384_wellplate_112ul_flat + position: + x: 28.305 + y: 34.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_K5 + name: corning_384_wellplate_112ul_flat_K5 + parent: corning_384_wellplate_112ul_flat + position: + x: 28.305 + y: 29.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_L5 + name: corning_384_wellplate_112ul_flat_L5 + parent: corning_384_wellplate_112ul_flat + position: + x: 28.305 + y: 25.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_M5 + name: corning_384_wellplate_112ul_flat_M5 + parent: corning_384_wellplate_112ul_flat + position: + x: 28.305 + y: 20.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_N5 + name: corning_384_wellplate_112ul_flat_N5 + parent: corning_384_wellplate_112ul_flat + position: + x: 28.305 + y: 16.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_O5 + name: corning_384_wellplate_112ul_flat_O5 + parent: corning_384_wellplate_112ul_flat + position: + x: 28.305 + y: 11.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_P5 + name: corning_384_wellplate_112ul_flat_P5 + parent: corning_384_wellplate_112ul_flat + position: + x: 28.305 + y: 7.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_A6 + name: corning_384_wellplate_112ul_flat_A6 + parent: corning_384_wellplate_112ul_flat + position: + x: 32.805 + y: 74.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_B6 + name: corning_384_wellplate_112ul_flat_B6 + parent: corning_384_wellplate_112ul_flat + position: + x: 32.805 + y: 70.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_C6 + name: corning_384_wellplate_112ul_flat_C6 + parent: corning_384_wellplate_112ul_flat + position: + x: 32.805 + y: 65.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_D6 + name: corning_384_wellplate_112ul_flat_D6 + parent: corning_384_wellplate_112ul_flat + position: + x: 32.805 + y: 61.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_E6 + name: corning_384_wellplate_112ul_flat_E6 + parent: corning_384_wellplate_112ul_flat + position: + x: 32.805 + y: 56.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_F6 + name: corning_384_wellplate_112ul_flat_F6 + parent: corning_384_wellplate_112ul_flat + position: + x: 32.805 + y: 52.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_G6 + name: corning_384_wellplate_112ul_flat_G6 + parent: corning_384_wellplate_112ul_flat + position: + x: 32.805 + y: 47.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_H6 + name: corning_384_wellplate_112ul_flat_H6 + parent: corning_384_wellplate_112ul_flat + position: + x: 32.805 + y: 43.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_I6 + name: corning_384_wellplate_112ul_flat_I6 + parent: corning_384_wellplate_112ul_flat + position: + x: 32.805 + y: 38.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_J6 + name: corning_384_wellplate_112ul_flat_J6 + parent: corning_384_wellplate_112ul_flat + position: + x: 32.805 + y: 34.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_K6 + name: corning_384_wellplate_112ul_flat_K6 + parent: corning_384_wellplate_112ul_flat + position: + x: 32.805 + y: 29.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_L6 + name: corning_384_wellplate_112ul_flat_L6 + parent: corning_384_wellplate_112ul_flat + position: + x: 32.805 + y: 25.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_M6 + name: corning_384_wellplate_112ul_flat_M6 + parent: corning_384_wellplate_112ul_flat + position: + x: 32.805 + y: 20.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_N6 + name: corning_384_wellplate_112ul_flat_N6 + parent: corning_384_wellplate_112ul_flat + position: + x: 32.805 + y: 16.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_O6 + name: corning_384_wellplate_112ul_flat_O6 + parent: corning_384_wellplate_112ul_flat + position: + x: 32.805 + y: 11.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_P6 + name: corning_384_wellplate_112ul_flat_P6 + parent: corning_384_wellplate_112ul_flat + position: + x: 32.805 + y: 7.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_A7 + name: corning_384_wellplate_112ul_flat_A7 + parent: corning_384_wellplate_112ul_flat + position: + x: 37.305 + y: 74.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_B7 + name: corning_384_wellplate_112ul_flat_B7 + parent: corning_384_wellplate_112ul_flat + position: + x: 37.305 + y: 70.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_C7 + name: corning_384_wellplate_112ul_flat_C7 + parent: corning_384_wellplate_112ul_flat + position: + x: 37.305 + y: 65.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_D7 + name: corning_384_wellplate_112ul_flat_D7 + parent: corning_384_wellplate_112ul_flat + position: + x: 37.305 + y: 61.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_E7 + name: corning_384_wellplate_112ul_flat_E7 + parent: corning_384_wellplate_112ul_flat + position: + x: 37.305 + y: 56.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_F7 + name: corning_384_wellplate_112ul_flat_F7 + parent: corning_384_wellplate_112ul_flat + position: + x: 37.305 + y: 52.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_G7 + name: corning_384_wellplate_112ul_flat_G7 + parent: corning_384_wellplate_112ul_flat + position: + x: 37.305 + y: 47.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_H7 + name: corning_384_wellplate_112ul_flat_H7 + parent: corning_384_wellplate_112ul_flat + position: + x: 37.305 + y: 43.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_I7 + name: corning_384_wellplate_112ul_flat_I7 + parent: corning_384_wellplate_112ul_flat + position: + x: 37.305 + y: 38.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_J7 + name: corning_384_wellplate_112ul_flat_J7 + parent: corning_384_wellplate_112ul_flat + position: + x: 37.305 + y: 34.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_K7 + name: corning_384_wellplate_112ul_flat_K7 + parent: corning_384_wellplate_112ul_flat + position: + x: 37.305 + y: 29.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_L7 + name: corning_384_wellplate_112ul_flat_L7 + parent: corning_384_wellplate_112ul_flat + position: + x: 37.305 + y: 25.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_M7 + name: corning_384_wellplate_112ul_flat_M7 + parent: corning_384_wellplate_112ul_flat + position: + x: 37.305 + y: 20.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_N7 + name: corning_384_wellplate_112ul_flat_N7 + parent: corning_384_wellplate_112ul_flat + position: + x: 37.305 + y: 16.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_O7 + name: corning_384_wellplate_112ul_flat_O7 + parent: corning_384_wellplate_112ul_flat + position: + x: 37.305 + y: 11.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_P7 + name: corning_384_wellplate_112ul_flat_P7 + parent: corning_384_wellplate_112ul_flat + position: + x: 37.305 + y: 7.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_A8 + name: corning_384_wellplate_112ul_flat_A8 + parent: corning_384_wellplate_112ul_flat + position: + x: 41.805 + y: 74.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_B8 + name: corning_384_wellplate_112ul_flat_B8 + parent: corning_384_wellplate_112ul_flat + position: + x: 41.805 + y: 70.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_C8 + name: corning_384_wellplate_112ul_flat_C8 + parent: corning_384_wellplate_112ul_flat + position: + x: 41.805 + y: 65.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_D8 + name: corning_384_wellplate_112ul_flat_D8 + parent: corning_384_wellplate_112ul_flat + position: + x: 41.805 + y: 61.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_E8 + name: corning_384_wellplate_112ul_flat_E8 + parent: corning_384_wellplate_112ul_flat + position: + x: 41.805 + y: 56.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_F8 + name: corning_384_wellplate_112ul_flat_F8 + parent: corning_384_wellplate_112ul_flat + position: + x: 41.805 + y: 52.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_G8 + name: corning_384_wellplate_112ul_flat_G8 + parent: corning_384_wellplate_112ul_flat + position: + x: 41.805 + y: 47.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_H8 + name: corning_384_wellplate_112ul_flat_H8 + parent: corning_384_wellplate_112ul_flat + position: + x: 41.805 + y: 43.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_I8 + name: corning_384_wellplate_112ul_flat_I8 + parent: corning_384_wellplate_112ul_flat + position: + x: 41.805 + y: 38.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_J8 + name: corning_384_wellplate_112ul_flat_J8 + parent: corning_384_wellplate_112ul_flat + position: + x: 41.805 + y: 34.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_K8 + name: corning_384_wellplate_112ul_flat_K8 + parent: corning_384_wellplate_112ul_flat + position: + x: 41.805 + y: 29.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_L8 + name: corning_384_wellplate_112ul_flat_L8 + parent: corning_384_wellplate_112ul_flat + position: + x: 41.805 + y: 25.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_M8 + name: corning_384_wellplate_112ul_flat_M8 + parent: corning_384_wellplate_112ul_flat + position: + x: 41.805 + y: 20.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_N8 + name: corning_384_wellplate_112ul_flat_N8 + parent: corning_384_wellplate_112ul_flat + position: + x: 41.805 + y: 16.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_O8 + name: corning_384_wellplate_112ul_flat_O8 + parent: corning_384_wellplate_112ul_flat + position: + x: 41.805 + y: 11.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_P8 + name: corning_384_wellplate_112ul_flat_P8 + parent: corning_384_wellplate_112ul_flat + position: + x: 41.805 + y: 7.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_A9 + name: corning_384_wellplate_112ul_flat_A9 + parent: corning_384_wellplate_112ul_flat + position: + x: 46.305 + y: 74.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_B9 + name: corning_384_wellplate_112ul_flat_B9 + parent: corning_384_wellplate_112ul_flat + position: + x: 46.305 + y: 70.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_C9 + name: corning_384_wellplate_112ul_flat_C9 + parent: corning_384_wellplate_112ul_flat + position: + x: 46.305 + y: 65.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_D9 + name: corning_384_wellplate_112ul_flat_D9 + parent: corning_384_wellplate_112ul_flat + position: + x: 46.305 + y: 61.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_E9 + name: corning_384_wellplate_112ul_flat_E9 + parent: corning_384_wellplate_112ul_flat + position: + x: 46.305 + y: 56.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_F9 + name: corning_384_wellplate_112ul_flat_F9 + parent: corning_384_wellplate_112ul_flat + position: + x: 46.305 + y: 52.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_G9 + name: corning_384_wellplate_112ul_flat_G9 + parent: corning_384_wellplate_112ul_flat + position: + x: 46.305 + y: 47.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_H9 + name: corning_384_wellplate_112ul_flat_H9 + parent: corning_384_wellplate_112ul_flat + position: + x: 46.305 + y: 43.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_I9 + name: corning_384_wellplate_112ul_flat_I9 + parent: corning_384_wellplate_112ul_flat + position: + x: 46.305 + y: 38.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_J9 + name: corning_384_wellplate_112ul_flat_J9 + parent: corning_384_wellplate_112ul_flat + position: + x: 46.305 + y: 34.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_K9 + name: corning_384_wellplate_112ul_flat_K9 + parent: corning_384_wellplate_112ul_flat + position: + x: 46.305 + y: 29.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_L9 + name: corning_384_wellplate_112ul_flat_L9 + parent: corning_384_wellplate_112ul_flat + position: + x: 46.305 + y: 25.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_M9 + name: corning_384_wellplate_112ul_flat_M9 + parent: corning_384_wellplate_112ul_flat + position: + x: 46.305 + y: 20.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_N9 + name: corning_384_wellplate_112ul_flat_N9 + parent: corning_384_wellplate_112ul_flat + position: + x: 46.305 + y: 16.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_O9 + name: corning_384_wellplate_112ul_flat_O9 + parent: corning_384_wellplate_112ul_flat + position: + x: 46.305 + y: 11.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_P9 + name: corning_384_wellplate_112ul_flat_P9 + parent: corning_384_wellplate_112ul_flat + position: + x: 46.305 + y: 7.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_A10 + name: corning_384_wellplate_112ul_flat_A10 + parent: corning_384_wellplate_112ul_flat + position: + x: 50.805 + y: 74.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_B10 + name: corning_384_wellplate_112ul_flat_B10 + parent: corning_384_wellplate_112ul_flat + position: + x: 50.805 + y: 70.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_C10 + name: corning_384_wellplate_112ul_flat_C10 + parent: corning_384_wellplate_112ul_flat + position: + x: 50.805 + y: 65.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_D10 + name: corning_384_wellplate_112ul_flat_D10 + parent: corning_384_wellplate_112ul_flat + position: + x: 50.805 + y: 61.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_E10 + name: corning_384_wellplate_112ul_flat_E10 + parent: corning_384_wellplate_112ul_flat + position: + x: 50.805 + y: 56.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_F10 + name: corning_384_wellplate_112ul_flat_F10 + parent: corning_384_wellplate_112ul_flat + position: + x: 50.805 + y: 52.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_G10 + name: corning_384_wellplate_112ul_flat_G10 + parent: corning_384_wellplate_112ul_flat + position: + x: 50.805 + y: 47.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_H10 + name: corning_384_wellplate_112ul_flat_H10 + parent: corning_384_wellplate_112ul_flat + position: + x: 50.805 + y: 43.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_I10 + name: corning_384_wellplate_112ul_flat_I10 + parent: corning_384_wellplate_112ul_flat + position: + x: 50.805 + y: 38.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_J10 + name: corning_384_wellplate_112ul_flat_J10 + parent: corning_384_wellplate_112ul_flat + position: + x: 50.805 + y: 34.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_K10 + name: corning_384_wellplate_112ul_flat_K10 + parent: corning_384_wellplate_112ul_flat + position: + x: 50.805 + y: 29.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_L10 + name: corning_384_wellplate_112ul_flat_L10 + parent: corning_384_wellplate_112ul_flat + position: + x: 50.805 + y: 25.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_M10 + name: corning_384_wellplate_112ul_flat_M10 + parent: corning_384_wellplate_112ul_flat + position: + x: 50.805 + y: 20.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_N10 + name: corning_384_wellplate_112ul_flat_N10 + parent: corning_384_wellplate_112ul_flat + position: + x: 50.805 + y: 16.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_O10 + name: corning_384_wellplate_112ul_flat_O10 + parent: corning_384_wellplate_112ul_flat + position: + x: 50.805 + y: 11.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_P10 + name: corning_384_wellplate_112ul_flat_P10 + parent: corning_384_wellplate_112ul_flat + position: + x: 50.805 + y: 7.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_A11 + name: corning_384_wellplate_112ul_flat_A11 + parent: corning_384_wellplate_112ul_flat + position: + x: 55.305 + y: 74.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_B11 + name: corning_384_wellplate_112ul_flat_B11 + parent: corning_384_wellplate_112ul_flat + position: + x: 55.305 + y: 70.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_C11 + name: corning_384_wellplate_112ul_flat_C11 + parent: corning_384_wellplate_112ul_flat + position: + x: 55.305 + y: 65.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_D11 + name: corning_384_wellplate_112ul_flat_D11 + parent: corning_384_wellplate_112ul_flat + position: + x: 55.305 + y: 61.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_E11 + name: corning_384_wellplate_112ul_flat_E11 + parent: corning_384_wellplate_112ul_flat + position: + x: 55.305 + y: 56.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_F11 + name: corning_384_wellplate_112ul_flat_F11 + parent: corning_384_wellplate_112ul_flat + position: + x: 55.305 + y: 52.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_G11 + name: corning_384_wellplate_112ul_flat_G11 + parent: corning_384_wellplate_112ul_flat + position: + x: 55.305 + y: 47.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_H11 + name: corning_384_wellplate_112ul_flat_H11 + parent: corning_384_wellplate_112ul_flat + position: + x: 55.305 + y: 43.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_I11 + name: corning_384_wellplate_112ul_flat_I11 + parent: corning_384_wellplate_112ul_flat + position: + x: 55.305 + y: 38.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_J11 + name: corning_384_wellplate_112ul_flat_J11 + parent: corning_384_wellplate_112ul_flat + position: + x: 55.305 + y: 34.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_K11 + name: corning_384_wellplate_112ul_flat_K11 + parent: corning_384_wellplate_112ul_flat + position: + x: 55.305 + y: 29.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_L11 + name: corning_384_wellplate_112ul_flat_L11 + parent: corning_384_wellplate_112ul_flat + position: + x: 55.305 + y: 25.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_M11 + name: corning_384_wellplate_112ul_flat_M11 + parent: corning_384_wellplate_112ul_flat + position: + x: 55.305 + y: 20.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_N11 + name: corning_384_wellplate_112ul_flat_N11 + parent: corning_384_wellplate_112ul_flat + position: + x: 55.305 + y: 16.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_O11 + name: corning_384_wellplate_112ul_flat_O11 + parent: corning_384_wellplate_112ul_flat + position: + x: 55.305 + y: 11.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_P11 + name: corning_384_wellplate_112ul_flat_P11 + parent: corning_384_wellplate_112ul_flat + position: + x: 55.305 + y: 7.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_A12 + name: corning_384_wellplate_112ul_flat_A12 + parent: corning_384_wellplate_112ul_flat + position: + x: 59.805 + y: 74.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_B12 + name: corning_384_wellplate_112ul_flat_B12 + parent: corning_384_wellplate_112ul_flat + position: + x: 59.805 + y: 70.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_C12 + name: corning_384_wellplate_112ul_flat_C12 + parent: corning_384_wellplate_112ul_flat + position: + x: 59.805 + y: 65.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_D12 + name: corning_384_wellplate_112ul_flat_D12 + parent: corning_384_wellplate_112ul_flat + position: + x: 59.805 + y: 61.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_E12 + name: corning_384_wellplate_112ul_flat_E12 + parent: corning_384_wellplate_112ul_flat + position: + x: 59.805 + y: 56.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_F12 + name: corning_384_wellplate_112ul_flat_F12 + parent: corning_384_wellplate_112ul_flat + position: + x: 59.805 + y: 52.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_G12 + name: corning_384_wellplate_112ul_flat_G12 + parent: corning_384_wellplate_112ul_flat + position: + x: 59.805 + y: 47.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_H12 + name: corning_384_wellplate_112ul_flat_H12 + parent: corning_384_wellplate_112ul_flat + position: + x: 59.805 + y: 43.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_I12 + name: corning_384_wellplate_112ul_flat_I12 + parent: corning_384_wellplate_112ul_flat + position: + x: 59.805 + y: 38.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_J12 + name: corning_384_wellplate_112ul_flat_J12 + parent: corning_384_wellplate_112ul_flat + position: + x: 59.805 + y: 34.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_K12 + name: corning_384_wellplate_112ul_flat_K12 + parent: corning_384_wellplate_112ul_flat + position: + x: 59.805 + y: 29.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_L12 + name: corning_384_wellplate_112ul_flat_L12 + parent: corning_384_wellplate_112ul_flat + position: + x: 59.805 + y: 25.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_M12 + name: corning_384_wellplate_112ul_flat_M12 + parent: corning_384_wellplate_112ul_flat + position: + x: 59.805 + y: 20.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_N12 + name: corning_384_wellplate_112ul_flat_N12 + parent: corning_384_wellplate_112ul_flat + position: + x: 59.805 + y: 16.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_O12 + name: corning_384_wellplate_112ul_flat_O12 + parent: corning_384_wellplate_112ul_flat + position: + x: 59.805 + y: 11.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_P12 + name: corning_384_wellplate_112ul_flat_P12 + parent: corning_384_wellplate_112ul_flat + position: + x: 59.805 + y: 7.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_A13 + name: corning_384_wellplate_112ul_flat_A13 + parent: corning_384_wellplate_112ul_flat + position: + x: 64.305 + y: 74.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_B13 + name: corning_384_wellplate_112ul_flat_B13 + parent: corning_384_wellplate_112ul_flat + position: + x: 64.305 + y: 70.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_C13 + name: corning_384_wellplate_112ul_flat_C13 + parent: corning_384_wellplate_112ul_flat + position: + x: 64.305 + y: 65.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_D13 + name: corning_384_wellplate_112ul_flat_D13 + parent: corning_384_wellplate_112ul_flat + position: + x: 64.305 + y: 61.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_E13 + name: corning_384_wellplate_112ul_flat_E13 + parent: corning_384_wellplate_112ul_flat + position: + x: 64.305 + y: 56.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_F13 + name: corning_384_wellplate_112ul_flat_F13 + parent: corning_384_wellplate_112ul_flat + position: + x: 64.305 + y: 52.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_G13 + name: corning_384_wellplate_112ul_flat_G13 + parent: corning_384_wellplate_112ul_flat + position: + x: 64.305 + y: 47.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_H13 + name: corning_384_wellplate_112ul_flat_H13 + parent: corning_384_wellplate_112ul_flat + position: + x: 64.305 + y: 43.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_I13 + name: corning_384_wellplate_112ul_flat_I13 + parent: corning_384_wellplate_112ul_flat + position: + x: 64.305 + y: 38.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_J13 + name: corning_384_wellplate_112ul_flat_J13 + parent: corning_384_wellplate_112ul_flat + position: + x: 64.305 + y: 34.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_K13 + name: corning_384_wellplate_112ul_flat_K13 + parent: corning_384_wellplate_112ul_flat + position: + x: 64.305 + y: 29.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_L13 + name: corning_384_wellplate_112ul_flat_L13 + parent: corning_384_wellplate_112ul_flat + position: + x: 64.305 + y: 25.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_M13 + name: corning_384_wellplate_112ul_flat_M13 + parent: corning_384_wellplate_112ul_flat + position: + x: 64.305 + y: 20.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_N13 + name: corning_384_wellplate_112ul_flat_N13 + parent: corning_384_wellplate_112ul_flat + position: + x: 64.305 + y: 16.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_O13 + name: corning_384_wellplate_112ul_flat_O13 + parent: corning_384_wellplate_112ul_flat + position: + x: 64.305 + y: 11.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_P13 + name: corning_384_wellplate_112ul_flat_P13 + parent: corning_384_wellplate_112ul_flat + position: + x: 64.305 + y: 7.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_A14 + name: corning_384_wellplate_112ul_flat_A14 + parent: corning_384_wellplate_112ul_flat + position: + x: 68.805 + y: 74.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_B14 + name: corning_384_wellplate_112ul_flat_B14 + parent: corning_384_wellplate_112ul_flat + position: + x: 68.805 + y: 70.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_C14 + name: corning_384_wellplate_112ul_flat_C14 + parent: corning_384_wellplate_112ul_flat + position: + x: 68.805 + y: 65.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_D14 + name: corning_384_wellplate_112ul_flat_D14 + parent: corning_384_wellplate_112ul_flat + position: + x: 68.805 + y: 61.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_E14 + name: corning_384_wellplate_112ul_flat_E14 + parent: corning_384_wellplate_112ul_flat + position: + x: 68.805 + y: 56.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_F14 + name: corning_384_wellplate_112ul_flat_F14 + parent: corning_384_wellplate_112ul_flat + position: + x: 68.805 + y: 52.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_G14 + name: corning_384_wellplate_112ul_flat_G14 + parent: corning_384_wellplate_112ul_flat + position: + x: 68.805 + y: 47.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_H14 + name: corning_384_wellplate_112ul_flat_H14 + parent: corning_384_wellplate_112ul_flat + position: + x: 68.805 + y: 43.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_I14 + name: corning_384_wellplate_112ul_flat_I14 + parent: corning_384_wellplate_112ul_flat + position: + x: 68.805 + y: 38.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_J14 + name: corning_384_wellplate_112ul_flat_J14 + parent: corning_384_wellplate_112ul_flat + position: + x: 68.805 + y: 34.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_K14 + name: corning_384_wellplate_112ul_flat_K14 + parent: corning_384_wellplate_112ul_flat + position: + x: 68.805 + y: 29.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_L14 + name: corning_384_wellplate_112ul_flat_L14 + parent: corning_384_wellplate_112ul_flat + position: + x: 68.805 + y: 25.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_M14 + name: corning_384_wellplate_112ul_flat_M14 + parent: corning_384_wellplate_112ul_flat + position: + x: 68.805 + y: 20.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_N14 + name: corning_384_wellplate_112ul_flat_N14 + parent: corning_384_wellplate_112ul_flat + position: + x: 68.805 + y: 16.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_O14 + name: corning_384_wellplate_112ul_flat_O14 + parent: corning_384_wellplate_112ul_flat + position: + x: 68.805 + y: 11.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_P14 + name: corning_384_wellplate_112ul_flat_P14 + parent: corning_384_wellplate_112ul_flat + position: + x: 68.805 + y: 7.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_A15 + name: corning_384_wellplate_112ul_flat_A15 + parent: corning_384_wellplate_112ul_flat + position: + x: 73.305 + y: 74.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_B15 + name: corning_384_wellplate_112ul_flat_B15 + parent: corning_384_wellplate_112ul_flat + position: + x: 73.305 + y: 70.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_C15 + name: corning_384_wellplate_112ul_flat_C15 + parent: corning_384_wellplate_112ul_flat + position: + x: 73.305 + y: 65.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_D15 + name: corning_384_wellplate_112ul_flat_D15 + parent: corning_384_wellplate_112ul_flat + position: + x: 73.305 + y: 61.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_E15 + name: corning_384_wellplate_112ul_flat_E15 + parent: corning_384_wellplate_112ul_flat + position: + x: 73.305 + y: 56.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_F15 + name: corning_384_wellplate_112ul_flat_F15 + parent: corning_384_wellplate_112ul_flat + position: + x: 73.305 + y: 52.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_G15 + name: corning_384_wellplate_112ul_flat_G15 + parent: corning_384_wellplate_112ul_flat + position: + x: 73.305 + y: 47.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_H15 + name: corning_384_wellplate_112ul_flat_H15 + parent: corning_384_wellplate_112ul_flat + position: + x: 73.305 + y: 43.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_I15 + name: corning_384_wellplate_112ul_flat_I15 + parent: corning_384_wellplate_112ul_flat + position: + x: 73.305 + y: 38.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_J15 + name: corning_384_wellplate_112ul_flat_J15 + parent: corning_384_wellplate_112ul_flat + position: + x: 73.305 + y: 34.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_K15 + name: corning_384_wellplate_112ul_flat_K15 + parent: corning_384_wellplate_112ul_flat + position: + x: 73.305 + y: 29.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_L15 + name: corning_384_wellplate_112ul_flat_L15 + parent: corning_384_wellplate_112ul_flat + position: + x: 73.305 + y: 25.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_M15 + name: corning_384_wellplate_112ul_flat_M15 + parent: corning_384_wellplate_112ul_flat + position: + x: 73.305 + y: 20.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_N15 + name: corning_384_wellplate_112ul_flat_N15 + parent: corning_384_wellplate_112ul_flat + position: + x: 73.305 + y: 16.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_O15 + name: corning_384_wellplate_112ul_flat_O15 + parent: corning_384_wellplate_112ul_flat + position: + x: 73.305 + y: 11.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_P15 + name: corning_384_wellplate_112ul_flat_P15 + parent: corning_384_wellplate_112ul_flat + position: + x: 73.305 + y: 7.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_A16 + name: corning_384_wellplate_112ul_flat_A16 + parent: corning_384_wellplate_112ul_flat + position: + x: 77.805 + y: 74.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_B16 + name: corning_384_wellplate_112ul_flat_B16 + parent: corning_384_wellplate_112ul_flat + position: + x: 77.805 + y: 70.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_C16 + name: corning_384_wellplate_112ul_flat_C16 + parent: corning_384_wellplate_112ul_flat + position: + x: 77.805 + y: 65.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_D16 + name: corning_384_wellplate_112ul_flat_D16 + parent: corning_384_wellplate_112ul_flat + position: + x: 77.805 + y: 61.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_E16 + name: corning_384_wellplate_112ul_flat_E16 + parent: corning_384_wellplate_112ul_flat + position: + x: 77.805 + y: 56.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_F16 + name: corning_384_wellplate_112ul_flat_F16 + parent: corning_384_wellplate_112ul_flat + position: + x: 77.805 + y: 52.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_G16 + name: corning_384_wellplate_112ul_flat_G16 + parent: corning_384_wellplate_112ul_flat + position: + x: 77.805 + y: 47.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_H16 + name: corning_384_wellplate_112ul_flat_H16 + parent: corning_384_wellplate_112ul_flat + position: + x: 77.805 + y: 43.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_I16 + name: corning_384_wellplate_112ul_flat_I16 + parent: corning_384_wellplate_112ul_flat + position: + x: 77.805 + y: 38.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_J16 + name: corning_384_wellplate_112ul_flat_J16 + parent: corning_384_wellplate_112ul_flat + position: + x: 77.805 + y: 34.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_K16 + name: corning_384_wellplate_112ul_flat_K16 + parent: corning_384_wellplate_112ul_flat + position: + x: 77.805 + y: 29.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_L16 + name: corning_384_wellplate_112ul_flat_L16 + parent: corning_384_wellplate_112ul_flat + position: + x: 77.805 + y: 25.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_M16 + name: corning_384_wellplate_112ul_flat_M16 + parent: corning_384_wellplate_112ul_flat + position: + x: 77.805 + y: 20.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_N16 + name: corning_384_wellplate_112ul_flat_N16 + parent: corning_384_wellplate_112ul_flat + position: + x: 77.805 + y: 16.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_O16 + name: corning_384_wellplate_112ul_flat_O16 + parent: corning_384_wellplate_112ul_flat + position: + x: 77.805 + y: 11.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_P16 + name: corning_384_wellplate_112ul_flat_P16 + parent: corning_384_wellplate_112ul_flat + position: + x: 77.805 + y: 7.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_A17 + name: corning_384_wellplate_112ul_flat_A17 + parent: corning_384_wellplate_112ul_flat + position: + x: 82.305 + y: 74.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_B17 + name: corning_384_wellplate_112ul_flat_B17 + parent: corning_384_wellplate_112ul_flat + position: + x: 82.305 + y: 70.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_C17 + name: corning_384_wellplate_112ul_flat_C17 + parent: corning_384_wellplate_112ul_flat + position: + x: 82.305 + y: 65.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_D17 + name: corning_384_wellplate_112ul_flat_D17 + parent: corning_384_wellplate_112ul_flat + position: + x: 82.305 + y: 61.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_E17 + name: corning_384_wellplate_112ul_flat_E17 + parent: corning_384_wellplate_112ul_flat + position: + x: 82.305 + y: 56.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_F17 + name: corning_384_wellplate_112ul_flat_F17 + parent: corning_384_wellplate_112ul_flat + position: + x: 82.305 + y: 52.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_G17 + name: corning_384_wellplate_112ul_flat_G17 + parent: corning_384_wellplate_112ul_flat + position: + x: 82.305 + y: 47.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_H17 + name: corning_384_wellplate_112ul_flat_H17 + parent: corning_384_wellplate_112ul_flat + position: + x: 82.305 + y: 43.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_I17 + name: corning_384_wellplate_112ul_flat_I17 + parent: corning_384_wellplate_112ul_flat + position: + x: 82.305 + y: 38.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_J17 + name: corning_384_wellplate_112ul_flat_J17 + parent: corning_384_wellplate_112ul_flat + position: + x: 82.305 + y: 34.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_K17 + name: corning_384_wellplate_112ul_flat_K17 + parent: corning_384_wellplate_112ul_flat + position: + x: 82.305 + y: 29.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_L17 + name: corning_384_wellplate_112ul_flat_L17 + parent: corning_384_wellplate_112ul_flat + position: + x: 82.305 + y: 25.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_M17 + name: corning_384_wellplate_112ul_flat_M17 + parent: corning_384_wellplate_112ul_flat + position: + x: 82.305 + y: 20.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_N17 + name: corning_384_wellplate_112ul_flat_N17 + parent: corning_384_wellplate_112ul_flat + position: + x: 82.305 + y: 16.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_O17 + name: corning_384_wellplate_112ul_flat_O17 + parent: corning_384_wellplate_112ul_flat + position: + x: 82.305 + y: 11.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_P17 + name: corning_384_wellplate_112ul_flat_P17 + parent: corning_384_wellplate_112ul_flat + position: + x: 82.305 + y: 7.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_A18 + name: corning_384_wellplate_112ul_flat_A18 + parent: corning_384_wellplate_112ul_flat + position: + x: 86.805 + y: 74.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_B18 + name: corning_384_wellplate_112ul_flat_B18 + parent: corning_384_wellplate_112ul_flat + position: + x: 86.805 + y: 70.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_C18 + name: corning_384_wellplate_112ul_flat_C18 + parent: corning_384_wellplate_112ul_flat + position: + x: 86.805 + y: 65.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_D18 + name: corning_384_wellplate_112ul_flat_D18 + parent: corning_384_wellplate_112ul_flat + position: + x: 86.805 + y: 61.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_E18 + name: corning_384_wellplate_112ul_flat_E18 + parent: corning_384_wellplate_112ul_flat + position: + x: 86.805 + y: 56.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_F18 + name: corning_384_wellplate_112ul_flat_F18 + parent: corning_384_wellplate_112ul_flat + position: + x: 86.805 + y: 52.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_G18 + name: corning_384_wellplate_112ul_flat_G18 + parent: corning_384_wellplate_112ul_flat + position: + x: 86.805 + y: 47.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_H18 + name: corning_384_wellplate_112ul_flat_H18 + parent: corning_384_wellplate_112ul_flat + position: + x: 86.805 + y: 43.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_I18 + name: corning_384_wellplate_112ul_flat_I18 + parent: corning_384_wellplate_112ul_flat + position: + x: 86.805 + y: 38.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_J18 + name: corning_384_wellplate_112ul_flat_J18 + parent: corning_384_wellplate_112ul_flat + position: + x: 86.805 + y: 34.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_K18 + name: corning_384_wellplate_112ul_flat_K18 + parent: corning_384_wellplate_112ul_flat + position: + x: 86.805 + y: 29.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_L18 + name: corning_384_wellplate_112ul_flat_L18 + parent: corning_384_wellplate_112ul_flat + position: + x: 86.805 + y: 25.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_M18 + name: corning_384_wellplate_112ul_flat_M18 + parent: corning_384_wellplate_112ul_flat + position: + x: 86.805 + y: 20.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_N18 + name: corning_384_wellplate_112ul_flat_N18 + parent: corning_384_wellplate_112ul_flat + position: + x: 86.805 + y: 16.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_O18 + name: corning_384_wellplate_112ul_flat_O18 + parent: corning_384_wellplate_112ul_flat + position: + x: 86.805 + y: 11.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_P18 + name: corning_384_wellplate_112ul_flat_P18 + parent: corning_384_wellplate_112ul_flat + position: + x: 86.805 + y: 7.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_A19 + name: corning_384_wellplate_112ul_flat_A19 + parent: corning_384_wellplate_112ul_flat + position: + x: 91.305 + y: 74.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_B19 + name: corning_384_wellplate_112ul_flat_B19 + parent: corning_384_wellplate_112ul_flat + position: + x: 91.305 + y: 70.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_C19 + name: corning_384_wellplate_112ul_flat_C19 + parent: corning_384_wellplate_112ul_flat + position: + x: 91.305 + y: 65.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_D19 + name: corning_384_wellplate_112ul_flat_D19 + parent: corning_384_wellplate_112ul_flat + position: + x: 91.305 + y: 61.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_E19 + name: corning_384_wellplate_112ul_flat_E19 + parent: corning_384_wellplate_112ul_flat + position: + x: 91.305 + y: 56.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_F19 + name: corning_384_wellplate_112ul_flat_F19 + parent: corning_384_wellplate_112ul_flat + position: + x: 91.305 + y: 52.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_G19 + name: corning_384_wellplate_112ul_flat_G19 + parent: corning_384_wellplate_112ul_flat + position: + x: 91.305 + y: 47.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_H19 + name: corning_384_wellplate_112ul_flat_H19 + parent: corning_384_wellplate_112ul_flat + position: + x: 91.305 + y: 43.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_I19 + name: corning_384_wellplate_112ul_flat_I19 + parent: corning_384_wellplate_112ul_flat + position: + x: 91.305 + y: 38.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_J19 + name: corning_384_wellplate_112ul_flat_J19 + parent: corning_384_wellplate_112ul_flat + position: + x: 91.305 + y: 34.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_K19 + name: corning_384_wellplate_112ul_flat_K19 + parent: corning_384_wellplate_112ul_flat + position: + x: 91.305 + y: 29.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_L19 + name: corning_384_wellplate_112ul_flat_L19 + parent: corning_384_wellplate_112ul_flat + position: + x: 91.305 + y: 25.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_M19 + name: corning_384_wellplate_112ul_flat_M19 + parent: corning_384_wellplate_112ul_flat + position: + x: 91.305 + y: 20.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_N19 + name: corning_384_wellplate_112ul_flat_N19 + parent: corning_384_wellplate_112ul_flat + position: + x: 91.305 + y: 16.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_O19 + name: corning_384_wellplate_112ul_flat_O19 + parent: corning_384_wellplate_112ul_flat + position: + x: 91.305 + y: 11.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_P19 + name: corning_384_wellplate_112ul_flat_P19 + parent: corning_384_wellplate_112ul_flat + position: + x: 91.305 + y: 7.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_A20 + name: corning_384_wellplate_112ul_flat_A20 + parent: corning_384_wellplate_112ul_flat + position: + x: 95.805 + y: 74.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_B20 + name: corning_384_wellplate_112ul_flat_B20 + parent: corning_384_wellplate_112ul_flat + position: + x: 95.805 + y: 70.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_C20 + name: corning_384_wellplate_112ul_flat_C20 + parent: corning_384_wellplate_112ul_flat + position: + x: 95.805 + y: 65.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_D20 + name: corning_384_wellplate_112ul_flat_D20 + parent: corning_384_wellplate_112ul_flat + position: + x: 95.805 + y: 61.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_E20 + name: corning_384_wellplate_112ul_flat_E20 + parent: corning_384_wellplate_112ul_flat + position: + x: 95.805 + y: 56.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_F20 + name: corning_384_wellplate_112ul_flat_F20 + parent: corning_384_wellplate_112ul_flat + position: + x: 95.805 + y: 52.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_G20 + name: corning_384_wellplate_112ul_flat_G20 + parent: corning_384_wellplate_112ul_flat + position: + x: 95.805 + y: 47.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_H20 + name: corning_384_wellplate_112ul_flat_H20 + parent: corning_384_wellplate_112ul_flat + position: + x: 95.805 + y: 43.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_I20 + name: corning_384_wellplate_112ul_flat_I20 + parent: corning_384_wellplate_112ul_flat + position: + x: 95.805 + y: 38.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_J20 + name: corning_384_wellplate_112ul_flat_J20 + parent: corning_384_wellplate_112ul_flat + position: + x: 95.805 + y: 34.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_K20 + name: corning_384_wellplate_112ul_flat_K20 + parent: corning_384_wellplate_112ul_flat + position: + x: 95.805 + y: 29.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_L20 + name: corning_384_wellplate_112ul_flat_L20 + parent: corning_384_wellplate_112ul_flat + position: + x: 95.805 + y: 25.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_M20 + name: corning_384_wellplate_112ul_flat_M20 + parent: corning_384_wellplate_112ul_flat + position: + x: 95.805 + y: 20.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_N20 + name: corning_384_wellplate_112ul_flat_N20 + parent: corning_384_wellplate_112ul_flat + position: + x: 95.805 + y: 16.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_O20 + name: corning_384_wellplate_112ul_flat_O20 + parent: corning_384_wellplate_112ul_flat + position: + x: 95.805 + y: 11.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_P20 + name: corning_384_wellplate_112ul_flat_P20 + parent: corning_384_wellplate_112ul_flat + position: + x: 95.805 + y: 7.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_A21 + name: corning_384_wellplate_112ul_flat_A21 + parent: corning_384_wellplate_112ul_flat + position: + x: 100.305 + y: 74.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_B21 + name: corning_384_wellplate_112ul_flat_B21 + parent: corning_384_wellplate_112ul_flat + position: + x: 100.305 + y: 70.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_C21 + name: corning_384_wellplate_112ul_flat_C21 + parent: corning_384_wellplate_112ul_flat + position: + x: 100.305 + y: 65.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_D21 + name: corning_384_wellplate_112ul_flat_D21 + parent: corning_384_wellplate_112ul_flat + position: + x: 100.305 + y: 61.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_E21 + name: corning_384_wellplate_112ul_flat_E21 + parent: corning_384_wellplate_112ul_flat + position: + x: 100.305 + y: 56.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_F21 + name: corning_384_wellplate_112ul_flat_F21 + parent: corning_384_wellplate_112ul_flat + position: + x: 100.305 + y: 52.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_G21 + name: corning_384_wellplate_112ul_flat_G21 + parent: corning_384_wellplate_112ul_flat + position: + x: 100.305 + y: 47.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_H21 + name: corning_384_wellplate_112ul_flat_H21 + parent: corning_384_wellplate_112ul_flat + position: + x: 100.305 + y: 43.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_I21 + name: corning_384_wellplate_112ul_flat_I21 + parent: corning_384_wellplate_112ul_flat + position: + x: 100.305 + y: 38.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_J21 + name: corning_384_wellplate_112ul_flat_J21 + parent: corning_384_wellplate_112ul_flat + position: + x: 100.305 + y: 34.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_K21 + name: corning_384_wellplate_112ul_flat_K21 + parent: corning_384_wellplate_112ul_flat + position: + x: 100.305 + y: 29.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_L21 + name: corning_384_wellplate_112ul_flat_L21 + parent: corning_384_wellplate_112ul_flat + position: + x: 100.305 + y: 25.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_M21 + name: corning_384_wellplate_112ul_flat_M21 + parent: corning_384_wellplate_112ul_flat + position: + x: 100.305 + y: 20.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_N21 + name: corning_384_wellplate_112ul_flat_N21 + parent: corning_384_wellplate_112ul_flat + position: + x: 100.305 + y: 16.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_O21 + name: corning_384_wellplate_112ul_flat_O21 + parent: corning_384_wellplate_112ul_flat + position: + x: 100.305 + y: 11.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_P21 + name: corning_384_wellplate_112ul_flat_P21 + parent: corning_384_wellplate_112ul_flat + position: + x: 100.305 + y: 7.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_A22 + name: corning_384_wellplate_112ul_flat_A22 + parent: corning_384_wellplate_112ul_flat + position: + x: 104.805 + y: 74.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_B22 + name: corning_384_wellplate_112ul_flat_B22 + parent: corning_384_wellplate_112ul_flat + position: + x: 104.805 + y: 70.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_C22 + name: corning_384_wellplate_112ul_flat_C22 + parent: corning_384_wellplate_112ul_flat + position: + x: 104.805 + y: 65.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_D22 + name: corning_384_wellplate_112ul_flat_D22 + parent: corning_384_wellplate_112ul_flat + position: + x: 104.805 + y: 61.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_E22 + name: corning_384_wellplate_112ul_flat_E22 + parent: corning_384_wellplate_112ul_flat + position: + x: 104.805 + y: 56.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_F22 + name: corning_384_wellplate_112ul_flat_F22 + parent: corning_384_wellplate_112ul_flat + position: + x: 104.805 + y: 52.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_G22 + name: corning_384_wellplate_112ul_flat_G22 + parent: corning_384_wellplate_112ul_flat + position: + x: 104.805 + y: 47.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_H22 + name: corning_384_wellplate_112ul_flat_H22 + parent: corning_384_wellplate_112ul_flat + position: + x: 104.805 + y: 43.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_I22 + name: corning_384_wellplate_112ul_flat_I22 + parent: corning_384_wellplate_112ul_flat + position: + x: 104.805 + y: 38.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_J22 + name: corning_384_wellplate_112ul_flat_J22 + parent: corning_384_wellplate_112ul_flat + position: + x: 104.805 + y: 34.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_K22 + name: corning_384_wellplate_112ul_flat_K22 + parent: corning_384_wellplate_112ul_flat + position: + x: 104.805 + y: 29.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_L22 + name: corning_384_wellplate_112ul_flat_L22 + parent: corning_384_wellplate_112ul_flat + position: + x: 104.805 + y: 25.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_M22 + name: corning_384_wellplate_112ul_flat_M22 + parent: corning_384_wellplate_112ul_flat + position: + x: 104.805 + y: 20.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_N22 + name: corning_384_wellplate_112ul_flat_N22 + parent: corning_384_wellplate_112ul_flat + position: + x: 104.805 + y: 16.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_O22 + name: corning_384_wellplate_112ul_flat_O22 + parent: corning_384_wellplate_112ul_flat + position: + x: 104.805 + y: 11.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_P22 + name: corning_384_wellplate_112ul_flat_P22 + parent: corning_384_wellplate_112ul_flat + position: + x: 104.805 + y: 7.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_A23 + name: corning_384_wellplate_112ul_flat_A23 + parent: corning_384_wellplate_112ul_flat + position: + x: 109.305 + y: 74.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_B23 + name: corning_384_wellplate_112ul_flat_B23 + parent: corning_384_wellplate_112ul_flat + position: + x: 109.305 + y: 70.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_C23 + name: corning_384_wellplate_112ul_flat_C23 + parent: corning_384_wellplate_112ul_flat + position: + x: 109.305 + y: 65.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_D23 + name: corning_384_wellplate_112ul_flat_D23 + parent: corning_384_wellplate_112ul_flat + position: + x: 109.305 + y: 61.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_E23 + name: corning_384_wellplate_112ul_flat_E23 + parent: corning_384_wellplate_112ul_flat + position: + x: 109.305 + y: 56.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_F23 + name: corning_384_wellplate_112ul_flat_F23 + parent: corning_384_wellplate_112ul_flat + position: + x: 109.305 + y: 52.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_G23 + name: corning_384_wellplate_112ul_flat_G23 + parent: corning_384_wellplate_112ul_flat + position: + x: 109.305 + y: 47.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_H23 + name: corning_384_wellplate_112ul_flat_H23 + parent: corning_384_wellplate_112ul_flat + position: + x: 109.305 + y: 43.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_I23 + name: corning_384_wellplate_112ul_flat_I23 + parent: corning_384_wellplate_112ul_flat + position: + x: 109.305 + y: 38.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_J23 + name: corning_384_wellplate_112ul_flat_J23 + parent: corning_384_wellplate_112ul_flat + position: + x: 109.305 + y: 34.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_K23 + name: corning_384_wellplate_112ul_flat_K23 + parent: corning_384_wellplate_112ul_flat + position: + x: 109.305 + y: 29.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_L23 + name: corning_384_wellplate_112ul_flat_L23 + parent: corning_384_wellplate_112ul_flat + position: + x: 109.305 + y: 25.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_M23 + name: corning_384_wellplate_112ul_flat_M23 + parent: corning_384_wellplate_112ul_flat + position: + x: 109.305 + y: 20.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_N23 + name: corning_384_wellplate_112ul_flat_N23 + parent: corning_384_wellplate_112ul_flat + position: + x: 109.305 + y: 16.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_O23 + name: corning_384_wellplate_112ul_flat_O23 + parent: corning_384_wellplate_112ul_flat + position: + x: 109.305 + y: 11.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_P23 + name: corning_384_wellplate_112ul_flat_P23 + parent: corning_384_wellplate_112ul_flat + position: + x: 109.305 + y: 7.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_A24 + name: corning_384_wellplate_112ul_flat_A24 + parent: corning_384_wellplate_112ul_flat + position: + x: 113.805 + y: 74.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_B24 + name: corning_384_wellplate_112ul_flat_B24 + parent: corning_384_wellplate_112ul_flat + position: + x: 113.805 + y: 70.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_C24 + name: corning_384_wellplate_112ul_flat_C24 + parent: corning_384_wellplate_112ul_flat + position: + x: 113.805 + y: 65.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_D24 + name: corning_384_wellplate_112ul_flat_D24 + parent: corning_384_wellplate_112ul_flat + position: + x: 113.805 + y: 61.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_E24 + name: corning_384_wellplate_112ul_flat_E24 + parent: corning_384_wellplate_112ul_flat + position: + x: 113.805 + y: 56.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_F24 + name: corning_384_wellplate_112ul_flat_F24 + parent: corning_384_wellplate_112ul_flat + position: + x: 113.805 + y: 52.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_G24 + name: corning_384_wellplate_112ul_flat_G24 + parent: corning_384_wellplate_112ul_flat + position: + x: 113.805 + y: 47.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_H24 + name: corning_384_wellplate_112ul_flat_H24 + parent: corning_384_wellplate_112ul_flat + position: + x: 113.805 + y: 43.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_I24 + name: corning_384_wellplate_112ul_flat_I24 + parent: corning_384_wellplate_112ul_flat + position: + x: 113.805 + y: 38.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_J24 + name: corning_384_wellplate_112ul_flat_J24 + parent: corning_384_wellplate_112ul_flat + position: + x: 113.805 + y: 34.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_K24 + name: corning_384_wellplate_112ul_flat_K24 + parent: corning_384_wellplate_112ul_flat + position: + x: 113.805 + y: 29.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_L24 + name: corning_384_wellplate_112ul_flat_L24 + parent: corning_384_wellplate_112ul_flat + position: + x: 113.805 + y: 25.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_M24 + name: corning_384_wellplate_112ul_flat_M24 + parent: corning_384_wellplate_112ul_flat + position: + x: 113.805 + y: 20.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_N24 + name: corning_384_wellplate_112ul_flat_N24 + parent: corning_384_wellplate_112ul_flat + position: + x: 113.805 + y: 16.175 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_O24 + name: corning_384_wellplate_112ul_flat_O24 + parent: corning_384_wellplate_112ul_flat + position: + x: 113.805 + y: 11.675 + z: 2.79 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 112 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.63 + size_y: 3.63 + size_z: 11.43 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_384_wellplate_112ul_flat_P24 + name: corning_384_wellplate_112ul_flat_P24 + parent: corning_384_wellplate_112ul_flat + position: + x: 113.805 + y: 7.175 + z: 2.79 + sample_id: null + type: well + description: Corning 384 wellplate 112ul flat + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/plates.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +corning_48_wellplate_1point6ml_flat: + category: + - plates + class: + module: pylabrobot.resources.opentrons.plates:corning_48_wellplate_1point6ml_flat + type: pylabrobot + config_info: + - children: + - corning_48_wellplate_1point6ml_flat_A1 + - corning_48_wellplate_1point6ml_flat_B1 + - corning_48_wellplate_1point6ml_flat_C1 + - corning_48_wellplate_1point6ml_flat_D1 + - corning_48_wellplate_1point6ml_flat_E1 + - corning_48_wellplate_1point6ml_flat_F1 + - corning_48_wellplate_1point6ml_flat_A2 + - corning_48_wellplate_1point6ml_flat_B2 + - corning_48_wellplate_1point6ml_flat_C2 + - corning_48_wellplate_1point6ml_flat_D2 + - corning_48_wellplate_1point6ml_flat_E2 + - corning_48_wellplate_1point6ml_flat_F2 + - corning_48_wellplate_1point6ml_flat_A3 + - corning_48_wellplate_1point6ml_flat_B3 + - corning_48_wellplate_1point6ml_flat_C3 + - corning_48_wellplate_1point6ml_flat_D3 + - corning_48_wellplate_1point6ml_flat_E3 + - corning_48_wellplate_1point6ml_flat_F3 + - corning_48_wellplate_1point6ml_flat_A4 + - corning_48_wellplate_1point6ml_flat_B4 + - corning_48_wellplate_1point6ml_flat_C4 + - corning_48_wellplate_1point6ml_flat_D4 + - corning_48_wellplate_1point6ml_flat_E4 + - corning_48_wellplate_1point6ml_flat_F4 + - corning_48_wellplate_1point6ml_flat_A5 + - corning_48_wellplate_1point6ml_flat_B5 + - corning_48_wellplate_1point6ml_flat_C5 + - corning_48_wellplate_1point6ml_flat_D5 + - corning_48_wellplate_1point6ml_flat_E5 + - corning_48_wellplate_1point6ml_flat_F5 + - corning_48_wellplate_1point6ml_flat_A6 + - corning_48_wellplate_1point6ml_flat_B6 + - corning_48_wellplate_1point6ml_flat_C6 + - corning_48_wellplate_1point6ml_flat_D6 + - corning_48_wellplate_1point6ml_flat_E6 + - corning_48_wellplate_1point6ml_flat_F6 + - corning_48_wellplate_1point6ml_flat_A7 + - corning_48_wellplate_1point6ml_flat_B7 + - corning_48_wellplate_1point6ml_flat_C7 + - corning_48_wellplate_1point6ml_flat_D7 + - corning_48_wellplate_1point6ml_flat_E7 + - corning_48_wellplate_1point6ml_flat_F7 + - corning_48_wellplate_1point6ml_flat_A8 + - corning_48_wellplate_1point6ml_flat_B8 + - corning_48_wellplate_1point6ml_flat_C8 + - corning_48_wellplate_1point6ml_flat_D8 + - corning_48_wellplate_1point6ml_flat_E8 + - corning_48_wellplate_1point6ml_flat_F8 + class: '' + config: + barcode: null + category: plate + model: Corning 48 Well Plate 1.6 mL Flat + ordering: + A1: corning_48_wellplate_1point6ml_flat_A1 + B1: corning_48_wellplate_1point6ml_flat_B1 + C1: corning_48_wellplate_1point6ml_flat_C1 + D1: corning_48_wellplate_1point6ml_flat_D1 + E1: corning_48_wellplate_1point6ml_flat_E1 + F1: corning_48_wellplate_1point6ml_flat_F1 + A2: corning_48_wellplate_1point6ml_flat_A2 + B2: corning_48_wellplate_1point6ml_flat_B2 + C2: corning_48_wellplate_1point6ml_flat_C2 + D2: corning_48_wellplate_1point6ml_flat_D2 + E2: corning_48_wellplate_1point6ml_flat_E2 + F2: corning_48_wellplate_1point6ml_flat_F2 + A3: corning_48_wellplate_1point6ml_flat_A3 + B3: corning_48_wellplate_1point6ml_flat_B3 + C3: corning_48_wellplate_1point6ml_flat_C3 + D3: corning_48_wellplate_1point6ml_flat_D3 + E3: corning_48_wellplate_1point6ml_flat_E3 + F3: corning_48_wellplate_1point6ml_flat_F3 + A4: corning_48_wellplate_1point6ml_flat_A4 + B4: corning_48_wellplate_1point6ml_flat_B4 + C4: corning_48_wellplate_1point6ml_flat_C4 + D4: corning_48_wellplate_1point6ml_flat_D4 + E4: corning_48_wellplate_1point6ml_flat_E4 + F4: corning_48_wellplate_1point6ml_flat_F4 + A5: corning_48_wellplate_1point6ml_flat_A5 + B5: corning_48_wellplate_1point6ml_flat_B5 + C5: corning_48_wellplate_1point6ml_flat_C5 + D5: corning_48_wellplate_1point6ml_flat_D5 + E5: corning_48_wellplate_1point6ml_flat_E5 + F5: corning_48_wellplate_1point6ml_flat_F5 + A6: corning_48_wellplate_1point6ml_flat_A6 + B6: corning_48_wellplate_1point6ml_flat_B6 + C6: corning_48_wellplate_1point6ml_flat_C6 + D6: corning_48_wellplate_1point6ml_flat_D6 + E6: corning_48_wellplate_1point6ml_flat_E6 + F6: corning_48_wellplate_1point6ml_flat_F6 + A7: corning_48_wellplate_1point6ml_flat_A7 + B7: corning_48_wellplate_1point6ml_flat_B7 + C7: corning_48_wellplate_1point6ml_flat_C7 + D7: corning_48_wellplate_1point6ml_flat_D7 + E7: corning_48_wellplate_1point6ml_flat_E7 + F7: corning_48_wellplate_1point6ml_flat_F7 + A8: corning_48_wellplate_1point6ml_flat_A8 + B8: corning_48_wellplate_1point6ml_flat_B8 + C8: corning_48_wellplate_1point6ml_flat_C8 + D8: corning_48_wellplate_1point6ml_flat_D8 + E8: corning_48_wellplate_1point6ml_flat_E8 + F8: corning_48_wellplate_1point6ml_flat_F8 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.89 + size_y: 85.6 + size_z: 20.02 + type: Plate + data: {} + id: corning_48_wellplate_1point6ml_flat + name: corning_48_wellplate_1point6ml_flat + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: plate + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_A1 + name: corning_48_wellplate_1point6ml_flat_A1 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 14.073 + y: 71.393 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_B1 + name: corning_48_wellplate_1point6ml_flat_B1 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 14.073 + y: 58.313 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_C1 + name: corning_48_wellplate_1point6ml_flat_C1 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 14.073 + y: 45.233 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_D1 + name: corning_48_wellplate_1point6ml_flat_D1 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 14.073 + y: 32.153 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_E1 + name: corning_48_wellplate_1point6ml_flat_E1 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 14.073 + y: 19.073 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_F1 + name: corning_48_wellplate_1point6ml_flat_F1 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 14.073 + y: 5.993 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_A2 + name: corning_48_wellplate_1point6ml_flat_A2 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 27.153 + y: 71.393 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_B2 + name: corning_48_wellplate_1point6ml_flat_B2 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 27.153 + y: 58.313 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_C2 + name: corning_48_wellplate_1point6ml_flat_C2 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 27.153 + y: 45.233 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_D2 + name: corning_48_wellplate_1point6ml_flat_D2 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 27.153 + y: 32.153 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_E2 + name: corning_48_wellplate_1point6ml_flat_E2 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 27.153 + y: 19.073 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_F2 + name: corning_48_wellplate_1point6ml_flat_F2 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 27.153 + y: 5.993 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_A3 + name: corning_48_wellplate_1point6ml_flat_A3 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 40.233 + y: 71.393 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_B3 + name: corning_48_wellplate_1point6ml_flat_B3 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 40.233 + y: 58.313 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_C3 + name: corning_48_wellplate_1point6ml_flat_C3 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 40.233 + y: 45.233 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_D3 + name: corning_48_wellplate_1point6ml_flat_D3 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 40.233 + y: 32.153 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_E3 + name: corning_48_wellplate_1point6ml_flat_E3 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 40.233 + y: 19.073 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_F3 + name: corning_48_wellplate_1point6ml_flat_F3 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 40.233 + y: 5.993 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_A4 + name: corning_48_wellplate_1point6ml_flat_A4 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 53.313 + y: 71.393 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_B4 + name: corning_48_wellplate_1point6ml_flat_B4 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 53.313 + y: 58.313 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_C4 + name: corning_48_wellplate_1point6ml_flat_C4 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 53.313 + y: 45.233 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_D4 + name: corning_48_wellplate_1point6ml_flat_D4 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 53.313 + y: 32.153 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_E4 + name: corning_48_wellplate_1point6ml_flat_E4 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 53.313 + y: 19.073 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_F4 + name: corning_48_wellplate_1point6ml_flat_F4 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 53.313 + y: 5.993 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_A5 + name: corning_48_wellplate_1point6ml_flat_A5 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 66.393 + y: 71.393 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_B5 + name: corning_48_wellplate_1point6ml_flat_B5 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 66.393 + y: 58.313 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_C5 + name: corning_48_wellplate_1point6ml_flat_C5 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 66.393 + y: 45.233 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_D5 + name: corning_48_wellplate_1point6ml_flat_D5 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 66.393 + y: 32.153 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_E5 + name: corning_48_wellplate_1point6ml_flat_E5 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 66.393 + y: 19.073 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_F5 + name: corning_48_wellplate_1point6ml_flat_F5 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 66.393 + y: 5.993 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_A6 + name: corning_48_wellplate_1point6ml_flat_A6 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 79.473 + y: 71.393 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_B6 + name: corning_48_wellplate_1point6ml_flat_B6 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 79.473 + y: 58.313 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_C6 + name: corning_48_wellplate_1point6ml_flat_C6 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 79.473 + y: 45.233 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_D6 + name: corning_48_wellplate_1point6ml_flat_D6 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 79.473 + y: 32.153 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_E6 + name: corning_48_wellplate_1point6ml_flat_E6 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 79.473 + y: 19.073 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_F6 + name: corning_48_wellplate_1point6ml_flat_F6 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 79.473 + y: 5.993 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_A7 + name: corning_48_wellplate_1point6ml_flat_A7 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 92.553 + y: 71.393 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_B7 + name: corning_48_wellplate_1point6ml_flat_B7 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 92.553 + y: 58.313 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_C7 + name: corning_48_wellplate_1point6ml_flat_C7 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 92.553 + y: 45.233 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_D7 + name: corning_48_wellplate_1point6ml_flat_D7 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 92.553 + y: 32.153 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_E7 + name: corning_48_wellplate_1point6ml_flat_E7 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 92.553 + y: 19.073 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_F7 + name: corning_48_wellplate_1point6ml_flat_F7 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 92.553 + y: 5.993 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_A8 + name: corning_48_wellplate_1point6ml_flat_A8 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 105.633 + y: 71.393 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_B8 + name: corning_48_wellplate_1point6ml_flat_B8 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 105.633 + y: 58.313 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_C8 + name: corning_48_wellplate_1point6ml_flat_C8 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 105.633 + y: 45.233 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_D8 + name: corning_48_wellplate_1point6ml_flat_D8 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 105.633 + y: 32.153 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_E8 + name: corning_48_wellplate_1point6ml_flat_E8 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 105.633 + y: 19.073 + z: 2.62 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1600 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.174 + size_y: 8.174 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_48_wellplate_1point6ml_flat_F8 + name: corning_48_wellplate_1point6ml_flat_F8 + parent: corning_48_wellplate_1point6ml_flat + position: + x: 105.633 + y: 5.993 + z: 2.62 + sample_id: null + type: well + description: Corning 48 wellplate 1.6ml flat + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/plates.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +corning_6_wellplate_16point8ml_flat: + category: + - plates + class: + module: pylabrobot.resources.opentrons.plates:corning_6_wellplate_16point8ml_flat + type: pylabrobot + config_info: + - children: + - corning_6_wellplate_16point8ml_flat_A1 + - corning_6_wellplate_16point8ml_flat_B1 + - corning_6_wellplate_16point8ml_flat_A2 + - corning_6_wellplate_16point8ml_flat_B2 + - corning_6_wellplate_16point8ml_flat_A3 + - corning_6_wellplate_16point8ml_flat_B3 + class: '' + config: + barcode: null + category: plate + model: Corning 6 Well Plate 16.8 mL Flat + ordering: + A1: corning_6_wellplate_16point8ml_flat_A1 + B1: corning_6_wellplate_16point8ml_flat_B1 + A2: corning_6_wellplate_16point8ml_flat_A2 + B2: corning_6_wellplate_16point8ml_flat_B2 + A3: corning_6_wellplate_16point8ml_flat_A3 + B3: corning_6_wellplate_16point8ml_flat_B3 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.76 + size_y: 85.47 + size_z: 20.27 + type: Plate + data: {} + id: corning_6_wellplate_16point8ml_flat + name: corning_6_wellplate_16point8ml_flat + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: plate + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 16800 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 25.053 + size_y: 25.053 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_6_wellplate_16point8ml_flat_A1 + name: corning_6_wellplate_16point8ml_flat_A1 + parent: corning_6_wellplate_16point8ml_flat + position: + x: 12.2335 + y: 49.7535 + z: 2.87 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 16800 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 25.053 + size_y: 25.053 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_6_wellplate_16point8ml_flat_B1 + name: corning_6_wellplate_16point8ml_flat_B1 + parent: corning_6_wellplate_16point8ml_flat + position: + x: 12.2335 + y: 10.6335 + z: 2.87 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 16800 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 25.053 + size_y: 25.053 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_6_wellplate_16point8ml_flat_A2 + name: corning_6_wellplate_16point8ml_flat_A2 + parent: corning_6_wellplate_16point8ml_flat + position: + x: 51.3535 + y: 49.7535 + z: 2.87 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 16800 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 25.053 + size_y: 25.053 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_6_wellplate_16point8ml_flat_B2 + name: corning_6_wellplate_16point8ml_flat_B2 + parent: corning_6_wellplate_16point8ml_flat + position: + x: 51.3535 + y: 10.6335 + z: 2.87 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 16800 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 25.053 + size_y: 25.053 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_6_wellplate_16point8ml_flat_A3 + name: corning_6_wellplate_16point8ml_flat_A3 + parent: corning_6_wellplate_16point8ml_flat + position: + x: 90.4735 + y: 49.7535 + z: 2.87 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 16800 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 25.053 + size_y: 25.053 + size_z: 17.4 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_6_wellplate_16point8ml_flat_B3 + name: corning_6_wellplate_16point8ml_flat_B3 + parent: corning_6_wellplate_16point8ml_flat + position: + x: 90.4735 + y: 10.6335 + z: 2.87 + sample_id: null + type: well + description: Corning 6 wellplate 16.8ml flat + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/plates.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +corning_96_wellplate_360ul_flat: + category: + - plates + class: + module: pylabrobot.resources.opentrons.plates:corning_96_wellplate_360ul_flat + type: pylabrobot + config_info: + - children: + - corning_96_wellplate_360ul_flat_A1 + - corning_96_wellplate_360ul_flat_B1 + - corning_96_wellplate_360ul_flat_C1 + - corning_96_wellplate_360ul_flat_D1 + - corning_96_wellplate_360ul_flat_E1 + - corning_96_wellplate_360ul_flat_F1 + - corning_96_wellplate_360ul_flat_G1 + - corning_96_wellplate_360ul_flat_H1 + - corning_96_wellplate_360ul_flat_A2 + - corning_96_wellplate_360ul_flat_B2 + - corning_96_wellplate_360ul_flat_C2 + - corning_96_wellplate_360ul_flat_D2 + - corning_96_wellplate_360ul_flat_E2 + - corning_96_wellplate_360ul_flat_F2 + - corning_96_wellplate_360ul_flat_G2 + - corning_96_wellplate_360ul_flat_H2 + - corning_96_wellplate_360ul_flat_A3 + - corning_96_wellplate_360ul_flat_B3 + - corning_96_wellplate_360ul_flat_C3 + - corning_96_wellplate_360ul_flat_D3 + - corning_96_wellplate_360ul_flat_E3 + - corning_96_wellplate_360ul_flat_F3 + - corning_96_wellplate_360ul_flat_G3 + - corning_96_wellplate_360ul_flat_H3 + - corning_96_wellplate_360ul_flat_A4 + - corning_96_wellplate_360ul_flat_B4 + - corning_96_wellplate_360ul_flat_C4 + - corning_96_wellplate_360ul_flat_D4 + - corning_96_wellplate_360ul_flat_E4 + - corning_96_wellplate_360ul_flat_F4 + - corning_96_wellplate_360ul_flat_G4 + - corning_96_wellplate_360ul_flat_H4 + - corning_96_wellplate_360ul_flat_A5 + - corning_96_wellplate_360ul_flat_B5 + - corning_96_wellplate_360ul_flat_C5 + - corning_96_wellplate_360ul_flat_D5 + - corning_96_wellplate_360ul_flat_E5 + - corning_96_wellplate_360ul_flat_F5 + - corning_96_wellplate_360ul_flat_G5 + - corning_96_wellplate_360ul_flat_H5 + - corning_96_wellplate_360ul_flat_A6 + - corning_96_wellplate_360ul_flat_B6 + - corning_96_wellplate_360ul_flat_C6 + - corning_96_wellplate_360ul_flat_D6 + - corning_96_wellplate_360ul_flat_E6 + - corning_96_wellplate_360ul_flat_F6 + - corning_96_wellplate_360ul_flat_G6 + - corning_96_wellplate_360ul_flat_H6 + - corning_96_wellplate_360ul_flat_A7 + - corning_96_wellplate_360ul_flat_B7 + - corning_96_wellplate_360ul_flat_C7 + - corning_96_wellplate_360ul_flat_D7 + - corning_96_wellplate_360ul_flat_E7 + - corning_96_wellplate_360ul_flat_F7 + - corning_96_wellplate_360ul_flat_G7 + - corning_96_wellplate_360ul_flat_H7 + - corning_96_wellplate_360ul_flat_A8 + - corning_96_wellplate_360ul_flat_B8 + - corning_96_wellplate_360ul_flat_C8 + - corning_96_wellplate_360ul_flat_D8 + - corning_96_wellplate_360ul_flat_E8 + - corning_96_wellplate_360ul_flat_F8 + - corning_96_wellplate_360ul_flat_G8 + - corning_96_wellplate_360ul_flat_H8 + - corning_96_wellplate_360ul_flat_A9 + - corning_96_wellplate_360ul_flat_B9 + - corning_96_wellplate_360ul_flat_C9 + - corning_96_wellplate_360ul_flat_D9 + - corning_96_wellplate_360ul_flat_E9 + - corning_96_wellplate_360ul_flat_F9 + - corning_96_wellplate_360ul_flat_G9 + - corning_96_wellplate_360ul_flat_H9 + - corning_96_wellplate_360ul_flat_A10 + - corning_96_wellplate_360ul_flat_B10 + - corning_96_wellplate_360ul_flat_C10 + - corning_96_wellplate_360ul_flat_D10 + - corning_96_wellplate_360ul_flat_E10 + - corning_96_wellplate_360ul_flat_F10 + - corning_96_wellplate_360ul_flat_G10 + - corning_96_wellplate_360ul_flat_H10 + - corning_96_wellplate_360ul_flat_A11 + - corning_96_wellplate_360ul_flat_B11 + - corning_96_wellplate_360ul_flat_C11 + - corning_96_wellplate_360ul_flat_D11 + - corning_96_wellplate_360ul_flat_E11 + - corning_96_wellplate_360ul_flat_F11 + - corning_96_wellplate_360ul_flat_G11 + - corning_96_wellplate_360ul_flat_H11 + - corning_96_wellplate_360ul_flat_A12 + - corning_96_wellplate_360ul_flat_B12 + - corning_96_wellplate_360ul_flat_C12 + - corning_96_wellplate_360ul_flat_D12 + - corning_96_wellplate_360ul_flat_E12 + - corning_96_wellplate_360ul_flat_F12 + - corning_96_wellplate_360ul_flat_G12 + - corning_96_wellplate_360ul_flat_H12 + class: '' + config: + barcode: null + category: plate + model: Corning 96 Well Plate 360 µL Flat + ordering: + A1: corning_96_wellplate_360ul_flat_A1 + B1: corning_96_wellplate_360ul_flat_B1 + C1: corning_96_wellplate_360ul_flat_C1 + D1: corning_96_wellplate_360ul_flat_D1 + E1: corning_96_wellplate_360ul_flat_E1 + F1: corning_96_wellplate_360ul_flat_F1 + G1: corning_96_wellplate_360ul_flat_G1 + H1: corning_96_wellplate_360ul_flat_H1 + A2: corning_96_wellplate_360ul_flat_A2 + B2: corning_96_wellplate_360ul_flat_B2 + C2: corning_96_wellplate_360ul_flat_C2 + D2: corning_96_wellplate_360ul_flat_D2 + E2: corning_96_wellplate_360ul_flat_E2 + F2: corning_96_wellplate_360ul_flat_F2 + G2: corning_96_wellplate_360ul_flat_G2 + H2: corning_96_wellplate_360ul_flat_H2 + A3: corning_96_wellplate_360ul_flat_A3 + B3: corning_96_wellplate_360ul_flat_B3 + C3: corning_96_wellplate_360ul_flat_C3 + D3: corning_96_wellplate_360ul_flat_D3 + E3: corning_96_wellplate_360ul_flat_E3 + F3: corning_96_wellplate_360ul_flat_F3 + G3: corning_96_wellplate_360ul_flat_G3 + H3: corning_96_wellplate_360ul_flat_H3 + A4: corning_96_wellplate_360ul_flat_A4 + B4: corning_96_wellplate_360ul_flat_B4 + C4: corning_96_wellplate_360ul_flat_C4 + D4: corning_96_wellplate_360ul_flat_D4 + E4: corning_96_wellplate_360ul_flat_E4 + F4: corning_96_wellplate_360ul_flat_F4 + G4: corning_96_wellplate_360ul_flat_G4 + H4: corning_96_wellplate_360ul_flat_H4 + A5: corning_96_wellplate_360ul_flat_A5 + B5: corning_96_wellplate_360ul_flat_B5 + C5: corning_96_wellplate_360ul_flat_C5 + D5: corning_96_wellplate_360ul_flat_D5 + E5: corning_96_wellplate_360ul_flat_E5 + F5: corning_96_wellplate_360ul_flat_F5 + G5: corning_96_wellplate_360ul_flat_G5 + H5: corning_96_wellplate_360ul_flat_H5 + A6: corning_96_wellplate_360ul_flat_A6 + B6: corning_96_wellplate_360ul_flat_B6 + C6: corning_96_wellplate_360ul_flat_C6 + D6: corning_96_wellplate_360ul_flat_D6 + E6: corning_96_wellplate_360ul_flat_E6 + F6: corning_96_wellplate_360ul_flat_F6 + G6: corning_96_wellplate_360ul_flat_G6 + H6: corning_96_wellplate_360ul_flat_H6 + A7: corning_96_wellplate_360ul_flat_A7 + B7: corning_96_wellplate_360ul_flat_B7 + C7: corning_96_wellplate_360ul_flat_C7 + D7: corning_96_wellplate_360ul_flat_D7 + E7: corning_96_wellplate_360ul_flat_E7 + F7: corning_96_wellplate_360ul_flat_F7 + G7: corning_96_wellplate_360ul_flat_G7 + H7: corning_96_wellplate_360ul_flat_H7 + A8: corning_96_wellplate_360ul_flat_A8 + B8: corning_96_wellplate_360ul_flat_B8 + C8: corning_96_wellplate_360ul_flat_C8 + D8: corning_96_wellplate_360ul_flat_D8 + E8: corning_96_wellplate_360ul_flat_E8 + F8: corning_96_wellplate_360ul_flat_F8 + G8: corning_96_wellplate_360ul_flat_G8 + H8: corning_96_wellplate_360ul_flat_H8 + A9: corning_96_wellplate_360ul_flat_A9 + B9: corning_96_wellplate_360ul_flat_B9 + C9: corning_96_wellplate_360ul_flat_C9 + D9: corning_96_wellplate_360ul_flat_D9 + E9: corning_96_wellplate_360ul_flat_E9 + F9: corning_96_wellplate_360ul_flat_F9 + G9: corning_96_wellplate_360ul_flat_G9 + H9: corning_96_wellplate_360ul_flat_H9 + A10: corning_96_wellplate_360ul_flat_A10 + B10: corning_96_wellplate_360ul_flat_B10 + C10: corning_96_wellplate_360ul_flat_C10 + D10: corning_96_wellplate_360ul_flat_D10 + E10: corning_96_wellplate_360ul_flat_E10 + F10: corning_96_wellplate_360ul_flat_F10 + G10: corning_96_wellplate_360ul_flat_G10 + H10: corning_96_wellplate_360ul_flat_H10 + A11: corning_96_wellplate_360ul_flat_A11 + B11: corning_96_wellplate_360ul_flat_B11 + C11: corning_96_wellplate_360ul_flat_C11 + D11: corning_96_wellplate_360ul_flat_D11 + E11: corning_96_wellplate_360ul_flat_E11 + F11: corning_96_wellplate_360ul_flat_F11 + G11: corning_96_wellplate_360ul_flat_G11 + H11: corning_96_wellplate_360ul_flat_H11 + A12: corning_96_wellplate_360ul_flat_A12 + B12: corning_96_wellplate_360ul_flat_B12 + C12: corning_96_wellplate_360ul_flat_C12 + D12: corning_96_wellplate_360ul_flat_D12 + E12: corning_96_wellplate_360ul_flat_E12 + F12: corning_96_wellplate_360ul_flat_F12 + G12: corning_96_wellplate_360ul_flat_G12 + H12: corning_96_wellplate_360ul_flat_H12 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.76 + size_y: 85.47 + size_z: 14.22 + type: Plate + data: {} + id: corning_96_wellplate_360ul_flat + name: corning_96_wellplate_360ul_flat + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: plate + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_A1 + name: corning_96_wellplate_360ul_flat_A1 + parent: corning_96_wellplate_360ul_flat + position: + x: 11.9545 + y: 71.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_B1 + name: corning_96_wellplate_360ul_flat_B1 + parent: corning_96_wellplate_360ul_flat + position: + x: 11.9545 + y: 62.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_C1 + name: corning_96_wellplate_360ul_flat_C1 + parent: corning_96_wellplate_360ul_flat + position: + x: 11.9545 + y: 53.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_D1 + name: corning_96_wellplate_360ul_flat_D1 + parent: corning_96_wellplate_360ul_flat + position: + x: 11.9545 + y: 44.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_E1 + name: corning_96_wellplate_360ul_flat_E1 + parent: corning_96_wellplate_360ul_flat + position: + x: 11.9545 + y: 35.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_F1 + name: corning_96_wellplate_360ul_flat_F1 + parent: corning_96_wellplate_360ul_flat + position: + x: 11.9545 + y: 26.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_G1 + name: corning_96_wellplate_360ul_flat_G1 + parent: corning_96_wellplate_360ul_flat + position: + x: 11.9545 + y: 17.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_H1 + name: corning_96_wellplate_360ul_flat_H1 + parent: corning_96_wellplate_360ul_flat + position: + x: 11.9545 + y: 8.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_A2 + name: corning_96_wellplate_360ul_flat_A2 + parent: corning_96_wellplate_360ul_flat + position: + x: 20.9545 + y: 71.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_B2 + name: corning_96_wellplate_360ul_flat_B2 + parent: corning_96_wellplate_360ul_flat + position: + x: 20.9545 + y: 62.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_C2 + name: corning_96_wellplate_360ul_flat_C2 + parent: corning_96_wellplate_360ul_flat + position: + x: 20.9545 + y: 53.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_D2 + name: corning_96_wellplate_360ul_flat_D2 + parent: corning_96_wellplate_360ul_flat + position: + x: 20.9545 + y: 44.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_E2 + name: corning_96_wellplate_360ul_flat_E2 + parent: corning_96_wellplate_360ul_flat + position: + x: 20.9545 + y: 35.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_F2 + name: corning_96_wellplate_360ul_flat_F2 + parent: corning_96_wellplate_360ul_flat + position: + x: 20.9545 + y: 26.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_G2 + name: corning_96_wellplate_360ul_flat_G2 + parent: corning_96_wellplate_360ul_flat + position: + x: 20.9545 + y: 17.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_H2 + name: corning_96_wellplate_360ul_flat_H2 + parent: corning_96_wellplate_360ul_flat + position: + x: 20.9545 + y: 8.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_A3 + name: corning_96_wellplate_360ul_flat_A3 + parent: corning_96_wellplate_360ul_flat + position: + x: 29.9545 + y: 71.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_B3 + name: corning_96_wellplate_360ul_flat_B3 + parent: corning_96_wellplate_360ul_flat + position: + x: 29.9545 + y: 62.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_C3 + name: corning_96_wellplate_360ul_flat_C3 + parent: corning_96_wellplate_360ul_flat + position: + x: 29.9545 + y: 53.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_D3 + name: corning_96_wellplate_360ul_flat_D3 + parent: corning_96_wellplate_360ul_flat + position: + x: 29.9545 + y: 44.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_E3 + name: corning_96_wellplate_360ul_flat_E3 + parent: corning_96_wellplate_360ul_flat + position: + x: 29.9545 + y: 35.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_F3 + name: corning_96_wellplate_360ul_flat_F3 + parent: corning_96_wellplate_360ul_flat + position: + x: 29.9545 + y: 26.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_G3 + name: corning_96_wellplate_360ul_flat_G3 + parent: corning_96_wellplate_360ul_flat + position: + x: 29.9545 + y: 17.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_H3 + name: corning_96_wellplate_360ul_flat_H3 + parent: corning_96_wellplate_360ul_flat + position: + x: 29.9545 + y: 8.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_A4 + name: corning_96_wellplate_360ul_flat_A4 + parent: corning_96_wellplate_360ul_flat + position: + x: 38.9545 + y: 71.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_B4 + name: corning_96_wellplate_360ul_flat_B4 + parent: corning_96_wellplate_360ul_flat + position: + x: 38.9545 + y: 62.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_C4 + name: corning_96_wellplate_360ul_flat_C4 + parent: corning_96_wellplate_360ul_flat + position: + x: 38.9545 + y: 53.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_D4 + name: corning_96_wellplate_360ul_flat_D4 + parent: corning_96_wellplate_360ul_flat + position: + x: 38.9545 + y: 44.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_E4 + name: corning_96_wellplate_360ul_flat_E4 + parent: corning_96_wellplate_360ul_flat + position: + x: 38.9545 + y: 35.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_F4 + name: corning_96_wellplate_360ul_flat_F4 + parent: corning_96_wellplate_360ul_flat + position: + x: 38.9545 + y: 26.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_G4 + name: corning_96_wellplate_360ul_flat_G4 + parent: corning_96_wellplate_360ul_flat + position: + x: 38.9545 + y: 17.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_H4 + name: corning_96_wellplate_360ul_flat_H4 + parent: corning_96_wellplate_360ul_flat + position: + x: 38.9545 + y: 8.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_A5 + name: corning_96_wellplate_360ul_flat_A5 + parent: corning_96_wellplate_360ul_flat + position: + x: 47.9545 + y: 71.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_B5 + name: corning_96_wellplate_360ul_flat_B5 + parent: corning_96_wellplate_360ul_flat + position: + x: 47.9545 + y: 62.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_C5 + name: corning_96_wellplate_360ul_flat_C5 + parent: corning_96_wellplate_360ul_flat + position: + x: 47.9545 + y: 53.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_D5 + name: corning_96_wellplate_360ul_flat_D5 + parent: corning_96_wellplate_360ul_flat + position: + x: 47.9545 + y: 44.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_E5 + name: corning_96_wellplate_360ul_flat_E5 + parent: corning_96_wellplate_360ul_flat + position: + x: 47.9545 + y: 35.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_F5 + name: corning_96_wellplate_360ul_flat_F5 + parent: corning_96_wellplate_360ul_flat + position: + x: 47.9545 + y: 26.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_G5 + name: corning_96_wellplate_360ul_flat_G5 + parent: corning_96_wellplate_360ul_flat + position: + x: 47.9545 + y: 17.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_H5 + name: corning_96_wellplate_360ul_flat_H5 + parent: corning_96_wellplate_360ul_flat + position: + x: 47.9545 + y: 8.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_A6 + name: corning_96_wellplate_360ul_flat_A6 + parent: corning_96_wellplate_360ul_flat + position: + x: 56.9545 + y: 71.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_B6 + name: corning_96_wellplate_360ul_flat_B6 + parent: corning_96_wellplate_360ul_flat + position: + x: 56.9545 + y: 62.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_C6 + name: corning_96_wellplate_360ul_flat_C6 + parent: corning_96_wellplate_360ul_flat + position: + x: 56.9545 + y: 53.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_D6 + name: corning_96_wellplate_360ul_flat_D6 + parent: corning_96_wellplate_360ul_flat + position: + x: 56.9545 + y: 44.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_E6 + name: corning_96_wellplate_360ul_flat_E6 + parent: corning_96_wellplate_360ul_flat + position: + x: 56.9545 + y: 35.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_F6 + name: corning_96_wellplate_360ul_flat_F6 + parent: corning_96_wellplate_360ul_flat + position: + x: 56.9545 + y: 26.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_G6 + name: corning_96_wellplate_360ul_flat_G6 + parent: corning_96_wellplate_360ul_flat + position: + x: 56.9545 + y: 17.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_H6 + name: corning_96_wellplate_360ul_flat_H6 + parent: corning_96_wellplate_360ul_flat + position: + x: 56.9545 + y: 8.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_A7 + name: corning_96_wellplate_360ul_flat_A7 + parent: corning_96_wellplate_360ul_flat + position: + x: 65.9545 + y: 71.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_B7 + name: corning_96_wellplate_360ul_flat_B7 + parent: corning_96_wellplate_360ul_flat + position: + x: 65.9545 + y: 62.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_C7 + name: corning_96_wellplate_360ul_flat_C7 + parent: corning_96_wellplate_360ul_flat + position: + x: 65.9545 + y: 53.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_D7 + name: corning_96_wellplate_360ul_flat_D7 + parent: corning_96_wellplate_360ul_flat + position: + x: 65.9545 + y: 44.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_E7 + name: corning_96_wellplate_360ul_flat_E7 + parent: corning_96_wellplate_360ul_flat + position: + x: 65.9545 + y: 35.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_F7 + name: corning_96_wellplate_360ul_flat_F7 + parent: corning_96_wellplate_360ul_flat + position: + x: 65.9545 + y: 26.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_G7 + name: corning_96_wellplate_360ul_flat_G7 + parent: corning_96_wellplate_360ul_flat + position: + x: 65.9545 + y: 17.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_H7 + name: corning_96_wellplate_360ul_flat_H7 + parent: corning_96_wellplate_360ul_flat + position: + x: 65.9545 + y: 8.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_A8 + name: corning_96_wellplate_360ul_flat_A8 + parent: corning_96_wellplate_360ul_flat + position: + x: 74.9545 + y: 71.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_B8 + name: corning_96_wellplate_360ul_flat_B8 + parent: corning_96_wellplate_360ul_flat + position: + x: 74.9545 + y: 62.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_C8 + name: corning_96_wellplate_360ul_flat_C8 + parent: corning_96_wellplate_360ul_flat + position: + x: 74.9545 + y: 53.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_D8 + name: corning_96_wellplate_360ul_flat_D8 + parent: corning_96_wellplate_360ul_flat + position: + x: 74.9545 + y: 44.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_E8 + name: corning_96_wellplate_360ul_flat_E8 + parent: corning_96_wellplate_360ul_flat + position: + x: 74.9545 + y: 35.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_F8 + name: corning_96_wellplate_360ul_flat_F8 + parent: corning_96_wellplate_360ul_flat + position: + x: 74.9545 + y: 26.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_G8 + name: corning_96_wellplate_360ul_flat_G8 + parent: corning_96_wellplate_360ul_flat + position: + x: 74.9545 + y: 17.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_H8 + name: corning_96_wellplate_360ul_flat_H8 + parent: corning_96_wellplate_360ul_flat + position: + x: 74.9545 + y: 8.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_A9 + name: corning_96_wellplate_360ul_flat_A9 + parent: corning_96_wellplate_360ul_flat + position: + x: 83.9545 + y: 71.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_B9 + name: corning_96_wellplate_360ul_flat_B9 + parent: corning_96_wellplate_360ul_flat + position: + x: 83.9545 + y: 62.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_C9 + name: corning_96_wellplate_360ul_flat_C9 + parent: corning_96_wellplate_360ul_flat + position: + x: 83.9545 + y: 53.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_D9 + name: corning_96_wellplate_360ul_flat_D9 + parent: corning_96_wellplate_360ul_flat + position: + x: 83.9545 + y: 44.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_E9 + name: corning_96_wellplate_360ul_flat_E9 + parent: corning_96_wellplate_360ul_flat + position: + x: 83.9545 + y: 35.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_F9 + name: corning_96_wellplate_360ul_flat_F9 + parent: corning_96_wellplate_360ul_flat + position: + x: 83.9545 + y: 26.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_G9 + name: corning_96_wellplate_360ul_flat_G9 + parent: corning_96_wellplate_360ul_flat + position: + x: 83.9545 + y: 17.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_H9 + name: corning_96_wellplate_360ul_flat_H9 + parent: corning_96_wellplate_360ul_flat + position: + x: 83.9545 + y: 8.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_A10 + name: corning_96_wellplate_360ul_flat_A10 + parent: corning_96_wellplate_360ul_flat + position: + x: 92.9545 + y: 71.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_B10 + name: corning_96_wellplate_360ul_flat_B10 + parent: corning_96_wellplate_360ul_flat + position: + x: 92.9545 + y: 62.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_C10 + name: corning_96_wellplate_360ul_flat_C10 + parent: corning_96_wellplate_360ul_flat + position: + x: 92.9545 + y: 53.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_D10 + name: corning_96_wellplate_360ul_flat_D10 + parent: corning_96_wellplate_360ul_flat + position: + x: 92.9545 + y: 44.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_E10 + name: corning_96_wellplate_360ul_flat_E10 + parent: corning_96_wellplate_360ul_flat + position: + x: 92.9545 + y: 35.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_F10 + name: corning_96_wellplate_360ul_flat_F10 + parent: corning_96_wellplate_360ul_flat + position: + x: 92.9545 + y: 26.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_G10 + name: corning_96_wellplate_360ul_flat_G10 + parent: corning_96_wellplate_360ul_flat + position: + x: 92.9545 + y: 17.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_H10 + name: corning_96_wellplate_360ul_flat_H10 + parent: corning_96_wellplate_360ul_flat + position: + x: 92.9545 + y: 8.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_A11 + name: corning_96_wellplate_360ul_flat_A11 + parent: corning_96_wellplate_360ul_flat + position: + x: 101.9545 + y: 71.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_B11 + name: corning_96_wellplate_360ul_flat_B11 + parent: corning_96_wellplate_360ul_flat + position: + x: 101.9545 + y: 62.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_C11 + name: corning_96_wellplate_360ul_flat_C11 + parent: corning_96_wellplate_360ul_flat + position: + x: 101.9545 + y: 53.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_D11 + name: corning_96_wellplate_360ul_flat_D11 + parent: corning_96_wellplate_360ul_flat + position: + x: 101.9545 + y: 44.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_E11 + name: corning_96_wellplate_360ul_flat_E11 + parent: corning_96_wellplate_360ul_flat + position: + x: 101.9545 + y: 35.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_F11 + name: corning_96_wellplate_360ul_flat_F11 + parent: corning_96_wellplate_360ul_flat + position: + x: 101.9545 + y: 26.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_G11 + name: corning_96_wellplate_360ul_flat_G11 + parent: corning_96_wellplate_360ul_flat + position: + x: 101.9545 + y: 17.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_H11 + name: corning_96_wellplate_360ul_flat_H11 + parent: corning_96_wellplate_360ul_flat + position: + x: 101.9545 + y: 8.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_A12 + name: corning_96_wellplate_360ul_flat_A12 + parent: corning_96_wellplate_360ul_flat + position: + x: 110.9545 + y: 71.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_B12 + name: corning_96_wellplate_360ul_flat_B12 + parent: corning_96_wellplate_360ul_flat + position: + x: 110.9545 + y: 62.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_C12 + name: corning_96_wellplate_360ul_flat_C12 + parent: corning_96_wellplate_360ul_flat + position: + x: 110.9545 + y: 53.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_D12 + name: corning_96_wellplate_360ul_flat_D12 + parent: corning_96_wellplate_360ul_flat + position: + x: 110.9545 + y: 44.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_E12 + name: corning_96_wellplate_360ul_flat_E12 + parent: corning_96_wellplate_360ul_flat + position: + x: 110.9545 + y: 35.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_F12 + name: corning_96_wellplate_360ul_flat_F12 + parent: corning_96_wellplate_360ul_flat + position: + x: 110.9545 + y: 26.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_G12 + name: corning_96_wellplate_360ul_flat_G12 + parent: corning_96_wellplate_360ul_flat + position: + x: 110.9545 + y: 17.8145 + z: 3.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 360 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.851 + size_y: 4.851 + size_z: 10.67 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: corning_96_wellplate_360ul_flat_H12 + name: corning_96_wellplate_360ul_flat_H12 + parent: corning_96_wellplate_360ul_flat + position: + x: 110.9545 + y: 8.8145 + z: 3.55 + sample_id: null + type: well + description: Corning 96 wellplate 360ul flat + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/plates.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +nest_96_wellplate_100ul_pcr_full_skirt: + category: + - plates + class: + module: pylabrobot.resources.opentrons.plates:nest_96_wellplate_100ul_pcr_full_skirt + type: pylabrobot + config_info: + - children: + - nest_96_wellplate_100ul_pcr_full_skirt_A1 + - nest_96_wellplate_100ul_pcr_full_skirt_B1 + - nest_96_wellplate_100ul_pcr_full_skirt_C1 + - nest_96_wellplate_100ul_pcr_full_skirt_D1 + - nest_96_wellplate_100ul_pcr_full_skirt_E1 + - nest_96_wellplate_100ul_pcr_full_skirt_F1 + - nest_96_wellplate_100ul_pcr_full_skirt_G1 + - nest_96_wellplate_100ul_pcr_full_skirt_H1 + - nest_96_wellplate_100ul_pcr_full_skirt_A2 + - nest_96_wellplate_100ul_pcr_full_skirt_B2 + - nest_96_wellplate_100ul_pcr_full_skirt_C2 + - nest_96_wellplate_100ul_pcr_full_skirt_D2 + - nest_96_wellplate_100ul_pcr_full_skirt_E2 + - nest_96_wellplate_100ul_pcr_full_skirt_F2 + - nest_96_wellplate_100ul_pcr_full_skirt_G2 + - nest_96_wellplate_100ul_pcr_full_skirt_H2 + - nest_96_wellplate_100ul_pcr_full_skirt_A3 + - nest_96_wellplate_100ul_pcr_full_skirt_B3 + - nest_96_wellplate_100ul_pcr_full_skirt_C3 + - nest_96_wellplate_100ul_pcr_full_skirt_D3 + - nest_96_wellplate_100ul_pcr_full_skirt_E3 + - nest_96_wellplate_100ul_pcr_full_skirt_F3 + - nest_96_wellplate_100ul_pcr_full_skirt_G3 + - nest_96_wellplate_100ul_pcr_full_skirt_H3 + - nest_96_wellplate_100ul_pcr_full_skirt_A4 + - nest_96_wellplate_100ul_pcr_full_skirt_B4 + - nest_96_wellplate_100ul_pcr_full_skirt_C4 + - nest_96_wellplate_100ul_pcr_full_skirt_D4 + - nest_96_wellplate_100ul_pcr_full_skirt_E4 + - nest_96_wellplate_100ul_pcr_full_skirt_F4 + - nest_96_wellplate_100ul_pcr_full_skirt_G4 + - nest_96_wellplate_100ul_pcr_full_skirt_H4 + - nest_96_wellplate_100ul_pcr_full_skirt_A5 + - nest_96_wellplate_100ul_pcr_full_skirt_B5 + - nest_96_wellplate_100ul_pcr_full_skirt_C5 + - nest_96_wellplate_100ul_pcr_full_skirt_D5 + - nest_96_wellplate_100ul_pcr_full_skirt_E5 + - nest_96_wellplate_100ul_pcr_full_skirt_F5 + - nest_96_wellplate_100ul_pcr_full_skirt_G5 + - nest_96_wellplate_100ul_pcr_full_skirt_H5 + - nest_96_wellplate_100ul_pcr_full_skirt_A6 + - nest_96_wellplate_100ul_pcr_full_skirt_B6 + - nest_96_wellplate_100ul_pcr_full_skirt_C6 + - nest_96_wellplate_100ul_pcr_full_skirt_D6 + - nest_96_wellplate_100ul_pcr_full_skirt_E6 + - nest_96_wellplate_100ul_pcr_full_skirt_F6 + - nest_96_wellplate_100ul_pcr_full_skirt_G6 + - nest_96_wellplate_100ul_pcr_full_skirt_H6 + - nest_96_wellplate_100ul_pcr_full_skirt_A7 + - nest_96_wellplate_100ul_pcr_full_skirt_B7 + - nest_96_wellplate_100ul_pcr_full_skirt_C7 + - nest_96_wellplate_100ul_pcr_full_skirt_D7 + - nest_96_wellplate_100ul_pcr_full_skirt_E7 + - nest_96_wellplate_100ul_pcr_full_skirt_F7 + - nest_96_wellplate_100ul_pcr_full_skirt_G7 + - nest_96_wellplate_100ul_pcr_full_skirt_H7 + - nest_96_wellplate_100ul_pcr_full_skirt_A8 + - nest_96_wellplate_100ul_pcr_full_skirt_B8 + - nest_96_wellplate_100ul_pcr_full_skirt_C8 + - nest_96_wellplate_100ul_pcr_full_skirt_D8 + - nest_96_wellplate_100ul_pcr_full_skirt_E8 + - nest_96_wellplate_100ul_pcr_full_skirt_F8 + - nest_96_wellplate_100ul_pcr_full_skirt_G8 + - nest_96_wellplate_100ul_pcr_full_skirt_H8 + - nest_96_wellplate_100ul_pcr_full_skirt_A9 + - nest_96_wellplate_100ul_pcr_full_skirt_B9 + - nest_96_wellplate_100ul_pcr_full_skirt_C9 + - nest_96_wellplate_100ul_pcr_full_skirt_D9 + - nest_96_wellplate_100ul_pcr_full_skirt_E9 + - nest_96_wellplate_100ul_pcr_full_skirt_F9 + - nest_96_wellplate_100ul_pcr_full_skirt_G9 + - nest_96_wellplate_100ul_pcr_full_skirt_H9 + - nest_96_wellplate_100ul_pcr_full_skirt_A10 + - nest_96_wellplate_100ul_pcr_full_skirt_B10 + - nest_96_wellplate_100ul_pcr_full_skirt_C10 + - nest_96_wellplate_100ul_pcr_full_skirt_D10 + - nest_96_wellplate_100ul_pcr_full_skirt_E10 + - nest_96_wellplate_100ul_pcr_full_skirt_F10 + - nest_96_wellplate_100ul_pcr_full_skirt_G10 + - nest_96_wellplate_100ul_pcr_full_skirt_H10 + - nest_96_wellplate_100ul_pcr_full_skirt_A11 + - nest_96_wellplate_100ul_pcr_full_skirt_B11 + - nest_96_wellplate_100ul_pcr_full_skirt_C11 + - nest_96_wellplate_100ul_pcr_full_skirt_D11 + - nest_96_wellplate_100ul_pcr_full_skirt_E11 + - nest_96_wellplate_100ul_pcr_full_skirt_F11 + - nest_96_wellplate_100ul_pcr_full_skirt_G11 + - nest_96_wellplate_100ul_pcr_full_skirt_H11 + - nest_96_wellplate_100ul_pcr_full_skirt_A12 + - nest_96_wellplate_100ul_pcr_full_skirt_B12 + - nest_96_wellplate_100ul_pcr_full_skirt_C12 + - nest_96_wellplate_100ul_pcr_full_skirt_D12 + - nest_96_wellplate_100ul_pcr_full_skirt_E12 + - nest_96_wellplate_100ul_pcr_full_skirt_F12 + - nest_96_wellplate_100ul_pcr_full_skirt_G12 + - nest_96_wellplate_100ul_pcr_full_skirt_H12 + class: '' + config: + barcode: null + category: plate + model: NEST 96 Well Plate 100 µL PCR Full Skirt + ordering: + A1: nest_96_wellplate_100ul_pcr_full_skirt_A1 + B1: nest_96_wellplate_100ul_pcr_full_skirt_B1 + C1: nest_96_wellplate_100ul_pcr_full_skirt_C1 + D1: nest_96_wellplate_100ul_pcr_full_skirt_D1 + E1: nest_96_wellplate_100ul_pcr_full_skirt_E1 + F1: nest_96_wellplate_100ul_pcr_full_skirt_F1 + G1: nest_96_wellplate_100ul_pcr_full_skirt_G1 + H1: nest_96_wellplate_100ul_pcr_full_skirt_H1 + A2: nest_96_wellplate_100ul_pcr_full_skirt_A2 + B2: nest_96_wellplate_100ul_pcr_full_skirt_B2 + C2: nest_96_wellplate_100ul_pcr_full_skirt_C2 + D2: nest_96_wellplate_100ul_pcr_full_skirt_D2 + E2: nest_96_wellplate_100ul_pcr_full_skirt_E2 + F2: nest_96_wellplate_100ul_pcr_full_skirt_F2 + G2: nest_96_wellplate_100ul_pcr_full_skirt_G2 + H2: nest_96_wellplate_100ul_pcr_full_skirt_H2 + A3: nest_96_wellplate_100ul_pcr_full_skirt_A3 + B3: nest_96_wellplate_100ul_pcr_full_skirt_B3 + C3: nest_96_wellplate_100ul_pcr_full_skirt_C3 + D3: nest_96_wellplate_100ul_pcr_full_skirt_D3 + E3: nest_96_wellplate_100ul_pcr_full_skirt_E3 + F3: nest_96_wellplate_100ul_pcr_full_skirt_F3 + G3: nest_96_wellplate_100ul_pcr_full_skirt_G3 + H3: nest_96_wellplate_100ul_pcr_full_skirt_H3 + A4: nest_96_wellplate_100ul_pcr_full_skirt_A4 + B4: nest_96_wellplate_100ul_pcr_full_skirt_B4 + C4: nest_96_wellplate_100ul_pcr_full_skirt_C4 + D4: nest_96_wellplate_100ul_pcr_full_skirt_D4 + E4: nest_96_wellplate_100ul_pcr_full_skirt_E4 + F4: nest_96_wellplate_100ul_pcr_full_skirt_F4 + G4: nest_96_wellplate_100ul_pcr_full_skirt_G4 + H4: nest_96_wellplate_100ul_pcr_full_skirt_H4 + A5: nest_96_wellplate_100ul_pcr_full_skirt_A5 + B5: nest_96_wellplate_100ul_pcr_full_skirt_B5 + C5: nest_96_wellplate_100ul_pcr_full_skirt_C5 + D5: nest_96_wellplate_100ul_pcr_full_skirt_D5 + E5: nest_96_wellplate_100ul_pcr_full_skirt_E5 + F5: nest_96_wellplate_100ul_pcr_full_skirt_F5 + G5: nest_96_wellplate_100ul_pcr_full_skirt_G5 + H5: nest_96_wellplate_100ul_pcr_full_skirt_H5 + A6: nest_96_wellplate_100ul_pcr_full_skirt_A6 + B6: nest_96_wellplate_100ul_pcr_full_skirt_B6 + C6: nest_96_wellplate_100ul_pcr_full_skirt_C6 + D6: nest_96_wellplate_100ul_pcr_full_skirt_D6 + E6: nest_96_wellplate_100ul_pcr_full_skirt_E6 + F6: nest_96_wellplate_100ul_pcr_full_skirt_F6 + G6: nest_96_wellplate_100ul_pcr_full_skirt_G6 + H6: nest_96_wellplate_100ul_pcr_full_skirt_H6 + A7: nest_96_wellplate_100ul_pcr_full_skirt_A7 + B7: nest_96_wellplate_100ul_pcr_full_skirt_B7 + C7: nest_96_wellplate_100ul_pcr_full_skirt_C7 + D7: nest_96_wellplate_100ul_pcr_full_skirt_D7 + E7: nest_96_wellplate_100ul_pcr_full_skirt_E7 + F7: nest_96_wellplate_100ul_pcr_full_skirt_F7 + G7: nest_96_wellplate_100ul_pcr_full_skirt_G7 + H7: nest_96_wellplate_100ul_pcr_full_skirt_H7 + A8: nest_96_wellplate_100ul_pcr_full_skirt_A8 + B8: nest_96_wellplate_100ul_pcr_full_skirt_B8 + C8: nest_96_wellplate_100ul_pcr_full_skirt_C8 + D8: nest_96_wellplate_100ul_pcr_full_skirt_D8 + E8: nest_96_wellplate_100ul_pcr_full_skirt_E8 + F8: nest_96_wellplate_100ul_pcr_full_skirt_F8 + G8: nest_96_wellplate_100ul_pcr_full_skirt_G8 + H8: nest_96_wellplate_100ul_pcr_full_skirt_H8 + A9: nest_96_wellplate_100ul_pcr_full_skirt_A9 + B9: nest_96_wellplate_100ul_pcr_full_skirt_B9 + C9: nest_96_wellplate_100ul_pcr_full_skirt_C9 + D9: nest_96_wellplate_100ul_pcr_full_skirt_D9 + E9: nest_96_wellplate_100ul_pcr_full_skirt_E9 + F9: nest_96_wellplate_100ul_pcr_full_skirt_F9 + G9: nest_96_wellplate_100ul_pcr_full_skirt_G9 + H9: nest_96_wellplate_100ul_pcr_full_skirt_H9 + A10: nest_96_wellplate_100ul_pcr_full_skirt_A10 + B10: nest_96_wellplate_100ul_pcr_full_skirt_B10 + C10: nest_96_wellplate_100ul_pcr_full_skirt_C10 + D10: nest_96_wellplate_100ul_pcr_full_skirt_D10 + E10: nest_96_wellplate_100ul_pcr_full_skirt_E10 + F10: nest_96_wellplate_100ul_pcr_full_skirt_F10 + G10: nest_96_wellplate_100ul_pcr_full_skirt_G10 + H10: nest_96_wellplate_100ul_pcr_full_skirt_H10 + A11: nest_96_wellplate_100ul_pcr_full_skirt_A11 + B11: nest_96_wellplate_100ul_pcr_full_skirt_B11 + C11: nest_96_wellplate_100ul_pcr_full_skirt_C11 + D11: nest_96_wellplate_100ul_pcr_full_skirt_D11 + E11: nest_96_wellplate_100ul_pcr_full_skirt_E11 + F11: nest_96_wellplate_100ul_pcr_full_skirt_F11 + G11: nest_96_wellplate_100ul_pcr_full_skirt_G11 + H11: nest_96_wellplate_100ul_pcr_full_skirt_H11 + A12: nest_96_wellplate_100ul_pcr_full_skirt_A12 + B12: nest_96_wellplate_100ul_pcr_full_skirt_B12 + C12: nest_96_wellplate_100ul_pcr_full_skirt_C12 + D12: nest_96_wellplate_100ul_pcr_full_skirt_D12 + E12: nest_96_wellplate_100ul_pcr_full_skirt_E12 + F12: nest_96_wellplate_100ul_pcr_full_skirt_F12 + G12: nest_96_wellplate_100ul_pcr_full_skirt_G12 + H12: nest_96_wellplate_100ul_pcr_full_skirt_H12 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.76 + size_y: 85.48 + size_z: 15.7 + type: Plate + data: {} + id: nest_96_wellplate_100ul_pcr_full_skirt + name: nest_96_wellplate_100ul_pcr_full_skirt + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: plate + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_A1 + name: nest_96_wellplate_100ul_pcr_full_skirt_A1 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 12.492 + y: 72.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_B1 + name: nest_96_wellplate_100ul_pcr_full_skirt_B1 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 12.492 + y: 63.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_C1 + name: nest_96_wellplate_100ul_pcr_full_skirt_C1 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 12.492 + y: 54.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_D1 + name: nest_96_wellplate_100ul_pcr_full_skirt_D1 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 12.492 + y: 45.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_E1 + name: nest_96_wellplate_100ul_pcr_full_skirt_E1 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 12.492 + y: 36.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_F1 + name: nest_96_wellplate_100ul_pcr_full_skirt_F1 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 12.492 + y: 27.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_G1 + name: nest_96_wellplate_100ul_pcr_full_skirt_G1 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 12.492 + y: 18.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_H1 + name: nest_96_wellplate_100ul_pcr_full_skirt_H1 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 12.492 + y: 9.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_A2 + name: nest_96_wellplate_100ul_pcr_full_skirt_A2 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 21.492 + y: 72.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_B2 + name: nest_96_wellplate_100ul_pcr_full_skirt_B2 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 21.492 + y: 63.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_C2 + name: nest_96_wellplate_100ul_pcr_full_skirt_C2 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 21.492 + y: 54.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_D2 + name: nest_96_wellplate_100ul_pcr_full_skirt_D2 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 21.492 + y: 45.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_E2 + name: nest_96_wellplate_100ul_pcr_full_skirt_E2 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 21.492 + y: 36.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_F2 + name: nest_96_wellplate_100ul_pcr_full_skirt_F2 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 21.492 + y: 27.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_G2 + name: nest_96_wellplate_100ul_pcr_full_skirt_G2 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 21.492 + y: 18.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_H2 + name: nest_96_wellplate_100ul_pcr_full_skirt_H2 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 21.492 + y: 9.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_A3 + name: nest_96_wellplate_100ul_pcr_full_skirt_A3 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 30.492 + y: 72.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_B3 + name: nest_96_wellplate_100ul_pcr_full_skirt_B3 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 30.492 + y: 63.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_C3 + name: nest_96_wellplate_100ul_pcr_full_skirt_C3 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 30.492 + y: 54.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_D3 + name: nest_96_wellplate_100ul_pcr_full_skirt_D3 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 30.492 + y: 45.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_E3 + name: nest_96_wellplate_100ul_pcr_full_skirt_E3 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 30.492 + y: 36.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_F3 + name: nest_96_wellplate_100ul_pcr_full_skirt_F3 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 30.492 + y: 27.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_G3 + name: nest_96_wellplate_100ul_pcr_full_skirt_G3 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 30.492 + y: 18.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_H3 + name: nest_96_wellplate_100ul_pcr_full_skirt_H3 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 30.492 + y: 9.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_A4 + name: nest_96_wellplate_100ul_pcr_full_skirt_A4 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 39.492 + y: 72.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_B4 + name: nest_96_wellplate_100ul_pcr_full_skirt_B4 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 39.492 + y: 63.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_C4 + name: nest_96_wellplate_100ul_pcr_full_skirt_C4 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 39.492 + y: 54.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_D4 + name: nest_96_wellplate_100ul_pcr_full_skirt_D4 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 39.492 + y: 45.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_E4 + name: nest_96_wellplate_100ul_pcr_full_skirt_E4 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 39.492 + y: 36.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_F4 + name: nest_96_wellplate_100ul_pcr_full_skirt_F4 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 39.492 + y: 27.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_G4 + name: nest_96_wellplate_100ul_pcr_full_skirt_G4 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 39.492 + y: 18.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_H4 + name: nest_96_wellplate_100ul_pcr_full_skirt_H4 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 39.492 + y: 9.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_A5 + name: nest_96_wellplate_100ul_pcr_full_skirt_A5 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 48.492 + y: 72.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_B5 + name: nest_96_wellplate_100ul_pcr_full_skirt_B5 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 48.492 + y: 63.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_C5 + name: nest_96_wellplate_100ul_pcr_full_skirt_C5 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 48.492 + y: 54.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_D5 + name: nest_96_wellplate_100ul_pcr_full_skirt_D5 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 48.492 + y: 45.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_E5 + name: nest_96_wellplate_100ul_pcr_full_skirt_E5 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 48.492 + y: 36.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_F5 + name: nest_96_wellplate_100ul_pcr_full_skirt_F5 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 48.492 + y: 27.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_G5 + name: nest_96_wellplate_100ul_pcr_full_skirt_G5 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 48.492 + y: 18.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_H5 + name: nest_96_wellplate_100ul_pcr_full_skirt_H5 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 48.492 + y: 9.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_A6 + name: nest_96_wellplate_100ul_pcr_full_skirt_A6 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 57.492 + y: 72.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_B6 + name: nest_96_wellplate_100ul_pcr_full_skirt_B6 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 57.492 + y: 63.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_C6 + name: nest_96_wellplate_100ul_pcr_full_skirt_C6 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 57.492 + y: 54.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_D6 + name: nest_96_wellplate_100ul_pcr_full_skirt_D6 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 57.492 + y: 45.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_E6 + name: nest_96_wellplate_100ul_pcr_full_skirt_E6 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 57.492 + y: 36.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_F6 + name: nest_96_wellplate_100ul_pcr_full_skirt_F6 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 57.492 + y: 27.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_G6 + name: nest_96_wellplate_100ul_pcr_full_skirt_G6 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 57.492 + y: 18.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_H6 + name: nest_96_wellplate_100ul_pcr_full_skirt_H6 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 57.492 + y: 9.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_A7 + name: nest_96_wellplate_100ul_pcr_full_skirt_A7 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 66.492 + y: 72.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_B7 + name: nest_96_wellplate_100ul_pcr_full_skirt_B7 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 66.492 + y: 63.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_C7 + name: nest_96_wellplate_100ul_pcr_full_skirt_C7 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 66.492 + y: 54.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_D7 + name: nest_96_wellplate_100ul_pcr_full_skirt_D7 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 66.492 + y: 45.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_E7 + name: nest_96_wellplate_100ul_pcr_full_skirt_E7 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 66.492 + y: 36.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_F7 + name: nest_96_wellplate_100ul_pcr_full_skirt_F7 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 66.492 + y: 27.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_G7 + name: nest_96_wellplate_100ul_pcr_full_skirt_G7 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 66.492 + y: 18.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_H7 + name: nest_96_wellplate_100ul_pcr_full_skirt_H7 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 66.492 + y: 9.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_A8 + name: nest_96_wellplate_100ul_pcr_full_skirt_A8 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 75.492 + y: 72.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_B8 + name: nest_96_wellplate_100ul_pcr_full_skirt_B8 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 75.492 + y: 63.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_C8 + name: nest_96_wellplate_100ul_pcr_full_skirt_C8 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 75.492 + y: 54.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_D8 + name: nest_96_wellplate_100ul_pcr_full_skirt_D8 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 75.492 + y: 45.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_E8 + name: nest_96_wellplate_100ul_pcr_full_skirt_E8 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 75.492 + y: 36.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_F8 + name: nest_96_wellplate_100ul_pcr_full_skirt_F8 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 75.492 + y: 27.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_G8 + name: nest_96_wellplate_100ul_pcr_full_skirt_G8 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 75.492 + y: 18.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_H8 + name: nest_96_wellplate_100ul_pcr_full_skirt_H8 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 75.492 + y: 9.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_A9 + name: nest_96_wellplate_100ul_pcr_full_skirt_A9 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 84.492 + y: 72.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_B9 + name: nest_96_wellplate_100ul_pcr_full_skirt_B9 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 84.492 + y: 63.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_C9 + name: nest_96_wellplate_100ul_pcr_full_skirt_C9 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 84.492 + y: 54.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_D9 + name: nest_96_wellplate_100ul_pcr_full_skirt_D9 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 84.492 + y: 45.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_E9 + name: nest_96_wellplate_100ul_pcr_full_skirt_E9 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 84.492 + y: 36.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_F9 + name: nest_96_wellplate_100ul_pcr_full_skirt_F9 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 84.492 + y: 27.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_G9 + name: nest_96_wellplate_100ul_pcr_full_skirt_G9 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 84.492 + y: 18.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_H9 + name: nest_96_wellplate_100ul_pcr_full_skirt_H9 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 84.492 + y: 9.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_A10 + name: nest_96_wellplate_100ul_pcr_full_skirt_A10 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 93.492 + y: 72.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_B10 + name: nest_96_wellplate_100ul_pcr_full_skirt_B10 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 93.492 + y: 63.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_C10 + name: nest_96_wellplate_100ul_pcr_full_skirt_C10 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 93.492 + y: 54.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_D10 + name: nest_96_wellplate_100ul_pcr_full_skirt_D10 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 93.492 + y: 45.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_E10 + name: nest_96_wellplate_100ul_pcr_full_skirt_E10 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 93.492 + y: 36.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_F10 + name: nest_96_wellplate_100ul_pcr_full_skirt_F10 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 93.492 + y: 27.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_G10 + name: nest_96_wellplate_100ul_pcr_full_skirt_G10 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 93.492 + y: 18.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_H10 + name: nest_96_wellplate_100ul_pcr_full_skirt_H10 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 93.492 + y: 9.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_A11 + name: nest_96_wellplate_100ul_pcr_full_skirt_A11 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 102.492 + y: 72.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_B11 + name: nest_96_wellplate_100ul_pcr_full_skirt_B11 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 102.492 + y: 63.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_C11 + name: nest_96_wellplate_100ul_pcr_full_skirt_C11 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 102.492 + y: 54.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_D11 + name: nest_96_wellplate_100ul_pcr_full_skirt_D11 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 102.492 + y: 45.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_E11 + name: nest_96_wellplate_100ul_pcr_full_skirt_E11 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 102.492 + y: 36.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_F11 + name: nest_96_wellplate_100ul_pcr_full_skirt_F11 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 102.492 + y: 27.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_G11 + name: nest_96_wellplate_100ul_pcr_full_skirt_G11 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 102.492 + y: 18.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_H11 + name: nest_96_wellplate_100ul_pcr_full_skirt_H11 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 102.492 + y: 9.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_A12 + name: nest_96_wellplate_100ul_pcr_full_skirt_A12 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 111.492 + y: 72.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_B12 + name: nest_96_wellplate_100ul_pcr_full_skirt_B12 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 111.492 + y: 63.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_C12 + name: nest_96_wellplate_100ul_pcr_full_skirt_C12 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 111.492 + y: 54.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_D12 + name: nest_96_wellplate_100ul_pcr_full_skirt_D12 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 111.492 + y: 45.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_E12 + name: nest_96_wellplate_100ul_pcr_full_skirt_E12 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 111.492 + y: 36.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_F12 + name: nest_96_wellplate_100ul_pcr_full_skirt_F12 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 111.492 + y: 27.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_G12 + name: nest_96_wellplate_100ul_pcr_full_skirt_G12 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 111.492 + y: 18.352 + z: 0.92 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 100 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_100ul_pcr_full_skirt_H12 + name: nest_96_wellplate_100ul_pcr_full_skirt_H12 + parent: nest_96_wellplate_100ul_pcr_full_skirt + position: + x: 111.492 + y: 9.352 + z: 0.92 + sample_id: null + type: well + description: Nest 96 wellplate 100ul pcr full skirt + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/plates.yaml + handles: [] + icon: '' + init_param_schema: {} + model: + children_mesh: generic_labware_tube_10_75/meshes/0_base.stl + children_mesh_tf: + - 0.0018 + - 0.0018 + - 0 + - -1.5708 + - 0 + - 0 + mesh: tecan_nested_tip_rack/meshes/plate.stl + mesh_tf: + - 0.064 + - 0.043 + - 0 + - -1.5708 + - 0 + - 1.5708 + type: resource + registry_type: resource + version: 1.0.0 +nest_96_wellplate_200ul_flat: + category: + - plates + class: + module: pylabrobot.resources.opentrons.plates:nest_96_wellplate_200ul_flat + type: pylabrobot + config_info: + - children: + - nest_96_wellplate_200ul_flat_A1 + - nest_96_wellplate_200ul_flat_B1 + - nest_96_wellplate_200ul_flat_C1 + - nest_96_wellplate_200ul_flat_D1 + - nest_96_wellplate_200ul_flat_E1 + - nest_96_wellplate_200ul_flat_F1 + - nest_96_wellplate_200ul_flat_G1 + - nest_96_wellplate_200ul_flat_H1 + - nest_96_wellplate_200ul_flat_A2 + - nest_96_wellplate_200ul_flat_B2 + - nest_96_wellplate_200ul_flat_C2 + - nest_96_wellplate_200ul_flat_D2 + - nest_96_wellplate_200ul_flat_E2 + - nest_96_wellplate_200ul_flat_F2 + - nest_96_wellplate_200ul_flat_G2 + - nest_96_wellplate_200ul_flat_H2 + - nest_96_wellplate_200ul_flat_A3 + - nest_96_wellplate_200ul_flat_B3 + - nest_96_wellplate_200ul_flat_C3 + - nest_96_wellplate_200ul_flat_D3 + - nest_96_wellplate_200ul_flat_E3 + - nest_96_wellplate_200ul_flat_F3 + - nest_96_wellplate_200ul_flat_G3 + - nest_96_wellplate_200ul_flat_H3 + - nest_96_wellplate_200ul_flat_A4 + - nest_96_wellplate_200ul_flat_B4 + - nest_96_wellplate_200ul_flat_C4 + - nest_96_wellplate_200ul_flat_D4 + - nest_96_wellplate_200ul_flat_E4 + - nest_96_wellplate_200ul_flat_F4 + - nest_96_wellplate_200ul_flat_G4 + - nest_96_wellplate_200ul_flat_H4 + - nest_96_wellplate_200ul_flat_A5 + - nest_96_wellplate_200ul_flat_B5 + - nest_96_wellplate_200ul_flat_C5 + - nest_96_wellplate_200ul_flat_D5 + - nest_96_wellplate_200ul_flat_E5 + - nest_96_wellplate_200ul_flat_F5 + - nest_96_wellplate_200ul_flat_G5 + - nest_96_wellplate_200ul_flat_H5 + - nest_96_wellplate_200ul_flat_A6 + - nest_96_wellplate_200ul_flat_B6 + - nest_96_wellplate_200ul_flat_C6 + - nest_96_wellplate_200ul_flat_D6 + - nest_96_wellplate_200ul_flat_E6 + - nest_96_wellplate_200ul_flat_F6 + - nest_96_wellplate_200ul_flat_G6 + - nest_96_wellplate_200ul_flat_H6 + - nest_96_wellplate_200ul_flat_A7 + - nest_96_wellplate_200ul_flat_B7 + - nest_96_wellplate_200ul_flat_C7 + - nest_96_wellplate_200ul_flat_D7 + - nest_96_wellplate_200ul_flat_E7 + - nest_96_wellplate_200ul_flat_F7 + - nest_96_wellplate_200ul_flat_G7 + - nest_96_wellplate_200ul_flat_H7 + - nest_96_wellplate_200ul_flat_A8 + - nest_96_wellplate_200ul_flat_B8 + - nest_96_wellplate_200ul_flat_C8 + - nest_96_wellplate_200ul_flat_D8 + - nest_96_wellplate_200ul_flat_E8 + - nest_96_wellplate_200ul_flat_F8 + - nest_96_wellplate_200ul_flat_G8 + - nest_96_wellplate_200ul_flat_H8 + - nest_96_wellplate_200ul_flat_A9 + - nest_96_wellplate_200ul_flat_B9 + - nest_96_wellplate_200ul_flat_C9 + - nest_96_wellplate_200ul_flat_D9 + - nest_96_wellplate_200ul_flat_E9 + - nest_96_wellplate_200ul_flat_F9 + - nest_96_wellplate_200ul_flat_G9 + - nest_96_wellplate_200ul_flat_H9 + - nest_96_wellplate_200ul_flat_A10 + - nest_96_wellplate_200ul_flat_B10 + - nest_96_wellplate_200ul_flat_C10 + - nest_96_wellplate_200ul_flat_D10 + - nest_96_wellplate_200ul_flat_E10 + - nest_96_wellplate_200ul_flat_F10 + - nest_96_wellplate_200ul_flat_G10 + - nest_96_wellplate_200ul_flat_H10 + - nest_96_wellplate_200ul_flat_A11 + - nest_96_wellplate_200ul_flat_B11 + - nest_96_wellplate_200ul_flat_C11 + - nest_96_wellplate_200ul_flat_D11 + - nest_96_wellplate_200ul_flat_E11 + - nest_96_wellplate_200ul_flat_F11 + - nest_96_wellplate_200ul_flat_G11 + - nest_96_wellplate_200ul_flat_H11 + - nest_96_wellplate_200ul_flat_A12 + - nest_96_wellplate_200ul_flat_B12 + - nest_96_wellplate_200ul_flat_C12 + - nest_96_wellplate_200ul_flat_D12 + - nest_96_wellplate_200ul_flat_E12 + - nest_96_wellplate_200ul_flat_F12 + - nest_96_wellplate_200ul_flat_G12 + - nest_96_wellplate_200ul_flat_H12 + class: '' + config: + barcode: null + category: plate + model: NEST 96 Well Plate 200 µL Flat + ordering: + A1: nest_96_wellplate_200ul_flat_A1 + B1: nest_96_wellplate_200ul_flat_B1 + C1: nest_96_wellplate_200ul_flat_C1 + D1: nest_96_wellplate_200ul_flat_D1 + E1: nest_96_wellplate_200ul_flat_E1 + F1: nest_96_wellplate_200ul_flat_F1 + G1: nest_96_wellplate_200ul_flat_G1 + H1: nest_96_wellplate_200ul_flat_H1 + A2: nest_96_wellplate_200ul_flat_A2 + B2: nest_96_wellplate_200ul_flat_B2 + C2: nest_96_wellplate_200ul_flat_C2 + D2: nest_96_wellplate_200ul_flat_D2 + E2: nest_96_wellplate_200ul_flat_E2 + F2: nest_96_wellplate_200ul_flat_F2 + G2: nest_96_wellplate_200ul_flat_G2 + H2: nest_96_wellplate_200ul_flat_H2 + A3: nest_96_wellplate_200ul_flat_A3 + B3: nest_96_wellplate_200ul_flat_B3 + C3: nest_96_wellplate_200ul_flat_C3 + D3: nest_96_wellplate_200ul_flat_D3 + E3: nest_96_wellplate_200ul_flat_E3 + F3: nest_96_wellplate_200ul_flat_F3 + G3: nest_96_wellplate_200ul_flat_G3 + H3: nest_96_wellplate_200ul_flat_H3 + A4: nest_96_wellplate_200ul_flat_A4 + B4: nest_96_wellplate_200ul_flat_B4 + C4: nest_96_wellplate_200ul_flat_C4 + D4: nest_96_wellplate_200ul_flat_D4 + E4: nest_96_wellplate_200ul_flat_E4 + F4: nest_96_wellplate_200ul_flat_F4 + G4: nest_96_wellplate_200ul_flat_G4 + H4: nest_96_wellplate_200ul_flat_H4 + A5: nest_96_wellplate_200ul_flat_A5 + B5: nest_96_wellplate_200ul_flat_B5 + C5: nest_96_wellplate_200ul_flat_C5 + D5: nest_96_wellplate_200ul_flat_D5 + E5: nest_96_wellplate_200ul_flat_E5 + F5: nest_96_wellplate_200ul_flat_F5 + G5: nest_96_wellplate_200ul_flat_G5 + H5: nest_96_wellplate_200ul_flat_H5 + A6: nest_96_wellplate_200ul_flat_A6 + B6: nest_96_wellplate_200ul_flat_B6 + C6: nest_96_wellplate_200ul_flat_C6 + D6: nest_96_wellplate_200ul_flat_D6 + E6: nest_96_wellplate_200ul_flat_E6 + F6: nest_96_wellplate_200ul_flat_F6 + G6: nest_96_wellplate_200ul_flat_G6 + H6: nest_96_wellplate_200ul_flat_H6 + A7: nest_96_wellplate_200ul_flat_A7 + B7: nest_96_wellplate_200ul_flat_B7 + C7: nest_96_wellplate_200ul_flat_C7 + D7: nest_96_wellplate_200ul_flat_D7 + E7: nest_96_wellplate_200ul_flat_E7 + F7: nest_96_wellplate_200ul_flat_F7 + G7: nest_96_wellplate_200ul_flat_G7 + H7: nest_96_wellplate_200ul_flat_H7 + A8: nest_96_wellplate_200ul_flat_A8 + B8: nest_96_wellplate_200ul_flat_B8 + C8: nest_96_wellplate_200ul_flat_C8 + D8: nest_96_wellplate_200ul_flat_D8 + E8: nest_96_wellplate_200ul_flat_E8 + F8: nest_96_wellplate_200ul_flat_F8 + G8: nest_96_wellplate_200ul_flat_G8 + H8: nest_96_wellplate_200ul_flat_H8 + A9: nest_96_wellplate_200ul_flat_A9 + B9: nest_96_wellplate_200ul_flat_B9 + C9: nest_96_wellplate_200ul_flat_C9 + D9: nest_96_wellplate_200ul_flat_D9 + E9: nest_96_wellplate_200ul_flat_E9 + F9: nest_96_wellplate_200ul_flat_F9 + G9: nest_96_wellplate_200ul_flat_G9 + H9: nest_96_wellplate_200ul_flat_H9 + A10: nest_96_wellplate_200ul_flat_A10 + B10: nest_96_wellplate_200ul_flat_B10 + C10: nest_96_wellplate_200ul_flat_C10 + D10: nest_96_wellplate_200ul_flat_D10 + E10: nest_96_wellplate_200ul_flat_E10 + F10: nest_96_wellplate_200ul_flat_F10 + G10: nest_96_wellplate_200ul_flat_G10 + H10: nest_96_wellplate_200ul_flat_H10 + A11: nest_96_wellplate_200ul_flat_A11 + B11: nest_96_wellplate_200ul_flat_B11 + C11: nest_96_wellplate_200ul_flat_C11 + D11: nest_96_wellplate_200ul_flat_D11 + E11: nest_96_wellplate_200ul_flat_E11 + F11: nest_96_wellplate_200ul_flat_F11 + G11: nest_96_wellplate_200ul_flat_G11 + H11: nest_96_wellplate_200ul_flat_H11 + A12: nest_96_wellplate_200ul_flat_A12 + B12: nest_96_wellplate_200ul_flat_B12 + C12: nest_96_wellplate_200ul_flat_C12 + D12: nest_96_wellplate_200ul_flat_D12 + E12: nest_96_wellplate_200ul_flat_E12 + F12: nest_96_wellplate_200ul_flat_F12 + G12: nest_96_wellplate_200ul_flat_G12 + H12: nest_96_wellplate_200ul_flat_H12 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.56 + size_y: 85.36 + size_z: 14.3 + type: Plate + data: {} + id: nest_96_wellplate_200ul_flat + name: nest_96_wellplate_200ul_flat + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: plate + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_A1 + name: nest_96_wellplate_200ul_flat_A1 + parent: nest_96_wellplate_200ul_flat + position: + x: 11.858 + y: 71.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_B1 + name: nest_96_wellplate_200ul_flat_B1 + parent: nest_96_wellplate_200ul_flat + position: + x: 11.858 + y: 62.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_C1 + name: nest_96_wellplate_200ul_flat_C1 + parent: nest_96_wellplate_200ul_flat + position: + x: 11.858 + y: 53.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_D1 + name: nest_96_wellplate_200ul_flat_D1 + parent: nest_96_wellplate_200ul_flat + position: + x: 11.858 + y: 44.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_E1 + name: nest_96_wellplate_200ul_flat_E1 + parent: nest_96_wellplate_200ul_flat + position: + x: 11.858 + y: 35.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_F1 + name: nest_96_wellplate_200ul_flat_F1 + parent: nest_96_wellplate_200ul_flat + position: + x: 11.858 + y: 26.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_G1 + name: nest_96_wellplate_200ul_flat_G1 + parent: nest_96_wellplate_200ul_flat + position: + x: 11.858 + y: 17.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_H1 + name: nest_96_wellplate_200ul_flat_H1 + parent: nest_96_wellplate_200ul_flat + position: + x: 11.858 + y: 8.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_A2 + name: nest_96_wellplate_200ul_flat_A2 + parent: nest_96_wellplate_200ul_flat + position: + x: 20.858 + y: 71.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_B2 + name: nest_96_wellplate_200ul_flat_B2 + parent: nest_96_wellplate_200ul_flat + position: + x: 20.858 + y: 62.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_C2 + name: nest_96_wellplate_200ul_flat_C2 + parent: nest_96_wellplate_200ul_flat + position: + x: 20.858 + y: 53.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_D2 + name: nest_96_wellplate_200ul_flat_D2 + parent: nest_96_wellplate_200ul_flat + position: + x: 20.858 + y: 44.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_E2 + name: nest_96_wellplate_200ul_flat_E2 + parent: nest_96_wellplate_200ul_flat + position: + x: 20.858 + y: 35.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_F2 + name: nest_96_wellplate_200ul_flat_F2 + parent: nest_96_wellplate_200ul_flat + position: + x: 20.858 + y: 26.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_G2 + name: nest_96_wellplate_200ul_flat_G2 + parent: nest_96_wellplate_200ul_flat + position: + x: 20.858 + y: 17.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_H2 + name: nest_96_wellplate_200ul_flat_H2 + parent: nest_96_wellplate_200ul_flat + position: + x: 20.858 + y: 8.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_A3 + name: nest_96_wellplate_200ul_flat_A3 + parent: nest_96_wellplate_200ul_flat + position: + x: 29.858 + y: 71.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_B3 + name: nest_96_wellplate_200ul_flat_B3 + parent: nest_96_wellplate_200ul_flat + position: + x: 29.858 + y: 62.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_C3 + name: nest_96_wellplate_200ul_flat_C3 + parent: nest_96_wellplate_200ul_flat + position: + x: 29.858 + y: 53.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_D3 + name: nest_96_wellplate_200ul_flat_D3 + parent: nest_96_wellplate_200ul_flat + position: + x: 29.858 + y: 44.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_E3 + name: nest_96_wellplate_200ul_flat_E3 + parent: nest_96_wellplate_200ul_flat + position: + x: 29.858 + y: 35.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_F3 + name: nest_96_wellplate_200ul_flat_F3 + parent: nest_96_wellplate_200ul_flat + position: + x: 29.858 + y: 26.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_G3 + name: nest_96_wellplate_200ul_flat_G3 + parent: nest_96_wellplate_200ul_flat + position: + x: 29.858 + y: 17.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_H3 + name: nest_96_wellplate_200ul_flat_H3 + parent: nest_96_wellplate_200ul_flat + position: + x: 29.858 + y: 8.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_A4 + name: nest_96_wellplate_200ul_flat_A4 + parent: nest_96_wellplate_200ul_flat + position: + x: 38.858 + y: 71.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_B4 + name: nest_96_wellplate_200ul_flat_B4 + parent: nest_96_wellplate_200ul_flat + position: + x: 38.858 + y: 62.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_C4 + name: nest_96_wellplate_200ul_flat_C4 + parent: nest_96_wellplate_200ul_flat + position: + x: 38.858 + y: 53.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_D4 + name: nest_96_wellplate_200ul_flat_D4 + parent: nest_96_wellplate_200ul_flat + position: + x: 38.858 + y: 44.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_E4 + name: nest_96_wellplate_200ul_flat_E4 + parent: nest_96_wellplate_200ul_flat + position: + x: 38.858 + y: 35.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_F4 + name: nest_96_wellplate_200ul_flat_F4 + parent: nest_96_wellplate_200ul_flat + position: + x: 38.858 + y: 26.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_G4 + name: nest_96_wellplate_200ul_flat_G4 + parent: nest_96_wellplate_200ul_flat + position: + x: 38.858 + y: 17.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_H4 + name: nest_96_wellplate_200ul_flat_H4 + parent: nest_96_wellplate_200ul_flat + position: + x: 38.858 + y: 8.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_A5 + name: nest_96_wellplate_200ul_flat_A5 + parent: nest_96_wellplate_200ul_flat + position: + x: 47.858 + y: 71.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_B5 + name: nest_96_wellplate_200ul_flat_B5 + parent: nest_96_wellplate_200ul_flat + position: + x: 47.858 + y: 62.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_C5 + name: nest_96_wellplate_200ul_flat_C5 + parent: nest_96_wellplate_200ul_flat + position: + x: 47.858 + y: 53.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_D5 + name: nest_96_wellplate_200ul_flat_D5 + parent: nest_96_wellplate_200ul_flat + position: + x: 47.858 + y: 44.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_E5 + name: nest_96_wellplate_200ul_flat_E5 + parent: nest_96_wellplate_200ul_flat + position: + x: 47.858 + y: 35.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_F5 + name: nest_96_wellplate_200ul_flat_F5 + parent: nest_96_wellplate_200ul_flat + position: + x: 47.858 + y: 26.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_G5 + name: nest_96_wellplate_200ul_flat_G5 + parent: nest_96_wellplate_200ul_flat + position: + x: 47.858 + y: 17.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_H5 + name: nest_96_wellplate_200ul_flat_H5 + parent: nest_96_wellplate_200ul_flat + position: + x: 47.858 + y: 8.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_A6 + name: nest_96_wellplate_200ul_flat_A6 + parent: nest_96_wellplate_200ul_flat + position: + x: 56.858 + y: 71.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_B6 + name: nest_96_wellplate_200ul_flat_B6 + parent: nest_96_wellplate_200ul_flat + position: + x: 56.858 + y: 62.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_C6 + name: nest_96_wellplate_200ul_flat_C6 + parent: nest_96_wellplate_200ul_flat + position: + x: 56.858 + y: 53.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_D6 + name: nest_96_wellplate_200ul_flat_D6 + parent: nest_96_wellplate_200ul_flat + position: + x: 56.858 + y: 44.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_E6 + name: nest_96_wellplate_200ul_flat_E6 + parent: nest_96_wellplate_200ul_flat + position: + x: 56.858 + y: 35.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_F6 + name: nest_96_wellplate_200ul_flat_F6 + parent: nest_96_wellplate_200ul_flat + position: + x: 56.858 + y: 26.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_G6 + name: nest_96_wellplate_200ul_flat_G6 + parent: nest_96_wellplate_200ul_flat + position: + x: 56.858 + y: 17.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_H6 + name: nest_96_wellplate_200ul_flat_H6 + parent: nest_96_wellplate_200ul_flat + position: + x: 56.858 + y: 8.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_A7 + name: nest_96_wellplate_200ul_flat_A7 + parent: nest_96_wellplate_200ul_flat + position: + x: 65.858 + y: 71.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_B7 + name: nest_96_wellplate_200ul_flat_B7 + parent: nest_96_wellplate_200ul_flat + position: + x: 65.858 + y: 62.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_C7 + name: nest_96_wellplate_200ul_flat_C7 + parent: nest_96_wellplate_200ul_flat + position: + x: 65.858 + y: 53.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_D7 + name: nest_96_wellplate_200ul_flat_D7 + parent: nest_96_wellplate_200ul_flat + position: + x: 65.858 + y: 44.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_E7 + name: nest_96_wellplate_200ul_flat_E7 + parent: nest_96_wellplate_200ul_flat + position: + x: 65.858 + y: 35.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_F7 + name: nest_96_wellplate_200ul_flat_F7 + parent: nest_96_wellplate_200ul_flat + position: + x: 65.858 + y: 26.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_G7 + name: nest_96_wellplate_200ul_flat_G7 + parent: nest_96_wellplate_200ul_flat + position: + x: 65.858 + y: 17.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_H7 + name: nest_96_wellplate_200ul_flat_H7 + parent: nest_96_wellplate_200ul_flat + position: + x: 65.858 + y: 8.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_A8 + name: nest_96_wellplate_200ul_flat_A8 + parent: nest_96_wellplate_200ul_flat + position: + x: 74.858 + y: 71.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_B8 + name: nest_96_wellplate_200ul_flat_B8 + parent: nest_96_wellplate_200ul_flat + position: + x: 74.858 + y: 62.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_C8 + name: nest_96_wellplate_200ul_flat_C8 + parent: nest_96_wellplate_200ul_flat + position: + x: 74.858 + y: 53.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_D8 + name: nest_96_wellplate_200ul_flat_D8 + parent: nest_96_wellplate_200ul_flat + position: + x: 74.858 + y: 44.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_E8 + name: nest_96_wellplate_200ul_flat_E8 + parent: nest_96_wellplate_200ul_flat + position: + x: 74.858 + y: 35.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_F8 + name: nest_96_wellplate_200ul_flat_F8 + parent: nest_96_wellplate_200ul_flat + position: + x: 74.858 + y: 26.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_G8 + name: nest_96_wellplate_200ul_flat_G8 + parent: nest_96_wellplate_200ul_flat + position: + x: 74.858 + y: 17.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_H8 + name: nest_96_wellplate_200ul_flat_H8 + parent: nest_96_wellplate_200ul_flat + position: + x: 74.858 + y: 8.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_A9 + name: nest_96_wellplate_200ul_flat_A9 + parent: nest_96_wellplate_200ul_flat + position: + x: 83.858 + y: 71.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_B9 + name: nest_96_wellplate_200ul_flat_B9 + parent: nest_96_wellplate_200ul_flat + position: + x: 83.858 + y: 62.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_C9 + name: nest_96_wellplate_200ul_flat_C9 + parent: nest_96_wellplate_200ul_flat + position: + x: 83.858 + y: 53.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_D9 + name: nest_96_wellplate_200ul_flat_D9 + parent: nest_96_wellplate_200ul_flat + position: + x: 83.858 + y: 44.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_E9 + name: nest_96_wellplate_200ul_flat_E9 + parent: nest_96_wellplate_200ul_flat + position: + x: 83.858 + y: 35.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_F9 + name: nest_96_wellplate_200ul_flat_F9 + parent: nest_96_wellplate_200ul_flat + position: + x: 83.858 + y: 26.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_G9 + name: nest_96_wellplate_200ul_flat_G9 + parent: nest_96_wellplate_200ul_flat + position: + x: 83.858 + y: 17.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_H9 + name: nest_96_wellplate_200ul_flat_H9 + parent: nest_96_wellplate_200ul_flat + position: + x: 83.858 + y: 8.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_A10 + name: nest_96_wellplate_200ul_flat_A10 + parent: nest_96_wellplate_200ul_flat + position: + x: 92.858 + y: 71.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_B10 + name: nest_96_wellplate_200ul_flat_B10 + parent: nest_96_wellplate_200ul_flat + position: + x: 92.858 + y: 62.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_C10 + name: nest_96_wellplate_200ul_flat_C10 + parent: nest_96_wellplate_200ul_flat + position: + x: 92.858 + y: 53.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_D10 + name: nest_96_wellplate_200ul_flat_D10 + parent: nest_96_wellplate_200ul_flat + position: + x: 92.858 + y: 44.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_E10 + name: nest_96_wellplate_200ul_flat_E10 + parent: nest_96_wellplate_200ul_flat + position: + x: 92.858 + y: 35.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_F10 + name: nest_96_wellplate_200ul_flat_F10 + parent: nest_96_wellplate_200ul_flat + position: + x: 92.858 + y: 26.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_G10 + name: nest_96_wellplate_200ul_flat_G10 + parent: nest_96_wellplate_200ul_flat + position: + x: 92.858 + y: 17.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_H10 + name: nest_96_wellplate_200ul_flat_H10 + parent: nest_96_wellplate_200ul_flat + position: + x: 92.858 + y: 8.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_A11 + name: nest_96_wellplate_200ul_flat_A11 + parent: nest_96_wellplate_200ul_flat + position: + x: 101.858 + y: 71.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_B11 + name: nest_96_wellplate_200ul_flat_B11 + parent: nest_96_wellplate_200ul_flat + position: + x: 101.858 + y: 62.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_C11 + name: nest_96_wellplate_200ul_flat_C11 + parent: nest_96_wellplate_200ul_flat + position: + x: 101.858 + y: 53.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_D11 + name: nest_96_wellplate_200ul_flat_D11 + parent: nest_96_wellplate_200ul_flat + position: + x: 101.858 + y: 44.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_E11 + name: nest_96_wellplate_200ul_flat_E11 + parent: nest_96_wellplate_200ul_flat + position: + x: 101.858 + y: 35.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_F11 + name: nest_96_wellplate_200ul_flat_F11 + parent: nest_96_wellplate_200ul_flat + position: + x: 101.858 + y: 26.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_G11 + name: nest_96_wellplate_200ul_flat_G11 + parent: nest_96_wellplate_200ul_flat + position: + x: 101.858 + y: 17.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_H11 + name: nest_96_wellplate_200ul_flat_H11 + parent: nest_96_wellplate_200ul_flat + position: + x: 101.858 + y: 8.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_A12 + name: nest_96_wellplate_200ul_flat_A12 + parent: nest_96_wellplate_200ul_flat + position: + x: 110.858 + y: 71.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_B12 + name: nest_96_wellplate_200ul_flat_B12 + parent: nest_96_wellplate_200ul_flat + position: + x: 110.858 + y: 62.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_C12 + name: nest_96_wellplate_200ul_flat_C12 + parent: nest_96_wellplate_200ul_flat + position: + x: 110.858 + y: 53.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_D12 + name: nest_96_wellplate_200ul_flat_D12 + parent: nest_96_wellplate_200ul_flat + position: + x: 110.858 + y: 44.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_E12 + name: nest_96_wellplate_200ul_flat_E12 + parent: nest_96_wellplate_200ul_flat + position: + x: 110.858 + y: 35.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_F12 + name: nest_96_wellplate_200ul_flat_F12 + parent: nest_96_wellplate_200ul_flat + position: + x: 110.858 + y: 26.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_G12 + name: nest_96_wellplate_200ul_flat_G12 + parent: nest_96_wellplate_200ul_flat + position: + x: 110.858 + y: 17.758 + z: 3.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 200 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.844 + size_y: 4.844 + size_z: 10.8 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_200ul_flat_H12 + name: nest_96_wellplate_200ul_flat_H12 + parent: nest_96_wellplate_200ul_flat + position: + x: 110.858 + y: 8.758 + z: 3.5 + sample_id: null + type: well + description: Nest 96 wellplate 200ul flat + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/plates.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +nest_96_wellplate_2ml_deep: + category: + - plates + class: + module: pylabrobot.resources.opentrons.plates:nest_96_wellplate_2ml_deep + type: pylabrobot + config_info: + - children: + - nest_96_wellplate_2ml_deep_A1 + - nest_96_wellplate_2ml_deep_B1 + - nest_96_wellplate_2ml_deep_C1 + - nest_96_wellplate_2ml_deep_D1 + - nest_96_wellplate_2ml_deep_E1 + - nest_96_wellplate_2ml_deep_F1 + - nest_96_wellplate_2ml_deep_G1 + - nest_96_wellplate_2ml_deep_H1 + - nest_96_wellplate_2ml_deep_A2 + - nest_96_wellplate_2ml_deep_B2 + - nest_96_wellplate_2ml_deep_C2 + - nest_96_wellplate_2ml_deep_D2 + - nest_96_wellplate_2ml_deep_E2 + - nest_96_wellplate_2ml_deep_F2 + - nest_96_wellplate_2ml_deep_G2 + - nest_96_wellplate_2ml_deep_H2 + - nest_96_wellplate_2ml_deep_A3 + - nest_96_wellplate_2ml_deep_B3 + - nest_96_wellplate_2ml_deep_C3 + - nest_96_wellplate_2ml_deep_D3 + - nest_96_wellplate_2ml_deep_E3 + - nest_96_wellplate_2ml_deep_F3 + - nest_96_wellplate_2ml_deep_G3 + - nest_96_wellplate_2ml_deep_H3 + - nest_96_wellplate_2ml_deep_A4 + - nest_96_wellplate_2ml_deep_B4 + - nest_96_wellplate_2ml_deep_C4 + - nest_96_wellplate_2ml_deep_D4 + - nest_96_wellplate_2ml_deep_E4 + - nest_96_wellplate_2ml_deep_F4 + - nest_96_wellplate_2ml_deep_G4 + - nest_96_wellplate_2ml_deep_H4 + - nest_96_wellplate_2ml_deep_A5 + - nest_96_wellplate_2ml_deep_B5 + - nest_96_wellplate_2ml_deep_C5 + - nest_96_wellplate_2ml_deep_D5 + - nest_96_wellplate_2ml_deep_E5 + - nest_96_wellplate_2ml_deep_F5 + - nest_96_wellplate_2ml_deep_G5 + - nest_96_wellplate_2ml_deep_H5 + - nest_96_wellplate_2ml_deep_A6 + - nest_96_wellplate_2ml_deep_B6 + - nest_96_wellplate_2ml_deep_C6 + - nest_96_wellplate_2ml_deep_D6 + - nest_96_wellplate_2ml_deep_E6 + - nest_96_wellplate_2ml_deep_F6 + - nest_96_wellplate_2ml_deep_G6 + - nest_96_wellplate_2ml_deep_H6 + - nest_96_wellplate_2ml_deep_A7 + - nest_96_wellplate_2ml_deep_B7 + - nest_96_wellplate_2ml_deep_C7 + - nest_96_wellplate_2ml_deep_D7 + - nest_96_wellplate_2ml_deep_E7 + - nest_96_wellplate_2ml_deep_F7 + - nest_96_wellplate_2ml_deep_G7 + - nest_96_wellplate_2ml_deep_H7 + - nest_96_wellplate_2ml_deep_A8 + - nest_96_wellplate_2ml_deep_B8 + - nest_96_wellplate_2ml_deep_C8 + - nest_96_wellplate_2ml_deep_D8 + - nest_96_wellplate_2ml_deep_E8 + - nest_96_wellplate_2ml_deep_F8 + - nest_96_wellplate_2ml_deep_G8 + - nest_96_wellplate_2ml_deep_H8 + - nest_96_wellplate_2ml_deep_A9 + - nest_96_wellplate_2ml_deep_B9 + - nest_96_wellplate_2ml_deep_C9 + - nest_96_wellplate_2ml_deep_D9 + - nest_96_wellplate_2ml_deep_E9 + - nest_96_wellplate_2ml_deep_F9 + - nest_96_wellplate_2ml_deep_G9 + - nest_96_wellplate_2ml_deep_H9 + - nest_96_wellplate_2ml_deep_A10 + - nest_96_wellplate_2ml_deep_B10 + - nest_96_wellplate_2ml_deep_C10 + - nest_96_wellplate_2ml_deep_D10 + - nest_96_wellplate_2ml_deep_E10 + - nest_96_wellplate_2ml_deep_F10 + - nest_96_wellplate_2ml_deep_G10 + - nest_96_wellplate_2ml_deep_H10 + - nest_96_wellplate_2ml_deep_A11 + - nest_96_wellplate_2ml_deep_B11 + - nest_96_wellplate_2ml_deep_C11 + - nest_96_wellplate_2ml_deep_D11 + - nest_96_wellplate_2ml_deep_E11 + - nest_96_wellplate_2ml_deep_F11 + - nest_96_wellplate_2ml_deep_G11 + - nest_96_wellplate_2ml_deep_H11 + - nest_96_wellplate_2ml_deep_A12 + - nest_96_wellplate_2ml_deep_B12 + - nest_96_wellplate_2ml_deep_C12 + - nest_96_wellplate_2ml_deep_D12 + - nest_96_wellplate_2ml_deep_E12 + - nest_96_wellplate_2ml_deep_F12 + - nest_96_wellplate_2ml_deep_G12 + - nest_96_wellplate_2ml_deep_H12 + class: '' + config: + barcode: null + category: plate + model: NEST 96 Deep Well Plate 2mL + ordering: + A1: nest_96_wellplate_2ml_deep_A1 + B1: nest_96_wellplate_2ml_deep_B1 + C1: nest_96_wellplate_2ml_deep_C1 + D1: nest_96_wellplate_2ml_deep_D1 + E1: nest_96_wellplate_2ml_deep_E1 + F1: nest_96_wellplate_2ml_deep_F1 + G1: nest_96_wellplate_2ml_deep_G1 + H1: nest_96_wellplate_2ml_deep_H1 + A2: nest_96_wellplate_2ml_deep_A2 + B2: nest_96_wellplate_2ml_deep_B2 + C2: nest_96_wellplate_2ml_deep_C2 + D2: nest_96_wellplate_2ml_deep_D2 + E2: nest_96_wellplate_2ml_deep_E2 + F2: nest_96_wellplate_2ml_deep_F2 + G2: nest_96_wellplate_2ml_deep_G2 + H2: nest_96_wellplate_2ml_deep_H2 + A3: nest_96_wellplate_2ml_deep_A3 + B3: nest_96_wellplate_2ml_deep_B3 + C3: nest_96_wellplate_2ml_deep_C3 + D3: nest_96_wellplate_2ml_deep_D3 + E3: nest_96_wellplate_2ml_deep_E3 + F3: nest_96_wellplate_2ml_deep_F3 + G3: nest_96_wellplate_2ml_deep_G3 + H3: nest_96_wellplate_2ml_deep_H3 + A4: nest_96_wellplate_2ml_deep_A4 + B4: nest_96_wellplate_2ml_deep_B4 + C4: nest_96_wellplate_2ml_deep_C4 + D4: nest_96_wellplate_2ml_deep_D4 + E4: nest_96_wellplate_2ml_deep_E4 + F4: nest_96_wellplate_2ml_deep_F4 + G4: nest_96_wellplate_2ml_deep_G4 + H4: nest_96_wellplate_2ml_deep_H4 + A5: nest_96_wellplate_2ml_deep_A5 + B5: nest_96_wellplate_2ml_deep_B5 + C5: nest_96_wellplate_2ml_deep_C5 + D5: nest_96_wellplate_2ml_deep_D5 + E5: nest_96_wellplate_2ml_deep_E5 + F5: nest_96_wellplate_2ml_deep_F5 + G5: nest_96_wellplate_2ml_deep_G5 + H5: nest_96_wellplate_2ml_deep_H5 + A6: nest_96_wellplate_2ml_deep_A6 + B6: nest_96_wellplate_2ml_deep_B6 + C6: nest_96_wellplate_2ml_deep_C6 + D6: nest_96_wellplate_2ml_deep_D6 + E6: nest_96_wellplate_2ml_deep_E6 + F6: nest_96_wellplate_2ml_deep_F6 + G6: nest_96_wellplate_2ml_deep_G6 + H6: nest_96_wellplate_2ml_deep_H6 + A7: nest_96_wellplate_2ml_deep_A7 + B7: nest_96_wellplate_2ml_deep_B7 + C7: nest_96_wellplate_2ml_deep_C7 + D7: nest_96_wellplate_2ml_deep_D7 + E7: nest_96_wellplate_2ml_deep_E7 + F7: nest_96_wellplate_2ml_deep_F7 + G7: nest_96_wellplate_2ml_deep_G7 + H7: nest_96_wellplate_2ml_deep_H7 + A8: nest_96_wellplate_2ml_deep_A8 + B8: nest_96_wellplate_2ml_deep_B8 + C8: nest_96_wellplate_2ml_deep_C8 + D8: nest_96_wellplate_2ml_deep_D8 + E8: nest_96_wellplate_2ml_deep_E8 + F8: nest_96_wellplate_2ml_deep_F8 + G8: nest_96_wellplate_2ml_deep_G8 + H8: nest_96_wellplate_2ml_deep_H8 + A9: nest_96_wellplate_2ml_deep_A9 + B9: nest_96_wellplate_2ml_deep_B9 + C9: nest_96_wellplate_2ml_deep_C9 + D9: nest_96_wellplate_2ml_deep_D9 + E9: nest_96_wellplate_2ml_deep_E9 + F9: nest_96_wellplate_2ml_deep_F9 + G9: nest_96_wellplate_2ml_deep_G9 + H9: nest_96_wellplate_2ml_deep_H9 + A10: nest_96_wellplate_2ml_deep_A10 + B10: nest_96_wellplate_2ml_deep_B10 + C10: nest_96_wellplate_2ml_deep_C10 + D10: nest_96_wellplate_2ml_deep_D10 + E10: nest_96_wellplate_2ml_deep_E10 + F10: nest_96_wellplate_2ml_deep_F10 + G10: nest_96_wellplate_2ml_deep_G10 + H10: nest_96_wellplate_2ml_deep_H10 + A11: nest_96_wellplate_2ml_deep_A11 + B11: nest_96_wellplate_2ml_deep_B11 + C11: nest_96_wellplate_2ml_deep_C11 + D11: nest_96_wellplate_2ml_deep_D11 + E11: nest_96_wellplate_2ml_deep_E11 + F11: nest_96_wellplate_2ml_deep_F11 + G11: nest_96_wellplate_2ml_deep_G11 + H11: nest_96_wellplate_2ml_deep_H11 + A12: nest_96_wellplate_2ml_deep_A12 + B12: nest_96_wellplate_2ml_deep_B12 + C12: nest_96_wellplate_2ml_deep_C12 + D12: nest_96_wellplate_2ml_deep_D12 + E12: nest_96_wellplate_2ml_deep_E12 + F12: nest_96_wellplate_2ml_deep_F12 + G12: nest_96_wellplate_2ml_deep_G12 + H12: nest_96_wellplate_2ml_deep_H12 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.6 + size_y: 85.3 + size_z: 41 + type: Plate + data: {} + id: nest_96_wellplate_2ml_deep + name: nest_96_wellplate_2ml_deep + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: plate + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_A1 + name: nest_96_wellplate_2ml_deep_A1 + parent: nest_96_wellplate_2ml_deep + position: + x: 10.2 + y: 70.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_B1 + name: nest_96_wellplate_2ml_deep_B1 + parent: nest_96_wellplate_2ml_deep + position: + x: 10.2 + y: 61.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_C1 + name: nest_96_wellplate_2ml_deep_C1 + parent: nest_96_wellplate_2ml_deep + position: + x: 10.2 + y: 52.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_D1 + name: nest_96_wellplate_2ml_deep_D1 + parent: nest_96_wellplate_2ml_deep + position: + x: 10.2 + y: 43.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_E1 + name: nest_96_wellplate_2ml_deep_E1 + parent: nest_96_wellplate_2ml_deep + position: + x: 10.2 + y: 34.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_F1 + name: nest_96_wellplate_2ml_deep_F1 + parent: nest_96_wellplate_2ml_deep + position: + x: 10.2 + y: 25.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_G1 + name: nest_96_wellplate_2ml_deep_G1 + parent: nest_96_wellplate_2ml_deep + position: + x: 10.2 + y: 16.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_H1 + name: nest_96_wellplate_2ml_deep_H1 + parent: nest_96_wellplate_2ml_deep + position: + x: 10.2 + y: 7.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_A2 + name: nest_96_wellplate_2ml_deep_A2 + parent: nest_96_wellplate_2ml_deep + position: + x: 19.2 + y: 70.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_B2 + name: nest_96_wellplate_2ml_deep_B2 + parent: nest_96_wellplate_2ml_deep + position: + x: 19.2 + y: 61.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_C2 + name: nest_96_wellplate_2ml_deep_C2 + parent: nest_96_wellplate_2ml_deep + position: + x: 19.2 + y: 52.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_D2 + name: nest_96_wellplate_2ml_deep_D2 + parent: nest_96_wellplate_2ml_deep + position: + x: 19.2 + y: 43.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_E2 + name: nest_96_wellplate_2ml_deep_E2 + parent: nest_96_wellplate_2ml_deep + position: + x: 19.2 + y: 34.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_F2 + name: nest_96_wellplate_2ml_deep_F2 + parent: nest_96_wellplate_2ml_deep + position: + x: 19.2 + y: 25.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_G2 + name: nest_96_wellplate_2ml_deep_G2 + parent: nest_96_wellplate_2ml_deep + position: + x: 19.2 + y: 16.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_H2 + name: nest_96_wellplate_2ml_deep_H2 + parent: nest_96_wellplate_2ml_deep + position: + x: 19.2 + y: 7.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_A3 + name: nest_96_wellplate_2ml_deep_A3 + parent: nest_96_wellplate_2ml_deep + position: + x: 28.2 + y: 70.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_B3 + name: nest_96_wellplate_2ml_deep_B3 + parent: nest_96_wellplate_2ml_deep + position: + x: 28.2 + y: 61.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_C3 + name: nest_96_wellplate_2ml_deep_C3 + parent: nest_96_wellplate_2ml_deep + position: + x: 28.2 + y: 52.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_D3 + name: nest_96_wellplate_2ml_deep_D3 + parent: nest_96_wellplate_2ml_deep + position: + x: 28.2 + y: 43.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_E3 + name: nest_96_wellplate_2ml_deep_E3 + parent: nest_96_wellplate_2ml_deep + position: + x: 28.2 + y: 34.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_F3 + name: nest_96_wellplate_2ml_deep_F3 + parent: nest_96_wellplate_2ml_deep + position: + x: 28.2 + y: 25.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_G3 + name: nest_96_wellplate_2ml_deep_G3 + parent: nest_96_wellplate_2ml_deep + position: + x: 28.2 + y: 16.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_H3 + name: nest_96_wellplate_2ml_deep_H3 + parent: nest_96_wellplate_2ml_deep + position: + x: 28.2 + y: 7.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_A4 + name: nest_96_wellplate_2ml_deep_A4 + parent: nest_96_wellplate_2ml_deep + position: + x: 37.2 + y: 70.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_B4 + name: nest_96_wellplate_2ml_deep_B4 + parent: nest_96_wellplate_2ml_deep + position: + x: 37.2 + y: 61.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_C4 + name: nest_96_wellplate_2ml_deep_C4 + parent: nest_96_wellplate_2ml_deep + position: + x: 37.2 + y: 52.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_D4 + name: nest_96_wellplate_2ml_deep_D4 + parent: nest_96_wellplate_2ml_deep + position: + x: 37.2 + y: 43.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_E4 + name: nest_96_wellplate_2ml_deep_E4 + parent: nest_96_wellplate_2ml_deep + position: + x: 37.2 + y: 34.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_F4 + name: nest_96_wellplate_2ml_deep_F4 + parent: nest_96_wellplate_2ml_deep + position: + x: 37.2 + y: 25.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_G4 + name: nest_96_wellplate_2ml_deep_G4 + parent: nest_96_wellplate_2ml_deep + position: + x: 37.2 + y: 16.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_H4 + name: nest_96_wellplate_2ml_deep_H4 + parent: nest_96_wellplate_2ml_deep + position: + x: 37.2 + y: 7.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_A5 + name: nest_96_wellplate_2ml_deep_A5 + parent: nest_96_wellplate_2ml_deep + position: + x: 46.2 + y: 70.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_B5 + name: nest_96_wellplate_2ml_deep_B5 + parent: nest_96_wellplate_2ml_deep + position: + x: 46.2 + y: 61.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_C5 + name: nest_96_wellplate_2ml_deep_C5 + parent: nest_96_wellplate_2ml_deep + position: + x: 46.2 + y: 52.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_D5 + name: nest_96_wellplate_2ml_deep_D5 + parent: nest_96_wellplate_2ml_deep + position: + x: 46.2 + y: 43.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_E5 + name: nest_96_wellplate_2ml_deep_E5 + parent: nest_96_wellplate_2ml_deep + position: + x: 46.2 + y: 34.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_F5 + name: nest_96_wellplate_2ml_deep_F5 + parent: nest_96_wellplate_2ml_deep + position: + x: 46.2 + y: 25.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_G5 + name: nest_96_wellplate_2ml_deep_G5 + parent: nest_96_wellplate_2ml_deep + position: + x: 46.2 + y: 16.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_H5 + name: nest_96_wellplate_2ml_deep_H5 + parent: nest_96_wellplate_2ml_deep + position: + x: 46.2 + y: 7.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_A6 + name: nest_96_wellplate_2ml_deep_A6 + parent: nest_96_wellplate_2ml_deep + position: + x: 55.2 + y: 70.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_B6 + name: nest_96_wellplate_2ml_deep_B6 + parent: nest_96_wellplate_2ml_deep + position: + x: 55.2 + y: 61.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_C6 + name: nest_96_wellplate_2ml_deep_C6 + parent: nest_96_wellplate_2ml_deep + position: + x: 55.2 + y: 52.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_D6 + name: nest_96_wellplate_2ml_deep_D6 + parent: nest_96_wellplate_2ml_deep + position: + x: 55.2 + y: 43.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_E6 + name: nest_96_wellplate_2ml_deep_E6 + parent: nest_96_wellplate_2ml_deep + position: + x: 55.2 + y: 34.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_F6 + name: nest_96_wellplate_2ml_deep_F6 + parent: nest_96_wellplate_2ml_deep + position: + x: 55.2 + y: 25.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_G6 + name: nest_96_wellplate_2ml_deep_G6 + parent: nest_96_wellplate_2ml_deep + position: + x: 55.2 + y: 16.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_H6 + name: nest_96_wellplate_2ml_deep_H6 + parent: nest_96_wellplate_2ml_deep + position: + x: 55.2 + y: 7.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_A7 + name: nest_96_wellplate_2ml_deep_A7 + parent: nest_96_wellplate_2ml_deep + position: + x: 64.2 + y: 70.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_B7 + name: nest_96_wellplate_2ml_deep_B7 + parent: nest_96_wellplate_2ml_deep + position: + x: 64.2 + y: 61.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_C7 + name: nest_96_wellplate_2ml_deep_C7 + parent: nest_96_wellplate_2ml_deep + position: + x: 64.2 + y: 52.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_D7 + name: nest_96_wellplate_2ml_deep_D7 + parent: nest_96_wellplate_2ml_deep + position: + x: 64.2 + y: 43.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_E7 + name: nest_96_wellplate_2ml_deep_E7 + parent: nest_96_wellplate_2ml_deep + position: + x: 64.2 + y: 34.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_F7 + name: nest_96_wellplate_2ml_deep_F7 + parent: nest_96_wellplate_2ml_deep + position: + x: 64.2 + y: 25.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_G7 + name: nest_96_wellplate_2ml_deep_G7 + parent: nest_96_wellplate_2ml_deep + position: + x: 64.2 + y: 16.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_H7 + name: nest_96_wellplate_2ml_deep_H7 + parent: nest_96_wellplate_2ml_deep + position: + x: 64.2 + y: 7.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_A8 + name: nest_96_wellplate_2ml_deep_A8 + parent: nest_96_wellplate_2ml_deep + position: + x: 73.2 + y: 70.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_B8 + name: nest_96_wellplate_2ml_deep_B8 + parent: nest_96_wellplate_2ml_deep + position: + x: 73.2 + y: 61.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_C8 + name: nest_96_wellplate_2ml_deep_C8 + parent: nest_96_wellplate_2ml_deep + position: + x: 73.2 + y: 52.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_D8 + name: nest_96_wellplate_2ml_deep_D8 + parent: nest_96_wellplate_2ml_deep + position: + x: 73.2 + y: 43.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_E8 + name: nest_96_wellplate_2ml_deep_E8 + parent: nest_96_wellplate_2ml_deep + position: + x: 73.2 + y: 34.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_F8 + name: nest_96_wellplate_2ml_deep_F8 + parent: nest_96_wellplate_2ml_deep + position: + x: 73.2 + y: 25.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_G8 + name: nest_96_wellplate_2ml_deep_G8 + parent: nest_96_wellplate_2ml_deep + position: + x: 73.2 + y: 16.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_H8 + name: nest_96_wellplate_2ml_deep_H8 + parent: nest_96_wellplate_2ml_deep + position: + x: 73.2 + y: 7.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_A9 + name: nest_96_wellplate_2ml_deep_A9 + parent: nest_96_wellplate_2ml_deep + position: + x: 82.2 + y: 70.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_B9 + name: nest_96_wellplate_2ml_deep_B9 + parent: nest_96_wellplate_2ml_deep + position: + x: 82.2 + y: 61.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_C9 + name: nest_96_wellplate_2ml_deep_C9 + parent: nest_96_wellplate_2ml_deep + position: + x: 82.2 + y: 52.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_D9 + name: nest_96_wellplate_2ml_deep_D9 + parent: nest_96_wellplate_2ml_deep + position: + x: 82.2 + y: 43.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_E9 + name: nest_96_wellplate_2ml_deep_E9 + parent: nest_96_wellplate_2ml_deep + position: + x: 82.2 + y: 34.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_F9 + name: nest_96_wellplate_2ml_deep_F9 + parent: nest_96_wellplate_2ml_deep + position: + x: 82.2 + y: 25.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_G9 + name: nest_96_wellplate_2ml_deep_G9 + parent: nest_96_wellplate_2ml_deep + position: + x: 82.2 + y: 16.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_H9 + name: nest_96_wellplate_2ml_deep_H9 + parent: nest_96_wellplate_2ml_deep + position: + x: 82.2 + y: 7.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_A10 + name: nest_96_wellplate_2ml_deep_A10 + parent: nest_96_wellplate_2ml_deep + position: + x: 91.2 + y: 70.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_B10 + name: nest_96_wellplate_2ml_deep_B10 + parent: nest_96_wellplate_2ml_deep + position: + x: 91.2 + y: 61.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_C10 + name: nest_96_wellplate_2ml_deep_C10 + parent: nest_96_wellplate_2ml_deep + position: + x: 91.2 + y: 52.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_D10 + name: nest_96_wellplate_2ml_deep_D10 + parent: nest_96_wellplate_2ml_deep + position: + x: 91.2 + y: 43.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_E10 + name: nest_96_wellplate_2ml_deep_E10 + parent: nest_96_wellplate_2ml_deep + position: + x: 91.2 + y: 34.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_F10 + name: nest_96_wellplate_2ml_deep_F10 + parent: nest_96_wellplate_2ml_deep + position: + x: 91.2 + y: 25.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_G10 + name: nest_96_wellplate_2ml_deep_G10 + parent: nest_96_wellplate_2ml_deep + position: + x: 91.2 + y: 16.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_H10 + name: nest_96_wellplate_2ml_deep_H10 + parent: nest_96_wellplate_2ml_deep + position: + x: 91.2 + y: 7.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_A11 + name: nest_96_wellplate_2ml_deep_A11 + parent: nest_96_wellplate_2ml_deep + position: + x: 100.2 + y: 70.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_B11 + name: nest_96_wellplate_2ml_deep_B11 + parent: nest_96_wellplate_2ml_deep + position: + x: 100.2 + y: 61.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_C11 + name: nest_96_wellplate_2ml_deep_C11 + parent: nest_96_wellplate_2ml_deep + position: + x: 100.2 + y: 52.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_D11 + name: nest_96_wellplate_2ml_deep_D11 + parent: nest_96_wellplate_2ml_deep + position: + x: 100.2 + y: 43.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_E11 + name: nest_96_wellplate_2ml_deep_E11 + parent: nest_96_wellplate_2ml_deep + position: + x: 100.2 + y: 34.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_F11 + name: nest_96_wellplate_2ml_deep_F11 + parent: nest_96_wellplate_2ml_deep + position: + x: 100.2 + y: 25.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_G11 + name: nest_96_wellplate_2ml_deep_G11 + parent: nest_96_wellplate_2ml_deep + position: + x: 100.2 + y: 16.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_H11 + name: nest_96_wellplate_2ml_deep_H11 + parent: nest_96_wellplate_2ml_deep + position: + x: 100.2 + y: 7.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_A12 + name: nest_96_wellplate_2ml_deep_A12 + parent: nest_96_wellplate_2ml_deep + position: + x: 109.2 + y: 70.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_B12 + name: nest_96_wellplate_2ml_deep_B12 + parent: nest_96_wellplate_2ml_deep + position: + x: 109.2 + y: 61.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_C12 + name: nest_96_wellplate_2ml_deep_C12 + parent: nest_96_wellplate_2ml_deep + position: + x: 109.2 + y: 52.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_D12 + name: nest_96_wellplate_2ml_deep_D12 + parent: nest_96_wellplate_2ml_deep + position: + x: 109.2 + y: 43.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_E12 + name: nest_96_wellplate_2ml_deep_E12 + parent: nest_96_wellplate_2ml_deep + position: + x: 109.2 + y: 34.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_F12 + name: nest_96_wellplate_2ml_deep_F12 + parent: nest_96_wellplate_2ml_deep + position: + x: 109.2 + y: 25.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_G12 + name: nest_96_wellplate_2ml_deep_G12 + parent: nest_96_wellplate_2ml_deep + position: + x: 109.2 + y: 16.05 + z: 3 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 38 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_96_wellplate_2ml_deep_H12 + name: nest_96_wellplate_2ml_deep_H12 + parent: nest_96_wellplate_2ml_deep + position: + x: 109.2 + y: 7.05 + z: 3 + sample_id: null + type: well + description: Nest 96 wellplate 2ml deep + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/plates.yaml + handles: [] + icon: '' + init_param_schema: {} + model: + mesh: tecan_nested_tip_rack/meshes/plate.stl + mesh_tf: + - 0.064 + - 0.043 + - 0 + - -1.5708 + - 0 + - 1.5708 + type: resource + registry_type: resource + version: 1.0.0 +thermoscientificnunc_96_wellplate_1300ul: + category: + - plates + class: + module: pylabrobot.resources.opentrons.plates:thermoscientificnunc_96_wellplate_1300ul + type: pylabrobot + config_info: + - children: + - thermoscientificnunc_96_wellplate_1300ul_A1 + - thermoscientificnunc_96_wellplate_1300ul_B1 + - thermoscientificnunc_96_wellplate_1300ul_C1 + - thermoscientificnunc_96_wellplate_1300ul_D1 + - thermoscientificnunc_96_wellplate_1300ul_E1 + - thermoscientificnunc_96_wellplate_1300ul_F1 + - thermoscientificnunc_96_wellplate_1300ul_G1 + - thermoscientificnunc_96_wellplate_1300ul_H1 + - thermoscientificnunc_96_wellplate_1300ul_A2 + - thermoscientificnunc_96_wellplate_1300ul_B2 + - thermoscientificnunc_96_wellplate_1300ul_C2 + - thermoscientificnunc_96_wellplate_1300ul_D2 + - thermoscientificnunc_96_wellplate_1300ul_E2 + - thermoscientificnunc_96_wellplate_1300ul_F2 + - thermoscientificnunc_96_wellplate_1300ul_G2 + - thermoscientificnunc_96_wellplate_1300ul_H2 + - thermoscientificnunc_96_wellplate_1300ul_A3 + - thermoscientificnunc_96_wellplate_1300ul_B3 + - thermoscientificnunc_96_wellplate_1300ul_C3 + - thermoscientificnunc_96_wellplate_1300ul_D3 + - thermoscientificnunc_96_wellplate_1300ul_E3 + - thermoscientificnunc_96_wellplate_1300ul_F3 + - thermoscientificnunc_96_wellplate_1300ul_G3 + - thermoscientificnunc_96_wellplate_1300ul_H3 + - thermoscientificnunc_96_wellplate_1300ul_A4 + - thermoscientificnunc_96_wellplate_1300ul_B4 + - thermoscientificnunc_96_wellplate_1300ul_C4 + - thermoscientificnunc_96_wellplate_1300ul_D4 + - thermoscientificnunc_96_wellplate_1300ul_E4 + - thermoscientificnunc_96_wellplate_1300ul_F4 + - thermoscientificnunc_96_wellplate_1300ul_G4 + - thermoscientificnunc_96_wellplate_1300ul_H4 + - thermoscientificnunc_96_wellplate_1300ul_A5 + - thermoscientificnunc_96_wellplate_1300ul_B5 + - thermoscientificnunc_96_wellplate_1300ul_C5 + - thermoscientificnunc_96_wellplate_1300ul_D5 + - thermoscientificnunc_96_wellplate_1300ul_E5 + - thermoscientificnunc_96_wellplate_1300ul_F5 + - thermoscientificnunc_96_wellplate_1300ul_G5 + - thermoscientificnunc_96_wellplate_1300ul_H5 + - thermoscientificnunc_96_wellplate_1300ul_A6 + - thermoscientificnunc_96_wellplate_1300ul_B6 + - thermoscientificnunc_96_wellplate_1300ul_C6 + - thermoscientificnunc_96_wellplate_1300ul_D6 + - thermoscientificnunc_96_wellplate_1300ul_E6 + - thermoscientificnunc_96_wellplate_1300ul_F6 + - thermoscientificnunc_96_wellplate_1300ul_G6 + - thermoscientificnunc_96_wellplate_1300ul_H6 + - thermoscientificnunc_96_wellplate_1300ul_A7 + - thermoscientificnunc_96_wellplate_1300ul_B7 + - thermoscientificnunc_96_wellplate_1300ul_C7 + - thermoscientificnunc_96_wellplate_1300ul_D7 + - thermoscientificnunc_96_wellplate_1300ul_E7 + - thermoscientificnunc_96_wellplate_1300ul_F7 + - thermoscientificnunc_96_wellplate_1300ul_G7 + - thermoscientificnunc_96_wellplate_1300ul_H7 + - thermoscientificnunc_96_wellplate_1300ul_A8 + - thermoscientificnunc_96_wellplate_1300ul_B8 + - thermoscientificnunc_96_wellplate_1300ul_C8 + - thermoscientificnunc_96_wellplate_1300ul_D8 + - thermoscientificnunc_96_wellplate_1300ul_E8 + - thermoscientificnunc_96_wellplate_1300ul_F8 + - thermoscientificnunc_96_wellplate_1300ul_G8 + - thermoscientificnunc_96_wellplate_1300ul_H8 + - thermoscientificnunc_96_wellplate_1300ul_A9 + - thermoscientificnunc_96_wellplate_1300ul_B9 + - thermoscientificnunc_96_wellplate_1300ul_C9 + - thermoscientificnunc_96_wellplate_1300ul_D9 + - thermoscientificnunc_96_wellplate_1300ul_E9 + - thermoscientificnunc_96_wellplate_1300ul_F9 + - thermoscientificnunc_96_wellplate_1300ul_G9 + - thermoscientificnunc_96_wellplate_1300ul_H9 + - thermoscientificnunc_96_wellplate_1300ul_A10 + - thermoscientificnunc_96_wellplate_1300ul_B10 + - thermoscientificnunc_96_wellplate_1300ul_C10 + - thermoscientificnunc_96_wellplate_1300ul_D10 + - thermoscientificnunc_96_wellplate_1300ul_E10 + - thermoscientificnunc_96_wellplate_1300ul_F10 + - thermoscientificnunc_96_wellplate_1300ul_G10 + - thermoscientificnunc_96_wellplate_1300ul_H10 + - thermoscientificnunc_96_wellplate_1300ul_A11 + - thermoscientificnunc_96_wellplate_1300ul_B11 + - thermoscientificnunc_96_wellplate_1300ul_C11 + - thermoscientificnunc_96_wellplate_1300ul_D11 + - thermoscientificnunc_96_wellplate_1300ul_E11 + - thermoscientificnunc_96_wellplate_1300ul_F11 + - thermoscientificnunc_96_wellplate_1300ul_G11 + - thermoscientificnunc_96_wellplate_1300ul_H11 + - thermoscientificnunc_96_wellplate_1300ul_A12 + - thermoscientificnunc_96_wellplate_1300ul_B12 + - thermoscientificnunc_96_wellplate_1300ul_C12 + - thermoscientificnunc_96_wellplate_1300ul_D12 + - thermoscientificnunc_96_wellplate_1300ul_E12 + - thermoscientificnunc_96_wellplate_1300ul_F12 + - thermoscientificnunc_96_wellplate_1300ul_G12 + - thermoscientificnunc_96_wellplate_1300ul_H12 + class: '' + config: + barcode: null + category: plate + model: Thermo Scientific Nunc 96 Well Plate 1300 µL + ordering: + A1: thermoscientificnunc_96_wellplate_1300ul_A1 + B1: thermoscientificnunc_96_wellplate_1300ul_B1 + C1: thermoscientificnunc_96_wellplate_1300ul_C1 + D1: thermoscientificnunc_96_wellplate_1300ul_D1 + E1: thermoscientificnunc_96_wellplate_1300ul_E1 + F1: thermoscientificnunc_96_wellplate_1300ul_F1 + G1: thermoscientificnunc_96_wellplate_1300ul_G1 + H1: thermoscientificnunc_96_wellplate_1300ul_H1 + A2: thermoscientificnunc_96_wellplate_1300ul_A2 + B2: thermoscientificnunc_96_wellplate_1300ul_B2 + C2: thermoscientificnunc_96_wellplate_1300ul_C2 + D2: thermoscientificnunc_96_wellplate_1300ul_D2 + E2: thermoscientificnunc_96_wellplate_1300ul_E2 + F2: thermoscientificnunc_96_wellplate_1300ul_F2 + G2: thermoscientificnunc_96_wellplate_1300ul_G2 + H2: thermoscientificnunc_96_wellplate_1300ul_H2 + A3: thermoscientificnunc_96_wellplate_1300ul_A3 + B3: thermoscientificnunc_96_wellplate_1300ul_B3 + C3: thermoscientificnunc_96_wellplate_1300ul_C3 + D3: thermoscientificnunc_96_wellplate_1300ul_D3 + E3: thermoscientificnunc_96_wellplate_1300ul_E3 + F3: thermoscientificnunc_96_wellplate_1300ul_F3 + G3: thermoscientificnunc_96_wellplate_1300ul_G3 + H3: thermoscientificnunc_96_wellplate_1300ul_H3 + A4: thermoscientificnunc_96_wellplate_1300ul_A4 + B4: thermoscientificnunc_96_wellplate_1300ul_B4 + C4: thermoscientificnunc_96_wellplate_1300ul_C4 + D4: thermoscientificnunc_96_wellplate_1300ul_D4 + E4: thermoscientificnunc_96_wellplate_1300ul_E4 + F4: thermoscientificnunc_96_wellplate_1300ul_F4 + G4: thermoscientificnunc_96_wellplate_1300ul_G4 + H4: thermoscientificnunc_96_wellplate_1300ul_H4 + A5: thermoscientificnunc_96_wellplate_1300ul_A5 + B5: thermoscientificnunc_96_wellplate_1300ul_B5 + C5: thermoscientificnunc_96_wellplate_1300ul_C5 + D5: thermoscientificnunc_96_wellplate_1300ul_D5 + E5: thermoscientificnunc_96_wellplate_1300ul_E5 + F5: thermoscientificnunc_96_wellplate_1300ul_F5 + G5: thermoscientificnunc_96_wellplate_1300ul_G5 + H5: thermoscientificnunc_96_wellplate_1300ul_H5 + A6: thermoscientificnunc_96_wellplate_1300ul_A6 + B6: thermoscientificnunc_96_wellplate_1300ul_B6 + C6: thermoscientificnunc_96_wellplate_1300ul_C6 + D6: thermoscientificnunc_96_wellplate_1300ul_D6 + E6: thermoscientificnunc_96_wellplate_1300ul_E6 + F6: thermoscientificnunc_96_wellplate_1300ul_F6 + G6: thermoscientificnunc_96_wellplate_1300ul_G6 + H6: thermoscientificnunc_96_wellplate_1300ul_H6 + A7: thermoscientificnunc_96_wellplate_1300ul_A7 + B7: thermoscientificnunc_96_wellplate_1300ul_B7 + C7: thermoscientificnunc_96_wellplate_1300ul_C7 + D7: thermoscientificnunc_96_wellplate_1300ul_D7 + E7: thermoscientificnunc_96_wellplate_1300ul_E7 + F7: thermoscientificnunc_96_wellplate_1300ul_F7 + G7: thermoscientificnunc_96_wellplate_1300ul_G7 + H7: thermoscientificnunc_96_wellplate_1300ul_H7 + A8: thermoscientificnunc_96_wellplate_1300ul_A8 + B8: thermoscientificnunc_96_wellplate_1300ul_B8 + C8: thermoscientificnunc_96_wellplate_1300ul_C8 + D8: thermoscientificnunc_96_wellplate_1300ul_D8 + E8: thermoscientificnunc_96_wellplate_1300ul_E8 + F8: thermoscientificnunc_96_wellplate_1300ul_F8 + G8: thermoscientificnunc_96_wellplate_1300ul_G8 + H8: thermoscientificnunc_96_wellplate_1300ul_H8 + A9: thermoscientificnunc_96_wellplate_1300ul_A9 + B9: thermoscientificnunc_96_wellplate_1300ul_B9 + C9: thermoscientificnunc_96_wellplate_1300ul_C9 + D9: thermoscientificnunc_96_wellplate_1300ul_D9 + E9: thermoscientificnunc_96_wellplate_1300ul_E9 + F9: thermoscientificnunc_96_wellplate_1300ul_F9 + G9: thermoscientificnunc_96_wellplate_1300ul_G9 + H9: thermoscientificnunc_96_wellplate_1300ul_H9 + A10: thermoscientificnunc_96_wellplate_1300ul_A10 + B10: thermoscientificnunc_96_wellplate_1300ul_B10 + C10: thermoscientificnunc_96_wellplate_1300ul_C10 + D10: thermoscientificnunc_96_wellplate_1300ul_D10 + E10: thermoscientificnunc_96_wellplate_1300ul_E10 + F10: thermoscientificnunc_96_wellplate_1300ul_F10 + G10: thermoscientificnunc_96_wellplate_1300ul_G10 + H10: thermoscientificnunc_96_wellplate_1300ul_H10 + A11: thermoscientificnunc_96_wellplate_1300ul_A11 + B11: thermoscientificnunc_96_wellplate_1300ul_B11 + C11: thermoscientificnunc_96_wellplate_1300ul_C11 + D11: thermoscientificnunc_96_wellplate_1300ul_D11 + E11: thermoscientificnunc_96_wellplate_1300ul_E11 + F11: thermoscientificnunc_96_wellplate_1300ul_F11 + G11: thermoscientificnunc_96_wellplate_1300ul_G11 + H11: thermoscientificnunc_96_wellplate_1300ul_H11 + A12: thermoscientificnunc_96_wellplate_1300ul_A12 + B12: thermoscientificnunc_96_wellplate_1300ul_B12 + C12: thermoscientificnunc_96_wellplate_1300ul_C12 + D12: thermoscientificnunc_96_wellplate_1300ul_D12 + E12: thermoscientificnunc_96_wellplate_1300ul_E12 + F12: thermoscientificnunc_96_wellplate_1300ul_F12 + G12: thermoscientificnunc_96_wellplate_1300ul_G12 + H12: thermoscientificnunc_96_wellplate_1300ul_H12 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.76 + size_y: 85.47 + size_z: 31.6 + type: Plate + data: {} + id: thermoscientificnunc_96_wellplate_1300ul + name: thermoscientificnunc_96_wellplate_1300ul + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: plate + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_A1 + name: thermoscientificnunc_96_wellplate_1300ul_A1 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 11.43 + y: 71.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_B1 + name: thermoscientificnunc_96_wellplate_1300ul_B1 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 11.43 + y: 62.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_C1 + name: thermoscientificnunc_96_wellplate_1300ul_C1 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 11.43 + y: 53.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_D1 + name: thermoscientificnunc_96_wellplate_1300ul_D1 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 11.43 + y: 44.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_E1 + name: thermoscientificnunc_96_wellplate_1300ul_E1 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 11.43 + y: 35.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_F1 + name: thermoscientificnunc_96_wellplate_1300ul_F1 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 11.43 + y: 26.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_G1 + name: thermoscientificnunc_96_wellplate_1300ul_G1 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 11.43 + y: 17.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_H1 + name: thermoscientificnunc_96_wellplate_1300ul_H1 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 11.43 + y: 8.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_A2 + name: thermoscientificnunc_96_wellplate_1300ul_A2 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 20.43 + y: 71.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_B2 + name: thermoscientificnunc_96_wellplate_1300ul_B2 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 20.43 + y: 62.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_C2 + name: thermoscientificnunc_96_wellplate_1300ul_C2 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 20.43 + y: 53.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_D2 + name: thermoscientificnunc_96_wellplate_1300ul_D2 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 20.43 + y: 44.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_E2 + name: thermoscientificnunc_96_wellplate_1300ul_E2 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 20.43 + y: 35.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_F2 + name: thermoscientificnunc_96_wellplate_1300ul_F2 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 20.43 + y: 26.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_G2 + name: thermoscientificnunc_96_wellplate_1300ul_G2 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 20.43 + y: 17.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_H2 + name: thermoscientificnunc_96_wellplate_1300ul_H2 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 20.43 + y: 8.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_A3 + name: thermoscientificnunc_96_wellplate_1300ul_A3 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 29.43 + y: 71.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_B3 + name: thermoscientificnunc_96_wellplate_1300ul_B3 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 29.43 + y: 62.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_C3 + name: thermoscientificnunc_96_wellplate_1300ul_C3 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 29.43 + y: 53.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_D3 + name: thermoscientificnunc_96_wellplate_1300ul_D3 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 29.43 + y: 44.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_E3 + name: thermoscientificnunc_96_wellplate_1300ul_E3 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 29.43 + y: 35.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_F3 + name: thermoscientificnunc_96_wellplate_1300ul_F3 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 29.43 + y: 26.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_G3 + name: thermoscientificnunc_96_wellplate_1300ul_G3 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 29.43 + y: 17.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_H3 + name: thermoscientificnunc_96_wellplate_1300ul_H3 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 29.43 + y: 8.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_A4 + name: thermoscientificnunc_96_wellplate_1300ul_A4 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 38.43 + y: 71.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_B4 + name: thermoscientificnunc_96_wellplate_1300ul_B4 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 38.43 + y: 62.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_C4 + name: thermoscientificnunc_96_wellplate_1300ul_C4 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 38.43 + y: 53.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_D4 + name: thermoscientificnunc_96_wellplate_1300ul_D4 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 38.43 + y: 44.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_E4 + name: thermoscientificnunc_96_wellplate_1300ul_E4 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 38.43 + y: 35.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_F4 + name: thermoscientificnunc_96_wellplate_1300ul_F4 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 38.43 + y: 26.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_G4 + name: thermoscientificnunc_96_wellplate_1300ul_G4 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 38.43 + y: 17.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_H4 + name: thermoscientificnunc_96_wellplate_1300ul_H4 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 38.43 + y: 8.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_A5 + name: thermoscientificnunc_96_wellplate_1300ul_A5 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 47.43 + y: 71.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_B5 + name: thermoscientificnunc_96_wellplate_1300ul_B5 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 47.43 + y: 62.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_C5 + name: thermoscientificnunc_96_wellplate_1300ul_C5 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 47.43 + y: 53.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_D5 + name: thermoscientificnunc_96_wellplate_1300ul_D5 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 47.43 + y: 44.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_E5 + name: thermoscientificnunc_96_wellplate_1300ul_E5 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 47.43 + y: 35.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_F5 + name: thermoscientificnunc_96_wellplate_1300ul_F5 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 47.43 + y: 26.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_G5 + name: thermoscientificnunc_96_wellplate_1300ul_G5 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 47.43 + y: 17.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_H5 + name: thermoscientificnunc_96_wellplate_1300ul_H5 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 47.43 + y: 8.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_A6 + name: thermoscientificnunc_96_wellplate_1300ul_A6 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 56.43 + y: 71.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_B6 + name: thermoscientificnunc_96_wellplate_1300ul_B6 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 56.43 + y: 62.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_C6 + name: thermoscientificnunc_96_wellplate_1300ul_C6 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 56.43 + y: 53.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_D6 + name: thermoscientificnunc_96_wellplate_1300ul_D6 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 56.43 + y: 44.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_E6 + name: thermoscientificnunc_96_wellplate_1300ul_E6 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 56.43 + y: 35.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_F6 + name: thermoscientificnunc_96_wellplate_1300ul_F6 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 56.43 + y: 26.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_G6 + name: thermoscientificnunc_96_wellplate_1300ul_G6 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 56.43 + y: 17.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_H6 + name: thermoscientificnunc_96_wellplate_1300ul_H6 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 56.43 + y: 8.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_A7 + name: thermoscientificnunc_96_wellplate_1300ul_A7 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 65.43 + y: 71.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_B7 + name: thermoscientificnunc_96_wellplate_1300ul_B7 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 65.43 + y: 62.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_C7 + name: thermoscientificnunc_96_wellplate_1300ul_C7 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 65.43 + y: 53.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_D7 + name: thermoscientificnunc_96_wellplate_1300ul_D7 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 65.43 + y: 44.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_E7 + name: thermoscientificnunc_96_wellplate_1300ul_E7 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 65.43 + y: 35.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_F7 + name: thermoscientificnunc_96_wellplate_1300ul_F7 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 65.43 + y: 26.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_G7 + name: thermoscientificnunc_96_wellplate_1300ul_G7 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 65.43 + y: 17.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_H7 + name: thermoscientificnunc_96_wellplate_1300ul_H7 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 65.43 + y: 8.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_A8 + name: thermoscientificnunc_96_wellplate_1300ul_A8 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 74.43 + y: 71.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_B8 + name: thermoscientificnunc_96_wellplate_1300ul_B8 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 74.43 + y: 62.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_C8 + name: thermoscientificnunc_96_wellplate_1300ul_C8 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 74.43 + y: 53.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_D8 + name: thermoscientificnunc_96_wellplate_1300ul_D8 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 74.43 + y: 44.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_E8 + name: thermoscientificnunc_96_wellplate_1300ul_E8 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 74.43 + y: 35.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_F8 + name: thermoscientificnunc_96_wellplate_1300ul_F8 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 74.43 + y: 26.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_G8 + name: thermoscientificnunc_96_wellplate_1300ul_G8 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 74.43 + y: 17.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_H8 + name: thermoscientificnunc_96_wellplate_1300ul_H8 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 74.43 + y: 8.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_A9 + name: thermoscientificnunc_96_wellplate_1300ul_A9 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 83.43 + y: 71.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_B9 + name: thermoscientificnunc_96_wellplate_1300ul_B9 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 83.43 + y: 62.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_C9 + name: thermoscientificnunc_96_wellplate_1300ul_C9 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 83.43 + y: 53.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_D9 + name: thermoscientificnunc_96_wellplate_1300ul_D9 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 83.43 + y: 44.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_E9 + name: thermoscientificnunc_96_wellplate_1300ul_E9 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 83.43 + y: 35.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_F9 + name: thermoscientificnunc_96_wellplate_1300ul_F9 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 83.43 + y: 26.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_G9 + name: thermoscientificnunc_96_wellplate_1300ul_G9 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 83.43 + y: 17.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_H9 + name: thermoscientificnunc_96_wellplate_1300ul_H9 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 83.43 + y: 8.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_A10 + name: thermoscientificnunc_96_wellplate_1300ul_A10 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 92.43 + y: 71.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_B10 + name: thermoscientificnunc_96_wellplate_1300ul_B10 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 92.43 + y: 62.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_C10 + name: thermoscientificnunc_96_wellplate_1300ul_C10 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 92.43 + y: 53.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_D10 + name: thermoscientificnunc_96_wellplate_1300ul_D10 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 92.43 + y: 44.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_E10 + name: thermoscientificnunc_96_wellplate_1300ul_E10 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 92.43 + y: 35.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_F10 + name: thermoscientificnunc_96_wellplate_1300ul_F10 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 92.43 + y: 26.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_G10 + name: thermoscientificnunc_96_wellplate_1300ul_G10 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 92.43 + y: 17.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_H10 + name: thermoscientificnunc_96_wellplate_1300ul_H10 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 92.43 + y: 8.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_A11 + name: thermoscientificnunc_96_wellplate_1300ul_A11 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 101.43 + y: 71.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_B11 + name: thermoscientificnunc_96_wellplate_1300ul_B11 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 101.43 + y: 62.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_C11 + name: thermoscientificnunc_96_wellplate_1300ul_C11 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 101.43 + y: 53.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_D11 + name: thermoscientificnunc_96_wellplate_1300ul_D11 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 101.43 + y: 44.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_E11 + name: thermoscientificnunc_96_wellplate_1300ul_E11 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 101.43 + y: 35.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_F11 + name: thermoscientificnunc_96_wellplate_1300ul_F11 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 101.43 + y: 26.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_G11 + name: thermoscientificnunc_96_wellplate_1300ul_G11 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 101.43 + y: 17.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_H11 + name: thermoscientificnunc_96_wellplate_1300ul_H11 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 101.43 + y: 8.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_A12 + name: thermoscientificnunc_96_wellplate_1300ul_A12 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 110.43 + y: 71.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_B12 + name: thermoscientificnunc_96_wellplate_1300ul_B12 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 110.43 + y: 62.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_C12 + name: thermoscientificnunc_96_wellplate_1300ul_C12 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 110.43 + y: 53.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_D12 + name: thermoscientificnunc_96_wellplate_1300ul_D12 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 110.43 + y: 44.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_E12 + name: thermoscientificnunc_96_wellplate_1300ul_E12 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 110.43 + y: 35.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_F12 + name: thermoscientificnunc_96_wellplate_1300ul_F12 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 110.43 + y: 26.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_G12 + name: thermoscientificnunc_96_wellplate_1300ul_G12 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 110.43 + y: 17.3 + z: 2.5 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 1300 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.94 + size_y: 5.94 + size_z: 29.1 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_1300ul_H12 + name: thermoscientificnunc_96_wellplate_1300ul_H12 + parent: thermoscientificnunc_96_wellplate_1300ul + position: + x: 110.43 + y: 8.3 + z: 2.5 + sample_id: null + type: well + description: Thermoscientific Nunc 96 wellplate 1300ul + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/plates.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +thermoscientificnunc_96_wellplate_2000ul: + category: + - plates + class: + module: pylabrobot.resources.opentrons.plates:thermoscientificnunc_96_wellplate_2000ul + type: pylabrobot + config_info: + - children: + - thermoscientificnunc_96_wellplate_2000ul_A1 + - thermoscientificnunc_96_wellplate_2000ul_B1 + - thermoscientificnunc_96_wellplate_2000ul_C1 + - thermoscientificnunc_96_wellplate_2000ul_D1 + - thermoscientificnunc_96_wellplate_2000ul_E1 + - thermoscientificnunc_96_wellplate_2000ul_F1 + - thermoscientificnunc_96_wellplate_2000ul_G1 + - thermoscientificnunc_96_wellplate_2000ul_H1 + - thermoscientificnunc_96_wellplate_2000ul_A2 + - thermoscientificnunc_96_wellplate_2000ul_B2 + - thermoscientificnunc_96_wellplate_2000ul_C2 + - thermoscientificnunc_96_wellplate_2000ul_D2 + - thermoscientificnunc_96_wellplate_2000ul_E2 + - thermoscientificnunc_96_wellplate_2000ul_F2 + - thermoscientificnunc_96_wellplate_2000ul_G2 + - thermoscientificnunc_96_wellplate_2000ul_H2 + - thermoscientificnunc_96_wellplate_2000ul_A3 + - thermoscientificnunc_96_wellplate_2000ul_B3 + - thermoscientificnunc_96_wellplate_2000ul_C3 + - thermoscientificnunc_96_wellplate_2000ul_D3 + - thermoscientificnunc_96_wellplate_2000ul_E3 + - thermoscientificnunc_96_wellplate_2000ul_F3 + - thermoscientificnunc_96_wellplate_2000ul_G3 + - thermoscientificnunc_96_wellplate_2000ul_H3 + - thermoscientificnunc_96_wellplate_2000ul_A4 + - thermoscientificnunc_96_wellplate_2000ul_B4 + - thermoscientificnunc_96_wellplate_2000ul_C4 + - thermoscientificnunc_96_wellplate_2000ul_D4 + - thermoscientificnunc_96_wellplate_2000ul_E4 + - thermoscientificnunc_96_wellplate_2000ul_F4 + - thermoscientificnunc_96_wellplate_2000ul_G4 + - thermoscientificnunc_96_wellplate_2000ul_H4 + - thermoscientificnunc_96_wellplate_2000ul_A5 + - thermoscientificnunc_96_wellplate_2000ul_B5 + - thermoscientificnunc_96_wellplate_2000ul_C5 + - thermoscientificnunc_96_wellplate_2000ul_D5 + - thermoscientificnunc_96_wellplate_2000ul_E5 + - thermoscientificnunc_96_wellplate_2000ul_F5 + - thermoscientificnunc_96_wellplate_2000ul_G5 + - thermoscientificnunc_96_wellplate_2000ul_H5 + - thermoscientificnunc_96_wellplate_2000ul_A6 + - thermoscientificnunc_96_wellplate_2000ul_B6 + - thermoscientificnunc_96_wellplate_2000ul_C6 + - thermoscientificnunc_96_wellplate_2000ul_D6 + - thermoscientificnunc_96_wellplate_2000ul_E6 + - thermoscientificnunc_96_wellplate_2000ul_F6 + - thermoscientificnunc_96_wellplate_2000ul_G6 + - thermoscientificnunc_96_wellplate_2000ul_H6 + - thermoscientificnunc_96_wellplate_2000ul_A7 + - thermoscientificnunc_96_wellplate_2000ul_B7 + - thermoscientificnunc_96_wellplate_2000ul_C7 + - thermoscientificnunc_96_wellplate_2000ul_D7 + - thermoscientificnunc_96_wellplate_2000ul_E7 + - thermoscientificnunc_96_wellplate_2000ul_F7 + - thermoscientificnunc_96_wellplate_2000ul_G7 + - thermoscientificnunc_96_wellplate_2000ul_H7 + - thermoscientificnunc_96_wellplate_2000ul_A8 + - thermoscientificnunc_96_wellplate_2000ul_B8 + - thermoscientificnunc_96_wellplate_2000ul_C8 + - thermoscientificnunc_96_wellplate_2000ul_D8 + - thermoscientificnunc_96_wellplate_2000ul_E8 + - thermoscientificnunc_96_wellplate_2000ul_F8 + - thermoscientificnunc_96_wellplate_2000ul_G8 + - thermoscientificnunc_96_wellplate_2000ul_H8 + - thermoscientificnunc_96_wellplate_2000ul_A9 + - thermoscientificnunc_96_wellplate_2000ul_B9 + - thermoscientificnunc_96_wellplate_2000ul_C9 + - thermoscientificnunc_96_wellplate_2000ul_D9 + - thermoscientificnunc_96_wellplate_2000ul_E9 + - thermoscientificnunc_96_wellplate_2000ul_F9 + - thermoscientificnunc_96_wellplate_2000ul_G9 + - thermoscientificnunc_96_wellplate_2000ul_H9 + - thermoscientificnunc_96_wellplate_2000ul_A10 + - thermoscientificnunc_96_wellplate_2000ul_B10 + - thermoscientificnunc_96_wellplate_2000ul_C10 + - thermoscientificnunc_96_wellplate_2000ul_D10 + - thermoscientificnunc_96_wellplate_2000ul_E10 + - thermoscientificnunc_96_wellplate_2000ul_F10 + - thermoscientificnunc_96_wellplate_2000ul_G10 + - thermoscientificnunc_96_wellplate_2000ul_H10 + - thermoscientificnunc_96_wellplate_2000ul_A11 + - thermoscientificnunc_96_wellplate_2000ul_B11 + - thermoscientificnunc_96_wellplate_2000ul_C11 + - thermoscientificnunc_96_wellplate_2000ul_D11 + - thermoscientificnunc_96_wellplate_2000ul_E11 + - thermoscientificnunc_96_wellplate_2000ul_F11 + - thermoscientificnunc_96_wellplate_2000ul_G11 + - thermoscientificnunc_96_wellplate_2000ul_H11 + - thermoscientificnunc_96_wellplate_2000ul_A12 + - thermoscientificnunc_96_wellplate_2000ul_B12 + - thermoscientificnunc_96_wellplate_2000ul_C12 + - thermoscientificnunc_96_wellplate_2000ul_D12 + - thermoscientificnunc_96_wellplate_2000ul_E12 + - thermoscientificnunc_96_wellplate_2000ul_F12 + - thermoscientificnunc_96_wellplate_2000ul_G12 + - thermoscientificnunc_96_wellplate_2000ul_H12 + class: '' + config: + barcode: null + category: plate + model: Thermo Scientific Nunc 96 Well Plate 2000 µL + ordering: + A1: thermoscientificnunc_96_wellplate_2000ul_A1 + B1: thermoscientificnunc_96_wellplate_2000ul_B1 + C1: thermoscientificnunc_96_wellplate_2000ul_C1 + D1: thermoscientificnunc_96_wellplate_2000ul_D1 + E1: thermoscientificnunc_96_wellplate_2000ul_E1 + F1: thermoscientificnunc_96_wellplate_2000ul_F1 + G1: thermoscientificnunc_96_wellplate_2000ul_G1 + H1: thermoscientificnunc_96_wellplate_2000ul_H1 + A2: thermoscientificnunc_96_wellplate_2000ul_A2 + B2: thermoscientificnunc_96_wellplate_2000ul_B2 + C2: thermoscientificnunc_96_wellplate_2000ul_C2 + D2: thermoscientificnunc_96_wellplate_2000ul_D2 + E2: thermoscientificnunc_96_wellplate_2000ul_E2 + F2: thermoscientificnunc_96_wellplate_2000ul_F2 + G2: thermoscientificnunc_96_wellplate_2000ul_G2 + H2: thermoscientificnunc_96_wellplate_2000ul_H2 + A3: thermoscientificnunc_96_wellplate_2000ul_A3 + B3: thermoscientificnunc_96_wellplate_2000ul_B3 + C3: thermoscientificnunc_96_wellplate_2000ul_C3 + D3: thermoscientificnunc_96_wellplate_2000ul_D3 + E3: thermoscientificnunc_96_wellplate_2000ul_E3 + F3: thermoscientificnunc_96_wellplate_2000ul_F3 + G3: thermoscientificnunc_96_wellplate_2000ul_G3 + H3: thermoscientificnunc_96_wellplate_2000ul_H3 + A4: thermoscientificnunc_96_wellplate_2000ul_A4 + B4: thermoscientificnunc_96_wellplate_2000ul_B4 + C4: thermoscientificnunc_96_wellplate_2000ul_C4 + D4: thermoscientificnunc_96_wellplate_2000ul_D4 + E4: thermoscientificnunc_96_wellplate_2000ul_E4 + F4: thermoscientificnunc_96_wellplate_2000ul_F4 + G4: thermoscientificnunc_96_wellplate_2000ul_G4 + H4: thermoscientificnunc_96_wellplate_2000ul_H4 + A5: thermoscientificnunc_96_wellplate_2000ul_A5 + B5: thermoscientificnunc_96_wellplate_2000ul_B5 + C5: thermoscientificnunc_96_wellplate_2000ul_C5 + D5: thermoscientificnunc_96_wellplate_2000ul_D5 + E5: thermoscientificnunc_96_wellplate_2000ul_E5 + F5: thermoscientificnunc_96_wellplate_2000ul_F5 + G5: thermoscientificnunc_96_wellplate_2000ul_G5 + H5: thermoscientificnunc_96_wellplate_2000ul_H5 + A6: thermoscientificnunc_96_wellplate_2000ul_A6 + B6: thermoscientificnunc_96_wellplate_2000ul_B6 + C6: thermoscientificnunc_96_wellplate_2000ul_C6 + D6: thermoscientificnunc_96_wellplate_2000ul_D6 + E6: thermoscientificnunc_96_wellplate_2000ul_E6 + F6: thermoscientificnunc_96_wellplate_2000ul_F6 + G6: thermoscientificnunc_96_wellplate_2000ul_G6 + H6: thermoscientificnunc_96_wellplate_2000ul_H6 + A7: thermoscientificnunc_96_wellplate_2000ul_A7 + B7: thermoscientificnunc_96_wellplate_2000ul_B7 + C7: thermoscientificnunc_96_wellplate_2000ul_C7 + D7: thermoscientificnunc_96_wellplate_2000ul_D7 + E7: thermoscientificnunc_96_wellplate_2000ul_E7 + F7: thermoscientificnunc_96_wellplate_2000ul_F7 + G7: thermoscientificnunc_96_wellplate_2000ul_G7 + H7: thermoscientificnunc_96_wellplate_2000ul_H7 + A8: thermoscientificnunc_96_wellplate_2000ul_A8 + B8: thermoscientificnunc_96_wellplate_2000ul_B8 + C8: thermoscientificnunc_96_wellplate_2000ul_C8 + D8: thermoscientificnunc_96_wellplate_2000ul_D8 + E8: thermoscientificnunc_96_wellplate_2000ul_E8 + F8: thermoscientificnunc_96_wellplate_2000ul_F8 + G8: thermoscientificnunc_96_wellplate_2000ul_G8 + H8: thermoscientificnunc_96_wellplate_2000ul_H8 + A9: thermoscientificnunc_96_wellplate_2000ul_A9 + B9: thermoscientificnunc_96_wellplate_2000ul_B9 + C9: thermoscientificnunc_96_wellplate_2000ul_C9 + D9: thermoscientificnunc_96_wellplate_2000ul_D9 + E9: thermoscientificnunc_96_wellplate_2000ul_E9 + F9: thermoscientificnunc_96_wellplate_2000ul_F9 + G9: thermoscientificnunc_96_wellplate_2000ul_G9 + H9: thermoscientificnunc_96_wellplate_2000ul_H9 + A10: thermoscientificnunc_96_wellplate_2000ul_A10 + B10: thermoscientificnunc_96_wellplate_2000ul_B10 + C10: thermoscientificnunc_96_wellplate_2000ul_C10 + D10: thermoscientificnunc_96_wellplate_2000ul_D10 + E10: thermoscientificnunc_96_wellplate_2000ul_E10 + F10: thermoscientificnunc_96_wellplate_2000ul_F10 + G10: thermoscientificnunc_96_wellplate_2000ul_G10 + H10: thermoscientificnunc_96_wellplate_2000ul_H10 + A11: thermoscientificnunc_96_wellplate_2000ul_A11 + B11: thermoscientificnunc_96_wellplate_2000ul_B11 + C11: thermoscientificnunc_96_wellplate_2000ul_C11 + D11: thermoscientificnunc_96_wellplate_2000ul_D11 + E11: thermoscientificnunc_96_wellplate_2000ul_E11 + F11: thermoscientificnunc_96_wellplate_2000ul_F11 + G11: thermoscientificnunc_96_wellplate_2000ul_G11 + H11: thermoscientificnunc_96_wellplate_2000ul_H11 + A12: thermoscientificnunc_96_wellplate_2000ul_A12 + B12: thermoscientificnunc_96_wellplate_2000ul_B12 + C12: thermoscientificnunc_96_wellplate_2000ul_C12 + D12: thermoscientificnunc_96_wellplate_2000ul_D12 + E12: thermoscientificnunc_96_wellplate_2000ul_E12 + F12: thermoscientificnunc_96_wellplate_2000ul_F12 + G12: thermoscientificnunc_96_wellplate_2000ul_G12 + H12: thermoscientificnunc_96_wellplate_2000ul_H12 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.8 + size_y: 85.5 + size_z: 43.6 + type: Plate + data: {} + id: thermoscientificnunc_96_wellplate_2000ul + name: thermoscientificnunc_96_wellplate_2000ul + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: plate + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_A1 + name: thermoscientificnunc_96_wellplate_2000ul_A1 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 11.295 + y: 71.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_B1 + name: thermoscientificnunc_96_wellplate_2000ul_B1 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 11.295 + y: 62.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_C1 + name: thermoscientificnunc_96_wellplate_2000ul_C1 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 11.295 + y: 53.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_D1 + name: thermoscientificnunc_96_wellplate_2000ul_D1 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 11.295 + y: 44.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_E1 + name: thermoscientificnunc_96_wellplate_2000ul_E1 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 11.295 + y: 35.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_F1 + name: thermoscientificnunc_96_wellplate_2000ul_F1 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 11.295 + y: 26.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_G1 + name: thermoscientificnunc_96_wellplate_2000ul_G1 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 11.295 + y: 17.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_H1 + name: thermoscientificnunc_96_wellplate_2000ul_H1 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 11.295 + y: 8.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_A2 + name: thermoscientificnunc_96_wellplate_2000ul_A2 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 20.295 + y: 71.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_B2 + name: thermoscientificnunc_96_wellplate_2000ul_B2 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 20.295 + y: 62.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_C2 + name: thermoscientificnunc_96_wellplate_2000ul_C2 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 20.295 + y: 53.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_D2 + name: thermoscientificnunc_96_wellplate_2000ul_D2 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 20.295 + y: 44.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_E2 + name: thermoscientificnunc_96_wellplate_2000ul_E2 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 20.295 + y: 35.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_F2 + name: thermoscientificnunc_96_wellplate_2000ul_F2 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 20.295 + y: 26.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_G2 + name: thermoscientificnunc_96_wellplate_2000ul_G2 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 20.295 + y: 17.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_H2 + name: thermoscientificnunc_96_wellplate_2000ul_H2 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 20.295 + y: 8.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_A3 + name: thermoscientificnunc_96_wellplate_2000ul_A3 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 29.295 + y: 71.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_B3 + name: thermoscientificnunc_96_wellplate_2000ul_B3 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 29.295 + y: 62.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_C3 + name: thermoscientificnunc_96_wellplate_2000ul_C3 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 29.295 + y: 53.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_D3 + name: thermoscientificnunc_96_wellplate_2000ul_D3 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 29.295 + y: 44.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_E3 + name: thermoscientificnunc_96_wellplate_2000ul_E3 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 29.295 + y: 35.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_F3 + name: thermoscientificnunc_96_wellplate_2000ul_F3 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 29.295 + y: 26.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_G3 + name: thermoscientificnunc_96_wellplate_2000ul_G3 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 29.295 + y: 17.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_H3 + name: thermoscientificnunc_96_wellplate_2000ul_H3 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 29.295 + y: 8.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_A4 + name: thermoscientificnunc_96_wellplate_2000ul_A4 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 38.295 + y: 71.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_B4 + name: thermoscientificnunc_96_wellplate_2000ul_B4 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 38.295 + y: 62.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_C4 + name: thermoscientificnunc_96_wellplate_2000ul_C4 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 38.295 + y: 53.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_D4 + name: thermoscientificnunc_96_wellplate_2000ul_D4 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 38.295 + y: 44.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_E4 + name: thermoscientificnunc_96_wellplate_2000ul_E4 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 38.295 + y: 35.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_F4 + name: thermoscientificnunc_96_wellplate_2000ul_F4 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 38.295 + y: 26.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_G4 + name: thermoscientificnunc_96_wellplate_2000ul_G4 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 38.295 + y: 17.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_H4 + name: thermoscientificnunc_96_wellplate_2000ul_H4 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 38.295 + y: 8.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_A5 + name: thermoscientificnunc_96_wellplate_2000ul_A5 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 47.295 + y: 71.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_B5 + name: thermoscientificnunc_96_wellplate_2000ul_B5 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 47.295 + y: 62.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_C5 + name: thermoscientificnunc_96_wellplate_2000ul_C5 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 47.295 + y: 53.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_D5 + name: thermoscientificnunc_96_wellplate_2000ul_D5 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 47.295 + y: 44.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_E5 + name: thermoscientificnunc_96_wellplate_2000ul_E5 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 47.295 + y: 35.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_F5 + name: thermoscientificnunc_96_wellplate_2000ul_F5 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 47.295 + y: 26.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_G5 + name: thermoscientificnunc_96_wellplate_2000ul_G5 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 47.295 + y: 17.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_H5 + name: thermoscientificnunc_96_wellplate_2000ul_H5 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 47.295 + y: 8.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_A6 + name: thermoscientificnunc_96_wellplate_2000ul_A6 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 56.295 + y: 71.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_B6 + name: thermoscientificnunc_96_wellplate_2000ul_B6 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 56.295 + y: 62.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_C6 + name: thermoscientificnunc_96_wellplate_2000ul_C6 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 56.295 + y: 53.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_D6 + name: thermoscientificnunc_96_wellplate_2000ul_D6 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 56.295 + y: 44.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_E6 + name: thermoscientificnunc_96_wellplate_2000ul_E6 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 56.295 + y: 35.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_F6 + name: thermoscientificnunc_96_wellplate_2000ul_F6 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 56.295 + y: 26.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_G6 + name: thermoscientificnunc_96_wellplate_2000ul_G6 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 56.295 + y: 17.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_H6 + name: thermoscientificnunc_96_wellplate_2000ul_H6 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 56.295 + y: 8.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_A7 + name: thermoscientificnunc_96_wellplate_2000ul_A7 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 65.295 + y: 71.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_B7 + name: thermoscientificnunc_96_wellplate_2000ul_B7 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 65.295 + y: 62.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_C7 + name: thermoscientificnunc_96_wellplate_2000ul_C7 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 65.295 + y: 53.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_D7 + name: thermoscientificnunc_96_wellplate_2000ul_D7 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 65.295 + y: 44.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_E7 + name: thermoscientificnunc_96_wellplate_2000ul_E7 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 65.295 + y: 35.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_F7 + name: thermoscientificnunc_96_wellplate_2000ul_F7 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 65.295 + y: 26.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_G7 + name: thermoscientificnunc_96_wellplate_2000ul_G7 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 65.295 + y: 17.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_H7 + name: thermoscientificnunc_96_wellplate_2000ul_H7 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 65.295 + y: 8.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_A8 + name: thermoscientificnunc_96_wellplate_2000ul_A8 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 74.295 + y: 71.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_B8 + name: thermoscientificnunc_96_wellplate_2000ul_B8 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 74.295 + y: 62.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_C8 + name: thermoscientificnunc_96_wellplate_2000ul_C8 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 74.295 + y: 53.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_D8 + name: thermoscientificnunc_96_wellplate_2000ul_D8 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 74.295 + y: 44.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_E8 + name: thermoscientificnunc_96_wellplate_2000ul_E8 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 74.295 + y: 35.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_F8 + name: thermoscientificnunc_96_wellplate_2000ul_F8 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 74.295 + y: 26.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_G8 + name: thermoscientificnunc_96_wellplate_2000ul_G8 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 74.295 + y: 17.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_H8 + name: thermoscientificnunc_96_wellplate_2000ul_H8 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 74.295 + y: 8.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_A9 + name: thermoscientificnunc_96_wellplate_2000ul_A9 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 83.295 + y: 71.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_B9 + name: thermoscientificnunc_96_wellplate_2000ul_B9 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 83.295 + y: 62.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_C9 + name: thermoscientificnunc_96_wellplate_2000ul_C9 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 83.295 + y: 53.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_D9 + name: thermoscientificnunc_96_wellplate_2000ul_D9 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 83.295 + y: 44.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_E9 + name: thermoscientificnunc_96_wellplate_2000ul_E9 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 83.295 + y: 35.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_F9 + name: thermoscientificnunc_96_wellplate_2000ul_F9 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 83.295 + y: 26.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_G9 + name: thermoscientificnunc_96_wellplate_2000ul_G9 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 83.295 + y: 17.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_H9 + name: thermoscientificnunc_96_wellplate_2000ul_H9 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 83.295 + y: 8.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_A10 + name: thermoscientificnunc_96_wellplate_2000ul_A10 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 92.295 + y: 71.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_B10 + name: thermoscientificnunc_96_wellplate_2000ul_B10 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 92.295 + y: 62.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_C10 + name: thermoscientificnunc_96_wellplate_2000ul_C10 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 92.295 + y: 53.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_D10 + name: thermoscientificnunc_96_wellplate_2000ul_D10 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 92.295 + y: 44.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_E10 + name: thermoscientificnunc_96_wellplate_2000ul_E10 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 92.295 + y: 35.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_F10 + name: thermoscientificnunc_96_wellplate_2000ul_F10 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 92.295 + y: 26.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_G10 + name: thermoscientificnunc_96_wellplate_2000ul_G10 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 92.295 + y: 17.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_H10 + name: thermoscientificnunc_96_wellplate_2000ul_H10 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 92.295 + y: 8.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_A11 + name: thermoscientificnunc_96_wellplate_2000ul_A11 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 101.295 + y: 71.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_B11 + name: thermoscientificnunc_96_wellplate_2000ul_B11 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 101.295 + y: 62.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_C11 + name: thermoscientificnunc_96_wellplate_2000ul_C11 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 101.295 + y: 53.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_D11 + name: thermoscientificnunc_96_wellplate_2000ul_D11 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 101.295 + y: 44.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_E11 + name: thermoscientificnunc_96_wellplate_2000ul_E11 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 101.295 + y: 35.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_F11 + name: thermoscientificnunc_96_wellplate_2000ul_F11 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 101.295 + y: 26.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_G11 + name: thermoscientificnunc_96_wellplate_2000ul_G11 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 101.295 + y: 17.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_H11 + name: thermoscientificnunc_96_wellplate_2000ul_H11 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 101.295 + y: 8.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_A12 + name: thermoscientificnunc_96_wellplate_2000ul_A12 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 110.295 + y: 71.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_B12 + name: thermoscientificnunc_96_wellplate_2000ul_B12 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 110.295 + y: 62.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_C12 + name: thermoscientificnunc_96_wellplate_2000ul_C12 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 110.295 + y: 53.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_D12 + name: thermoscientificnunc_96_wellplate_2000ul_D12 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 110.295 + y: 44.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_E12 + name: thermoscientificnunc_96_wellplate_2000ul_E12 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 110.295 + y: 35.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_F12 + name: thermoscientificnunc_96_wellplate_2000ul_F12 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 110.295 + y: 26.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_G12 + name: thermoscientificnunc_96_wellplate_2000ul_G12 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 110.295 + y: 17.195 + z: 2.1 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: circle + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 41.5 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: thermoscientificnunc_96_wellplate_2000ul_H12 + name: thermoscientificnunc_96_wellplate_2000ul_H12 + parent: thermoscientificnunc_96_wellplate_2000ul + position: + x: 110.295 + y: 8.195 + z: 2.1 + sample_id: null + type: well + description: Thermoscientific Nunc 96 wellplate 2000ul + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/plates.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +usascientific_96_wellplate_2point4ml_deep: + category: + - plates + class: + module: pylabrobot.resources.opentrons.plates:usascientific_96_wellplate_2point4ml_deep + type: pylabrobot + config_info: + - children: + - usascientific_96_wellplate_2point4ml_deep_A1 + - usascientific_96_wellplate_2point4ml_deep_B1 + - usascientific_96_wellplate_2point4ml_deep_C1 + - usascientific_96_wellplate_2point4ml_deep_D1 + - usascientific_96_wellplate_2point4ml_deep_E1 + - usascientific_96_wellplate_2point4ml_deep_F1 + - usascientific_96_wellplate_2point4ml_deep_G1 + - usascientific_96_wellplate_2point4ml_deep_H1 + - usascientific_96_wellplate_2point4ml_deep_A2 + - usascientific_96_wellplate_2point4ml_deep_B2 + - usascientific_96_wellplate_2point4ml_deep_C2 + - usascientific_96_wellplate_2point4ml_deep_D2 + - usascientific_96_wellplate_2point4ml_deep_E2 + - usascientific_96_wellplate_2point4ml_deep_F2 + - usascientific_96_wellplate_2point4ml_deep_G2 + - usascientific_96_wellplate_2point4ml_deep_H2 + - usascientific_96_wellplate_2point4ml_deep_A3 + - usascientific_96_wellplate_2point4ml_deep_B3 + - usascientific_96_wellplate_2point4ml_deep_C3 + - usascientific_96_wellplate_2point4ml_deep_D3 + - usascientific_96_wellplate_2point4ml_deep_E3 + - usascientific_96_wellplate_2point4ml_deep_F3 + - usascientific_96_wellplate_2point4ml_deep_G3 + - usascientific_96_wellplate_2point4ml_deep_H3 + - usascientific_96_wellplate_2point4ml_deep_A4 + - usascientific_96_wellplate_2point4ml_deep_B4 + - usascientific_96_wellplate_2point4ml_deep_C4 + - usascientific_96_wellplate_2point4ml_deep_D4 + - usascientific_96_wellplate_2point4ml_deep_E4 + - usascientific_96_wellplate_2point4ml_deep_F4 + - usascientific_96_wellplate_2point4ml_deep_G4 + - usascientific_96_wellplate_2point4ml_deep_H4 + - usascientific_96_wellplate_2point4ml_deep_A5 + - usascientific_96_wellplate_2point4ml_deep_B5 + - usascientific_96_wellplate_2point4ml_deep_C5 + - usascientific_96_wellplate_2point4ml_deep_D5 + - usascientific_96_wellplate_2point4ml_deep_E5 + - usascientific_96_wellplate_2point4ml_deep_F5 + - usascientific_96_wellplate_2point4ml_deep_G5 + - usascientific_96_wellplate_2point4ml_deep_H5 + - usascientific_96_wellplate_2point4ml_deep_A6 + - usascientific_96_wellplate_2point4ml_deep_B6 + - usascientific_96_wellplate_2point4ml_deep_C6 + - usascientific_96_wellplate_2point4ml_deep_D6 + - usascientific_96_wellplate_2point4ml_deep_E6 + - usascientific_96_wellplate_2point4ml_deep_F6 + - usascientific_96_wellplate_2point4ml_deep_G6 + - usascientific_96_wellplate_2point4ml_deep_H6 + - usascientific_96_wellplate_2point4ml_deep_A7 + - usascientific_96_wellplate_2point4ml_deep_B7 + - usascientific_96_wellplate_2point4ml_deep_C7 + - usascientific_96_wellplate_2point4ml_deep_D7 + - usascientific_96_wellplate_2point4ml_deep_E7 + - usascientific_96_wellplate_2point4ml_deep_F7 + - usascientific_96_wellplate_2point4ml_deep_G7 + - usascientific_96_wellplate_2point4ml_deep_H7 + - usascientific_96_wellplate_2point4ml_deep_A8 + - usascientific_96_wellplate_2point4ml_deep_B8 + - usascientific_96_wellplate_2point4ml_deep_C8 + - usascientific_96_wellplate_2point4ml_deep_D8 + - usascientific_96_wellplate_2point4ml_deep_E8 + - usascientific_96_wellplate_2point4ml_deep_F8 + - usascientific_96_wellplate_2point4ml_deep_G8 + - usascientific_96_wellplate_2point4ml_deep_H8 + - usascientific_96_wellplate_2point4ml_deep_A9 + - usascientific_96_wellplate_2point4ml_deep_B9 + - usascientific_96_wellplate_2point4ml_deep_C9 + - usascientific_96_wellplate_2point4ml_deep_D9 + - usascientific_96_wellplate_2point4ml_deep_E9 + - usascientific_96_wellplate_2point4ml_deep_F9 + - usascientific_96_wellplate_2point4ml_deep_G9 + - usascientific_96_wellplate_2point4ml_deep_H9 + - usascientific_96_wellplate_2point4ml_deep_A10 + - usascientific_96_wellplate_2point4ml_deep_B10 + - usascientific_96_wellplate_2point4ml_deep_C10 + - usascientific_96_wellplate_2point4ml_deep_D10 + - usascientific_96_wellplate_2point4ml_deep_E10 + - usascientific_96_wellplate_2point4ml_deep_F10 + - usascientific_96_wellplate_2point4ml_deep_G10 + - usascientific_96_wellplate_2point4ml_deep_H10 + - usascientific_96_wellplate_2point4ml_deep_A11 + - usascientific_96_wellplate_2point4ml_deep_B11 + - usascientific_96_wellplate_2point4ml_deep_C11 + - usascientific_96_wellplate_2point4ml_deep_D11 + - usascientific_96_wellplate_2point4ml_deep_E11 + - usascientific_96_wellplate_2point4ml_deep_F11 + - usascientific_96_wellplate_2point4ml_deep_G11 + - usascientific_96_wellplate_2point4ml_deep_H11 + - usascientific_96_wellplate_2point4ml_deep_A12 + - usascientific_96_wellplate_2point4ml_deep_B12 + - usascientific_96_wellplate_2point4ml_deep_C12 + - usascientific_96_wellplate_2point4ml_deep_D12 + - usascientific_96_wellplate_2point4ml_deep_E12 + - usascientific_96_wellplate_2point4ml_deep_F12 + - usascientific_96_wellplate_2point4ml_deep_G12 + - usascientific_96_wellplate_2point4ml_deep_H12 + class: '' + config: + barcode: null + category: plate + model: USA Scientific 96 Deep Well Plate 2.4 mL + ordering: + A1: usascientific_96_wellplate_2point4ml_deep_A1 + B1: usascientific_96_wellplate_2point4ml_deep_B1 + C1: usascientific_96_wellplate_2point4ml_deep_C1 + D1: usascientific_96_wellplate_2point4ml_deep_D1 + E1: usascientific_96_wellplate_2point4ml_deep_E1 + F1: usascientific_96_wellplate_2point4ml_deep_F1 + G1: usascientific_96_wellplate_2point4ml_deep_G1 + H1: usascientific_96_wellplate_2point4ml_deep_H1 + A2: usascientific_96_wellplate_2point4ml_deep_A2 + B2: usascientific_96_wellplate_2point4ml_deep_B2 + C2: usascientific_96_wellplate_2point4ml_deep_C2 + D2: usascientific_96_wellplate_2point4ml_deep_D2 + E2: usascientific_96_wellplate_2point4ml_deep_E2 + F2: usascientific_96_wellplate_2point4ml_deep_F2 + G2: usascientific_96_wellplate_2point4ml_deep_G2 + H2: usascientific_96_wellplate_2point4ml_deep_H2 + A3: usascientific_96_wellplate_2point4ml_deep_A3 + B3: usascientific_96_wellplate_2point4ml_deep_B3 + C3: usascientific_96_wellplate_2point4ml_deep_C3 + D3: usascientific_96_wellplate_2point4ml_deep_D3 + E3: usascientific_96_wellplate_2point4ml_deep_E3 + F3: usascientific_96_wellplate_2point4ml_deep_F3 + G3: usascientific_96_wellplate_2point4ml_deep_G3 + H3: usascientific_96_wellplate_2point4ml_deep_H3 + A4: usascientific_96_wellplate_2point4ml_deep_A4 + B4: usascientific_96_wellplate_2point4ml_deep_B4 + C4: usascientific_96_wellplate_2point4ml_deep_C4 + D4: usascientific_96_wellplate_2point4ml_deep_D4 + E4: usascientific_96_wellplate_2point4ml_deep_E4 + F4: usascientific_96_wellplate_2point4ml_deep_F4 + G4: usascientific_96_wellplate_2point4ml_deep_G4 + H4: usascientific_96_wellplate_2point4ml_deep_H4 + A5: usascientific_96_wellplate_2point4ml_deep_A5 + B5: usascientific_96_wellplate_2point4ml_deep_B5 + C5: usascientific_96_wellplate_2point4ml_deep_C5 + D5: usascientific_96_wellplate_2point4ml_deep_D5 + E5: usascientific_96_wellplate_2point4ml_deep_E5 + F5: usascientific_96_wellplate_2point4ml_deep_F5 + G5: usascientific_96_wellplate_2point4ml_deep_G5 + H5: usascientific_96_wellplate_2point4ml_deep_H5 + A6: usascientific_96_wellplate_2point4ml_deep_A6 + B6: usascientific_96_wellplate_2point4ml_deep_B6 + C6: usascientific_96_wellplate_2point4ml_deep_C6 + D6: usascientific_96_wellplate_2point4ml_deep_D6 + E6: usascientific_96_wellplate_2point4ml_deep_E6 + F6: usascientific_96_wellplate_2point4ml_deep_F6 + G6: usascientific_96_wellplate_2point4ml_deep_G6 + H6: usascientific_96_wellplate_2point4ml_deep_H6 + A7: usascientific_96_wellplate_2point4ml_deep_A7 + B7: usascientific_96_wellplate_2point4ml_deep_B7 + C7: usascientific_96_wellplate_2point4ml_deep_C7 + D7: usascientific_96_wellplate_2point4ml_deep_D7 + E7: usascientific_96_wellplate_2point4ml_deep_E7 + F7: usascientific_96_wellplate_2point4ml_deep_F7 + G7: usascientific_96_wellplate_2point4ml_deep_G7 + H7: usascientific_96_wellplate_2point4ml_deep_H7 + A8: usascientific_96_wellplate_2point4ml_deep_A8 + B8: usascientific_96_wellplate_2point4ml_deep_B8 + C8: usascientific_96_wellplate_2point4ml_deep_C8 + D8: usascientific_96_wellplate_2point4ml_deep_D8 + E8: usascientific_96_wellplate_2point4ml_deep_E8 + F8: usascientific_96_wellplate_2point4ml_deep_F8 + G8: usascientific_96_wellplate_2point4ml_deep_G8 + H8: usascientific_96_wellplate_2point4ml_deep_H8 + A9: usascientific_96_wellplate_2point4ml_deep_A9 + B9: usascientific_96_wellplate_2point4ml_deep_B9 + C9: usascientific_96_wellplate_2point4ml_deep_C9 + D9: usascientific_96_wellplate_2point4ml_deep_D9 + E9: usascientific_96_wellplate_2point4ml_deep_E9 + F9: usascientific_96_wellplate_2point4ml_deep_F9 + G9: usascientific_96_wellplate_2point4ml_deep_G9 + H9: usascientific_96_wellplate_2point4ml_deep_H9 + A10: usascientific_96_wellplate_2point4ml_deep_A10 + B10: usascientific_96_wellplate_2point4ml_deep_B10 + C10: usascientific_96_wellplate_2point4ml_deep_C10 + D10: usascientific_96_wellplate_2point4ml_deep_D10 + E10: usascientific_96_wellplate_2point4ml_deep_E10 + F10: usascientific_96_wellplate_2point4ml_deep_F10 + G10: usascientific_96_wellplate_2point4ml_deep_G10 + H10: usascientific_96_wellplate_2point4ml_deep_H10 + A11: usascientific_96_wellplate_2point4ml_deep_A11 + B11: usascientific_96_wellplate_2point4ml_deep_B11 + C11: usascientific_96_wellplate_2point4ml_deep_C11 + D11: usascientific_96_wellplate_2point4ml_deep_D11 + E11: usascientific_96_wellplate_2point4ml_deep_E11 + F11: usascientific_96_wellplate_2point4ml_deep_F11 + G11: usascientific_96_wellplate_2point4ml_deep_G11 + H11: usascientific_96_wellplate_2point4ml_deep_H11 + A12: usascientific_96_wellplate_2point4ml_deep_A12 + B12: usascientific_96_wellplate_2point4ml_deep_B12 + C12: usascientific_96_wellplate_2point4ml_deep_C12 + D12: usascientific_96_wellplate_2point4ml_deep_D12 + E12: usascientific_96_wellplate_2point4ml_deep_E12 + F12: usascientific_96_wellplate_2point4ml_deep_F12 + G12: usascientific_96_wellplate_2point4ml_deep_G12 + H12: usascientific_96_wellplate_2point4ml_deep_H12 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.8 + size_y: 85.5 + size_z: 44.1 + type: Plate + data: {} + id: usascientific_96_wellplate_2point4ml_deep + name: usascientific_96_wellplate_2point4ml_deep + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: plate + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_A1 + name: usascientific_96_wellplate_2point4ml_deep_A1 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 10.3 + y: 70.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_B1 + name: usascientific_96_wellplate_2point4ml_deep_B1 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 10.3 + y: 61.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_C1 + name: usascientific_96_wellplate_2point4ml_deep_C1 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 10.3 + y: 52.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_D1 + name: usascientific_96_wellplate_2point4ml_deep_D1 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 10.3 + y: 43.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_E1 + name: usascientific_96_wellplate_2point4ml_deep_E1 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 10.3 + y: 34.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_F1 + name: usascientific_96_wellplate_2point4ml_deep_F1 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 10.3 + y: 25.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_G1 + name: usascientific_96_wellplate_2point4ml_deep_G1 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 10.3 + y: 16.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_H1 + name: usascientific_96_wellplate_2point4ml_deep_H1 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 10.3 + y: 7.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_A2 + name: usascientific_96_wellplate_2point4ml_deep_A2 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 19.3 + y: 70.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_B2 + name: usascientific_96_wellplate_2point4ml_deep_B2 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 19.3 + y: 61.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_C2 + name: usascientific_96_wellplate_2point4ml_deep_C2 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 19.3 + y: 52.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_D2 + name: usascientific_96_wellplate_2point4ml_deep_D2 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 19.3 + y: 43.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_E2 + name: usascientific_96_wellplate_2point4ml_deep_E2 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 19.3 + y: 34.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_F2 + name: usascientific_96_wellplate_2point4ml_deep_F2 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 19.3 + y: 25.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_G2 + name: usascientific_96_wellplate_2point4ml_deep_G2 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 19.3 + y: 16.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_H2 + name: usascientific_96_wellplate_2point4ml_deep_H2 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 19.3 + y: 7.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_A3 + name: usascientific_96_wellplate_2point4ml_deep_A3 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 28.3 + y: 70.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_B3 + name: usascientific_96_wellplate_2point4ml_deep_B3 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 28.3 + y: 61.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_C3 + name: usascientific_96_wellplate_2point4ml_deep_C3 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 28.3 + y: 52.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_D3 + name: usascientific_96_wellplate_2point4ml_deep_D3 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 28.3 + y: 43.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_E3 + name: usascientific_96_wellplate_2point4ml_deep_E3 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 28.3 + y: 34.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_F3 + name: usascientific_96_wellplate_2point4ml_deep_F3 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 28.3 + y: 25.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_G3 + name: usascientific_96_wellplate_2point4ml_deep_G3 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 28.3 + y: 16.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_H3 + name: usascientific_96_wellplate_2point4ml_deep_H3 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 28.3 + y: 7.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_A4 + name: usascientific_96_wellplate_2point4ml_deep_A4 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 37.3 + y: 70.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_B4 + name: usascientific_96_wellplate_2point4ml_deep_B4 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 37.3 + y: 61.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_C4 + name: usascientific_96_wellplate_2point4ml_deep_C4 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 37.3 + y: 52.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_D4 + name: usascientific_96_wellplate_2point4ml_deep_D4 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 37.3 + y: 43.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_E4 + name: usascientific_96_wellplate_2point4ml_deep_E4 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 37.3 + y: 34.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_F4 + name: usascientific_96_wellplate_2point4ml_deep_F4 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 37.3 + y: 25.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_G4 + name: usascientific_96_wellplate_2point4ml_deep_G4 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 37.3 + y: 16.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_H4 + name: usascientific_96_wellplate_2point4ml_deep_H4 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 37.3 + y: 7.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_A5 + name: usascientific_96_wellplate_2point4ml_deep_A5 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 46.3 + y: 70.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_B5 + name: usascientific_96_wellplate_2point4ml_deep_B5 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 46.3 + y: 61.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_C5 + name: usascientific_96_wellplate_2point4ml_deep_C5 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 46.3 + y: 52.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_D5 + name: usascientific_96_wellplate_2point4ml_deep_D5 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 46.3 + y: 43.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_E5 + name: usascientific_96_wellplate_2point4ml_deep_E5 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 46.3 + y: 34.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_F5 + name: usascientific_96_wellplate_2point4ml_deep_F5 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 46.3 + y: 25.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_G5 + name: usascientific_96_wellplate_2point4ml_deep_G5 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 46.3 + y: 16.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_H5 + name: usascientific_96_wellplate_2point4ml_deep_H5 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 46.3 + y: 7.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_A6 + name: usascientific_96_wellplate_2point4ml_deep_A6 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 55.3 + y: 70.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_B6 + name: usascientific_96_wellplate_2point4ml_deep_B6 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 55.3 + y: 61.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_C6 + name: usascientific_96_wellplate_2point4ml_deep_C6 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 55.3 + y: 52.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_D6 + name: usascientific_96_wellplate_2point4ml_deep_D6 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 55.3 + y: 43.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_E6 + name: usascientific_96_wellplate_2point4ml_deep_E6 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 55.3 + y: 34.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_F6 + name: usascientific_96_wellplate_2point4ml_deep_F6 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 55.3 + y: 25.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_G6 + name: usascientific_96_wellplate_2point4ml_deep_G6 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 55.3 + y: 16.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_H6 + name: usascientific_96_wellplate_2point4ml_deep_H6 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 55.3 + y: 7.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_A7 + name: usascientific_96_wellplate_2point4ml_deep_A7 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 64.3 + y: 70.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_B7 + name: usascientific_96_wellplate_2point4ml_deep_B7 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 64.3 + y: 61.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_C7 + name: usascientific_96_wellplate_2point4ml_deep_C7 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 64.3 + y: 52.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_D7 + name: usascientific_96_wellplate_2point4ml_deep_D7 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 64.3 + y: 43.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_E7 + name: usascientific_96_wellplate_2point4ml_deep_E7 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 64.3 + y: 34.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_F7 + name: usascientific_96_wellplate_2point4ml_deep_F7 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 64.3 + y: 25.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_G7 + name: usascientific_96_wellplate_2point4ml_deep_G7 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 64.3 + y: 16.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_H7 + name: usascientific_96_wellplate_2point4ml_deep_H7 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 64.3 + y: 7.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_A8 + name: usascientific_96_wellplate_2point4ml_deep_A8 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 73.3 + y: 70.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_B8 + name: usascientific_96_wellplate_2point4ml_deep_B8 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 73.3 + y: 61.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_C8 + name: usascientific_96_wellplate_2point4ml_deep_C8 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 73.3 + y: 52.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_D8 + name: usascientific_96_wellplate_2point4ml_deep_D8 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 73.3 + y: 43.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_E8 + name: usascientific_96_wellplate_2point4ml_deep_E8 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 73.3 + y: 34.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_F8 + name: usascientific_96_wellplate_2point4ml_deep_F8 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 73.3 + y: 25.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_G8 + name: usascientific_96_wellplate_2point4ml_deep_G8 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 73.3 + y: 16.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_H8 + name: usascientific_96_wellplate_2point4ml_deep_H8 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 73.3 + y: 7.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_A9 + name: usascientific_96_wellplate_2point4ml_deep_A9 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 82.3 + y: 70.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_B9 + name: usascientific_96_wellplate_2point4ml_deep_B9 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 82.3 + y: 61.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_C9 + name: usascientific_96_wellplate_2point4ml_deep_C9 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 82.3 + y: 52.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_D9 + name: usascientific_96_wellplate_2point4ml_deep_D9 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 82.3 + y: 43.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_E9 + name: usascientific_96_wellplate_2point4ml_deep_E9 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 82.3 + y: 34.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_F9 + name: usascientific_96_wellplate_2point4ml_deep_F9 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 82.3 + y: 25.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_G9 + name: usascientific_96_wellplate_2point4ml_deep_G9 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 82.3 + y: 16.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_H9 + name: usascientific_96_wellplate_2point4ml_deep_H9 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 82.3 + y: 7.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_A10 + name: usascientific_96_wellplate_2point4ml_deep_A10 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 91.3 + y: 70.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_B10 + name: usascientific_96_wellplate_2point4ml_deep_B10 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 91.3 + y: 61.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_C10 + name: usascientific_96_wellplate_2point4ml_deep_C10 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 91.3 + y: 52.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_D10 + name: usascientific_96_wellplate_2point4ml_deep_D10 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 91.3 + y: 43.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_E10 + name: usascientific_96_wellplate_2point4ml_deep_E10 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 91.3 + y: 34.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_F10 + name: usascientific_96_wellplate_2point4ml_deep_F10 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 91.3 + y: 25.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_G10 + name: usascientific_96_wellplate_2point4ml_deep_G10 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 91.3 + y: 16.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_H10 + name: usascientific_96_wellplate_2point4ml_deep_H10 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 91.3 + y: 7.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_A11 + name: usascientific_96_wellplate_2point4ml_deep_A11 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 100.3 + y: 70.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_B11 + name: usascientific_96_wellplate_2point4ml_deep_B11 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 100.3 + y: 61.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_C11 + name: usascientific_96_wellplate_2point4ml_deep_C11 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 100.3 + y: 52.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_D11 + name: usascientific_96_wellplate_2point4ml_deep_D11 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 100.3 + y: 43.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_E11 + name: usascientific_96_wellplate_2point4ml_deep_E11 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 100.3 + y: 34.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_F11 + name: usascientific_96_wellplate_2point4ml_deep_F11 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 100.3 + y: 25.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_G11 + name: usascientific_96_wellplate_2point4ml_deep_G11 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 100.3 + y: 16.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_H11 + name: usascientific_96_wellplate_2point4ml_deep_H11 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 100.3 + y: 7.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_A12 + name: usascientific_96_wellplate_2point4ml_deep_A12 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 109.3 + y: 70.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_B12 + name: usascientific_96_wellplate_2point4ml_deep_B12 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 109.3 + y: 61.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_C12 + name: usascientific_96_wellplate_2point4ml_deep_C12 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 109.3 + y: 52.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_D12 + name: usascientific_96_wellplate_2point4ml_deep_D12 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 109.3 + y: 43.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_E12 + name: usascientific_96_wellplate_2point4ml_deep_E12 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 109.3 + y: 34.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_F12 + name: usascientific_96_wellplate_2point4ml_deep_F12 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 109.3 + y: 25.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_G12 + name: usascientific_96_wellplate_2point4ml_deep_G12 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 109.3 + y: 16.1 + z: 2.8 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 2400 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 8.2 + size_z: 41.3 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_96_wellplate_2point4ml_deep_H12 + name: usascientific_96_wellplate_2point4ml_deep_H12 + parent: usascientific_96_wellplate_2point4ml_deep + position: + x: 109.3 + y: 7.1 + z: 2.8 + sample_id: null + type: well + description: USAScientific 96 wellplate 2.4ml deep + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/plates.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 diff --git a/unilabos/registry/resources/opentrons/reservoirs.yaml b/unilabos/registry/resources/opentrons/reservoirs.yaml index fbc8490..71f014b 100644 --- a/unilabos/registry/resources/opentrons/reservoirs.yaml +++ b/unilabos/registry/resources/opentrons/reservoirs.yaml @@ -1,35 +1,1248 @@ agilent_1_reservoir_290ml: - description: Agilent 1 reservoir 290ml - class: + category: + - reservoirs + class: module: pylabrobot.resources.opentrons.reservoirs:agilent_1_reservoir_290ml type: pylabrobot - + config_info: + - children: + - agilent_1_reservoir_290ml_A1 + class: '' + config: + barcode: null + category: plate + model: Agilent 1 Well Reservoir 290 mL + ordering: + A1: agilent_1_reservoir_290ml_A1 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.76 + size_y: 85.57 + size_z: 44.04 + type: Plate + data: {} + id: agilent_1_reservoir_290ml + name: agilent_1_reservoir_290ml + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: plate + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 290000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 108 + size_y: 72 + size_z: 39.22 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: agilent_1_reservoir_290ml_A1 + name: agilent_1_reservoir_290ml_A1 + parent: agilent_1_reservoir_290ml + position: + x: 9.88 + y: 6.785 + z: 4.82 + sample_id: null + type: well + description: Agilent 1 reservoir 290ml + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/reservoirs.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 axygen_1_reservoir_90ml: - description: Axygen 1 reservoir 90ml - class: + category: + - reservoirs + class: module: pylabrobot.resources.opentrons.reservoirs:axygen_1_reservoir_90ml type: pylabrobot - + config_info: + - children: + - axygen_1_reservoir_90ml_A1 + class: '' + config: + barcode: null + category: plate + model: Axygen 1 Well Reservoir 90 mL + ordering: + A1: axygen_1_reservoir_90ml_A1 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.76 + size_y: 85.47 + size_z: 19.05 + type: Plate + data: {} + id: axygen_1_reservoir_90ml + name: axygen_1_reservoir_90ml + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: plate + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 90000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 106.76 + size_y: 70.52 + size_z: 12.42 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: axygen_1_reservoir_90ml_A1 + name: axygen_1_reservoir_90ml_A1 + parent: axygen_1_reservoir_90ml + position: + x: 10.5 + y: 7.475 + z: 6.63 + sample_id: null + type: well + description: Axygen 1 reservoir 90ml + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/reservoirs.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 nest_12_reservoir_15ml: - description: Nest 12 reservoir 15ml - class: + category: + - reservoirs + class: module: pylabrobot.resources.opentrons.reservoirs:nest_12_reservoir_15ml type: pylabrobot - + config_info: + - children: + - nest_12_reservoir_15ml_A1 + - nest_12_reservoir_15ml_A2 + - nest_12_reservoir_15ml_A3 + - nest_12_reservoir_15ml_A4 + - nest_12_reservoir_15ml_A5 + - nest_12_reservoir_15ml_A6 + - nest_12_reservoir_15ml_A7 + - nest_12_reservoir_15ml_A8 + - nest_12_reservoir_15ml_A9 + - nest_12_reservoir_15ml_A10 + - nest_12_reservoir_15ml_A11 + - nest_12_reservoir_15ml_A12 + class: '' + config: + barcode: null + category: plate + model: NEST 12 Well Reservoir 15 mL + ordering: + A1: nest_12_reservoir_15ml_A1 + A2: nest_12_reservoir_15ml_A2 + A3: nest_12_reservoir_15ml_A3 + A4: nest_12_reservoir_15ml_A4 + A5: nest_12_reservoir_15ml_A5 + A6: nest_12_reservoir_15ml_A6 + A7: nest_12_reservoir_15ml_A7 + A8: nest_12_reservoir_15ml_A8 + A9: nest_12_reservoir_15ml_A9 + A10: nest_12_reservoir_15ml_A10 + A11: nest_12_reservoir_15ml_A11 + A12: nest_12_reservoir_15ml_A12 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.76 + size_y: 85.48 + size_z: 31.4 + type: Plate + data: {} + id: nest_12_reservoir_15ml + name: nest_12_reservoir_15ml + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: plate + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 71.2 + size_z: 26.85 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_12_reservoir_15ml_A1 + name: nest_12_reservoir_15ml_A1 + parent: nest_12_reservoir_15ml + position: + x: 10.28 + y: 7.18 + z: 4.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 71.2 + size_z: 26.85 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_12_reservoir_15ml_A2 + name: nest_12_reservoir_15ml_A2 + parent: nest_12_reservoir_15ml + position: + x: 19.28 + y: 7.18 + z: 4.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 71.2 + size_z: 26.85 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_12_reservoir_15ml_A3 + name: nest_12_reservoir_15ml_A3 + parent: nest_12_reservoir_15ml + position: + x: 28.28 + y: 7.18 + z: 4.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 71.2 + size_z: 26.85 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_12_reservoir_15ml_A4 + name: nest_12_reservoir_15ml_A4 + parent: nest_12_reservoir_15ml + position: + x: 37.28 + y: 7.18 + z: 4.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 71.2 + size_z: 26.85 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_12_reservoir_15ml_A5 + name: nest_12_reservoir_15ml_A5 + parent: nest_12_reservoir_15ml + position: + x: 46.28 + y: 7.18 + z: 4.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 71.2 + size_z: 26.85 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_12_reservoir_15ml_A6 + name: nest_12_reservoir_15ml_A6 + parent: nest_12_reservoir_15ml + position: + x: 55.28 + y: 7.18 + z: 4.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 71.2 + size_z: 26.85 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_12_reservoir_15ml_A7 + name: nest_12_reservoir_15ml_A7 + parent: nest_12_reservoir_15ml + position: + x: 64.28 + y: 7.18 + z: 4.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 71.2 + size_z: 26.85 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_12_reservoir_15ml_A8 + name: nest_12_reservoir_15ml_A8 + parent: nest_12_reservoir_15ml + position: + x: 73.28 + y: 7.18 + z: 4.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 71.2 + size_z: 26.85 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_12_reservoir_15ml_A9 + name: nest_12_reservoir_15ml_A9 + parent: nest_12_reservoir_15ml + position: + x: 82.28 + y: 7.18 + z: 4.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 71.2 + size_z: 26.85 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_12_reservoir_15ml_A10 + name: nest_12_reservoir_15ml_A10 + parent: nest_12_reservoir_15ml + position: + x: 91.28 + y: 7.18 + z: 4.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 71.2 + size_z: 26.85 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_12_reservoir_15ml_A11 + name: nest_12_reservoir_15ml_A11 + parent: nest_12_reservoir_15ml + position: + x: 100.28 + y: 7.18 + z: 4.55 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.2 + size_y: 71.2 + size_z: 26.85 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_12_reservoir_15ml_A12 + name: nest_12_reservoir_15ml_A12 + parent: nest_12_reservoir_15ml + position: + x: 109.28 + y: 7.18 + z: 4.55 + sample_id: null + type: well + description: Nest 12 reservoir 15ml + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/reservoirs.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 nest_1_reservoir_195ml: - description: Nest 1 reservoir 195ml - class: + category: + - reservoirs + class: module: pylabrobot.resources.opentrons.reservoirs:nest_1_reservoir_195ml type: pylabrobot - + config_info: + - children: + - nest_1_reservoir_195ml_A1 + class: '' + config: + barcode: null + category: plate + model: NEST 1 Well Reservoir 195 mL + ordering: + A1: nest_1_reservoir_195ml_A1 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.76 + size_y: 85.48 + size_z: 31.4 + type: Plate + data: {} + id: nest_1_reservoir_195ml + name: nest_1_reservoir_195ml + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: plate + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 195000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 106.8 + size_y: 71.2 + size_z: 25 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_1_reservoir_195ml_A1 + name: nest_1_reservoir_195ml_A1 + parent: nest_1_reservoir_195ml + position: + x: 10.48 + y: 7.14 + z: 4.55 + sample_id: null + type: well + description: Nest 1 reservoir 195ml + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/reservoirs.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 nest_1_reservoir_290ml: - description: Nest 1 reservoir 290ml - class: + category: + - reservoirs + class: module: pylabrobot.resources.opentrons.reservoirs:nest_1_reservoir_290ml type: pylabrobot - + config_info: + - children: + - nest_1_reservoir_290ml_A1 + class: '' + config: + barcode: null + category: plate + model: NEST 1 Well Reservoir 290 mL + ordering: + A1: nest_1_reservoir_290ml_A1 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.76 + size_y: 85.47 + size_z: 44.4 + type: Plate + data: {} + id: nest_1_reservoir_290ml + name: nest_1_reservoir_290ml + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: plate + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 290000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 106.8 + size_y: 71.2 + size_z: 39.55 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: nest_1_reservoir_290ml_A1 + name: nest_1_reservoir_290ml_A1 + parent: nest_1_reservoir_290ml + position: + x: 10.48 + y: 7.14 + z: 4.85 + sample_id: null + type: well + description: Nest 1 reservoir 290ml + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/reservoirs.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 usascientific_12_reservoir_22ml: - description: USAScientific 12 reservoir 22ml - class: + category: + - reservoirs + class: module: pylabrobot.resources.opentrons.reservoirs:usascientific_12_reservoir_22ml type: pylabrobot + config_info: + - children: + - usascientific_12_reservoir_22ml_A1 + - usascientific_12_reservoir_22ml_A2 + - usascientific_12_reservoir_22ml_A3 + - usascientific_12_reservoir_22ml_A4 + - usascientific_12_reservoir_22ml_A5 + - usascientific_12_reservoir_22ml_A6 + - usascientific_12_reservoir_22ml_A7 + - usascientific_12_reservoir_22ml_A8 + - usascientific_12_reservoir_22ml_A9 + - usascientific_12_reservoir_22ml_A10 + - usascientific_12_reservoir_22ml_A11 + - usascientific_12_reservoir_22ml_A12 + class: '' + config: + barcode: null + category: plate + model: USA Scientific 12 Well Reservoir 22 mL + ordering: + A1: usascientific_12_reservoir_22ml_A1 + A2: usascientific_12_reservoir_22ml_A2 + A3: usascientific_12_reservoir_22ml_A3 + A4: usascientific_12_reservoir_22ml_A4 + A5: usascientific_12_reservoir_22ml_A5 + A6: usascientific_12_reservoir_22ml_A6 + A7: usascientific_12_reservoir_22ml_A7 + A8: usascientific_12_reservoir_22ml_A8 + A9: usascientific_12_reservoir_22ml_A9 + A10: usascientific_12_reservoir_22ml_A10 + A11: usascientific_12_reservoir_22ml_A11 + A12: usascientific_12_reservoir_22ml_A12 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.76 + size_y: 85.8 + size_z: 44.45 + type: Plate + data: {} + id: usascientific_12_reservoir_22ml + name: usascientific_12_reservoir_22ml + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: plate + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 22000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.33 + size_y: 71.88 + size_z: 42.16 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_12_reservoir_22ml_A1 + name: usascientific_12_reservoir_22ml_A1 + parent: usascientific_12_reservoir_22ml + position: + x: 9.775 + y: 6.96 + z: 2.29 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 22000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.33 + size_y: 71.88 + size_z: 42.16 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_12_reservoir_22ml_A2 + name: usascientific_12_reservoir_22ml_A2 + parent: usascientific_12_reservoir_22ml + position: + x: 18.865 + y: 6.96 + z: 2.29 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 22000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.33 + size_y: 71.88 + size_z: 42.16 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_12_reservoir_22ml_A3 + name: usascientific_12_reservoir_22ml_A3 + parent: usascientific_12_reservoir_22ml + position: + x: 27.955 + y: 6.96 + z: 2.29 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 22000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.33 + size_y: 71.88 + size_z: 42.16 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_12_reservoir_22ml_A4 + name: usascientific_12_reservoir_22ml_A4 + parent: usascientific_12_reservoir_22ml + position: + x: 37.045 + y: 6.96 + z: 2.29 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 22000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.33 + size_y: 71.88 + size_z: 42.16 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_12_reservoir_22ml_A5 + name: usascientific_12_reservoir_22ml_A5 + parent: usascientific_12_reservoir_22ml + position: + x: 46.135 + y: 6.96 + z: 2.29 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 22000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.33 + size_y: 71.88 + size_z: 42.16 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_12_reservoir_22ml_A6 + name: usascientific_12_reservoir_22ml_A6 + parent: usascientific_12_reservoir_22ml + position: + x: 55.225 + y: 6.96 + z: 2.29 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 22000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.33 + size_y: 71.88 + size_z: 42.16 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_12_reservoir_22ml_A7 + name: usascientific_12_reservoir_22ml_A7 + parent: usascientific_12_reservoir_22ml + position: + x: 64.315 + y: 6.96 + z: 2.29 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 22000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.33 + size_y: 71.88 + size_z: 42.16 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_12_reservoir_22ml_A8 + name: usascientific_12_reservoir_22ml_A8 + parent: usascientific_12_reservoir_22ml + position: + x: 73.405 + y: 6.96 + z: 2.29 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 22000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.33 + size_y: 71.88 + size_z: 42.16 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_12_reservoir_22ml_A9 + name: usascientific_12_reservoir_22ml_A9 + parent: usascientific_12_reservoir_22ml + position: + x: 82.495 + y: 6.96 + z: 2.29 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 22000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.33 + size_y: 71.88 + size_z: 42.16 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_12_reservoir_22ml_A10 + name: usascientific_12_reservoir_22ml_A10 + parent: usascientific_12_reservoir_22ml + position: + x: 91.585 + y: 6.96 + z: 2.29 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 22000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.33 + size_y: 71.88 + size_z: 42.16 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_12_reservoir_22ml_A11 + name: usascientific_12_reservoir_22ml_A11 + parent: usascientific_12_reservoir_22ml + position: + x: 100.675 + y: 6.96 + z: 2.29 + sample_id: null + type: well + - children: [] + class: '' + config: + barcode: null + bottom_type: unknown + category: well + compute_height_from_volume: null + compute_volume_from_height: null + cross_section_type: rectangle + material_z_thickness: null + max_volume: 22000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 8.33 + size_y: 71.88 + size_z: 42.16 + type: Well + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: usascientific_12_reservoir_22ml_A12 + name: usascientific_12_reservoir_22ml_A12 + parent: usascientific_12_reservoir_22ml + position: + x: 109.765 + y: 6.96 + z: 2.29 + sample_id: null + type: well + description: USAScientific 12 reservoir 22ml + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/reservoirs.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 diff --git a/unilabos/registry/resources/opentrons/tip_racks.yaml b/unilabos/registry/resources/opentrons/tip_racks.yaml index a605b55..c549ddd 100644 --- a/unilabos/registry/resources/opentrons/tip_racks.yaml +++ b/unilabos/registry/resources/opentrons/tip_racks.yaml @@ -1,83 +1,61690 @@ eppendorf_96_tiprack_1000ul_eptips: - description: Eppendorf 96 tiprack 1000ul eptips - class: + category: + - tip_racks + class: module: pylabrobot.resources.opentrons.tip_racks:eppendorf_96_tiprack_1000ul_eptips type: pylabrobot - -tipone_96_tiprack_200ul: - description: TipOne 96 tiprack 200ul - class: - module: pylabrobot.resources.opentrons.tip_racks:tipone_96_tiprack_200ul - type: pylabrobot - -opentrons_96_tiprack_300ul: - description: Opentrons 96 tiprack 300ul - class: - module: pylabrobot.resources.opentrons.tip_racks:opentrons_96_tiprack_300ul - type: pylabrobot - -opentrons_96_tiprack_10ul: - description: Opentrons 96 tiprack 10ul - class: - module: pylabrobot.resources.opentrons.tip_racks:opentrons_96_tiprack_10ul - type: pylabrobot - -opentrons_96_filtertiprack_10ul: - description: Opentrons 96 filtertiprack 10ul - class: - module: pylabrobot.resources.opentrons.tip_racks:opentrons_96_filtertiprack_10ul - type: pylabrobot - -geb_96_tiprack_10ul: - description: Geb 96 tiprack 10ul - class: - module: pylabrobot.resources.opentrons.tip_racks:geb_96_tiprack_10ul - type: pylabrobot - -opentrons_96_filtertiprack_200ul: - description: Opentrons 96 filtertiprack 200ul - class: - module: pylabrobot.resources.opentrons.tip_racks:opentrons_96_filtertiprack_200ul - type: pylabrobot - + config_info: + - children: + - eppendorf_96_tiprack_1000ul_eptips_A1 + - eppendorf_96_tiprack_1000ul_eptips_B1 + - eppendorf_96_tiprack_1000ul_eptips_C1 + - eppendorf_96_tiprack_1000ul_eptips_D1 + - eppendorf_96_tiprack_1000ul_eptips_E1 + - eppendorf_96_tiprack_1000ul_eptips_F1 + - eppendorf_96_tiprack_1000ul_eptips_G1 + - eppendorf_96_tiprack_1000ul_eptips_H1 + - eppendorf_96_tiprack_1000ul_eptips_A2 + - eppendorf_96_tiprack_1000ul_eptips_B2 + - eppendorf_96_tiprack_1000ul_eptips_C2 + - eppendorf_96_tiprack_1000ul_eptips_D2 + - eppendorf_96_tiprack_1000ul_eptips_E2 + - eppendorf_96_tiprack_1000ul_eptips_F2 + - eppendorf_96_tiprack_1000ul_eptips_G2 + - eppendorf_96_tiprack_1000ul_eptips_H2 + - eppendorf_96_tiprack_1000ul_eptips_A3 + - eppendorf_96_tiprack_1000ul_eptips_B3 + - eppendorf_96_tiprack_1000ul_eptips_C3 + - eppendorf_96_tiprack_1000ul_eptips_D3 + - eppendorf_96_tiprack_1000ul_eptips_E3 + - eppendorf_96_tiprack_1000ul_eptips_F3 + - eppendorf_96_tiprack_1000ul_eptips_G3 + - eppendorf_96_tiprack_1000ul_eptips_H3 + - eppendorf_96_tiprack_1000ul_eptips_A4 + - eppendorf_96_tiprack_1000ul_eptips_B4 + - eppendorf_96_tiprack_1000ul_eptips_C4 + - eppendorf_96_tiprack_1000ul_eptips_D4 + - eppendorf_96_tiprack_1000ul_eptips_E4 + - eppendorf_96_tiprack_1000ul_eptips_F4 + - eppendorf_96_tiprack_1000ul_eptips_G4 + - eppendorf_96_tiprack_1000ul_eptips_H4 + - eppendorf_96_tiprack_1000ul_eptips_A5 + - eppendorf_96_tiprack_1000ul_eptips_B5 + - eppendorf_96_tiprack_1000ul_eptips_C5 + - eppendorf_96_tiprack_1000ul_eptips_D5 + - eppendorf_96_tiprack_1000ul_eptips_E5 + - eppendorf_96_tiprack_1000ul_eptips_F5 + - eppendorf_96_tiprack_1000ul_eptips_G5 + - eppendorf_96_tiprack_1000ul_eptips_H5 + - eppendorf_96_tiprack_1000ul_eptips_A6 + - eppendorf_96_tiprack_1000ul_eptips_B6 + - eppendorf_96_tiprack_1000ul_eptips_C6 + - eppendorf_96_tiprack_1000ul_eptips_D6 + - eppendorf_96_tiprack_1000ul_eptips_E6 + - eppendorf_96_tiprack_1000ul_eptips_F6 + - eppendorf_96_tiprack_1000ul_eptips_G6 + - eppendorf_96_tiprack_1000ul_eptips_H6 + - eppendorf_96_tiprack_1000ul_eptips_A7 + - eppendorf_96_tiprack_1000ul_eptips_B7 + - eppendorf_96_tiprack_1000ul_eptips_C7 + - eppendorf_96_tiprack_1000ul_eptips_D7 + - eppendorf_96_tiprack_1000ul_eptips_E7 + - eppendorf_96_tiprack_1000ul_eptips_F7 + - eppendorf_96_tiprack_1000ul_eptips_G7 + - eppendorf_96_tiprack_1000ul_eptips_H7 + - eppendorf_96_tiprack_1000ul_eptips_A8 + - eppendorf_96_tiprack_1000ul_eptips_B8 + - eppendorf_96_tiprack_1000ul_eptips_C8 + - eppendorf_96_tiprack_1000ul_eptips_D8 + - eppendorf_96_tiprack_1000ul_eptips_E8 + - eppendorf_96_tiprack_1000ul_eptips_F8 + - eppendorf_96_tiprack_1000ul_eptips_G8 + - eppendorf_96_tiprack_1000ul_eptips_H8 + - eppendorf_96_tiprack_1000ul_eptips_A9 + - eppendorf_96_tiprack_1000ul_eptips_B9 + - eppendorf_96_tiprack_1000ul_eptips_C9 + - eppendorf_96_tiprack_1000ul_eptips_D9 + - eppendorf_96_tiprack_1000ul_eptips_E9 + - eppendorf_96_tiprack_1000ul_eptips_F9 + - eppendorf_96_tiprack_1000ul_eptips_G9 + - eppendorf_96_tiprack_1000ul_eptips_H9 + - eppendorf_96_tiprack_1000ul_eptips_A10 + - eppendorf_96_tiprack_1000ul_eptips_B10 + - eppendorf_96_tiprack_1000ul_eptips_C10 + - eppendorf_96_tiprack_1000ul_eptips_D10 + - eppendorf_96_tiprack_1000ul_eptips_E10 + - eppendorf_96_tiprack_1000ul_eptips_F10 + - eppendorf_96_tiprack_1000ul_eptips_G10 + - eppendorf_96_tiprack_1000ul_eptips_H10 + - eppendorf_96_tiprack_1000ul_eptips_A11 + - eppendorf_96_tiprack_1000ul_eptips_B11 + - eppendorf_96_tiprack_1000ul_eptips_C11 + - eppendorf_96_tiprack_1000ul_eptips_D11 + - eppendorf_96_tiprack_1000ul_eptips_E11 + - eppendorf_96_tiprack_1000ul_eptips_F11 + - eppendorf_96_tiprack_1000ul_eptips_G11 + - eppendorf_96_tiprack_1000ul_eptips_H11 + - eppendorf_96_tiprack_1000ul_eptips_A12 + - eppendorf_96_tiprack_1000ul_eptips_B12 + - eppendorf_96_tiprack_1000ul_eptips_C12 + - eppendorf_96_tiprack_1000ul_eptips_D12 + - eppendorf_96_tiprack_1000ul_eptips_E12 + - eppendorf_96_tiprack_1000ul_eptips_F12 + - eppendorf_96_tiprack_1000ul_eptips_G12 + - eppendorf_96_tiprack_1000ul_eptips_H12 + class: '' + config: + barcode: null + category: tip_rack + model: Eppendorf epT.I.P.S. 96 Tip Rack 1000 µL + ordering: + A1: eppendorf_96_tiprack_1000ul_eptips_A1 + B1: eppendorf_96_tiprack_1000ul_eptips_B1 + C1: eppendorf_96_tiprack_1000ul_eptips_C1 + D1: eppendorf_96_tiprack_1000ul_eptips_D1 + E1: eppendorf_96_tiprack_1000ul_eptips_E1 + F1: eppendorf_96_tiprack_1000ul_eptips_F1 + G1: eppendorf_96_tiprack_1000ul_eptips_G1 + H1: eppendorf_96_tiprack_1000ul_eptips_H1 + A2: eppendorf_96_tiprack_1000ul_eptips_A2 + B2: eppendorf_96_tiprack_1000ul_eptips_B2 + C2: eppendorf_96_tiprack_1000ul_eptips_C2 + D2: eppendorf_96_tiprack_1000ul_eptips_D2 + E2: eppendorf_96_tiprack_1000ul_eptips_E2 + F2: eppendorf_96_tiprack_1000ul_eptips_F2 + G2: eppendorf_96_tiprack_1000ul_eptips_G2 + H2: eppendorf_96_tiprack_1000ul_eptips_H2 + A3: eppendorf_96_tiprack_1000ul_eptips_A3 + B3: eppendorf_96_tiprack_1000ul_eptips_B3 + C3: eppendorf_96_tiprack_1000ul_eptips_C3 + D3: eppendorf_96_tiprack_1000ul_eptips_D3 + E3: eppendorf_96_tiprack_1000ul_eptips_E3 + F3: eppendorf_96_tiprack_1000ul_eptips_F3 + G3: eppendorf_96_tiprack_1000ul_eptips_G3 + H3: eppendorf_96_tiprack_1000ul_eptips_H3 + A4: eppendorf_96_tiprack_1000ul_eptips_A4 + B4: eppendorf_96_tiprack_1000ul_eptips_B4 + C4: eppendorf_96_tiprack_1000ul_eptips_C4 + D4: eppendorf_96_tiprack_1000ul_eptips_D4 + E4: eppendorf_96_tiprack_1000ul_eptips_E4 + F4: eppendorf_96_tiprack_1000ul_eptips_F4 + G4: eppendorf_96_tiprack_1000ul_eptips_G4 + H4: eppendorf_96_tiprack_1000ul_eptips_H4 + A5: eppendorf_96_tiprack_1000ul_eptips_A5 + B5: eppendorf_96_tiprack_1000ul_eptips_B5 + C5: eppendorf_96_tiprack_1000ul_eptips_C5 + D5: eppendorf_96_tiprack_1000ul_eptips_D5 + E5: eppendorf_96_tiprack_1000ul_eptips_E5 + F5: eppendorf_96_tiprack_1000ul_eptips_F5 + G5: eppendorf_96_tiprack_1000ul_eptips_G5 + H5: eppendorf_96_tiprack_1000ul_eptips_H5 + A6: eppendorf_96_tiprack_1000ul_eptips_A6 + B6: eppendorf_96_tiprack_1000ul_eptips_B6 + C6: eppendorf_96_tiprack_1000ul_eptips_C6 + D6: eppendorf_96_tiprack_1000ul_eptips_D6 + E6: eppendorf_96_tiprack_1000ul_eptips_E6 + F6: eppendorf_96_tiprack_1000ul_eptips_F6 + G6: eppendorf_96_tiprack_1000ul_eptips_G6 + H6: eppendorf_96_tiprack_1000ul_eptips_H6 + A7: eppendorf_96_tiprack_1000ul_eptips_A7 + B7: eppendorf_96_tiprack_1000ul_eptips_B7 + C7: eppendorf_96_tiprack_1000ul_eptips_C7 + D7: eppendorf_96_tiprack_1000ul_eptips_D7 + E7: eppendorf_96_tiprack_1000ul_eptips_E7 + F7: eppendorf_96_tiprack_1000ul_eptips_F7 + G7: eppendorf_96_tiprack_1000ul_eptips_G7 + H7: eppendorf_96_tiprack_1000ul_eptips_H7 + A8: eppendorf_96_tiprack_1000ul_eptips_A8 + B8: eppendorf_96_tiprack_1000ul_eptips_B8 + C8: eppendorf_96_tiprack_1000ul_eptips_C8 + D8: eppendorf_96_tiprack_1000ul_eptips_D8 + E8: eppendorf_96_tiprack_1000ul_eptips_E8 + F8: eppendorf_96_tiprack_1000ul_eptips_F8 + G8: eppendorf_96_tiprack_1000ul_eptips_G8 + H8: eppendorf_96_tiprack_1000ul_eptips_H8 + A9: eppendorf_96_tiprack_1000ul_eptips_A9 + B9: eppendorf_96_tiprack_1000ul_eptips_B9 + C9: eppendorf_96_tiprack_1000ul_eptips_C9 + D9: eppendorf_96_tiprack_1000ul_eptips_D9 + E9: eppendorf_96_tiprack_1000ul_eptips_E9 + F9: eppendorf_96_tiprack_1000ul_eptips_F9 + G9: eppendorf_96_tiprack_1000ul_eptips_G9 + H9: eppendorf_96_tiprack_1000ul_eptips_H9 + A10: eppendorf_96_tiprack_1000ul_eptips_A10 + B10: eppendorf_96_tiprack_1000ul_eptips_B10 + C10: eppendorf_96_tiprack_1000ul_eptips_C10 + D10: eppendorf_96_tiprack_1000ul_eptips_D10 + E10: eppendorf_96_tiprack_1000ul_eptips_E10 + F10: eppendorf_96_tiprack_1000ul_eptips_F10 + G10: eppendorf_96_tiprack_1000ul_eptips_G10 + H10: eppendorf_96_tiprack_1000ul_eptips_H10 + A11: eppendorf_96_tiprack_1000ul_eptips_A11 + B11: eppendorf_96_tiprack_1000ul_eptips_B11 + C11: eppendorf_96_tiprack_1000ul_eptips_C11 + D11: eppendorf_96_tiprack_1000ul_eptips_D11 + E11: eppendorf_96_tiprack_1000ul_eptips_E11 + F11: eppendorf_96_tiprack_1000ul_eptips_F11 + G11: eppendorf_96_tiprack_1000ul_eptips_G11 + H11: eppendorf_96_tiprack_1000ul_eptips_H11 + A12: eppendorf_96_tiprack_1000ul_eptips_A12 + B12: eppendorf_96_tiprack_1000ul_eptips_B12 + C12: eppendorf_96_tiprack_1000ul_eptips_C12 + D12: eppendorf_96_tiprack_1000ul_eptips_D12 + E12: eppendorf_96_tiprack_1000ul_eptips_E12 + F12: eppendorf_96_tiprack_1000ul_eptips_F12 + G12: eppendorf_96_tiprack_1000ul_eptips_G12 + H12: eppendorf_96_tiprack_1000ul_eptips_H12 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.76 + size_y: 85.48 + size_z: 121.9 + type: TipRack + data: {} + id: eppendorf_96_tiprack_1000ul_eptips + name: eppendorf_96_tiprack_1000ul_eptips + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_A1 + name: eppendorf_96_tiprack_1000ul_eptips_A1 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 11.2685 + y: 71.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_B1 + name: eppendorf_96_tiprack_1000ul_eptips_B1 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 11.2685 + y: 62.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_C1 + name: eppendorf_96_tiprack_1000ul_eptips_C1 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 11.2685 + y: 53.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_D1 + name: eppendorf_96_tiprack_1000ul_eptips_D1 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 11.2685 + y: 44.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_E1 + name: eppendorf_96_tiprack_1000ul_eptips_E1 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 11.2685 + y: 35.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_F1 + name: eppendorf_96_tiprack_1000ul_eptips_F1 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 11.2685 + y: 26.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_G1 + name: eppendorf_96_tiprack_1000ul_eptips_G1 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 11.2685 + y: 17.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_H1 + name: eppendorf_96_tiprack_1000ul_eptips_H1 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 11.2685 + y: 8.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_A2 + name: eppendorf_96_tiprack_1000ul_eptips_A2 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 20.2685 + y: 71.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_B2 + name: eppendorf_96_tiprack_1000ul_eptips_B2 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 20.2685 + y: 62.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_C2 + name: eppendorf_96_tiprack_1000ul_eptips_C2 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 20.2685 + y: 53.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_D2 + name: eppendorf_96_tiprack_1000ul_eptips_D2 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 20.2685 + y: 44.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_E2 + name: eppendorf_96_tiprack_1000ul_eptips_E2 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 20.2685 + y: 35.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_F2 + name: eppendorf_96_tiprack_1000ul_eptips_F2 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 20.2685 + y: 26.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_G2 + name: eppendorf_96_tiprack_1000ul_eptips_G2 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 20.2685 + y: 17.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_H2 + name: eppendorf_96_tiprack_1000ul_eptips_H2 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 20.2685 + y: 8.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_A3 + name: eppendorf_96_tiprack_1000ul_eptips_A3 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 29.2685 + y: 71.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_B3 + name: eppendorf_96_tiprack_1000ul_eptips_B3 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 29.2685 + y: 62.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_C3 + name: eppendorf_96_tiprack_1000ul_eptips_C3 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 29.2685 + y: 53.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_D3 + name: eppendorf_96_tiprack_1000ul_eptips_D3 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 29.2685 + y: 44.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_E3 + name: eppendorf_96_tiprack_1000ul_eptips_E3 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 29.2685 + y: 35.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_F3 + name: eppendorf_96_tiprack_1000ul_eptips_F3 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 29.2685 + y: 26.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_G3 + name: eppendorf_96_tiprack_1000ul_eptips_G3 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 29.2685 + y: 17.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_H3 + name: eppendorf_96_tiprack_1000ul_eptips_H3 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 29.2685 + y: 8.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_A4 + name: eppendorf_96_tiprack_1000ul_eptips_A4 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 38.2685 + y: 71.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_B4 + name: eppendorf_96_tiprack_1000ul_eptips_B4 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 38.2685 + y: 62.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_C4 + name: eppendorf_96_tiprack_1000ul_eptips_C4 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 38.2685 + y: 53.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_D4 + name: eppendorf_96_tiprack_1000ul_eptips_D4 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 38.2685 + y: 44.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_E4 + name: eppendorf_96_tiprack_1000ul_eptips_E4 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 38.2685 + y: 35.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_F4 + name: eppendorf_96_tiprack_1000ul_eptips_F4 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 38.2685 + y: 26.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_G4 + name: eppendorf_96_tiprack_1000ul_eptips_G4 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 38.2685 + y: 17.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_H4 + name: eppendorf_96_tiprack_1000ul_eptips_H4 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 38.2685 + y: 8.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_A5 + name: eppendorf_96_tiprack_1000ul_eptips_A5 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 47.2685 + y: 71.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_B5 + name: eppendorf_96_tiprack_1000ul_eptips_B5 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 47.2685 + y: 62.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_C5 + name: eppendorf_96_tiprack_1000ul_eptips_C5 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 47.2685 + y: 53.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_D5 + name: eppendorf_96_tiprack_1000ul_eptips_D5 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 47.2685 + y: 44.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_E5 + name: eppendorf_96_tiprack_1000ul_eptips_E5 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 47.2685 + y: 35.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_F5 + name: eppendorf_96_tiprack_1000ul_eptips_F5 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 47.2685 + y: 26.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_G5 + name: eppendorf_96_tiprack_1000ul_eptips_G5 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 47.2685 + y: 17.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_H5 + name: eppendorf_96_tiprack_1000ul_eptips_H5 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 47.2685 + y: 8.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_A6 + name: eppendorf_96_tiprack_1000ul_eptips_A6 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 56.2685 + y: 71.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_B6 + name: eppendorf_96_tiprack_1000ul_eptips_B6 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 56.2685 + y: 62.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_C6 + name: eppendorf_96_tiprack_1000ul_eptips_C6 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 56.2685 + y: 53.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_D6 + name: eppendorf_96_tiprack_1000ul_eptips_D6 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 56.2685 + y: 44.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_E6 + name: eppendorf_96_tiprack_1000ul_eptips_E6 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 56.2685 + y: 35.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_F6 + name: eppendorf_96_tiprack_1000ul_eptips_F6 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 56.2685 + y: 26.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_G6 + name: eppendorf_96_tiprack_1000ul_eptips_G6 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 56.2685 + y: 17.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_H6 + name: eppendorf_96_tiprack_1000ul_eptips_H6 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 56.2685 + y: 8.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_A7 + name: eppendorf_96_tiprack_1000ul_eptips_A7 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 65.2685 + y: 71.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_B7 + name: eppendorf_96_tiprack_1000ul_eptips_B7 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 65.2685 + y: 62.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_C7 + name: eppendorf_96_tiprack_1000ul_eptips_C7 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 65.2685 + y: 53.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_D7 + name: eppendorf_96_tiprack_1000ul_eptips_D7 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 65.2685 + y: 44.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_E7 + name: eppendorf_96_tiprack_1000ul_eptips_E7 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 65.2685 + y: 35.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_F7 + name: eppendorf_96_tiprack_1000ul_eptips_F7 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 65.2685 + y: 26.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_G7 + name: eppendorf_96_tiprack_1000ul_eptips_G7 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 65.2685 + y: 17.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_H7 + name: eppendorf_96_tiprack_1000ul_eptips_H7 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 65.2685 + y: 8.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_A8 + name: eppendorf_96_tiprack_1000ul_eptips_A8 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 74.2685 + y: 71.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_B8 + name: eppendorf_96_tiprack_1000ul_eptips_B8 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 74.2685 + y: 62.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_C8 + name: eppendorf_96_tiprack_1000ul_eptips_C8 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 74.2685 + y: 53.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_D8 + name: eppendorf_96_tiprack_1000ul_eptips_D8 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 74.2685 + y: 44.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_E8 + name: eppendorf_96_tiprack_1000ul_eptips_E8 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 74.2685 + y: 35.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_F8 + name: eppendorf_96_tiprack_1000ul_eptips_F8 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 74.2685 + y: 26.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_G8 + name: eppendorf_96_tiprack_1000ul_eptips_G8 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 74.2685 + y: 17.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_H8 + name: eppendorf_96_tiprack_1000ul_eptips_H8 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 74.2685 + y: 8.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_A9 + name: eppendorf_96_tiprack_1000ul_eptips_A9 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 83.2685 + y: 71.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_B9 + name: eppendorf_96_tiprack_1000ul_eptips_B9 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 83.2685 + y: 62.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_C9 + name: eppendorf_96_tiprack_1000ul_eptips_C9 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 83.2685 + y: 53.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_D9 + name: eppendorf_96_tiprack_1000ul_eptips_D9 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 83.2685 + y: 44.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_E9 + name: eppendorf_96_tiprack_1000ul_eptips_E9 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 83.2685 + y: 35.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_F9 + name: eppendorf_96_tiprack_1000ul_eptips_F9 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 83.2685 + y: 26.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_G9 + name: eppendorf_96_tiprack_1000ul_eptips_G9 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 83.2685 + y: 17.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_H9 + name: eppendorf_96_tiprack_1000ul_eptips_H9 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 83.2685 + y: 8.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_A10 + name: eppendorf_96_tiprack_1000ul_eptips_A10 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 92.2685 + y: 71.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_B10 + name: eppendorf_96_tiprack_1000ul_eptips_B10 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 92.2685 + y: 62.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_C10 + name: eppendorf_96_tiprack_1000ul_eptips_C10 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 92.2685 + y: 53.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_D10 + name: eppendorf_96_tiprack_1000ul_eptips_D10 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 92.2685 + y: 44.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_E10 + name: eppendorf_96_tiprack_1000ul_eptips_E10 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 92.2685 + y: 35.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_F10 + name: eppendorf_96_tiprack_1000ul_eptips_F10 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 92.2685 + y: 26.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_G10 + name: eppendorf_96_tiprack_1000ul_eptips_G10 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 92.2685 + y: 17.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_H10 + name: eppendorf_96_tiprack_1000ul_eptips_H10 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 92.2685 + y: 8.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_A11 + name: eppendorf_96_tiprack_1000ul_eptips_A11 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 101.2685 + y: 71.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_B11 + name: eppendorf_96_tiprack_1000ul_eptips_B11 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 101.2685 + y: 62.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_C11 + name: eppendorf_96_tiprack_1000ul_eptips_C11 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 101.2685 + y: 53.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_D11 + name: eppendorf_96_tiprack_1000ul_eptips_D11 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 101.2685 + y: 44.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_E11 + name: eppendorf_96_tiprack_1000ul_eptips_E11 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 101.2685 + y: 35.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_F11 + name: eppendorf_96_tiprack_1000ul_eptips_F11 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 101.2685 + y: 26.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_G11 + name: eppendorf_96_tiprack_1000ul_eptips_G11 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 101.2685 + y: 17.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_H11 + name: eppendorf_96_tiprack_1000ul_eptips_H11 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 101.2685 + y: 8.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_A12 + name: eppendorf_96_tiprack_1000ul_eptips_A12 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 110.2685 + y: 71.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_B12 + name: eppendorf_96_tiprack_1000ul_eptips_B12 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 110.2685 + y: 62.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_C12 + name: eppendorf_96_tiprack_1000ul_eptips_C12 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 110.2685 + y: 53.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_D12 + name: eppendorf_96_tiprack_1000ul_eptips_D12 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 110.2685 + y: 44.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_E12 + name: eppendorf_96_tiprack_1000ul_eptips_E12 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 110.2685 + y: 35.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_F12 + name: eppendorf_96_tiprack_1000ul_eptips_F12 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 110.2685 + y: 26.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_G12 + name: eppendorf_96_tiprack_1000ul_eptips_G12 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 110.2685 + y: 17.1285 + z: 56.9 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip: + fitting_depth: 0 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 70.7 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_1000ul_eptips_H12 + name: eppendorf_96_tiprack_1000ul_eptips_H12 + parent: eppendorf_96_tiprack_1000ul_eptips + position: + x: 110.2685 + y: 8.1285 + z: 56.9 + sample_id: null + type: container + description: Eppendorf 96 tiprack 1000ul eptips + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/tip_racks.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 eppendorf_96_tiprack_10ul_eptips: - description: Eppendorf 96 tiprack 10ul eptips - class: + category: + - tip_racks + class: module: pylabrobot.resources.opentrons.tip_racks:eppendorf_96_tiprack_10ul_eptips type: pylabrobot - -opentrons_96_tiprack_1000ul: - description: Opentrons 96 tiprack 1000ul - class: - module: pylabrobot.resources.opentrons.tip_racks:opentrons_96_tiprack_1000ul - type: pylabrobot - -opentrons_96_tiprack_20ul: - description: Opentrons 96 tiprack 20ul - class: - module: pylabrobot.resources.opentrons.tip_racks:opentrons_96_tiprack_20ul - type: pylabrobot - -opentrons_96_filtertiprack_1000ul: - description: Opentrons 96 filtertiprack 1000ul - class: - module: pylabrobot.resources.opentrons.tip_racks:opentrons_96_filtertiprack_1000ul - type: pylabrobot - model: - type: resource - mesh: tecan_nested_tip_rack/meshes/plate.stl - mesh_tf: [0.064, 0.043, 0, -1.5708, 0, 1.5708] - children_mesh: generic_labware_tube_10_75/meshes/0_base.stl - children_mesh_tf: [0.0018, 0.0018, 0, -1.5708,0, 0] - -opentrons_96_filtertiprack_20ul: - description: Opentrons 96 filtertiprack 20ul - class: - module: pylabrobot.resources.opentrons.tip_racks:opentrons_96_filtertiprack_20ul - type: pylabrobot - + config_info: + - children: + - eppendorf_96_tiprack_10ul_eptips_A1 + - eppendorf_96_tiprack_10ul_eptips_B1 + - eppendorf_96_tiprack_10ul_eptips_C1 + - eppendorf_96_tiprack_10ul_eptips_D1 + - eppendorf_96_tiprack_10ul_eptips_E1 + - eppendorf_96_tiprack_10ul_eptips_F1 + - eppendorf_96_tiprack_10ul_eptips_G1 + - eppendorf_96_tiprack_10ul_eptips_H1 + - eppendorf_96_tiprack_10ul_eptips_A2 + - eppendorf_96_tiprack_10ul_eptips_B2 + - eppendorf_96_tiprack_10ul_eptips_C2 + - eppendorf_96_tiprack_10ul_eptips_D2 + - eppendorf_96_tiprack_10ul_eptips_E2 + - eppendorf_96_tiprack_10ul_eptips_F2 + - eppendorf_96_tiprack_10ul_eptips_G2 + - eppendorf_96_tiprack_10ul_eptips_H2 + - eppendorf_96_tiprack_10ul_eptips_A3 + - eppendorf_96_tiprack_10ul_eptips_B3 + - eppendorf_96_tiprack_10ul_eptips_C3 + - eppendorf_96_tiprack_10ul_eptips_D3 + - eppendorf_96_tiprack_10ul_eptips_E3 + - eppendorf_96_tiprack_10ul_eptips_F3 + - eppendorf_96_tiprack_10ul_eptips_G3 + - eppendorf_96_tiprack_10ul_eptips_H3 + - eppendorf_96_tiprack_10ul_eptips_A4 + - eppendorf_96_tiprack_10ul_eptips_B4 + - eppendorf_96_tiprack_10ul_eptips_C4 + - eppendorf_96_tiprack_10ul_eptips_D4 + - eppendorf_96_tiprack_10ul_eptips_E4 + - eppendorf_96_tiprack_10ul_eptips_F4 + - eppendorf_96_tiprack_10ul_eptips_G4 + - eppendorf_96_tiprack_10ul_eptips_H4 + - eppendorf_96_tiprack_10ul_eptips_A5 + - eppendorf_96_tiprack_10ul_eptips_B5 + - eppendorf_96_tiprack_10ul_eptips_C5 + - eppendorf_96_tiprack_10ul_eptips_D5 + - eppendorf_96_tiprack_10ul_eptips_E5 + - eppendorf_96_tiprack_10ul_eptips_F5 + - eppendorf_96_tiprack_10ul_eptips_G5 + - eppendorf_96_tiprack_10ul_eptips_H5 + - eppendorf_96_tiprack_10ul_eptips_A6 + - eppendorf_96_tiprack_10ul_eptips_B6 + - eppendorf_96_tiprack_10ul_eptips_C6 + - eppendorf_96_tiprack_10ul_eptips_D6 + - eppendorf_96_tiprack_10ul_eptips_E6 + - eppendorf_96_tiprack_10ul_eptips_F6 + - eppendorf_96_tiprack_10ul_eptips_G6 + - eppendorf_96_tiprack_10ul_eptips_H6 + - eppendorf_96_tiprack_10ul_eptips_A7 + - eppendorf_96_tiprack_10ul_eptips_B7 + - eppendorf_96_tiprack_10ul_eptips_C7 + - eppendorf_96_tiprack_10ul_eptips_D7 + - eppendorf_96_tiprack_10ul_eptips_E7 + - eppendorf_96_tiprack_10ul_eptips_F7 + - eppendorf_96_tiprack_10ul_eptips_G7 + - eppendorf_96_tiprack_10ul_eptips_H7 + - eppendorf_96_tiprack_10ul_eptips_A8 + - eppendorf_96_tiprack_10ul_eptips_B8 + - eppendorf_96_tiprack_10ul_eptips_C8 + - eppendorf_96_tiprack_10ul_eptips_D8 + - eppendorf_96_tiprack_10ul_eptips_E8 + - eppendorf_96_tiprack_10ul_eptips_F8 + - eppendorf_96_tiprack_10ul_eptips_G8 + - eppendorf_96_tiprack_10ul_eptips_H8 + - eppendorf_96_tiprack_10ul_eptips_A9 + - eppendorf_96_tiprack_10ul_eptips_B9 + - eppendorf_96_tiprack_10ul_eptips_C9 + - eppendorf_96_tiprack_10ul_eptips_D9 + - eppendorf_96_tiprack_10ul_eptips_E9 + - eppendorf_96_tiprack_10ul_eptips_F9 + - eppendorf_96_tiprack_10ul_eptips_G9 + - eppendorf_96_tiprack_10ul_eptips_H9 + - eppendorf_96_tiprack_10ul_eptips_A10 + - eppendorf_96_tiprack_10ul_eptips_B10 + - eppendorf_96_tiprack_10ul_eptips_C10 + - eppendorf_96_tiprack_10ul_eptips_D10 + - eppendorf_96_tiprack_10ul_eptips_E10 + - eppendorf_96_tiprack_10ul_eptips_F10 + - eppendorf_96_tiprack_10ul_eptips_G10 + - eppendorf_96_tiprack_10ul_eptips_H10 + - eppendorf_96_tiprack_10ul_eptips_A11 + - eppendorf_96_tiprack_10ul_eptips_B11 + - eppendorf_96_tiprack_10ul_eptips_C11 + - eppendorf_96_tiprack_10ul_eptips_D11 + - eppendorf_96_tiprack_10ul_eptips_E11 + - eppendorf_96_tiprack_10ul_eptips_F11 + - eppendorf_96_tiprack_10ul_eptips_G11 + - eppendorf_96_tiprack_10ul_eptips_H11 + - eppendorf_96_tiprack_10ul_eptips_A12 + - eppendorf_96_tiprack_10ul_eptips_B12 + - eppendorf_96_tiprack_10ul_eptips_C12 + - eppendorf_96_tiprack_10ul_eptips_D12 + - eppendorf_96_tiprack_10ul_eptips_E12 + - eppendorf_96_tiprack_10ul_eptips_F12 + - eppendorf_96_tiprack_10ul_eptips_G12 + - eppendorf_96_tiprack_10ul_eptips_H12 + class: '' + config: + barcode: null + category: tip_rack + model: Eppendorf epT.I.P.S. 96 Tip Rack 10 µL + ordering: + A1: eppendorf_96_tiprack_10ul_eptips_A1 + B1: eppendorf_96_tiprack_10ul_eptips_B1 + C1: eppendorf_96_tiprack_10ul_eptips_C1 + D1: eppendorf_96_tiprack_10ul_eptips_D1 + E1: eppendorf_96_tiprack_10ul_eptips_E1 + F1: eppendorf_96_tiprack_10ul_eptips_F1 + G1: eppendorf_96_tiprack_10ul_eptips_G1 + H1: eppendorf_96_tiprack_10ul_eptips_H1 + A2: eppendorf_96_tiprack_10ul_eptips_A2 + B2: eppendorf_96_tiprack_10ul_eptips_B2 + C2: eppendorf_96_tiprack_10ul_eptips_C2 + D2: eppendorf_96_tiprack_10ul_eptips_D2 + E2: eppendorf_96_tiprack_10ul_eptips_E2 + F2: eppendorf_96_tiprack_10ul_eptips_F2 + G2: eppendorf_96_tiprack_10ul_eptips_G2 + H2: eppendorf_96_tiprack_10ul_eptips_H2 + A3: eppendorf_96_tiprack_10ul_eptips_A3 + B3: eppendorf_96_tiprack_10ul_eptips_B3 + C3: eppendorf_96_tiprack_10ul_eptips_C3 + D3: eppendorf_96_tiprack_10ul_eptips_D3 + E3: eppendorf_96_tiprack_10ul_eptips_E3 + F3: eppendorf_96_tiprack_10ul_eptips_F3 + G3: eppendorf_96_tiprack_10ul_eptips_G3 + H3: eppendorf_96_tiprack_10ul_eptips_H3 + A4: eppendorf_96_tiprack_10ul_eptips_A4 + B4: eppendorf_96_tiprack_10ul_eptips_B4 + C4: eppendorf_96_tiprack_10ul_eptips_C4 + D4: eppendorf_96_tiprack_10ul_eptips_D4 + E4: eppendorf_96_tiprack_10ul_eptips_E4 + F4: eppendorf_96_tiprack_10ul_eptips_F4 + G4: eppendorf_96_tiprack_10ul_eptips_G4 + H4: eppendorf_96_tiprack_10ul_eptips_H4 + A5: eppendorf_96_tiprack_10ul_eptips_A5 + B5: eppendorf_96_tiprack_10ul_eptips_B5 + C5: eppendorf_96_tiprack_10ul_eptips_C5 + D5: eppendorf_96_tiprack_10ul_eptips_D5 + E5: eppendorf_96_tiprack_10ul_eptips_E5 + F5: eppendorf_96_tiprack_10ul_eptips_F5 + G5: eppendorf_96_tiprack_10ul_eptips_G5 + H5: eppendorf_96_tiprack_10ul_eptips_H5 + A6: eppendorf_96_tiprack_10ul_eptips_A6 + B6: eppendorf_96_tiprack_10ul_eptips_B6 + C6: eppendorf_96_tiprack_10ul_eptips_C6 + D6: eppendorf_96_tiprack_10ul_eptips_D6 + E6: eppendorf_96_tiprack_10ul_eptips_E6 + F6: eppendorf_96_tiprack_10ul_eptips_F6 + G6: eppendorf_96_tiprack_10ul_eptips_G6 + H6: eppendorf_96_tiprack_10ul_eptips_H6 + A7: eppendorf_96_tiprack_10ul_eptips_A7 + B7: eppendorf_96_tiprack_10ul_eptips_B7 + C7: eppendorf_96_tiprack_10ul_eptips_C7 + D7: eppendorf_96_tiprack_10ul_eptips_D7 + E7: eppendorf_96_tiprack_10ul_eptips_E7 + F7: eppendorf_96_tiprack_10ul_eptips_F7 + G7: eppendorf_96_tiprack_10ul_eptips_G7 + H7: eppendorf_96_tiprack_10ul_eptips_H7 + A8: eppendorf_96_tiprack_10ul_eptips_A8 + B8: eppendorf_96_tiprack_10ul_eptips_B8 + C8: eppendorf_96_tiprack_10ul_eptips_C8 + D8: eppendorf_96_tiprack_10ul_eptips_D8 + E8: eppendorf_96_tiprack_10ul_eptips_E8 + F8: eppendorf_96_tiprack_10ul_eptips_F8 + G8: eppendorf_96_tiprack_10ul_eptips_G8 + H8: eppendorf_96_tiprack_10ul_eptips_H8 + A9: eppendorf_96_tiprack_10ul_eptips_A9 + B9: eppendorf_96_tiprack_10ul_eptips_B9 + C9: eppendorf_96_tiprack_10ul_eptips_C9 + D9: eppendorf_96_tiprack_10ul_eptips_D9 + E9: eppendorf_96_tiprack_10ul_eptips_E9 + F9: eppendorf_96_tiprack_10ul_eptips_F9 + G9: eppendorf_96_tiprack_10ul_eptips_G9 + H9: eppendorf_96_tiprack_10ul_eptips_H9 + A10: eppendorf_96_tiprack_10ul_eptips_A10 + B10: eppendorf_96_tiprack_10ul_eptips_B10 + C10: eppendorf_96_tiprack_10ul_eptips_C10 + D10: eppendorf_96_tiprack_10ul_eptips_D10 + E10: eppendorf_96_tiprack_10ul_eptips_E10 + F10: eppendorf_96_tiprack_10ul_eptips_F10 + G10: eppendorf_96_tiprack_10ul_eptips_G10 + H10: eppendorf_96_tiprack_10ul_eptips_H10 + A11: eppendorf_96_tiprack_10ul_eptips_A11 + B11: eppendorf_96_tiprack_10ul_eptips_B11 + C11: eppendorf_96_tiprack_10ul_eptips_C11 + D11: eppendorf_96_tiprack_10ul_eptips_D11 + E11: eppendorf_96_tiprack_10ul_eptips_E11 + F11: eppendorf_96_tiprack_10ul_eptips_F11 + G11: eppendorf_96_tiprack_10ul_eptips_G11 + H11: eppendorf_96_tiprack_10ul_eptips_H11 + A12: eppendorf_96_tiprack_10ul_eptips_A12 + B12: eppendorf_96_tiprack_10ul_eptips_B12 + C12: eppendorf_96_tiprack_10ul_eptips_C12 + D12: eppendorf_96_tiprack_10ul_eptips_D12 + E12: eppendorf_96_tiprack_10ul_eptips_E12 + F12: eppendorf_96_tiprack_10ul_eptips_F12 + G12: eppendorf_96_tiprack_10ul_eptips_G12 + H12: eppendorf_96_tiprack_10ul_eptips_H12 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.76 + size_y: 85.48 + size_z: 65.4 + type: TipRack + data: {} + id: eppendorf_96_tiprack_10ul_eptips + name: eppendorf_96_tiprack_10ul_eptips + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_A1 + name: eppendorf_96_tiprack_10ul_eptips_A1 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 12.2585 + y: 72.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_B1 + name: eppendorf_96_tiprack_10ul_eptips_B1 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 12.2585 + y: 63.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_C1 + name: eppendorf_96_tiprack_10ul_eptips_C1 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 12.2585 + y: 54.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_D1 + name: eppendorf_96_tiprack_10ul_eptips_D1 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 12.2585 + y: 45.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_E1 + name: eppendorf_96_tiprack_10ul_eptips_E1 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 12.2585 + y: 36.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_F1 + name: eppendorf_96_tiprack_10ul_eptips_F1 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 12.2585 + y: 27.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_G1 + name: eppendorf_96_tiprack_10ul_eptips_G1 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 12.2585 + y: 18.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_H1 + name: eppendorf_96_tiprack_10ul_eptips_H1 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 12.2585 + y: 9.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_A2 + name: eppendorf_96_tiprack_10ul_eptips_A2 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 21.2585 + y: 72.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_B2 + name: eppendorf_96_tiprack_10ul_eptips_B2 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 21.2585 + y: 63.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_C2 + name: eppendorf_96_tiprack_10ul_eptips_C2 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 21.2585 + y: 54.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_D2 + name: eppendorf_96_tiprack_10ul_eptips_D2 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 21.2585 + y: 45.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_E2 + name: eppendorf_96_tiprack_10ul_eptips_E2 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 21.2585 + y: 36.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_F2 + name: eppendorf_96_tiprack_10ul_eptips_F2 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 21.2585 + y: 27.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_G2 + name: eppendorf_96_tiprack_10ul_eptips_G2 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 21.2585 + y: 18.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_H2 + name: eppendorf_96_tiprack_10ul_eptips_H2 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 21.2585 + y: 9.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_A3 + name: eppendorf_96_tiprack_10ul_eptips_A3 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 30.2585 + y: 72.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_B3 + name: eppendorf_96_tiprack_10ul_eptips_B3 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 30.2585 + y: 63.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_C3 + name: eppendorf_96_tiprack_10ul_eptips_C3 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 30.2585 + y: 54.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_D3 + name: eppendorf_96_tiprack_10ul_eptips_D3 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 30.2585 + y: 45.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_E3 + name: eppendorf_96_tiprack_10ul_eptips_E3 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 30.2585 + y: 36.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_F3 + name: eppendorf_96_tiprack_10ul_eptips_F3 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 30.2585 + y: 27.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_G3 + name: eppendorf_96_tiprack_10ul_eptips_G3 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 30.2585 + y: 18.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_H3 + name: eppendorf_96_tiprack_10ul_eptips_H3 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 30.2585 + y: 9.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_A4 + name: eppendorf_96_tiprack_10ul_eptips_A4 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 39.2585 + y: 72.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_B4 + name: eppendorf_96_tiprack_10ul_eptips_B4 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 39.2585 + y: 63.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_C4 + name: eppendorf_96_tiprack_10ul_eptips_C4 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 39.2585 + y: 54.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_D4 + name: eppendorf_96_tiprack_10ul_eptips_D4 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 39.2585 + y: 45.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_E4 + name: eppendorf_96_tiprack_10ul_eptips_E4 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 39.2585 + y: 36.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_F4 + name: eppendorf_96_tiprack_10ul_eptips_F4 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 39.2585 + y: 27.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_G4 + name: eppendorf_96_tiprack_10ul_eptips_G4 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 39.2585 + y: 18.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_H4 + name: eppendorf_96_tiprack_10ul_eptips_H4 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 39.2585 + y: 9.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_A5 + name: eppendorf_96_tiprack_10ul_eptips_A5 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 48.2585 + y: 72.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_B5 + name: eppendorf_96_tiprack_10ul_eptips_B5 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 48.2585 + y: 63.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_C5 + name: eppendorf_96_tiprack_10ul_eptips_C5 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 48.2585 + y: 54.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_D5 + name: eppendorf_96_tiprack_10ul_eptips_D5 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 48.2585 + y: 45.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_E5 + name: eppendorf_96_tiprack_10ul_eptips_E5 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 48.2585 + y: 36.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_F5 + name: eppendorf_96_tiprack_10ul_eptips_F5 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 48.2585 + y: 27.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_G5 + name: eppendorf_96_tiprack_10ul_eptips_G5 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 48.2585 + y: 18.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_H5 + name: eppendorf_96_tiprack_10ul_eptips_H5 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 48.2585 + y: 9.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_A6 + name: eppendorf_96_tiprack_10ul_eptips_A6 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 57.2585 + y: 72.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_B6 + name: eppendorf_96_tiprack_10ul_eptips_B6 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 57.2585 + y: 63.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_C6 + name: eppendorf_96_tiprack_10ul_eptips_C6 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 57.2585 + y: 54.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_D6 + name: eppendorf_96_tiprack_10ul_eptips_D6 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 57.2585 + y: 45.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_E6 + name: eppendorf_96_tiprack_10ul_eptips_E6 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 57.2585 + y: 36.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_F6 + name: eppendorf_96_tiprack_10ul_eptips_F6 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 57.2585 + y: 27.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_G6 + name: eppendorf_96_tiprack_10ul_eptips_G6 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 57.2585 + y: 18.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_H6 + name: eppendorf_96_tiprack_10ul_eptips_H6 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 57.2585 + y: 9.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_A7 + name: eppendorf_96_tiprack_10ul_eptips_A7 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 66.2585 + y: 72.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_B7 + name: eppendorf_96_tiprack_10ul_eptips_B7 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 66.2585 + y: 63.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_C7 + name: eppendorf_96_tiprack_10ul_eptips_C7 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 66.2585 + y: 54.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_D7 + name: eppendorf_96_tiprack_10ul_eptips_D7 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 66.2585 + y: 45.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_E7 + name: eppendorf_96_tiprack_10ul_eptips_E7 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 66.2585 + y: 36.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_F7 + name: eppendorf_96_tiprack_10ul_eptips_F7 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 66.2585 + y: 27.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_G7 + name: eppendorf_96_tiprack_10ul_eptips_G7 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 66.2585 + y: 18.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_H7 + name: eppendorf_96_tiprack_10ul_eptips_H7 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 66.2585 + y: 9.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_A8 + name: eppendorf_96_tiprack_10ul_eptips_A8 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 75.2585 + y: 72.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_B8 + name: eppendorf_96_tiprack_10ul_eptips_B8 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 75.2585 + y: 63.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_C8 + name: eppendorf_96_tiprack_10ul_eptips_C8 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 75.2585 + y: 54.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_D8 + name: eppendorf_96_tiprack_10ul_eptips_D8 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 75.2585 + y: 45.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_E8 + name: eppendorf_96_tiprack_10ul_eptips_E8 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 75.2585 + y: 36.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_F8 + name: eppendorf_96_tiprack_10ul_eptips_F8 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 75.2585 + y: 27.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_G8 + name: eppendorf_96_tiprack_10ul_eptips_G8 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 75.2585 + y: 18.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_H8 + name: eppendorf_96_tiprack_10ul_eptips_H8 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 75.2585 + y: 9.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_A9 + name: eppendorf_96_tiprack_10ul_eptips_A9 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 84.2585 + y: 72.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_B9 + name: eppendorf_96_tiprack_10ul_eptips_B9 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 84.2585 + y: 63.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_C9 + name: eppendorf_96_tiprack_10ul_eptips_C9 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 84.2585 + y: 54.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_D9 + name: eppendorf_96_tiprack_10ul_eptips_D9 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 84.2585 + y: 45.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_E9 + name: eppendorf_96_tiprack_10ul_eptips_E9 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 84.2585 + y: 36.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_F9 + name: eppendorf_96_tiprack_10ul_eptips_F9 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 84.2585 + y: 27.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_G9 + name: eppendorf_96_tiprack_10ul_eptips_G9 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 84.2585 + y: 18.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_H9 + name: eppendorf_96_tiprack_10ul_eptips_H9 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 84.2585 + y: 9.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_A10 + name: eppendorf_96_tiprack_10ul_eptips_A10 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 93.2585 + y: 72.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_B10 + name: eppendorf_96_tiprack_10ul_eptips_B10 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 93.2585 + y: 63.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_C10 + name: eppendorf_96_tiprack_10ul_eptips_C10 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 93.2585 + y: 54.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_D10 + name: eppendorf_96_tiprack_10ul_eptips_D10 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 93.2585 + y: 45.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_E10 + name: eppendorf_96_tiprack_10ul_eptips_E10 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 93.2585 + y: 36.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_F10 + name: eppendorf_96_tiprack_10ul_eptips_F10 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 93.2585 + y: 27.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_G10 + name: eppendorf_96_tiprack_10ul_eptips_G10 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 93.2585 + y: 18.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_H10 + name: eppendorf_96_tiprack_10ul_eptips_H10 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 93.2585 + y: 9.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_A11 + name: eppendorf_96_tiprack_10ul_eptips_A11 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 102.2585 + y: 72.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_B11 + name: eppendorf_96_tiprack_10ul_eptips_B11 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 102.2585 + y: 63.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_C11 + name: eppendorf_96_tiprack_10ul_eptips_C11 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 102.2585 + y: 54.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_D11 + name: eppendorf_96_tiprack_10ul_eptips_D11 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 102.2585 + y: 45.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_E11 + name: eppendorf_96_tiprack_10ul_eptips_E11 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 102.2585 + y: 36.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_F11 + name: eppendorf_96_tiprack_10ul_eptips_F11 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 102.2585 + y: 27.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_G11 + name: eppendorf_96_tiprack_10ul_eptips_G11 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 102.2585 + y: 18.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_H11 + name: eppendorf_96_tiprack_10ul_eptips_H11 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 102.2585 + y: 9.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_A12 + name: eppendorf_96_tiprack_10ul_eptips_A12 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 111.2585 + y: 72.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_B12 + name: eppendorf_96_tiprack_10ul_eptips_B12 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 111.2585 + y: 63.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_C12 + name: eppendorf_96_tiprack_10ul_eptips_C12 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 111.2585 + y: 54.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_D12 + name: eppendorf_96_tiprack_10ul_eptips_D12 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 111.2585 + y: 45.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_E12 + name: eppendorf_96_tiprack_10ul_eptips_E12 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 111.2585 + y: 36.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_F12 + name: eppendorf_96_tiprack_10ul_eptips_F12 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 111.2585 + y: 27.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_G12 + name: eppendorf_96_tiprack_10ul_eptips_G12 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 111.2585 + y: 18.1185 + z: 35.4 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip: + fitting_depth: 1 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 34 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: eppendorf_96_tiprack_10ul_eptips_H12 + name: eppendorf_96_tiprack_10ul_eptips_H12 + parent: eppendorf_96_tiprack_10ul_eptips + position: + x: 111.2585 + y: 9.1185 + z: 35.4 + sample_id: null + type: container + description: Eppendorf 96 tiprack 10ul eptips + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/tip_racks.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 geb_96_tiprack_1000ul: - description: Geb 96 tiprack 1000ul - class: + category: + - tip_racks + class: module: pylabrobot.resources.opentrons.tip_racks:geb_96_tiprack_1000ul type: pylabrobot + config_info: + - children: + - geb_96_tiprack_1000ul_A1 + - geb_96_tiprack_1000ul_B1 + - geb_96_tiprack_1000ul_C1 + - geb_96_tiprack_1000ul_D1 + - geb_96_tiprack_1000ul_E1 + - geb_96_tiprack_1000ul_F1 + - geb_96_tiprack_1000ul_G1 + - geb_96_tiprack_1000ul_H1 + - geb_96_tiprack_1000ul_A2 + - geb_96_tiprack_1000ul_B2 + - geb_96_tiprack_1000ul_C2 + - geb_96_tiprack_1000ul_D2 + - geb_96_tiprack_1000ul_E2 + - geb_96_tiprack_1000ul_F2 + - geb_96_tiprack_1000ul_G2 + - geb_96_tiprack_1000ul_H2 + - geb_96_tiprack_1000ul_A3 + - geb_96_tiprack_1000ul_B3 + - geb_96_tiprack_1000ul_C3 + - geb_96_tiprack_1000ul_D3 + - geb_96_tiprack_1000ul_E3 + - geb_96_tiprack_1000ul_F3 + - geb_96_tiprack_1000ul_G3 + - geb_96_tiprack_1000ul_H3 + - geb_96_tiprack_1000ul_A4 + - geb_96_tiprack_1000ul_B4 + - geb_96_tiprack_1000ul_C4 + - geb_96_tiprack_1000ul_D4 + - geb_96_tiprack_1000ul_E4 + - geb_96_tiprack_1000ul_F4 + - geb_96_tiprack_1000ul_G4 + - geb_96_tiprack_1000ul_H4 + - geb_96_tiprack_1000ul_A5 + - geb_96_tiprack_1000ul_B5 + - geb_96_tiprack_1000ul_C5 + - geb_96_tiprack_1000ul_D5 + - geb_96_tiprack_1000ul_E5 + - geb_96_tiprack_1000ul_F5 + - geb_96_tiprack_1000ul_G5 + - geb_96_tiprack_1000ul_H5 + - geb_96_tiprack_1000ul_A6 + - geb_96_tiprack_1000ul_B6 + - geb_96_tiprack_1000ul_C6 + - geb_96_tiprack_1000ul_D6 + - geb_96_tiprack_1000ul_E6 + - geb_96_tiprack_1000ul_F6 + - geb_96_tiprack_1000ul_G6 + - geb_96_tiprack_1000ul_H6 + - geb_96_tiprack_1000ul_A7 + - geb_96_tiprack_1000ul_B7 + - geb_96_tiprack_1000ul_C7 + - geb_96_tiprack_1000ul_D7 + - geb_96_tiprack_1000ul_E7 + - geb_96_tiprack_1000ul_F7 + - geb_96_tiprack_1000ul_G7 + - geb_96_tiprack_1000ul_H7 + - geb_96_tiprack_1000ul_A8 + - geb_96_tiprack_1000ul_B8 + - geb_96_tiprack_1000ul_C8 + - geb_96_tiprack_1000ul_D8 + - geb_96_tiprack_1000ul_E8 + - geb_96_tiprack_1000ul_F8 + - geb_96_tiprack_1000ul_G8 + - geb_96_tiprack_1000ul_H8 + - geb_96_tiprack_1000ul_A9 + - geb_96_tiprack_1000ul_B9 + - geb_96_tiprack_1000ul_C9 + - geb_96_tiprack_1000ul_D9 + - geb_96_tiprack_1000ul_E9 + - geb_96_tiprack_1000ul_F9 + - geb_96_tiprack_1000ul_G9 + - geb_96_tiprack_1000ul_H9 + - geb_96_tiprack_1000ul_A10 + - geb_96_tiprack_1000ul_B10 + - geb_96_tiprack_1000ul_C10 + - geb_96_tiprack_1000ul_D10 + - geb_96_tiprack_1000ul_E10 + - geb_96_tiprack_1000ul_F10 + - geb_96_tiprack_1000ul_G10 + - geb_96_tiprack_1000ul_H10 + - geb_96_tiprack_1000ul_A11 + - geb_96_tiprack_1000ul_B11 + - geb_96_tiprack_1000ul_C11 + - geb_96_tiprack_1000ul_D11 + - geb_96_tiprack_1000ul_E11 + - geb_96_tiprack_1000ul_F11 + - geb_96_tiprack_1000ul_G11 + - geb_96_tiprack_1000ul_H11 + - geb_96_tiprack_1000ul_A12 + - geb_96_tiprack_1000ul_B12 + - geb_96_tiprack_1000ul_C12 + - geb_96_tiprack_1000ul_D12 + - geb_96_tiprack_1000ul_E12 + - geb_96_tiprack_1000ul_F12 + - geb_96_tiprack_1000ul_G12 + - geb_96_tiprack_1000ul_H12 + class: '' + config: + barcode: null + category: tip_rack + model: GEB 96 Tip Rack 1000 µL + ordering: + A1: geb_96_tiprack_1000ul_A1 + B1: geb_96_tiprack_1000ul_B1 + C1: geb_96_tiprack_1000ul_C1 + D1: geb_96_tiprack_1000ul_D1 + E1: geb_96_tiprack_1000ul_E1 + F1: geb_96_tiprack_1000ul_F1 + G1: geb_96_tiprack_1000ul_G1 + H1: geb_96_tiprack_1000ul_H1 + A2: geb_96_tiprack_1000ul_A2 + B2: geb_96_tiprack_1000ul_B2 + C2: geb_96_tiprack_1000ul_C2 + D2: geb_96_tiprack_1000ul_D2 + E2: geb_96_tiprack_1000ul_E2 + F2: geb_96_tiprack_1000ul_F2 + G2: geb_96_tiprack_1000ul_G2 + H2: geb_96_tiprack_1000ul_H2 + A3: geb_96_tiprack_1000ul_A3 + B3: geb_96_tiprack_1000ul_B3 + C3: geb_96_tiprack_1000ul_C3 + D3: geb_96_tiprack_1000ul_D3 + E3: geb_96_tiprack_1000ul_E3 + F3: geb_96_tiprack_1000ul_F3 + G3: geb_96_tiprack_1000ul_G3 + H3: geb_96_tiprack_1000ul_H3 + A4: geb_96_tiprack_1000ul_A4 + B4: geb_96_tiprack_1000ul_B4 + C4: geb_96_tiprack_1000ul_C4 + D4: geb_96_tiprack_1000ul_D4 + E4: geb_96_tiprack_1000ul_E4 + F4: geb_96_tiprack_1000ul_F4 + G4: geb_96_tiprack_1000ul_G4 + H4: geb_96_tiprack_1000ul_H4 + A5: geb_96_tiprack_1000ul_A5 + B5: geb_96_tiprack_1000ul_B5 + C5: geb_96_tiprack_1000ul_C5 + D5: geb_96_tiprack_1000ul_D5 + E5: geb_96_tiprack_1000ul_E5 + F5: geb_96_tiprack_1000ul_F5 + G5: geb_96_tiprack_1000ul_G5 + H5: geb_96_tiprack_1000ul_H5 + A6: geb_96_tiprack_1000ul_A6 + B6: geb_96_tiprack_1000ul_B6 + C6: geb_96_tiprack_1000ul_C6 + D6: geb_96_tiprack_1000ul_D6 + E6: geb_96_tiprack_1000ul_E6 + F6: geb_96_tiprack_1000ul_F6 + G6: geb_96_tiprack_1000ul_G6 + H6: geb_96_tiprack_1000ul_H6 + A7: geb_96_tiprack_1000ul_A7 + B7: geb_96_tiprack_1000ul_B7 + C7: geb_96_tiprack_1000ul_C7 + D7: geb_96_tiprack_1000ul_D7 + E7: geb_96_tiprack_1000ul_E7 + F7: geb_96_tiprack_1000ul_F7 + G7: geb_96_tiprack_1000ul_G7 + H7: geb_96_tiprack_1000ul_H7 + A8: geb_96_tiprack_1000ul_A8 + B8: geb_96_tiprack_1000ul_B8 + C8: geb_96_tiprack_1000ul_C8 + D8: geb_96_tiprack_1000ul_D8 + E8: geb_96_tiprack_1000ul_E8 + F8: geb_96_tiprack_1000ul_F8 + G8: geb_96_tiprack_1000ul_G8 + H8: geb_96_tiprack_1000ul_H8 + A9: geb_96_tiprack_1000ul_A9 + B9: geb_96_tiprack_1000ul_B9 + C9: geb_96_tiprack_1000ul_C9 + D9: geb_96_tiprack_1000ul_D9 + E9: geb_96_tiprack_1000ul_E9 + F9: geb_96_tiprack_1000ul_F9 + G9: geb_96_tiprack_1000ul_G9 + H9: geb_96_tiprack_1000ul_H9 + A10: geb_96_tiprack_1000ul_A10 + B10: geb_96_tiprack_1000ul_B10 + C10: geb_96_tiprack_1000ul_C10 + D10: geb_96_tiprack_1000ul_D10 + E10: geb_96_tiprack_1000ul_E10 + F10: geb_96_tiprack_1000ul_F10 + G10: geb_96_tiprack_1000ul_G10 + H10: geb_96_tiprack_1000ul_H10 + A11: geb_96_tiprack_1000ul_A11 + B11: geb_96_tiprack_1000ul_B11 + C11: geb_96_tiprack_1000ul_C11 + D11: geb_96_tiprack_1000ul_D11 + E11: geb_96_tiprack_1000ul_E11 + F11: geb_96_tiprack_1000ul_F11 + G11: geb_96_tiprack_1000ul_G11 + H11: geb_96_tiprack_1000ul_H11 + A12: geb_96_tiprack_1000ul_A12 + B12: geb_96_tiprack_1000ul_B12 + C12: geb_96_tiprack_1000ul_C12 + D12: geb_96_tiprack_1000ul_D12 + E12: geb_96_tiprack_1000ul_E12 + F12: geb_96_tiprack_1000ul_F12 + G12: geb_96_tiprack_1000ul_G12 + H12: geb_96_tiprack_1000ul_H12 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.75 + size_y: 85.5 + size_z: 100.25 + type: TipRack + data: {} + id: geb_96_tiprack_1000ul + name: geb_96_tiprack_1000ul + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_A1 + name: geb_96_tiprack_1000ul_A1 + parent: geb_96_tiprack_1000ul + position: + x: 11.5625 + y: 71.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_B1 + name: geb_96_tiprack_1000ul_B1 + parent: geb_96_tiprack_1000ul + position: + x: 11.5625 + y: 62.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_C1 + name: geb_96_tiprack_1000ul_C1 + parent: geb_96_tiprack_1000ul + position: + x: 11.5625 + y: 53.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_D1 + name: geb_96_tiprack_1000ul_D1 + parent: geb_96_tiprack_1000ul + position: + x: 11.5625 + y: 44.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_E1 + name: geb_96_tiprack_1000ul_E1 + parent: geb_96_tiprack_1000ul + position: + x: 11.5625 + y: 35.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_F1 + name: geb_96_tiprack_1000ul_F1 + parent: geb_96_tiprack_1000ul + position: + x: 11.5625 + y: 26.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_G1 + name: geb_96_tiprack_1000ul_G1 + parent: geb_96_tiprack_1000ul + position: + x: 11.5625 + y: 17.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_H1 + name: geb_96_tiprack_1000ul_H1 + parent: geb_96_tiprack_1000ul + position: + x: 11.5625 + y: 8.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_A2 + name: geb_96_tiprack_1000ul_A2 + parent: geb_96_tiprack_1000ul + position: + x: 20.5625 + y: 71.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_B2 + name: geb_96_tiprack_1000ul_B2 + parent: geb_96_tiprack_1000ul + position: + x: 20.5625 + y: 62.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_C2 + name: geb_96_tiprack_1000ul_C2 + parent: geb_96_tiprack_1000ul + position: + x: 20.5625 + y: 53.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_D2 + name: geb_96_tiprack_1000ul_D2 + parent: geb_96_tiprack_1000ul + position: + x: 20.5625 + y: 44.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_E2 + name: geb_96_tiprack_1000ul_E2 + parent: geb_96_tiprack_1000ul + position: + x: 20.5625 + y: 35.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_F2 + name: geb_96_tiprack_1000ul_F2 + parent: geb_96_tiprack_1000ul + position: + x: 20.5625 + y: 26.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_G2 + name: geb_96_tiprack_1000ul_G2 + parent: geb_96_tiprack_1000ul + position: + x: 20.5625 + y: 17.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_H2 + name: geb_96_tiprack_1000ul_H2 + parent: geb_96_tiprack_1000ul + position: + x: 20.5625 + y: 8.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_A3 + name: geb_96_tiprack_1000ul_A3 + parent: geb_96_tiprack_1000ul + position: + x: 29.5625 + y: 71.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_B3 + name: geb_96_tiprack_1000ul_B3 + parent: geb_96_tiprack_1000ul + position: + x: 29.5625 + y: 62.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_C3 + name: geb_96_tiprack_1000ul_C3 + parent: geb_96_tiprack_1000ul + position: + x: 29.5625 + y: 53.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_D3 + name: geb_96_tiprack_1000ul_D3 + parent: geb_96_tiprack_1000ul + position: + x: 29.5625 + y: 44.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_E3 + name: geb_96_tiprack_1000ul_E3 + parent: geb_96_tiprack_1000ul + position: + x: 29.5625 + y: 35.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_F3 + name: geb_96_tiprack_1000ul_F3 + parent: geb_96_tiprack_1000ul + position: + x: 29.5625 + y: 26.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_G3 + name: geb_96_tiprack_1000ul_G3 + parent: geb_96_tiprack_1000ul + position: + x: 29.5625 + y: 17.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_H3 + name: geb_96_tiprack_1000ul_H3 + parent: geb_96_tiprack_1000ul + position: + x: 29.5625 + y: 8.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_A4 + name: geb_96_tiprack_1000ul_A4 + parent: geb_96_tiprack_1000ul + position: + x: 38.5625 + y: 71.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_B4 + name: geb_96_tiprack_1000ul_B4 + parent: geb_96_tiprack_1000ul + position: + x: 38.5625 + y: 62.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_C4 + name: geb_96_tiprack_1000ul_C4 + parent: geb_96_tiprack_1000ul + position: + x: 38.5625 + y: 53.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_D4 + name: geb_96_tiprack_1000ul_D4 + parent: geb_96_tiprack_1000ul + position: + x: 38.5625 + y: 44.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_E4 + name: geb_96_tiprack_1000ul_E4 + parent: geb_96_tiprack_1000ul + position: + x: 38.5625 + y: 35.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_F4 + name: geb_96_tiprack_1000ul_F4 + parent: geb_96_tiprack_1000ul + position: + x: 38.5625 + y: 26.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_G4 + name: geb_96_tiprack_1000ul_G4 + parent: geb_96_tiprack_1000ul + position: + x: 38.5625 + y: 17.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_H4 + name: geb_96_tiprack_1000ul_H4 + parent: geb_96_tiprack_1000ul + position: + x: 38.5625 + y: 8.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_A5 + name: geb_96_tiprack_1000ul_A5 + parent: geb_96_tiprack_1000ul + position: + x: 47.5625 + y: 71.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_B5 + name: geb_96_tiprack_1000ul_B5 + parent: geb_96_tiprack_1000ul + position: + x: 47.5625 + y: 62.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_C5 + name: geb_96_tiprack_1000ul_C5 + parent: geb_96_tiprack_1000ul + position: + x: 47.5625 + y: 53.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_D5 + name: geb_96_tiprack_1000ul_D5 + parent: geb_96_tiprack_1000ul + position: + x: 47.5625 + y: 44.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_E5 + name: geb_96_tiprack_1000ul_E5 + parent: geb_96_tiprack_1000ul + position: + x: 47.5625 + y: 35.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_F5 + name: geb_96_tiprack_1000ul_F5 + parent: geb_96_tiprack_1000ul + position: + x: 47.5625 + y: 26.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_G5 + name: geb_96_tiprack_1000ul_G5 + parent: geb_96_tiprack_1000ul + position: + x: 47.5625 + y: 17.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_H5 + name: geb_96_tiprack_1000ul_H5 + parent: geb_96_tiprack_1000ul + position: + x: 47.5625 + y: 8.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_A6 + name: geb_96_tiprack_1000ul_A6 + parent: geb_96_tiprack_1000ul + position: + x: 56.5625 + y: 71.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_B6 + name: geb_96_tiprack_1000ul_B6 + parent: geb_96_tiprack_1000ul + position: + x: 56.5625 + y: 62.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_C6 + name: geb_96_tiprack_1000ul_C6 + parent: geb_96_tiprack_1000ul + position: + x: 56.5625 + y: 53.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_D6 + name: geb_96_tiprack_1000ul_D6 + parent: geb_96_tiprack_1000ul + position: + x: 56.5625 + y: 44.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_E6 + name: geb_96_tiprack_1000ul_E6 + parent: geb_96_tiprack_1000ul + position: + x: 56.5625 + y: 35.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_F6 + name: geb_96_tiprack_1000ul_F6 + parent: geb_96_tiprack_1000ul + position: + x: 56.5625 + y: 26.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_G6 + name: geb_96_tiprack_1000ul_G6 + parent: geb_96_tiprack_1000ul + position: + x: 56.5625 + y: 17.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_H6 + name: geb_96_tiprack_1000ul_H6 + parent: geb_96_tiprack_1000ul + position: + x: 56.5625 + y: 8.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_A7 + name: geb_96_tiprack_1000ul_A7 + parent: geb_96_tiprack_1000ul + position: + x: 65.5625 + y: 71.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_B7 + name: geb_96_tiprack_1000ul_B7 + parent: geb_96_tiprack_1000ul + position: + x: 65.5625 + y: 62.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_C7 + name: geb_96_tiprack_1000ul_C7 + parent: geb_96_tiprack_1000ul + position: + x: 65.5625 + y: 53.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_D7 + name: geb_96_tiprack_1000ul_D7 + parent: geb_96_tiprack_1000ul + position: + x: 65.5625 + y: 44.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_E7 + name: geb_96_tiprack_1000ul_E7 + parent: geb_96_tiprack_1000ul + position: + x: 65.5625 + y: 35.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_F7 + name: geb_96_tiprack_1000ul_F7 + parent: geb_96_tiprack_1000ul + position: + x: 65.5625 + y: 26.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_G7 + name: geb_96_tiprack_1000ul_G7 + parent: geb_96_tiprack_1000ul + position: + x: 65.5625 + y: 17.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_H7 + name: geb_96_tiprack_1000ul_H7 + parent: geb_96_tiprack_1000ul + position: + x: 65.5625 + y: 8.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_A8 + name: geb_96_tiprack_1000ul_A8 + parent: geb_96_tiprack_1000ul + position: + x: 74.5625 + y: 71.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_B8 + name: geb_96_tiprack_1000ul_B8 + parent: geb_96_tiprack_1000ul + position: + x: 74.5625 + y: 62.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_C8 + name: geb_96_tiprack_1000ul_C8 + parent: geb_96_tiprack_1000ul + position: + x: 74.5625 + y: 53.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_D8 + name: geb_96_tiprack_1000ul_D8 + parent: geb_96_tiprack_1000ul + position: + x: 74.5625 + y: 44.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_E8 + name: geb_96_tiprack_1000ul_E8 + parent: geb_96_tiprack_1000ul + position: + x: 74.5625 + y: 35.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_F8 + name: geb_96_tiprack_1000ul_F8 + parent: geb_96_tiprack_1000ul + position: + x: 74.5625 + y: 26.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_G8 + name: geb_96_tiprack_1000ul_G8 + parent: geb_96_tiprack_1000ul + position: + x: 74.5625 + y: 17.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_H8 + name: geb_96_tiprack_1000ul_H8 + parent: geb_96_tiprack_1000ul + position: + x: 74.5625 + y: 8.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_A9 + name: geb_96_tiprack_1000ul_A9 + parent: geb_96_tiprack_1000ul + position: + x: 83.5625 + y: 71.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_B9 + name: geb_96_tiprack_1000ul_B9 + parent: geb_96_tiprack_1000ul + position: + x: 83.5625 + y: 62.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_C9 + name: geb_96_tiprack_1000ul_C9 + parent: geb_96_tiprack_1000ul + position: + x: 83.5625 + y: 53.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_D9 + name: geb_96_tiprack_1000ul_D9 + parent: geb_96_tiprack_1000ul + position: + x: 83.5625 + y: 44.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_E9 + name: geb_96_tiprack_1000ul_E9 + parent: geb_96_tiprack_1000ul + position: + x: 83.5625 + y: 35.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_F9 + name: geb_96_tiprack_1000ul_F9 + parent: geb_96_tiprack_1000ul + position: + x: 83.5625 + y: 26.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_G9 + name: geb_96_tiprack_1000ul_G9 + parent: geb_96_tiprack_1000ul + position: + x: 83.5625 + y: 17.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_H9 + name: geb_96_tiprack_1000ul_H9 + parent: geb_96_tiprack_1000ul + position: + x: 83.5625 + y: 8.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_A10 + name: geb_96_tiprack_1000ul_A10 + parent: geb_96_tiprack_1000ul + position: + x: 92.5625 + y: 71.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_B10 + name: geb_96_tiprack_1000ul_B10 + parent: geb_96_tiprack_1000ul + position: + x: 92.5625 + y: 62.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_C10 + name: geb_96_tiprack_1000ul_C10 + parent: geb_96_tiprack_1000ul + position: + x: 92.5625 + y: 53.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_D10 + name: geb_96_tiprack_1000ul_D10 + parent: geb_96_tiprack_1000ul + position: + x: 92.5625 + y: 44.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_E10 + name: geb_96_tiprack_1000ul_E10 + parent: geb_96_tiprack_1000ul + position: + x: 92.5625 + y: 35.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_F10 + name: geb_96_tiprack_1000ul_F10 + parent: geb_96_tiprack_1000ul + position: + x: 92.5625 + y: 26.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_G10 + name: geb_96_tiprack_1000ul_G10 + parent: geb_96_tiprack_1000ul + position: + x: 92.5625 + y: 17.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_H10 + name: geb_96_tiprack_1000ul_H10 + parent: geb_96_tiprack_1000ul + position: + x: 92.5625 + y: 8.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_A11 + name: geb_96_tiprack_1000ul_A11 + parent: geb_96_tiprack_1000ul + position: + x: 101.5625 + y: 71.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_B11 + name: geb_96_tiprack_1000ul_B11 + parent: geb_96_tiprack_1000ul + position: + x: 101.5625 + y: 62.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_C11 + name: geb_96_tiprack_1000ul_C11 + parent: geb_96_tiprack_1000ul + position: + x: 101.5625 + y: 53.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_D11 + name: geb_96_tiprack_1000ul_D11 + parent: geb_96_tiprack_1000ul + position: + x: 101.5625 + y: 44.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_E11 + name: geb_96_tiprack_1000ul_E11 + parent: geb_96_tiprack_1000ul + position: + x: 101.5625 + y: 35.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_F11 + name: geb_96_tiprack_1000ul_F11 + parent: geb_96_tiprack_1000ul + position: + x: 101.5625 + y: 26.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_G11 + name: geb_96_tiprack_1000ul_G11 + parent: geb_96_tiprack_1000ul + position: + x: 101.5625 + y: 17.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_H11 + name: geb_96_tiprack_1000ul_H11 + parent: geb_96_tiprack_1000ul + position: + x: 101.5625 + y: 8.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_A12 + name: geb_96_tiprack_1000ul_A12 + parent: geb_96_tiprack_1000ul + position: + x: 110.5625 + y: 71.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_B12 + name: geb_96_tiprack_1000ul_B12 + parent: geb_96_tiprack_1000ul + position: + x: 110.5625 + y: 62.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_C12 + name: geb_96_tiprack_1000ul_C12 + parent: geb_96_tiprack_1000ul + position: + x: 110.5625 + y: 53.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_D12 + name: geb_96_tiprack_1000ul_D12 + parent: geb_96_tiprack_1000ul + position: + x: 110.5625 + y: 44.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_E12 + name: geb_96_tiprack_1000ul_E12 + parent: geb_96_tiprack_1000ul + position: + x: 110.5625 + y: 35.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_F12 + name: geb_96_tiprack_1000ul_F12 + parent: geb_96_tiprack_1000ul + position: + x: 110.5625 + y: 26.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_G12 + name: geb_96_tiprack_1000ul_G12 + parent: geb_96_tiprack_1000ul + position: + x: 110.5625 + y: 17.5625 + z: 18.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.275 + size_y: 5.275 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip: + fitting_depth: 11.2 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 87.9 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_1000ul_H12 + name: geb_96_tiprack_1000ul_H12 + parent: geb_96_tiprack_1000ul + position: + x: 110.5625 + y: 8.5625 + z: 18.25 + sample_id: null + type: container + description: Geb 96 tiprack 1000ul + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/tip_racks.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +geb_96_tiprack_10ul: + category: + - tip_racks + class: + module: pylabrobot.resources.opentrons.tip_racks:geb_96_tiprack_10ul + type: pylabrobot + config_info: + - children: + - geb_96_tiprack_10ul_A1 + - geb_96_tiprack_10ul_B1 + - geb_96_tiprack_10ul_C1 + - geb_96_tiprack_10ul_D1 + - geb_96_tiprack_10ul_E1 + - geb_96_tiprack_10ul_F1 + - geb_96_tiprack_10ul_G1 + - geb_96_tiprack_10ul_H1 + - geb_96_tiprack_10ul_A2 + - geb_96_tiprack_10ul_B2 + - geb_96_tiprack_10ul_C2 + - geb_96_tiprack_10ul_D2 + - geb_96_tiprack_10ul_E2 + - geb_96_tiprack_10ul_F2 + - geb_96_tiprack_10ul_G2 + - geb_96_tiprack_10ul_H2 + - geb_96_tiprack_10ul_A3 + - geb_96_tiprack_10ul_B3 + - geb_96_tiprack_10ul_C3 + - geb_96_tiprack_10ul_D3 + - geb_96_tiprack_10ul_E3 + - geb_96_tiprack_10ul_F3 + - geb_96_tiprack_10ul_G3 + - geb_96_tiprack_10ul_H3 + - geb_96_tiprack_10ul_A4 + - geb_96_tiprack_10ul_B4 + - geb_96_tiprack_10ul_C4 + - geb_96_tiprack_10ul_D4 + - geb_96_tiprack_10ul_E4 + - geb_96_tiprack_10ul_F4 + - geb_96_tiprack_10ul_G4 + - geb_96_tiprack_10ul_H4 + - geb_96_tiprack_10ul_A5 + - geb_96_tiprack_10ul_B5 + - geb_96_tiprack_10ul_C5 + - geb_96_tiprack_10ul_D5 + - geb_96_tiprack_10ul_E5 + - geb_96_tiprack_10ul_F5 + - geb_96_tiprack_10ul_G5 + - geb_96_tiprack_10ul_H5 + - geb_96_tiprack_10ul_A6 + - geb_96_tiprack_10ul_B6 + - geb_96_tiprack_10ul_C6 + - geb_96_tiprack_10ul_D6 + - geb_96_tiprack_10ul_E6 + - geb_96_tiprack_10ul_F6 + - geb_96_tiprack_10ul_G6 + - geb_96_tiprack_10ul_H6 + - geb_96_tiprack_10ul_A7 + - geb_96_tiprack_10ul_B7 + - geb_96_tiprack_10ul_C7 + - geb_96_tiprack_10ul_D7 + - geb_96_tiprack_10ul_E7 + - geb_96_tiprack_10ul_F7 + - geb_96_tiprack_10ul_G7 + - geb_96_tiprack_10ul_H7 + - geb_96_tiprack_10ul_A8 + - geb_96_tiprack_10ul_B8 + - geb_96_tiprack_10ul_C8 + - geb_96_tiprack_10ul_D8 + - geb_96_tiprack_10ul_E8 + - geb_96_tiprack_10ul_F8 + - geb_96_tiprack_10ul_G8 + - geb_96_tiprack_10ul_H8 + - geb_96_tiprack_10ul_A9 + - geb_96_tiprack_10ul_B9 + - geb_96_tiprack_10ul_C9 + - geb_96_tiprack_10ul_D9 + - geb_96_tiprack_10ul_E9 + - geb_96_tiprack_10ul_F9 + - geb_96_tiprack_10ul_G9 + - geb_96_tiprack_10ul_H9 + - geb_96_tiprack_10ul_A10 + - geb_96_tiprack_10ul_B10 + - geb_96_tiprack_10ul_C10 + - geb_96_tiprack_10ul_D10 + - geb_96_tiprack_10ul_E10 + - geb_96_tiprack_10ul_F10 + - geb_96_tiprack_10ul_G10 + - geb_96_tiprack_10ul_H10 + - geb_96_tiprack_10ul_A11 + - geb_96_tiprack_10ul_B11 + - geb_96_tiprack_10ul_C11 + - geb_96_tiprack_10ul_D11 + - geb_96_tiprack_10ul_E11 + - geb_96_tiprack_10ul_F11 + - geb_96_tiprack_10ul_G11 + - geb_96_tiprack_10ul_H11 + - geb_96_tiprack_10ul_A12 + - geb_96_tiprack_10ul_B12 + - geb_96_tiprack_10ul_C12 + - geb_96_tiprack_10ul_D12 + - geb_96_tiprack_10ul_E12 + - geb_96_tiprack_10ul_F12 + - geb_96_tiprack_10ul_G12 + - geb_96_tiprack_10ul_H12 + class: '' + config: + barcode: null + category: tip_rack + model: GEB 96 Tip Rack 10 µL + ordering: + A1: geb_96_tiprack_10ul_A1 + B1: geb_96_tiprack_10ul_B1 + C1: geb_96_tiprack_10ul_C1 + D1: geb_96_tiprack_10ul_D1 + E1: geb_96_tiprack_10ul_E1 + F1: geb_96_tiprack_10ul_F1 + G1: geb_96_tiprack_10ul_G1 + H1: geb_96_tiprack_10ul_H1 + A2: geb_96_tiprack_10ul_A2 + B2: geb_96_tiprack_10ul_B2 + C2: geb_96_tiprack_10ul_C2 + D2: geb_96_tiprack_10ul_D2 + E2: geb_96_tiprack_10ul_E2 + F2: geb_96_tiprack_10ul_F2 + G2: geb_96_tiprack_10ul_G2 + H2: geb_96_tiprack_10ul_H2 + A3: geb_96_tiprack_10ul_A3 + B3: geb_96_tiprack_10ul_B3 + C3: geb_96_tiprack_10ul_C3 + D3: geb_96_tiprack_10ul_D3 + E3: geb_96_tiprack_10ul_E3 + F3: geb_96_tiprack_10ul_F3 + G3: geb_96_tiprack_10ul_G3 + H3: geb_96_tiprack_10ul_H3 + A4: geb_96_tiprack_10ul_A4 + B4: geb_96_tiprack_10ul_B4 + C4: geb_96_tiprack_10ul_C4 + D4: geb_96_tiprack_10ul_D4 + E4: geb_96_tiprack_10ul_E4 + F4: geb_96_tiprack_10ul_F4 + G4: geb_96_tiprack_10ul_G4 + H4: geb_96_tiprack_10ul_H4 + A5: geb_96_tiprack_10ul_A5 + B5: geb_96_tiprack_10ul_B5 + C5: geb_96_tiprack_10ul_C5 + D5: geb_96_tiprack_10ul_D5 + E5: geb_96_tiprack_10ul_E5 + F5: geb_96_tiprack_10ul_F5 + G5: geb_96_tiprack_10ul_G5 + H5: geb_96_tiprack_10ul_H5 + A6: geb_96_tiprack_10ul_A6 + B6: geb_96_tiprack_10ul_B6 + C6: geb_96_tiprack_10ul_C6 + D6: geb_96_tiprack_10ul_D6 + E6: geb_96_tiprack_10ul_E6 + F6: geb_96_tiprack_10ul_F6 + G6: geb_96_tiprack_10ul_G6 + H6: geb_96_tiprack_10ul_H6 + A7: geb_96_tiprack_10ul_A7 + B7: geb_96_tiprack_10ul_B7 + C7: geb_96_tiprack_10ul_C7 + D7: geb_96_tiprack_10ul_D7 + E7: geb_96_tiprack_10ul_E7 + F7: geb_96_tiprack_10ul_F7 + G7: geb_96_tiprack_10ul_G7 + H7: geb_96_tiprack_10ul_H7 + A8: geb_96_tiprack_10ul_A8 + B8: geb_96_tiprack_10ul_B8 + C8: geb_96_tiprack_10ul_C8 + D8: geb_96_tiprack_10ul_D8 + E8: geb_96_tiprack_10ul_E8 + F8: geb_96_tiprack_10ul_F8 + G8: geb_96_tiprack_10ul_G8 + H8: geb_96_tiprack_10ul_H8 + A9: geb_96_tiprack_10ul_A9 + B9: geb_96_tiprack_10ul_B9 + C9: geb_96_tiprack_10ul_C9 + D9: geb_96_tiprack_10ul_D9 + E9: geb_96_tiprack_10ul_E9 + F9: geb_96_tiprack_10ul_F9 + G9: geb_96_tiprack_10ul_G9 + H9: geb_96_tiprack_10ul_H9 + A10: geb_96_tiprack_10ul_A10 + B10: geb_96_tiprack_10ul_B10 + C10: geb_96_tiprack_10ul_C10 + D10: geb_96_tiprack_10ul_D10 + E10: geb_96_tiprack_10ul_E10 + F10: geb_96_tiprack_10ul_F10 + G10: geb_96_tiprack_10ul_G10 + H10: geb_96_tiprack_10ul_H10 + A11: geb_96_tiprack_10ul_A11 + B11: geb_96_tiprack_10ul_B11 + C11: geb_96_tiprack_10ul_C11 + D11: geb_96_tiprack_10ul_D11 + E11: geb_96_tiprack_10ul_E11 + F11: geb_96_tiprack_10ul_F11 + G11: geb_96_tiprack_10ul_G11 + H11: geb_96_tiprack_10ul_H11 + A12: geb_96_tiprack_10ul_A12 + B12: geb_96_tiprack_10ul_B12 + C12: geb_96_tiprack_10ul_C12 + D12: geb_96_tiprack_10ul_D12 + E12: geb_96_tiprack_10ul_E12 + F12: geb_96_tiprack_10ul_F12 + G12: geb_96_tiprack_10ul_G12 + H12: geb_96_tiprack_10ul_H12 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.75 + size_y: 85.5 + size_z: 52.25 + type: TipRack + data: {} + id: geb_96_tiprack_10ul + name: geb_96_tiprack_10ul + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_A1 + name: geb_96_tiprack_10ul_A1 + parent: geb_96_tiprack_10ul + position: + x: 13.1565 + y: 73.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_B1 + name: geb_96_tiprack_10ul_B1 + parent: geb_96_tiprack_10ul + position: + x: 13.1565 + y: 64.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_C1 + name: geb_96_tiprack_10ul_C1 + parent: geb_96_tiprack_10ul + position: + x: 13.1565 + y: 55.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_D1 + name: geb_96_tiprack_10ul_D1 + parent: geb_96_tiprack_10ul + position: + x: 13.1565 + y: 46.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_E1 + name: geb_96_tiprack_10ul_E1 + parent: geb_96_tiprack_10ul + position: + x: 13.1565 + y: 37.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_F1 + name: geb_96_tiprack_10ul_F1 + parent: geb_96_tiprack_10ul + position: + x: 13.1565 + y: 28.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_G1 + name: geb_96_tiprack_10ul_G1 + parent: geb_96_tiprack_10ul + position: + x: 13.1565 + y: 19.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_H1 + name: geb_96_tiprack_10ul_H1 + parent: geb_96_tiprack_10ul + position: + x: 13.1565 + y: 10.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_A2 + name: geb_96_tiprack_10ul_A2 + parent: geb_96_tiprack_10ul + position: + x: 22.1565 + y: 73.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_B2 + name: geb_96_tiprack_10ul_B2 + parent: geb_96_tiprack_10ul + position: + x: 22.1565 + y: 64.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_C2 + name: geb_96_tiprack_10ul_C2 + parent: geb_96_tiprack_10ul + position: + x: 22.1565 + y: 55.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_D2 + name: geb_96_tiprack_10ul_D2 + parent: geb_96_tiprack_10ul + position: + x: 22.1565 + y: 46.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_E2 + name: geb_96_tiprack_10ul_E2 + parent: geb_96_tiprack_10ul + position: + x: 22.1565 + y: 37.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_F2 + name: geb_96_tiprack_10ul_F2 + parent: geb_96_tiprack_10ul + position: + x: 22.1565 + y: 28.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_G2 + name: geb_96_tiprack_10ul_G2 + parent: geb_96_tiprack_10ul + position: + x: 22.1565 + y: 19.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_H2 + name: geb_96_tiprack_10ul_H2 + parent: geb_96_tiprack_10ul + position: + x: 22.1565 + y: 10.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_A3 + name: geb_96_tiprack_10ul_A3 + parent: geb_96_tiprack_10ul + position: + x: 31.1565 + y: 73.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_B3 + name: geb_96_tiprack_10ul_B3 + parent: geb_96_tiprack_10ul + position: + x: 31.1565 + y: 64.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_C3 + name: geb_96_tiprack_10ul_C3 + parent: geb_96_tiprack_10ul + position: + x: 31.1565 + y: 55.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_D3 + name: geb_96_tiprack_10ul_D3 + parent: geb_96_tiprack_10ul + position: + x: 31.1565 + y: 46.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_E3 + name: geb_96_tiprack_10ul_E3 + parent: geb_96_tiprack_10ul + position: + x: 31.1565 + y: 37.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_F3 + name: geb_96_tiprack_10ul_F3 + parent: geb_96_tiprack_10ul + position: + x: 31.1565 + y: 28.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_G3 + name: geb_96_tiprack_10ul_G3 + parent: geb_96_tiprack_10ul + position: + x: 31.1565 + y: 19.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_H3 + name: geb_96_tiprack_10ul_H3 + parent: geb_96_tiprack_10ul + position: + x: 31.1565 + y: 10.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_A4 + name: geb_96_tiprack_10ul_A4 + parent: geb_96_tiprack_10ul + position: + x: 40.1565 + y: 73.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_B4 + name: geb_96_tiprack_10ul_B4 + parent: geb_96_tiprack_10ul + position: + x: 40.1565 + y: 64.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_C4 + name: geb_96_tiprack_10ul_C4 + parent: geb_96_tiprack_10ul + position: + x: 40.1565 + y: 55.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_D4 + name: geb_96_tiprack_10ul_D4 + parent: geb_96_tiprack_10ul + position: + x: 40.1565 + y: 46.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_E4 + name: geb_96_tiprack_10ul_E4 + parent: geb_96_tiprack_10ul + position: + x: 40.1565 + y: 37.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_F4 + name: geb_96_tiprack_10ul_F4 + parent: geb_96_tiprack_10ul + position: + x: 40.1565 + y: 28.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_G4 + name: geb_96_tiprack_10ul_G4 + parent: geb_96_tiprack_10ul + position: + x: 40.1565 + y: 19.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_H4 + name: geb_96_tiprack_10ul_H4 + parent: geb_96_tiprack_10ul + position: + x: 40.1565 + y: 10.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_A5 + name: geb_96_tiprack_10ul_A5 + parent: geb_96_tiprack_10ul + position: + x: 49.1565 + y: 73.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_B5 + name: geb_96_tiprack_10ul_B5 + parent: geb_96_tiprack_10ul + position: + x: 49.1565 + y: 64.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_C5 + name: geb_96_tiprack_10ul_C5 + parent: geb_96_tiprack_10ul + position: + x: 49.1565 + y: 55.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_D5 + name: geb_96_tiprack_10ul_D5 + parent: geb_96_tiprack_10ul + position: + x: 49.1565 + y: 46.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_E5 + name: geb_96_tiprack_10ul_E5 + parent: geb_96_tiprack_10ul + position: + x: 49.1565 + y: 37.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_F5 + name: geb_96_tiprack_10ul_F5 + parent: geb_96_tiprack_10ul + position: + x: 49.1565 + y: 28.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_G5 + name: geb_96_tiprack_10ul_G5 + parent: geb_96_tiprack_10ul + position: + x: 49.1565 + y: 19.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_H5 + name: geb_96_tiprack_10ul_H5 + parent: geb_96_tiprack_10ul + position: + x: 49.1565 + y: 10.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_A6 + name: geb_96_tiprack_10ul_A6 + parent: geb_96_tiprack_10ul + position: + x: 58.1565 + y: 73.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_B6 + name: geb_96_tiprack_10ul_B6 + parent: geb_96_tiprack_10ul + position: + x: 58.1565 + y: 64.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_C6 + name: geb_96_tiprack_10ul_C6 + parent: geb_96_tiprack_10ul + position: + x: 58.1565 + y: 55.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_D6 + name: geb_96_tiprack_10ul_D6 + parent: geb_96_tiprack_10ul + position: + x: 58.1565 + y: 46.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_E6 + name: geb_96_tiprack_10ul_E6 + parent: geb_96_tiprack_10ul + position: + x: 58.1565 + y: 37.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_F6 + name: geb_96_tiprack_10ul_F6 + parent: geb_96_tiprack_10ul + position: + x: 58.1565 + y: 28.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_G6 + name: geb_96_tiprack_10ul_G6 + parent: geb_96_tiprack_10ul + position: + x: 58.1565 + y: 19.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_H6 + name: geb_96_tiprack_10ul_H6 + parent: geb_96_tiprack_10ul + position: + x: 58.1565 + y: 10.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_A7 + name: geb_96_tiprack_10ul_A7 + parent: geb_96_tiprack_10ul + position: + x: 67.1565 + y: 73.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_B7 + name: geb_96_tiprack_10ul_B7 + parent: geb_96_tiprack_10ul + position: + x: 67.1565 + y: 64.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_C7 + name: geb_96_tiprack_10ul_C7 + parent: geb_96_tiprack_10ul + position: + x: 67.1565 + y: 55.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_D7 + name: geb_96_tiprack_10ul_D7 + parent: geb_96_tiprack_10ul + position: + x: 67.1565 + y: 46.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_E7 + name: geb_96_tiprack_10ul_E7 + parent: geb_96_tiprack_10ul + position: + x: 67.1565 + y: 37.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_F7 + name: geb_96_tiprack_10ul_F7 + parent: geb_96_tiprack_10ul + position: + x: 67.1565 + y: 28.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_G7 + name: geb_96_tiprack_10ul_G7 + parent: geb_96_tiprack_10ul + position: + x: 67.1565 + y: 19.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_H7 + name: geb_96_tiprack_10ul_H7 + parent: geb_96_tiprack_10ul + position: + x: 67.1565 + y: 10.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_A8 + name: geb_96_tiprack_10ul_A8 + parent: geb_96_tiprack_10ul + position: + x: 76.1565 + y: 73.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_B8 + name: geb_96_tiprack_10ul_B8 + parent: geb_96_tiprack_10ul + position: + x: 76.1565 + y: 64.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_C8 + name: geb_96_tiprack_10ul_C8 + parent: geb_96_tiprack_10ul + position: + x: 76.1565 + y: 55.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_D8 + name: geb_96_tiprack_10ul_D8 + parent: geb_96_tiprack_10ul + position: + x: 76.1565 + y: 46.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_E8 + name: geb_96_tiprack_10ul_E8 + parent: geb_96_tiprack_10ul + position: + x: 76.1565 + y: 37.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_F8 + name: geb_96_tiprack_10ul_F8 + parent: geb_96_tiprack_10ul + position: + x: 76.1565 + y: 28.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_G8 + name: geb_96_tiprack_10ul_G8 + parent: geb_96_tiprack_10ul + position: + x: 76.1565 + y: 19.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_H8 + name: geb_96_tiprack_10ul_H8 + parent: geb_96_tiprack_10ul + position: + x: 76.1565 + y: 10.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_A9 + name: geb_96_tiprack_10ul_A9 + parent: geb_96_tiprack_10ul + position: + x: 85.1565 + y: 73.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_B9 + name: geb_96_tiprack_10ul_B9 + parent: geb_96_tiprack_10ul + position: + x: 85.1565 + y: 64.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_C9 + name: geb_96_tiprack_10ul_C9 + parent: geb_96_tiprack_10ul + position: + x: 85.1565 + y: 55.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_D9 + name: geb_96_tiprack_10ul_D9 + parent: geb_96_tiprack_10ul + position: + x: 85.1565 + y: 46.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_E9 + name: geb_96_tiprack_10ul_E9 + parent: geb_96_tiprack_10ul + position: + x: 85.1565 + y: 37.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_F9 + name: geb_96_tiprack_10ul_F9 + parent: geb_96_tiprack_10ul + position: + x: 85.1565 + y: 28.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_G9 + name: geb_96_tiprack_10ul_G9 + parent: geb_96_tiprack_10ul + position: + x: 85.1565 + y: 19.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_H9 + name: geb_96_tiprack_10ul_H9 + parent: geb_96_tiprack_10ul + position: + x: 85.1565 + y: 10.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_A10 + name: geb_96_tiprack_10ul_A10 + parent: geb_96_tiprack_10ul + position: + x: 94.1565 + y: 73.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_B10 + name: geb_96_tiprack_10ul_B10 + parent: geb_96_tiprack_10ul + position: + x: 94.1565 + y: 64.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_C10 + name: geb_96_tiprack_10ul_C10 + parent: geb_96_tiprack_10ul + position: + x: 94.1565 + y: 55.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_D10 + name: geb_96_tiprack_10ul_D10 + parent: geb_96_tiprack_10ul + position: + x: 94.1565 + y: 46.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_E10 + name: geb_96_tiprack_10ul_E10 + parent: geb_96_tiprack_10ul + position: + x: 94.1565 + y: 37.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_F10 + name: geb_96_tiprack_10ul_F10 + parent: geb_96_tiprack_10ul + position: + x: 94.1565 + y: 28.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_G10 + name: geb_96_tiprack_10ul_G10 + parent: geb_96_tiprack_10ul + position: + x: 94.1565 + y: 19.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_H10 + name: geb_96_tiprack_10ul_H10 + parent: geb_96_tiprack_10ul + position: + x: 94.1565 + y: 10.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_A11 + name: geb_96_tiprack_10ul_A11 + parent: geb_96_tiprack_10ul + position: + x: 103.1565 + y: 73.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_B11 + name: geb_96_tiprack_10ul_B11 + parent: geb_96_tiprack_10ul + position: + x: 103.1565 + y: 64.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_C11 + name: geb_96_tiprack_10ul_C11 + parent: geb_96_tiprack_10ul + position: + x: 103.1565 + y: 55.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_D11 + name: geb_96_tiprack_10ul_D11 + parent: geb_96_tiprack_10ul + position: + x: 103.1565 + y: 46.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_E11 + name: geb_96_tiprack_10ul_E11 + parent: geb_96_tiprack_10ul + position: + x: 103.1565 + y: 37.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_F11 + name: geb_96_tiprack_10ul_F11 + parent: geb_96_tiprack_10ul + position: + x: 103.1565 + y: 28.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_G11 + name: geb_96_tiprack_10ul_G11 + parent: geb_96_tiprack_10ul + position: + x: 103.1565 + y: 19.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_H11 + name: geb_96_tiprack_10ul_H11 + parent: geb_96_tiprack_10ul + position: + x: 103.1565 + y: 10.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_A12 + name: geb_96_tiprack_10ul_A12 + parent: geb_96_tiprack_10ul + position: + x: 112.1565 + y: 73.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_B12 + name: geb_96_tiprack_10ul_B12 + parent: geb_96_tiprack_10ul + position: + x: 112.1565 + y: 64.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_C12 + name: geb_96_tiprack_10ul_C12 + parent: geb_96_tiprack_10ul + position: + x: 112.1565 + y: 55.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_D12 + name: geb_96_tiprack_10ul_D12 + parent: geb_96_tiprack_10ul + position: + x: 112.1565 + y: 46.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_E12 + name: geb_96_tiprack_10ul_E12 + parent: geb_96_tiprack_10ul + position: + x: 112.1565 + y: 37.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_F12 + name: geb_96_tiprack_10ul_F12 + parent: geb_96_tiprack_10ul + position: + x: 112.1565 + y: 28.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_G12 + name: geb_96_tiprack_10ul_G12 + parent: geb_96_tiprack_10ul + position: + x: 112.1565 + y: 19.0265 + z: 22.25 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.447 + size_y: 2.447 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 6.2 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: geb_96_tiprack_10ul_H12 + name: geb_96_tiprack_10ul_H12 + parent: geb_96_tiprack_10ul + position: + x: 112.1565 + y: 10.0265 + z: 22.25 + sample_id: null + type: container + description: Geb 96 tiprack 10ul + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/tip_racks.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +opentrons_96_filtertiprack_1000ul: + category: + - tip_racks + class: + module: pylabrobot.resources.opentrons.tip_racks:opentrons_96_filtertiprack_1000ul + type: pylabrobot + config_info: + - children: + - opentrons_96_filtertiprack_1000ul_A1 + - opentrons_96_filtertiprack_1000ul_B1 + - opentrons_96_filtertiprack_1000ul_C1 + - opentrons_96_filtertiprack_1000ul_D1 + - opentrons_96_filtertiprack_1000ul_E1 + - opentrons_96_filtertiprack_1000ul_F1 + - opentrons_96_filtertiprack_1000ul_G1 + - opentrons_96_filtertiprack_1000ul_H1 + - opentrons_96_filtertiprack_1000ul_A2 + - opentrons_96_filtertiprack_1000ul_B2 + - opentrons_96_filtertiprack_1000ul_C2 + - opentrons_96_filtertiprack_1000ul_D2 + - opentrons_96_filtertiprack_1000ul_E2 + - opentrons_96_filtertiprack_1000ul_F2 + - opentrons_96_filtertiprack_1000ul_G2 + - opentrons_96_filtertiprack_1000ul_H2 + - opentrons_96_filtertiprack_1000ul_A3 + - opentrons_96_filtertiprack_1000ul_B3 + - opentrons_96_filtertiprack_1000ul_C3 + - opentrons_96_filtertiprack_1000ul_D3 + - opentrons_96_filtertiprack_1000ul_E3 + - opentrons_96_filtertiprack_1000ul_F3 + - opentrons_96_filtertiprack_1000ul_G3 + - opentrons_96_filtertiprack_1000ul_H3 + - opentrons_96_filtertiprack_1000ul_A4 + - opentrons_96_filtertiprack_1000ul_B4 + - opentrons_96_filtertiprack_1000ul_C4 + - opentrons_96_filtertiprack_1000ul_D4 + - opentrons_96_filtertiprack_1000ul_E4 + - opentrons_96_filtertiprack_1000ul_F4 + - opentrons_96_filtertiprack_1000ul_G4 + - opentrons_96_filtertiprack_1000ul_H4 + - opentrons_96_filtertiprack_1000ul_A5 + - opentrons_96_filtertiprack_1000ul_B5 + - opentrons_96_filtertiprack_1000ul_C5 + - opentrons_96_filtertiprack_1000ul_D5 + - opentrons_96_filtertiprack_1000ul_E5 + - opentrons_96_filtertiprack_1000ul_F5 + - opentrons_96_filtertiprack_1000ul_G5 + - opentrons_96_filtertiprack_1000ul_H5 + - opentrons_96_filtertiprack_1000ul_A6 + - opentrons_96_filtertiprack_1000ul_B6 + - opentrons_96_filtertiprack_1000ul_C6 + - opentrons_96_filtertiprack_1000ul_D6 + - opentrons_96_filtertiprack_1000ul_E6 + - opentrons_96_filtertiprack_1000ul_F6 + - opentrons_96_filtertiprack_1000ul_G6 + - opentrons_96_filtertiprack_1000ul_H6 + - opentrons_96_filtertiprack_1000ul_A7 + - opentrons_96_filtertiprack_1000ul_B7 + - opentrons_96_filtertiprack_1000ul_C7 + - opentrons_96_filtertiprack_1000ul_D7 + - opentrons_96_filtertiprack_1000ul_E7 + - opentrons_96_filtertiprack_1000ul_F7 + - opentrons_96_filtertiprack_1000ul_G7 + - opentrons_96_filtertiprack_1000ul_H7 + - opentrons_96_filtertiprack_1000ul_A8 + - opentrons_96_filtertiprack_1000ul_B8 + - opentrons_96_filtertiprack_1000ul_C8 + - opentrons_96_filtertiprack_1000ul_D8 + - opentrons_96_filtertiprack_1000ul_E8 + - opentrons_96_filtertiprack_1000ul_F8 + - opentrons_96_filtertiprack_1000ul_G8 + - opentrons_96_filtertiprack_1000ul_H8 + - opentrons_96_filtertiprack_1000ul_A9 + - opentrons_96_filtertiprack_1000ul_B9 + - opentrons_96_filtertiprack_1000ul_C9 + - opentrons_96_filtertiprack_1000ul_D9 + - opentrons_96_filtertiprack_1000ul_E9 + - opentrons_96_filtertiprack_1000ul_F9 + - opentrons_96_filtertiprack_1000ul_G9 + - opentrons_96_filtertiprack_1000ul_H9 + - opentrons_96_filtertiprack_1000ul_A10 + - opentrons_96_filtertiprack_1000ul_B10 + - opentrons_96_filtertiprack_1000ul_C10 + - opentrons_96_filtertiprack_1000ul_D10 + - opentrons_96_filtertiprack_1000ul_E10 + - opentrons_96_filtertiprack_1000ul_F10 + - opentrons_96_filtertiprack_1000ul_G10 + - opentrons_96_filtertiprack_1000ul_H10 + - opentrons_96_filtertiprack_1000ul_A11 + - opentrons_96_filtertiprack_1000ul_B11 + - opentrons_96_filtertiprack_1000ul_C11 + - opentrons_96_filtertiprack_1000ul_D11 + - opentrons_96_filtertiprack_1000ul_E11 + - opentrons_96_filtertiprack_1000ul_F11 + - opentrons_96_filtertiprack_1000ul_G11 + - opentrons_96_filtertiprack_1000ul_H11 + - opentrons_96_filtertiprack_1000ul_A12 + - opentrons_96_filtertiprack_1000ul_B12 + - opentrons_96_filtertiprack_1000ul_C12 + - opentrons_96_filtertiprack_1000ul_D12 + - opentrons_96_filtertiprack_1000ul_E12 + - opentrons_96_filtertiprack_1000ul_F12 + - opentrons_96_filtertiprack_1000ul_G12 + - opentrons_96_filtertiprack_1000ul_H12 + class: '' + config: + barcode: null + category: tip_rack + model: Opentrons OT-2 96 Filter Tip Rack 1000 µL + ordering: + A1: opentrons_96_filtertiprack_1000ul_A1 + B1: opentrons_96_filtertiprack_1000ul_B1 + C1: opentrons_96_filtertiprack_1000ul_C1 + D1: opentrons_96_filtertiprack_1000ul_D1 + E1: opentrons_96_filtertiprack_1000ul_E1 + F1: opentrons_96_filtertiprack_1000ul_F1 + G1: opentrons_96_filtertiprack_1000ul_G1 + H1: opentrons_96_filtertiprack_1000ul_H1 + A2: opentrons_96_filtertiprack_1000ul_A2 + B2: opentrons_96_filtertiprack_1000ul_B2 + C2: opentrons_96_filtertiprack_1000ul_C2 + D2: opentrons_96_filtertiprack_1000ul_D2 + E2: opentrons_96_filtertiprack_1000ul_E2 + F2: opentrons_96_filtertiprack_1000ul_F2 + G2: opentrons_96_filtertiprack_1000ul_G2 + H2: opentrons_96_filtertiprack_1000ul_H2 + A3: opentrons_96_filtertiprack_1000ul_A3 + B3: opentrons_96_filtertiprack_1000ul_B3 + C3: opentrons_96_filtertiprack_1000ul_C3 + D3: opentrons_96_filtertiprack_1000ul_D3 + E3: opentrons_96_filtertiprack_1000ul_E3 + F3: opentrons_96_filtertiprack_1000ul_F3 + G3: opentrons_96_filtertiprack_1000ul_G3 + H3: opentrons_96_filtertiprack_1000ul_H3 + A4: opentrons_96_filtertiprack_1000ul_A4 + B4: opentrons_96_filtertiprack_1000ul_B4 + C4: opentrons_96_filtertiprack_1000ul_C4 + D4: opentrons_96_filtertiprack_1000ul_D4 + E4: opentrons_96_filtertiprack_1000ul_E4 + F4: opentrons_96_filtertiprack_1000ul_F4 + G4: opentrons_96_filtertiprack_1000ul_G4 + H4: opentrons_96_filtertiprack_1000ul_H4 + A5: opentrons_96_filtertiprack_1000ul_A5 + B5: opentrons_96_filtertiprack_1000ul_B5 + C5: opentrons_96_filtertiprack_1000ul_C5 + D5: opentrons_96_filtertiprack_1000ul_D5 + E5: opentrons_96_filtertiprack_1000ul_E5 + F5: opentrons_96_filtertiprack_1000ul_F5 + G5: opentrons_96_filtertiprack_1000ul_G5 + H5: opentrons_96_filtertiprack_1000ul_H5 + A6: opentrons_96_filtertiprack_1000ul_A6 + B6: opentrons_96_filtertiprack_1000ul_B6 + C6: opentrons_96_filtertiprack_1000ul_C6 + D6: opentrons_96_filtertiprack_1000ul_D6 + E6: opentrons_96_filtertiprack_1000ul_E6 + F6: opentrons_96_filtertiprack_1000ul_F6 + G6: opentrons_96_filtertiprack_1000ul_G6 + H6: opentrons_96_filtertiprack_1000ul_H6 + A7: opentrons_96_filtertiprack_1000ul_A7 + B7: opentrons_96_filtertiprack_1000ul_B7 + C7: opentrons_96_filtertiprack_1000ul_C7 + D7: opentrons_96_filtertiprack_1000ul_D7 + E7: opentrons_96_filtertiprack_1000ul_E7 + F7: opentrons_96_filtertiprack_1000ul_F7 + G7: opentrons_96_filtertiprack_1000ul_G7 + H7: opentrons_96_filtertiprack_1000ul_H7 + A8: opentrons_96_filtertiprack_1000ul_A8 + B8: opentrons_96_filtertiprack_1000ul_B8 + C8: opentrons_96_filtertiprack_1000ul_C8 + D8: opentrons_96_filtertiprack_1000ul_D8 + E8: opentrons_96_filtertiprack_1000ul_E8 + F8: opentrons_96_filtertiprack_1000ul_F8 + G8: opentrons_96_filtertiprack_1000ul_G8 + H8: opentrons_96_filtertiprack_1000ul_H8 + A9: opentrons_96_filtertiprack_1000ul_A9 + B9: opentrons_96_filtertiprack_1000ul_B9 + C9: opentrons_96_filtertiprack_1000ul_C9 + D9: opentrons_96_filtertiprack_1000ul_D9 + E9: opentrons_96_filtertiprack_1000ul_E9 + F9: opentrons_96_filtertiprack_1000ul_F9 + G9: opentrons_96_filtertiprack_1000ul_G9 + H9: opentrons_96_filtertiprack_1000ul_H9 + A10: opentrons_96_filtertiprack_1000ul_A10 + B10: opentrons_96_filtertiprack_1000ul_B10 + C10: opentrons_96_filtertiprack_1000ul_C10 + D10: opentrons_96_filtertiprack_1000ul_D10 + E10: opentrons_96_filtertiprack_1000ul_E10 + F10: opentrons_96_filtertiprack_1000ul_F10 + G10: opentrons_96_filtertiprack_1000ul_G10 + H10: opentrons_96_filtertiprack_1000ul_H10 + A11: opentrons_96_filtertiprack_1000ul_A11 + B11: opentrons_96_filtertiprack_1000ul_B11 + C11: opentrons_96_filtertiprack_1000ul_C11 + D11: opentrons_96_filtertiprack_1000ul_D11 + E11: opentrons_96_filtertiprack_1000ul_E11 + F11: opentrons_96_filtertiprack_1000ul_F11 + G11: opentrons_96_filtertiprack_1000ul_G11 + H11: opentrons_96_filtertiprack_1000ul_H11 + A12: opentrons_96_filtertiprack_1000ul_A12 + B12: opentrons_96_filtertiprack_1000ul_B12 + C12: opentrons_96_filtertiprack_1000ul_C12 + D12: opentrons_96_filtertiprack_1000ul_D12 + E12: opentrons_96_filtertiprack_1000ul_E12 + F12: opentrons_96_filtertiprack_1000ul_F12 + G12: opentrons_96_filtertiprack_1000ul_G12 + H12: opentrons_96_filtertiprack_1000ul_H12 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.76 + size_y: 85.48 + size_z: 97.47 + type: TipRack + data: {} + id: opentrons_96_filtertiprack_1000ul + name: opentrons_96_filtertiprack_1000ul + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_A1 + name: opentrons_96_filtertiprack_1000ul_A1 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 11.804 + y: 71.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_B1 + name: opentrons_96_filtertiprack_1000ul_B1 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 11.804 + y: 62.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_C1 + name: opentrons_96_filtertiprack_1000ul_C1 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 11.804 + y: 53.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_D1 + name: opentrons_96_filtertiprack_1000ul_D1 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 11.804 + y: 44.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_E1 + name: opentrons_96_filtertiprack_1000ul_E1 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 11.804 + y: 35.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_F1 + name: opentrons_96_filtertiprack_1000ul_F1 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 11.804 + y: 26.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_G1 + name: opentrons_96_filtertiprack_1000ul_G1 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 11.804 + y: 17.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_H1 + name: opentrons_96_filtertiprack_1000ul_H1 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 11.804 + y: 8.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_A2 + name: opentrons_96_filtertiprack_1000ul_A2 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 20.804 + y: 71.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_B2 + name: opentrons_96_filtertiprack_1000ul_B2 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 20.804 + y: 62.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_C2 + name: opentrons_96_filtertiprack_1000ul_C2 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 20.804 + y: 53.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_D2 + name: opentrons_96_filtertiprack_1000ul_D2 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 20.804 + y: 44.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_E2 + name: opentrons_96_filtertiprack_1000ul_E2 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 20.804 + y: 35.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_F2 + name: opentrons_96_filtertiprack_1000ul_F2 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 20.804 + y: 26.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_G2 + name: opentrons_96_filtertiprack_1000ul_G2 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 20.804 + y: 17.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_H2 + name: opentrons_96_filtertiprack_1000ul_H2 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 20.804 + y: 8.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_A3 + name: opentrons_96_filtertiprack_1000ul_A3 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 29.804 + y: 71.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_B3 + name: opentrons_96_filtertiprack_1000ul_B3 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 29.804 + y: 62.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_C3 + name: opentrons_96_filtertiprack_1000ul_C3 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 29.804 + y: 53.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_D3 + name: opentrons_96_filtertiprack_1000ul_D3 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 29.804 + y: 44.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_E3 + name: opentrons_96_filtertiprack_1000ul_E3 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 29.804 + y: 35.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_F3 + name: opentrons_96_filtertiprack_1000ul_F3 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 29.804 + y: 26.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_G3 + name: opentrons_96_filtertiprack_1000ul_G3 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 29.804 + y: 17.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_H3 + name: opentrons_96_filtertiprack_1000ul_H3 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 29.804 + y: 8.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_A4 + name: opentrons_96_filtertiprack_1000ul_A4 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 38.804 + y: 71.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_B4 + name: opentrons_96_filtertiprack_1000ul_B4 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 38.804 + y: 62.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_C4 + name: opentrons_96_filtertiprack_1000ul_C4 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 38.804 + y: 53.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_D4 + name: opentrons_96_filtertiprack_1000ul_D4 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 38.804 + y: 44.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_E4 + name: opentrons_96_filtertiprack_1000ul_E4 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 38.804 + y: 35.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_F4 + name: opentrons_96_filtertiprack_1000ul_F4 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 38.804 + y: 26.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_G4 + name: opentrons_96_filtertiprack_1000ul_G4 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 38.804 + y: 17.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_H4 + name: opentrons_96_filtertiprack_1000ul_H4 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 38.804 + y: 8.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_A5 + name: opentrons_96_filtertiprack_1000ul_A5 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 47.804 + y: 71.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_B5 + name: opentrons_96_filtertiprack_1000ul_B5 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 47.804 + y: 62.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_C5 + name: opentrons_96_filtertiprack_1000ul_C5 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 47.804 + y: 53.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_D5 + name: opentrons_96_filtertiprack_1000ul_D5 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 47.804 + y: 44.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_E5 + name: opentrons_96_filtertiprack_1000ul_E5 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 47.804 + y: 35.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_F5 + name: opentrons_96_filtertiprack_1000ul_F5 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 47.804 + y: 26.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_G5 + name: opentrons_96_filtertiprack_1000ul_G5 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 47.804 + y: 17.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_H5 + name: opentrons_96_filtertiprack_1000ul_H5 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 47.804 + y: 8.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_A6 + name: opentrons_96_filtertiprack_1000ul_A6 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 56.804 + y: 71.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_B6 + name: opentrons_96_filtertiprack_1000ul_B6 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 56.804 + y: 62.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_C6 + name: opentrons_96_filtertiprack_1000ul_C6 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 56.804 + y: 53.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_D6 + name: opentrons_96_filtertiprack_1000ul_D6 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 56.804 + y: 44.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_E6 + name: opentrons_96_filtertiprack_1000ul_E6 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 56.804 + y: 35.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_F6 + name: opentrons_96_filtertiprack_1000ul_F6 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 56.804 + y: 26.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_G6 + name: opentrons_96_filtertiprack_1000ul_G6 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 56.804 + y: 17.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_H6 + name: opentrons_96_filtertiprack_1000ul_H6 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 56.804 + y: 8.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_A7 + name: opentrons_96_filtertiprack_1000ul_A7 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 65.804 + y: 71.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_B7 + name: opentrons_96_filtertiprack_1000ul_B7 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 65.804 + y: 62.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_C7 + name: opentrons_96_filtertiprack_1000ul_C7 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 65.804 + y: 53.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_D7 + name: opentrons_96_filtertiprack_1000ul_D7 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 65.804 + y: 44.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_E7 + name: opentrons_96_filtertiprack_1000ul_E7 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 65.804 + y: 35.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_F7 + name: opentrons_96_filtertiprack_1000ul_F7 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 65.804 + y: 26.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_G7 + name: opentrons_96_filtertiprack_1000ul_G7 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 65.804 + y: 17.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_H7 + name: opentrons_96_filtertiprack_1000ul_H7 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 65.804 + y: 8.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_A8 + name: opentrons_96_filtertiprack_1000ul_A8 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 74.804 + y: 71.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_B8 + name: opentrons_96_filtertiprack_1000ul_B8 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 74.804 + y: 62.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_C8 + name: opentrons_96_filtertiprack_1000ul_C8 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 74.804 + y: 53.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_D8 + name: opentrons_96_filtertiprack_1000ul_D8 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 74.804 + y: 44.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_E8 + name: opentrons_96_filtertiprack_1000ul_E8 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 74.804 + y: 35.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_F8 + name: opentrons_96_filtertiprack_1000ul_F8 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 74.804 + y: 26.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_G8 + name: opentrons_96_filtertiprack_1000ul_G8 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 74.804 + y: 17.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_H8 + name: opentrons_96_filtertiprack_1000ul_H8 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 74.804 + y: 8.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_A9 + name: opentrons_96_filtertiprack_1000ul_A9 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 83.804 + y: 71.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_B9 + name: opentrons_96_filtertiprack_1000ul_B9 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 83.804 + y: 62.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_C9 + name: opentrons_96_filtertiprack_1000ul_C9 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 83.804 + y: 53.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_D9 + name: opentrons_96_filtertiprack_1000ul_D9 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 83.804 + y: 44.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_E9 + name: opentrons_96_filtertiprack_1000ul_E9 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 83.804 + y: 35.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_F9 + name: opentrons_96_filtertiprack_1000ul_F9 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 83.804 + y: 26.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_G9 + name: opentrons_96_filtertiprack_1000ul_G9 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 83.804 + y: 17.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_H9 + name: opentrons_96_filtertiprack_1000ul_H9 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 83.804 + y: 8.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_A10 + name: opentrons_96_filtertiprack_1000ul_A10 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 92.804 + y: 71.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_B10 + name: opentrons_96_filtertiprack_1000ul_B10 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 92.804 + y: 62.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_C10 + name: opentrons_96_filtertiprack_1000ul_C10 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 92.804 + y: 53.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_D10 + name: opentrons_96_filtertiprack_1000ul_D10 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 92.804 + y: 44.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_E10 + name: opentrons_96_filtertiprack_1000ul_E10 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 92.804 + y: 35.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_F10 + name: opentrons_96_filtertiprack_1000ul_F10 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 92.804 + y: 26.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_G10 + name: opentrons_96_filtertiprack_1000ul_G10 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 92.804 + y: 17.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_H10 + name: opentrons_96_filtertiprack_1000ul_H10 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 92.804 + y: 8.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_A11 + name: opentrons_96_filtertiprack_1000ul_A11 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 101.804 + y: 71.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_B11 + name: opentrons_96_filtertiprack_1000ul_B11 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 101.804 + y: 62.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_C11 + name: opentrons_96_filtertiprack_1000ul_C11 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 101.804 + y: 53.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_D11 + name: opentrons_96_filtertiprack_1000ul_D11 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 101.804 + y: 44.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_E11 + name: opentrons_96_filtertiprack_1000ul_E11 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 101.804 + y: 35.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_F11 + name: opentrons_96_filtertiprack_1000ul_F11 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 101.804 + y: 26.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_G11 + name: opentrons_96_filtertiprack_1000ul_G11 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 101.804 + y: 17.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_H11 + name: opentrons_96_filtertiprack_1000ul_H11 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 101.804 + y: 8.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_A12 + name: opentrons_96_filtertiprack_1000ul_A12 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 110.804 + y: 71.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_B12 + name: opentrons_96_filtertiprack_1000ul_B12 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 110.804 + y: 62.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_C12 + name: opentrons_96_filtertiprack_1000ul_C12 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 110.804 + y: 53.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_D12 + name: opentrons_96_filtertiprack_1000ul_D12 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 110.804 + y: 44.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_E12 + name: opentrons_96_filtertiprack_1000ul_E12 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 110.804 + y: 35.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_F12 + name: opentrons_96_filtertiprack_1000ul_F12 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 110.804 + y: 26.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_G12 + name: opentrons_96_filtertiprack_1000ul_G12 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 110.804 + y: 17.704 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: true + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_1000ul_H12 + name: opentrons_96_filtertiprack_1000ul_H12 + parent: opentrons_96_filtertiprack_1000ul + position: + x: 110.804 + y: 8.704 + z: 9.47 + sample_id: null + type: container + description: Opentrons 96 filtertiprack 1000ul + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/tip_racks.yaml + handles: [] + icon: '' + init_param_schema: {} + model: + children_mesh: generic_labware_tube_10_75/meshes/0_base.stl + children_mesh_tf: + - 0.0018 + - 0.0018 + - 0 + - -1.5708 + - 0 + - 0 + mesh: tecan_nested_tip_rack/meshes/plate.stl + mesh_tf: + - 0.064 + - 0.043 + - 0 + - -1.5708 + - 0 + - 1.5708 + type: resource + registry_type: resource + version: 1.0.0 +opentrons_96_filtertiprack_10ul: + category: + - tip_racks + class: + module: pylabrobot.resources.opentrons.tip_racks:opentrons_96_filtertiprack_10ul + type: pylabrobot + config_info: + - children: + - opentrons_96_filtertiprack_10ul_A1 + - opentrons_96_filtertiprack_10ul_B1 + - opentrons_96_filtertiprack_10ul_C1 + - opentrons_96_filtertiprack_10ul_D1 + - opentrons_96_filtertiprack_10ul_E1 + - opentrons_96_filtertiprack_10ul_F1 + - opentrons_96_filtertiprack_10ul_G1 + - opentrons_96_filtertiprack_10ul_H1 + - opentrons_96_filtertiprack_10ul_A2 + - opentrons_96_filtertiprack_10ul_B2 + - opentrons_96_filtertiprack_10ul_C2 + - opentrons_96_filtertiprack_10ul_D2 + - opentrons_96_filtertiprack_10ul_E2 + - opentrons_96_filtertiprack_10ul_F2 + - opentrons_96_filtertiprack_10ul_G2 + - opentrons_96_filtertiprack_10ul_H2 + - opentrons_96_filtertiprack_10ul_A3 + - opentrons_96_filtertiprack_10ul_B3 + - opentrons_96_filtertiprack_10ul_C3 + - opentrons_96_filtertiprack_10ul_D3 + - opentrons_96_filtertiprack_10ul_E3 + - opentrons_96_filtertiprack_10ul_F3 + - opentrons_96_filtertiprack_10ul_G3 + - opentrons_96_filtertiprack_10ul_H3 + - opentrons_96_filtertiprack_10ul_A4 + - opentrons_96_filtertiprack_10ul_B4 + - opentrons_96_filtertiprack_10ul_C4 + - opentrons_96_filtertiprack_10ul_D4 + - opentrons_96_filtertiprack_10ul_E4 + - opentrons_96_filtertiprack_10ul_F4 + - opentrons_96_filtertiprack_10ul_G4 + - opentrons_96_filtertiprack_10ul_H4 + - opentrons_96_filtertiprack_10ul_A5 + - opentrons_96_filtertiprack_10ul_B5 + - opentrons_96_filtertiprack_10ul_C5 + - opentrons_96_filtertiprack_10ul_D5 + - opentrons_96_filtertiprack_10ul_E5 + - opentrons_96_filtertiprack_10ul_F5 + - opentrons_96_filtertiprack_10ul_G5 + - opentrons_96_filtertiprack_10ul_H5 + - opentrons_96_filtertiprack_10ul_A6 + - opentrons_96_filtertiprack_10ul_B6 + - opentrons_96_filtertiprack_10ul_C6 + - opentrons_96_filtertiprack_10ul_D6 + - opentrons_96_filtertiprack_10ul_E6 + - opentrons_96_filtertiprack_10ul_F6 + - opentrons_96_filtertiprack_10ul_G6 + - opentrons_96_filtertiprack_10ul_H6 + - opentrons_96_filtertiprack_10ul_A7 + - opentrons_96_filtertiprack_10ul_B7 + - opentrons_96_filtertiprack_10ul_C7 + - opentrons_96_filtertiprack_10ul_D7 + - opentrons_96_filtertiprack_10ul_E7 + - opentrons_96_filtertiprack_10ul_F7 + - opentrons_96_filtertiprack_10ul_G7 + - opentrons_96_filtertiprack_10ul_H7 + - opentrons_96_filtertiprack_10ul_A8 + - opentrons_96_filtertiprack_10ul_B8 + - opentrons_96_filtertiprack_10ul_C8 + - opentrons_96_filtertiprack_10ul_D8 + - opentrons_96_filtertiprack_10ul_E8 + - opentrons_96_filtertiprack_10ul_F8 + - opentrons_96_filtertiprack_10ul_G8 + - opentrons_96_filtertiprack_10ul_H8 + - opentrons_96_filtertiprack_10ul_A9 + - opentrons_96_filtertiprack_10ul_B9 + - opentrons_96_filtertiprack_10ul_C9 + - opentrons_96_filtertiprack_10ul_D9 + - opentrons_96_filtertiprack_10ul_E9 + - opentrons_96_filtertiprack_10ul_F9 + - opentrons_96_filtertiprack_10ul_G9 + - opentrons_96_filtertiprack_10ul_H9 + - opentrons_96_filtertiprack_10ul_A10 + - opentrons_96_filtertiprack_10ul_B10 + - opentrons_96_filtertiprack_10ul_C10 + - opentrons_96_filtertiprack_10ul_D10 + - opentrons_96_filtertiprack_10ul_E10 + - opentrons_96_filtertiprack_10ul_F10 + - opentrons_96_filtertiprack_10ul_G10 + - opentrons_96_filtertiprack_10ul_H10 + - opentrons_96_filtertiprack_10ul_A11 + - opentrons_96_filtertiprack_10ul_B11 + - opentrons_96_filtertiprack_10ul_C11 + - opentrons_96_filtertiprack_10ul_D11 + - opentrons_96_filtertiprack_10ul_E11 + - opentrons_96_filtertiprack_10ul_F11 + - opentrons_96_filtertiprack_10ul_G11 + - opentrons_96_filtertiprack_10ul_H11 + - opentrons_96_filtertiprack_10ul_A12 + - opentrons_96_filtertiprack_10ul_B12 + - opentrons_96_filtertiprack_10ul_C12 + - opentrons_96_filtertiprack_10ul_D12 + - opentrons_96_filtertiprack_10ul_E12 + - opentrons_96_filtertiprack_10ul_F12 + - opentrons_96_filtertiprack_10ul_G12 + - opentrons_96_filtertiprack_10ul_H12 + class: '' + config: + barcode: null + category: tip_rack + model: Opentrons OT-2 96 Filter Tip Rack 10 µL + ordering: + A1: opentrons_96_filtertiprack_10ul_A1 + B1: opentrons_96_filtertiprack_10ul_B1 + C1: opentrons_96_filtertiprack_10ul_C1 + D1: opentrons_96_filtertiprack_10ul_D1 + E1: opentrons_96_filtertiprack_10ul_E1 + F1: opentrons_96_filtertiprack_10ul_F1 + G1: opentrons_96_filtertiprack_10ul_G1 + H1: opentrons_96_filtertiprack_10ul_H1 + A2: opentrons_96_filtertiprack_10ul_A2 + B2: opentrons_96_filtertiprack_10ul_B2 + C2: opentrons_96_filtertiprack_10ul_C2 + D2: opentrons_96_filtertiprack_10ul_D2 + E2: opentrons_96_filtertiprack_10ul_E2 + F2: opentrons_96_filtertiprack_10ul_F2 + G2: opentrons_96_filtertiprack_10ul_G2 + H2: opentrons_96_filtertiprack_10ul_H2 + A3: opentrons_96_filtertiprack_10ul_A3 + B3: opentrons_96_filtertiprack_10ul_B3 + C3: opentrons_96_filtertiprack_10ul_C3 + D3: opentrons_96_filtertiprack_10ul_D3 + E3: opentrons_96_filtertiprack_10ul_E3 + F3: opentrons_96_filtertiprack_10ul_F3 + G3: opentrons_96_filtertiprack_10ul_G3 + H3: opentrons_96_filtertiprack_10ul_H3 + A4: opentrons_96_filtertiprack_10ul_A4 + B4: opentrons_96_filtertiprack_10ul_B4 + C4: opentrons_96_filtertiprack_10ul_C4 + D4: opentrons_96_filtertiprack_10ul_D4 + E4: opentrons_96_filtertiprack_10ul_E4 + F4: opentrons_96_filtertiprack_10ul_F4 + G4: opentrons_96_filtertiprack_10ul_G4 + H4: opentrons_96_filtertiprack_10ul_H4 + A5: opentrons_96_filtertiprack_10ul_A5 + B5: opentrons_96_filtertiprack_10ul_B5 + C5: opentrons_96_filtertiprack_10ul_C5 + D5: opentrons_96_filtertiprack_10ul_D5 + E5: opentrons_96_filtertiprack_10ul_E5 + F5: opentrons_96_filtertiprack_10ul_F5 + G5: opentrons_96_filtertiprack_10ul_G5 + H5: opentrons_96_filtertiprack_10ul_H5 + A6: opentrons_96_filtertiprack_10ul_A6 + B6: opentrons_96_filtertiprack_10ul_B6 + C6: opentrons_96_filtertiprack_10ul_C6 + D6: opentrons_96_filtertiprack_10ul_D6 + E6: opentrons_96_filtertiprack_10ul_E6 + F6: opentrons_96_filtertiprack_10ul_F6 + G6: opentrons_96_filtertiprack_10ul_G6 + H6: opentrons_96_filtertiprack_10ul_H6 + A7: opentrons_96_filtertiprack_10ul_A7 + B7: opentrons_96_filtertiprack_10ul_B7 + C7: opentrons_96_filtertiprack_10ul_C7 + D7: opentrons_96_filtertiprack_10ul_D7 + E7: opentrons_96_filtertiprack_10ul_E7 + F7: opentrons_96_filtertiprack_10ul_F7 + G7: opentrons_96_filtertiprack_10ul_G7 + H7: opentrons_96_filtertiprack_10ul_H7 + A8: opentrons_96_filtertiprack_10ul_A8 + B8: opentrons_96_filtertiprack_10ul_B8 + C8: opentrons_96_filtertiprack_10ul_C8 + D8: opentrons_96_filtertiprack_10ul_D8 + E8: opentrons_96_filtertiprack_10ul_E8 + F8: opentrons_96_filtertiprack_10ul_F8 + G8: opentrons_96_filtertiprack_10ul_G8 + H8: opentrons_96_filtertiprack_10ul_H8 + A9: opentrons_96_filtertiprack_10ul_A9 + B9: opentrons_96_filtertiprack_10ul_B9 + C9: opentrons_96_filtertiprack_10ul_C9 + D9: opentrons_96_filtertiprack_10ul_D9 + E9: opentrons_96_filtertiprack_10ul_E9 + F9: opentrons_96_filtertiprack_10ul_F9 + G9: opentrons_96_filtertiprack_10ul_G9 + H9: opentrons_96_filtertiprack_10ul_H9 + A10: opentrons_96_filtertiprack_10ul_A10 + B10: opentrons_96_filtertiprack_10ul_B10 + C10: opentrons_96_filtertiprack_10ul_C10 + D10: opentrons_96_filtertiprack_10ul_D10 + E10: opentrons_96_filtertiprack_10ul_E10 + F10: opentrons_96_filtertiprack_10ul_F10 + G10: opentrons_96_filtertiprack_10ul_G10 + H10: opentrons_96_filtertiprack_10ul_H10 + A11: opentrons_96_filtertiprack_10ul_A11 + B11: opentrons_96_filtertiprack_10ul_B11 + C11: opentrons_96_filtertiprack_10ul_C11 + D11: opentrons_96_filtertiprack_10ul_D11 + E11: opentrons_96_filtertiprack_10ul_E11 + F11: opentrons_96_filtertiprack_10ul_F11 + G11: opentrons_96_filtertiprack_10ul_G11 + H11: opentrons_96_filtertiprack_10ul_H11 + A12: opentrons_96_filtertiprack_10ul_A12 + B12: opentrons_96_filtertiprack_10ul_B12 + C12: opentrons_96_filtertiprack_10ul_C12 + D12: opentrons_96_filtertiprack_10ul_D12 + E12: opentrons_96_filtertiprack_10ul_E12 + F12: opentrons_96_filtertiprack_10ul_F12 + G12: opentrons_96_filtertiprack_10ul_G12 + H12: opentrons_96_filtertiprack_10ul_H12 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.76 + size_y: 85.48 + size_z: 64.69 + type: TipRack + data: {} + id: opentrons_96_filtertiprack_10ul + name: opentrons_96_filtertiprack_10ul + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_A1 + name: opentrons_96_filtertiprack_10ul_A1 + parent: opentrons_96_filtertiprack_10ul + position: + x: 13.204 + y: 73.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_B1 + name: opentrons_96_filtertiprack_10ul_B1 + parent: opentrons_96_filtertiprack_10ul + position: + x: 13.204 + y: 64.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_C1 + name: opentrons_96_filtertiprack_10ul_C1 + parent: opentrons_96_filtertiprack_10ul + position: + x: 13.204 + y: 55.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_D1 + name: opentrons_96_filtertiprack_10ul_D1 + parent: opentrons_96_filtertiprack_10ul + position: + x: 13.204 + y: 46.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_E1 + name: opentrons_96_filtertiprack_10ul_E1 + parent: opentrons_96_filtertiprack_10ul + position: + x: 13.204 + y: 37.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_F1 + name: opentrons_96_filtertiprack_10ul_F1 + parent: opentrons_96_filtertiprack_10ul + position: + x: 13.204 + y: 28.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_G1 + name: opentrons_96_filtertiprack_10ul_G1 + parent: opentrons_96_filtertiprack_10ul + position: + x: 13.204 + y: 19.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_H1 + name: opentrons_96_filtertiprack_10ul_H1 + parent: opentrons_96_filtertiprack_10ul + position: + x: 13.204 + y: 10.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_A2 + name: opentrons_96_filtertiprack_10ul_A2 + parent: opentrons_96_filtertiprack_10ul + position: + x: 22.204 + y: 73.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_B2 + name: opentrons_96_filtertiprack_10ul_B2 + parent: opentrons_96_filtertiprack_10ul + position: + x: 22.204 + y: 64.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_C2 + name: opentrons_96_filtertiprack_10ul_C2 + parent: opentrons_96_filtertiprack_10ul + position: + x: 22.204 + y: 55.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_D2 + name: opentrons_96_filtertiprack_10ul_D2 + parent: opentrons_96_filtertiprack_10ul + position: + x: 22.204 + y: 46.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_E2 + name: opentrons_96_filtertiprack_10ul_E2 + parent: opentrons_96_filtertiprack_10ul + position: + x: 22.204 + y: 37.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_F2 + name: opentrons_96_filtertiprack_10ul_F2 + parent: opentrons_96_filtertiprack_10ul + position: + x: 22.204 + y: 28.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_G2 + name: opentrons_96_filtertiprack_10ul_G2 + parent: opentrons_96_filtertiprack_10ul + position: + x: 22.204 + y: 19.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_H2 + name: opentrons_96_filtertiprack_10ul_H2 + parent: opentrons_96_filtertiprack_10ul + position: + x: 22.204 + y: 10.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_A3 + name: opentrons_96_filtertiprack_10ul_A3 + parent: opentrons_96_filtertiprack_10ul + position: + x: 31.204 + y: 73.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_B3 + name: opentrons_96_filtertiprack_10ul_B3 + parent: opentrons_96_filtertiprack_10ul + position: + x: 31.204 + y: 64.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_C3 + name: opentrons_96_filtertiprack_10ul_C3 + parent: opentrons_96_filtertiprack_10ul + position: + x: 31.204 + y: 55.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_D3 + name: opentrons_96_filtertiprack_10ul_D3 + parent: opentrons_96_filtertiprack_10ul + position: + x: 31.204 + y: 46.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_E3 + name: opentrons_96_filtertiprack_10ul_E3 + parent: opentrons_96_filtertiprack_10ul + position: + x: 31.204 + y: 37.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_F3 + name: opentrons_96_filtertiprack_10ul_F3 + parent: opentrons_96_filtertiprack_10ul + position: + x: 31.204 + y: 28.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_G3 + name: opentrons_96_filtertiprack_10ul_G3 + parent: opentrons_96_filtertiprack_10ul + position: + x: 31.204 + y: 19.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_H3 + name: opentrons_96_filtertiprack_10ul_H3 + parent: opentrons_96_filtertiprack_10ul + position: + x: 31.204 + y: 10.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_A4 + name: opentrons_96_filtertiprack_10ul_A4 + parent: opentrons_96_filtertiprack_10ul + position: + x: 40.204 + y: 73.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_B4 + name: opentrons_96_filtertiprack_10ul_B4 + parent: opentrons_96_filtertiprack_10ul + position: + x: 40.204 + y: 64.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_C4 + name: opentrons_96_filtertiprack_10ul_C4 + parent: opentrons_96_filtertiprack_10ul + position: + x: 40.204 + y: 55.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_D4 + name: opentrons_96_filtertiprack_10ul_D4 + parent: opentrons_96_filtertiprack_10ul + position: + x: 40.204 + y: 46.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_E4 + name: opentrons_96_filtertiprack_10ul_E4 + parent: opentrons_96_filtertiprack_10ul + position: + x: 40.204 + y: 37.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_F4 + name: opentrons_96_filtertiprack_10ul_F4 + parent: opentrons_96_filtertiprack_10ul + position: + x: 40.204 + y: 28.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_G4 + name: opentrons_96_filtertiprack_10ul_G4 + parent: opentrons_96_filtertiprack_10ul + position: + x: 40.204 + y: 19.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_H4 + name: opentrons_96_filtertiprack_10ul_H4 + parent: opentrons_96_filtertiprack_10ul + position: + x: 40.204 + y: 10.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_A5 + name: opentrons_96_filtertiprack_10ul_A5 + parent: opentrons_96_filtertiprack_10ul + position: + x: 49.204 + y: 73.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_B5 + name: opentrons_96_filtertiprack_10ul_B5 + parent: opentrons_96_filtertiprack_10ul + position: + x: 49.204 + y: 64.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_C5 + name: opentrons_96_filtertiprack_10ul_C5 + parent: opentrons_96_filtertiprack_10ul + position: + x: 49.204 + y: 55.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_D5 + name: opentrons_96_filtertiprack_10ul_D5 + parent: opentrons_96_filtertiprack_10ul + position: + x: 49.204 + y: 46.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_E5 + name: opentrons_96_filtertiprack_10ul_E5 + parent: opentrons_96_filtertiprack_10ul + position: + x: 49.204 + y: 37.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_F5 + name: opentrons_96_filtertiprack_10ul_F5 + parent: opentrons_96_filtertiprack_10ul + position: + x: 49.204 + y: 28.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_G5 + name: opentrons_96_filtertiprack_10ul_G5 + parent: opentrons_96_filtertiprack_10ul + position: + x: 49.204 + y: 19.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_H5 + name: opentrons_96_filtertiprack_10ul_H5 + parent: opentrons_96_filtertiprack_10ul + position: + x: 49.204 + y: 10.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_A6 + name: opentrons_96_filtertiprack_10ul_A6 + parent: opentrons_96_filtertiprack_10ul + position: + x: 58.204 + y: 73.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_B6 + name: opentrons_96_filtertiprack_10ul_B6 + parent: opentrons_96_filtertiprack_10ul + position: + x: 58.204 + y: 64.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_C6 + name: opentrons_96_filtertiprack_10ul_C6 + parent: opentrons_96_filtertiprack_10ul + position: + x: 58.204 + y: 55.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_D6 + name: opentrons_96_filtertiprack_10ul_D6 + parent: opentrons_96_filtertiprack_10ul + position: + x: 58.204 + y: 46.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_E6 + name: opentrons_96_filtertiprack_10ul_E6 + parent: opentrons_96_filtertiprack_10ul + position: + x: 58.204 + y: 37.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_F6 + name: opentrons_96_filtertiprack_10ul_F6 + parent: opentrons_96_filtertiprack_10ul + position: + x: 58.204 + y: 28.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_G6 + name: opentrons_96_filtertiprack_10ul_G6 + parent: opentrons_96_filtertiprack_10ul + position: + x: 58.204 + y: 19.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_H6 + name: opentrons_96_filtertiprack_10ul_H6 + parent: opentrons_96_filtertiprack_10ul + position: + x: 58.204 + y: 10.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_A7 + name: opentrons_96_filtertiprack_10ul_A7 + parent: opentrons_96_filtertiprack_10ul + position: + x: 67.204 + y: 73.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_B7 + name: opentrons_96_filtertiprack_10ul_B7 + parent: opentrons_96_filtertiprack_10ul + position: + x: 67.204 + y: 64.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_C7 + name: opentrons_96_filtertiprack_10ul_C7 + parent: opentrons_96_filtertiprack_10ul + position: + x: 67.204 + y: 55.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_D7 + name: opentrons_96_filtertiprack_10ul_D7 + parent: opentrons_96_filtertiprack_10ul + position: + x: 67.204 + y: 46.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_E7 + name: opentrons_96_filtertiprack_10ul_E7 + parent: opentrons_96_filtertiprack_10ul + position: + x: 67.204 + y: 37.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_F7 + name: opentrons_96_filtertiprack_10ul_F7 + parent: opentrons_96_filtertiprack_10ul + position: + x: 67.204 + y: 28.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_G7 + name: opentrons_96_filtertiprack_10ul_G7 + parent: opentrons_96_filtertiprack_10ul + position: + x: 67.204 + y: 19.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_H7 + name: opentrons_96_filtertiprack_10ul_H7 + parent: opentrons_96_filtertiprack_10ul + position: + x: 67.204 + y: 10.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_A8 + name: opentrons_96_filtertiprack_10ul_A8 + parent: opentrons_96_filtertiprack_10ul + position: + x: 76.204 + y: 73.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_B8 + name: opentrons_96_filtertiprack_10ul_B8 + parent: opentrons_96_filtertiprack_10ul + position: + x: 76.204 + y: 64.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_C8 + name: opentrons_96_filtertiprack_10ul_C8 + parent: opentrons_96_filtertiprack_10ul + position: + x: 76.204 + y: 55.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_D8 + name: opentrons_96_filtertiprack_10ul_D8 + parent: opentrons_96_filtertiprack_10ul + position: + x: 76.204 + y: 46.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_E8 + name: opentrons_96_filtertiprack_10ul_E8 + parent: opentrons_96_filtertiprack_10ul + position: + x: 76.204 + y: 37.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_F8 + name: opentrons_96_filtertiprack_10ul_F8 + parent: opentrons_96_filtertiprack_10ul + position: + x: 76.204 + y: 28.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_G8 + name: opentrons_96_filtertiprack_10ul_G8 + parent: opentrons_96_filtertiprack_10ul + position: + x: 76.204 + y: 19.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_H8 + name: opentrons_96_filtertiprack_10ul_H8 + parent: opentrons_96_filtertiprack_10ul + position: + x: 76.204 + y: 10.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_A9 + name: opentrons_96_filtertiprack_10ul_A9 + parent: opentrons_96_filtertiprack_10ul + position: + x: 85.204 + y: 73.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_B9 + name: opentrons_96_filtertiprack_10ul_B9 + parent: opentrons_96_filtertiprack_10ul + position: + x: 85.204 + y: 64.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_C9 + name: opentrons_96_filtertiprack_10ul_C9 + parent: opentrons_96_filtertiprack_10ul + position: + x: 85.204 + y: 55.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_D9 + name: opentrons_96_filtertiprack_10ul_D9 + parent: opentrons_96_filtertiprack_10ul + position: + x: 85.204 + y: 46.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_E9 + name: opentrons_96_filtertiprack_10ul_E9 + parent: opentrons_96_filtertiprack_10ul + position: + x: 85.204 + y: 37.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_F9 + name: opentrons_96_filtertiprack_10ul_F9 + parent: opentrons_96_filtertiprack_10ul + position: + x: 85.204 + y: 28.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_G9 + name: opentrons_96_filtertiprack_10ul_G9 + parent: opentrons_96_filtertiprack_10ul + position: + x: 85.204 + y: 19.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_H9 + name: opentrons_96_filtertiprack_10ul_H9 + parent: opentrons_96_filtertiprack_10ul + position: + x: 85.204 + y: 10.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_A10 + name: opentrons_96_filtertiprack_10ul_A10 + parent: opentrons_96_filtertiprack_10ul + position: + x: 94.204 + y: 73.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_B10 + name: opentrons_96_filtertiprack_10ul_B10 + parent: opentrons_96_filtertiprack_10ul + position: + x: 94.204 + y: 64.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_C10 + name: opentrons_96_filtertiprack_10ul_C10 + parent: opentrons_96_filtertiprack_10ul + position: + x: 94.204 + y: 55.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_D10 + name: opentrons_96_filtertiprack_10ul_D10 + parent: opentrons_96_filtertiprack_10ul + position: + x: 94.204 + y: 46.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_E10 + name: opentrons_96_filtertiprack_10ul_E10 + parent: opentrons_96_filtertiprack_10ul + position: + x: 94.204 + y: 37.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_F10 + name: opentrons_96_filtertiprack_10ul_F10 + parent: opentrons_96_filtertiprack_10ul + position: + x: 94.204 + y: 28.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_G10 + name: opentrons_96_filtertiprack_10ul_G10 + parent: opentrons_96_filtertiprack_10ul + position: + x: 94.204 + y: 19.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_H10 + name: opentrons_96_filtertiprack_10ul_H10 + parent: opentrons_96_filtertiprack_10ul + position: + x: 94.204 + y: 10.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_A11 + name: opentrons_96_filtertiprack_10ul_A11 + parent: opentrons_96_filtertiprack_10ul + position: + x: 103.204 + y: 73.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_B11 + name: opentrons_96_filtertiprack_10ul_B11 + parent: opentrons_96_filtertiprack_10ul + position: + x: 103.204 + y: 64.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_C11 + name: opentrons_96_filtertiprack_10ul_C11 + parent: opentrons_96_filtertiprack_10ul + position: + x: 103.204 + y: 55.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_D11 + name: opentrons_96_filtertiprack_10ul_D11 + parent: opentrons_96_filtertiprack_10ul + position: + x: 103.204 + y: 46.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_E11 + name: opentrons_96_filtertiprack_10ul_E11 + parent: opentrons_96_filtertiprack_10ul + position: + x: 103.204 + y: 37.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_F11 + name: opentrons_96_filtertiprack_10ul_F11 + parent: opentrons_96_filtertiprack_10ul + position: + x: 103.204 + y: 28.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_G11 + name: opentrons_96_filtertiprack_10ul_G11 + parent: opentrons_96_filtertiprack_10ul + position: + x: 103.204 + y: 19.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_H11 + name: opentrons_96_filtertiprack_10ul_H11 + parent: opentrons_96_filtertiprack_10ul + position: + x: 103.204 + y: 10.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_A12 + name: opentrons_96_filtertiprack_10ul_A12 + parent: opentrons_96_filtertiprack_10ul + position: + x: 112.204 + y: 73.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_B12 + name: opentrons_96_filtertiprack_10ul_B12 + parent: opentrons_96_filtertiprack_10ul + position: + x: 112.204 + y: 64.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_C12 + name: opentrons_96_filtertiprack_10ul_C12 + parent: opentrons_96_filtertiprack_10ul + position: + x: 112.204 + y: 55.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_D12 + name: opentrons_96_filtertiprack_10ul_D12 + parent: opentrons_96_filtertiprack_10ul + position: + x: 112.204 + y: 46.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_E12 + name: opentrons_96_filtertiprack_10ul_E12 + parent: opentrons_96_filtertiprack_10ul + position: + x: 112.204 + y: 37.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_F12 + name: opentrons_96_filtertiprack_10ul_F12 + parent: opentrons_96_filtertiprack_10ul + position: + x: 112.204 + y: 28.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_G12 + name: opentrons_96_filtertiprack_10ul_G12 + parent: opentrons_96_filtertiprack_10ul + position: + x: 112.204 + y: 19.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_10ul_H12 + name: opentrons_96_filtertiprack_10ul_H12 + parent: opentrons_96_filtertiprack_10ul + position: + x: 112.204 + y: 10.104 + z: 25.49 + sample_id: null + type: container + description: Opentrons 96 filtertiprack 10ul + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/tip_racks.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +opentrons_96_filtertiprack_200ul: + category: + - tip_racks + class: + module: pylabrobot.resources.opentrons.tip_racks:opentrons_96_filtertiprack_200ul + type: pylabrobot + config_info: + - children: + - opentrons_96_filtertiprack_200ul_A1 + - opentrons_96_filtertiprack_200ul_B1 + - opentrons_96_filtertiprack_200ul_C1 + - opentrons_96_filtertiprack_200ul_D1 + - opentrons_96_filtertiprack_200ul_E1 + - opentrons_96_filtertiprack_200ul_F1 + - opentrons_96_filtertiprack_200ul_G1 + - opentrons_96_filtertiprack_200ul_H1 + - opentrons_96_filtertiprack_200ul_A2 + - opentrons_96_filtertiprack_200ul_B2 + - opentrons_96_filtertiprack_200ul_C2 + - opentrons_96_filtertiprack_200ul_D2 + - opentrons_96_filtertiprack_200ul_E2 + - opentrons_96_filtertiprack_200ul_F2 + - opentrons_96_filtertiprack_200ul_G2 + - opentrons_96_filtertiprack_200ul_H2 + - opentrons_96_filtertiprack_200ul_A3 + - opentrons_96_filtertiprack_200ul_B3 + - opentrons_96_filtertiprack_200ul_C3 + - opentrons_96_filtertiprack_200ul_D3 + - opentrons_96_filtertiprack_200ul_E3 + - opentrons_96_filtertiprack_200ul_F3 + - opentrons_96_filtertiprack_200ul_G3 + - opentrons_96_filtertiprack_200ul_H3 + - opentrons_96_filtertiprack_200ul_A4 + - opentrons_96_filtertiprack_200ul_B4 + - opentrons_96_filtertiprack_200ul_C4 + - opentrons_96_filtertiprack_200ul_D4 + - opentrons_96_filtertiprack_200ul_E4 + - opentrons_96_filtertiprack_200ul_F4 + - opentrons_96_filtertiprack_200ul_G4 + - opentrons_96_filtertiprack_200ul_H4 + - opentrons_96_filtertiprack_200ul_A5 + - opentrons_96_filtertiprack_200ul_B5 + - opentrons_96_filtertiprack_200ul_C5 + - opentrons_96_filtertiprack_200ul_D5 + - opentrons_96_filtertiprack_200ul_E5 + - opentrons_96_filtertiprack_200ul_F5 + - opentrons_96_filtertiprack_200ul_G5 + - opentrons_96_filtertiprack_200ul_H5 + - opentrons_96_filtertiprack_200ul_A6 + - opentrons_96_filtertiprack_200ul_B6 + - opentrons_96_filtertiprack_200ul_C6 + - opentrons_96_filtertiprack_200ul_D6 + - opentrons_96_filtertiprack_200ul_E6 + - opentrons_96_filtertiprack_200ul_F6 + - opentrons_96_filtertiprack_200ul_G6 + - opentrons_96_filtertiprack_200ul_H6 + - opentrons_96_filtertiprack_200ul_A7 + - opentrons_96_filtertiprack_200ul_B7 + - opentrons_96_filtertiprack_200ul_C7 + - opentrons_96_filtertiprack_200ul_D7 + - opentrons_96_filtertiprack_200ul_E7 + - opentrons_96_filtertiprack_200ul_F7 + - opentrons_96_filtertiprack_200ul_G7 + - opentrons_96_filtertiprack_200ul_H7 + - opentrons_96_filtertiprack_200ul_A8 + - opentrons_96_filtertiprack_200ul_B8 + - opentrons_96_filtertiprack_200ul_C8 + - opentrons_96_filtertiprack_200ul_D8 + - opentrons_96_filtertiprack_200ul_E8 + - opentrons_96_filtertiprack_200ul_F8 + - opentrons_96_filtertiprack_200ul_G8 + - opentrons_96_filtertiprack_200ul_H8 + - opentrons_96_filtertiprack_200ul_A9 + - opentrons_96_filtertiprack_200ul_B9 + - opentrons_96_filtertiprack_200ul_C9 + - opentrons_96_filtertiprack_200ul_D9 + - opentrons_96_filtertiprack_200ul_E9 + - opentrons_96_filtertiprack_200ul_F9 + - opentrons_96_filtertiprack_200ul_G9 + - opentrons_96_filtertiprack_200ul_H9 + - opentrons_96_filtertiprack_200ul_A10 + - opentrons_96_filtertiprack_200ul_B10 + - opentrons_96_filtertiprack_200ul_C10 + - opentrons_96_filtertiprack_200ul_D10 + - opentrons_96_filtertiprack_200ul_E10 + - opentrons_96_filtertiprack_200ul_F10 + - opentrons_96_filtertiprack_200ul_G10 + - opentrons_96_filtertiprack_200ul_H10 + - opentrons_96_filtertiprack_200ul_A11 + - opentrons_96_filtertiprack_200ul_B11 + - opentrons_96_filtertiprack_200ul_C11 + - opentrons_96_filtertiprack_200ul_D11 + - opentrons_96_filtertiprack_200ul_E11 + - opentrons_96_filtertiprack_200ul_F11 + - opentrons_96_filtertiprack_200ul_G11 + - opentrons_96_filtertiprack_200ul_H11 + - opentrons_96_filtertiprack_200ul_A12 + - opentrons_96_filtertiprack_200ul_B12 + - opentrons_96_filtertiprack_200ul_C12 + - opentrons_96_filtertiprack_200ul_D12 + - opentrons_96_filtertiprack_200ul_E12 + - opentrons_96_filtertiprack_200ul_F12 + - opentrons_96_filtertiprack_200ul_G12 + - opentrons_96_filtertiprack_200ul_H12 + class: '' + config: + barcode: null + category: tip_rack + model: Opentrons OT-2 96 Filter Tip Rack 200 µL + ordering: + A1: opentrons_96_filtertiprack_200ul_A1 + B1: opentrons_96_filtertiprack_200ul_B1 + C1: opentrons_96_filtertiprack_200ul_C1 + D1: opentrons_96_filtertiprack_200ul_D1 + E1: opentrons_96_filtertiprack_200ul_E1 + F1: opentrons_96_filtertiprack_200ul_F1 + G1: opentrons_96_filtertiprack_200ul_G1 + H1: opentrons_96_filtertiprack_200ul_H1 + A2: opentrons_96_filtertiprack_200ul_A2 + B2: opentrons_96_filtertiprack_200ul_B2 + C2: opentrons_96_filtertiprack_200ul_C2 + D2: opentrons_96_filtertiprack_200ul_D2 + E2: opentrons_96_filtertiprack_200ul_E2 + F2: opentrons_96_filtertiprack_200ul_F2 + G2: opentrons_96_filtertiprack_200ul_G2 + H2: opentrons_96_filtertiprack_200ul_H2 + A3: opentrons_96_filtertiprack_200ul_A3 + B3: opentrons_96_filtertiprack_200ul_B3 + C3: opentrons_96_filtertiprack_200ul_C3 + D3: opentrons_96_filtertiprack_200ul_D3 + E3: opentrons_96_filtertiprack_200ul_E3 + F3: opentrons_96_filtertiprack_200ul_F3 + G3: opentrons_96_filtertiprack_200ul_G3 + H3: opentrons_96_filtertiprack_200ul_H3 + A4: opentrons_96_filtertiprack_200ul_A4 + B4: opentrons_96_filtertiprack_200ul_B4 + C4: opentrons_96_filtertiprack_200ul_C4 + D4: opentrons_96_filtertiprack_200ul_D4 + E4: opentrons_96_filtertiprack_200ul_E4 + F4: opentrons_96_filtertiprack_200ul_F4 + G4: opentrons_96_filtertiprack_200ul_G4 + H4: opentrons_96_filtertiprack_200ul_H4 + A5: opentrons_96_filtertiprack_200ul_A5 + B5: opentrons_96_filtertiprack_200ul_B5 + C5: opentrons_96_filtertiprack_200ul_C5 + D5: opentrons_96_filtertiprack_200ul_D5 + E5: opentrons_96_filtertiprack_200ul_E5 + F5: opentrons_96_filtertiprack_200ul_F5 + G5: opentrons_96_filtertiprack_200ul_G5 + H5: opentrons_96_filtertiprack_200ul_H5 + A6: opentrons_96_filtertiprack_200ul_A6 + B6: opentrons_96_filtertiprack_200ul_B6 + C6: opentrons_96_filtertiprack_200ul_C6 + D6: opentrons_96_filtertiprack_200ul_D6 + E6: opentrons_96_filtertiprack_200ul_E6 + F6: opentrons_96_filtertiprack_200ul_F6 + G6: opentrons_96_filtertiprack_200ul_G6 + H6: opentrons_96_filtertiprack_200ul_H6 + A7: opentrons_96_filtertiprack_200ul_A7 + B7: opentrons_96_filtertiprack_200ul_B7 + C7: opentrons_96_filtertiprack_200ul_C7 + D7: opentrons_96_filtertiprack_200ul_D7 + E7: opentrons_96_filtertiprack_200ul_E7 + F7: opentrons_96_filtertiprack_200ul_F7 + G7: opentrons_96_filtertiprack_200ul_G7 + H7: opentrons_96_filtertiprack_200ul_H7 + A8: opentrons_96_filtertiprack_200ul_A8 + B8: opentrons_96_filtertiprack_200ul_B8 + C8: opentrons_96_filtertiprack_200ul_C8 + D8: opentrons_96_filtertiprack_200ul_D8 + E8: opentrons_96_filtertiprack_200ul_E8 + F8: opentrons_96_filtertiprack_200ul_F8 + G8: opentrons_96_filtertiprack_200ul_G8 + H8: opentrons_96_filtertiprack_200ul_H8 + A9: opentrons_96_filtertiprack_200ul_A9 + B9: opentrons_96_filtertiprack_200ul_B9 + C9: opentrons_96_filtertiprack_200ul_C9 + D9: opentrons_96_filtertiprack_200ul_D9 + E9: opentrons_96_filtertiprack_200ul_E9 + F9: opentrons_96_filtertiprack_200ul_F9 + G9: opentrons_96_filtertiprack_200ul_G9 + H9: opentrons_96_filtertiprack_200ul_H9 + A10: opentrons_96_filtertiprack_200ul_A10 + B10: opentrons_96_filtertiprack_200ul_B10 + C10: opentrons_96_filtertiprack_200ul_C10 + D10: opentrons_96_filtertiprack_200ul_D10 + E10: opentrons_96_filtertiprack_200ul_E10 + F10: opentrons_96_filtertiprack_200ul_F10 + G10: opentrons_96_filtertiprack_200ul_G10 + H10: opentrons_96_filtertiprack_200ul_H10 + A11: opentrons_96_filtertiprack_200ul_A11 + B11: opentrons_96_filtertiprack_200ul_B11 + C11: opentrons_96_filtertiprack_200ul_C11 + D11: opentrons_96_filtertiprack_200ul_D11 + E11: opentrons_96_filtertiprack_200ul_E11 + F11: opentrons_96_filtertiprack_200ul_F11 + G11: opentrons_96_filtertiprack_200ul_G11 + H11: opentrons_96_filtertiprack_200ul_H11 + A12: opentrons_96_filtertiprack_200ul_A12 + B12: opentrons_96_filtertiprack_200ul_B12 + C12: opentrons_96_filtertiprack_200ul_C12 + D12: opentrons_96_filtertiprack_200ul_D12 + E12: opentrons_96_filtertiprack_200ul_E12 + F12: opentrons_96_filtertiprack_200ul_F12 + G12: opentrons_96_filtertiprack_200ul_G12 + H12: opentrons_96_filtertiprack_200ul_H12 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.76 + size_y: 85.48 + size_z: 64.49 + type: TipRack + data: {} + id: opentrons_96_filtertiprack_200ul + name: opentrons_96_filtertiprack_200ul + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_A1 + name: opentrons_96_filtertiprack_200ul_A1 + parent: opentrons_96_filtertiprack_200ul + position: + x: 12.531 + y: 72.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_B1 + name: opentrons_96_filtertiprack_200ul_B1 + parent: opentrons_96_filtertiprack_200ul + position: + x: 12.531 + y: 63.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_C1 + name: opentrons_96_filtertiprack_200ul_C1 + parent: opentrons_96_filtertiprack_200ul + position: + x: 12.531 + y: 54.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_D1 + name: opentrons_96_filtertiprack_200ul_D1 + parent: opentrons_96_filtertiprack_200ul + position: + x: 12.531 + y: 45.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_E1 + name: opentrons_96_filtertiprack_200ul_E1 + parent: opentrons_96_filtertiprack_200ul + position: + x: 12.531 + y: 36.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_F1 + name: opentrons_96_filtertiprack_200ul_F1 + parent: opentrons_96_filtertiprack_200ul + position: + x: 12.531 + y: 27.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_G1 + name: opentrons_96_filtertiprack_200ul_G1 + parent: opentrons_96_filtertiprack_200ul + position: + x: 12.531 + y: 18.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_H1 + name: opentrons_96_filtertiprack_200ul_H1 + parent: opentrons_96_filtertiprack_200ul + position: + x: 12.531 + y: 9.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_A2 + name: opentrons_96_filtertiprack_200ul_A2 + parent: opentrons_96_filtertiprack_200ul + position: + x: 21.531 + y: 72.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_B2 + name: opentrons_96_filtertiprack_200ul_B2 + parent: opentrons_96_filtertiprack_200ul + position: + x: 21.531 + y: 63.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_C2 + name: opentrons_96_filtertiprack_200ul_C2 + parent: opentrons_96_filtertiprack_200ul + position: + x: 21.531 + y: 54.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_D2 + name: opentrons_96_filtertiprack_200ul_D2 + parent: opentrons_96_filtertiprack_200ul + position: + x: 21.531 + y: 45.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_E2 + name: opentrons_96_filtertiprack_200ul_E2 + parent: opentrons_96_filtertiprack_200ul + position: + x: 21.531 + y: 36.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_F2 + name: opentrons_96_filtertiprack_200ul_F2 + parent: opentrons_96_filtertiprack_200ul + position: + x: 21.531 + y: 27.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_G2 + name: opentrons_96_filtertiprack_200ul_G2 + parent: opentrons_96_filtertiprack_200ul + position: + x: 21.531 + y: 18.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_H2 + name: opentrons_96_filtertiprack_200ul_H2 + parent: opentrons_96_filtertiprack_200ul + position: + x: 21.531 + y: 9.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_A3 + name: opentrons_96_filtertiprack_200ul_A3 + parent: opentrons_96_filtertiprack_200ul + position: + x: 30.531 + y: 72.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_B3 + name: opentrons_96_filtertiprack_200ul_B3 + parent: opentrons_96_filtertiprack_200ul + position: + x: 30.531 + y: 63.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_C3 + name: opentrons_96_filtertiprack_200ul_C3 + parent: opentrons_96_filtertiprack_200ul + position: + x: 30.531 + y: 54.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_D3 + name: opentrons_96_filtertiprack_200ul_D3 + parent: opentrons_96_filtertiprack_200ul + position: + x: 30.531 + y: 45.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_E3 + name: opentrons_96_filtertiprack_200ul_E3 + parent: opentrons_96_filtertiprack_200ul + position: + x: 30.531 + y: 36.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_F3 + name: opentrons_96_filtertiprack_200ul_F3 + parent: opentrons_96_filtertiprack_200ul + position: + x: 30.531 + y: 27.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_G3 + name: opentrons_96_filtertiprack_200ul_G3 + parent: opentrons_96_filtertiprack_200ul + position: + x: 30.531 + y: 18.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_H3 + name: opentrons_96_filtertiprack_200ul_H3 + parent: opentrons_96_filtertiprack_200ul + position: + x: 30.531 + y: 9.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_A4 + name: opentrons_96_filtertiprack_200ul_A4 + parent: opentrons_96_filtertiprack_200ul + position: + x: 39.531 + y: 72.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_B4 + name: opentrons_96_filtertiprack_200ul_B4 + parent: opentrons_96_filtertiprack_200ul + position: + x: 39.531 + y: 63.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_C4 + name: opentrons_96_filtertiprack_200ul_C4 + parent: opentrons_96_filtertiprack_200ul + position: + x: 39.531 + y: 54.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_D4 + name: opentrons_96_filtertiprack_200ul_D4 + parent: opentrons_96_filtertiprack_200ul + position: + x: 39.531 + y: 45.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_E4 + name: opentrons_96_filtertiprack_200ul_E4 + parent: opentrons_96_filtertiprack_200ul + position: + x: 39.531 + y: 36.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_F4 + name: opentrons_96_filtertiprack_200ul_F4 + parent: opentrons_96_filtertiprack_200ul + position: + x: 39.531 + y: 27.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_G4 + name: opentrons_96_filtertiprack_200ul_G4 + parent: opentrons_96_filtertiprack_200ul + position: + x: 39.531 + y: 18.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_H4 + name: opentrons_96_filtertiprack_200ul_H4 + parent: opentrons_96_filtertiprack_200ul + position: + x: 39.531 + y: 9.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_A5 + name: opentrons_96_filtertiprack_200ul_A5 + parent: opentrons_96_filtertiprack_200ul + position: + x: 48.531 + y: 72.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_B5 + name: opentrons_96_filtertiprack_200ul_B5 + parent: opentrons_96_filtertiprack_200ul + position: + x: 48.531 + y: 63.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_C5 + name: opentrons_96_filtertiprack_200ul_C5 + parent: opentrons_96_filtertiprack_200ul + position: + x: 48.531 + y: 54.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_D5 + name: opentrons_96_filtertiprack_200ul_D5 + parent: opentrons_96_filtertiprack_200ul + position: + x: 48.531 + y: 45.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_E5 + name: opentrons_96_filtertiprack_200ul_E5 + parent: opentrons_96_filtertiprack_200ul + position: + x: 48.531 + y: 36.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_F5 + name: opentrons_96_filtertiprack_200ul_F5 + parent: opentrons_96_filtertiprack_200ul + position: + x: 48.531 + y: 27.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_G5 + name: opentrons_96_filtertiprack_200ul_G5 + parent: opentrons_96_filtertiprack_200ul + position: + x: 48.531 + y: 18.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_H5 + name: opentrons_96_filtertiprack_200ul_H5 + parent: opentrons_96_filtertiprack_200ul + position: + x: 48.531 + y: 9.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_A6 + name: opentrons_96_filtertiprack_200ul_A6 + parent: opentrons_96_filtertiprack_200ul + position: + x: 57.531 + y: 72.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_B6 + name: opentrons_96_filtertiprack_200ul_B6 + parent: opentrons_96_filtertiprack_200ul + position: + x: 57.531 + y: 63.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_C6 + name: opentrons_96_filtertiprack_200ul_C6 + parent: opentrons_96_filtertiprack_200ul + position: + x: 57.531 + y: 54.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_D6 + name: opentrons_96_filtertiprack_200ul_D6 + parent: opentrons_96_filtertiprack_200ul + position: + x: 57.531 + y: 45.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_E6 + name: opentrons_96_filtertiprack_200ul_E6 + parent: opentrons_96_filtertiprack_200ul + position: + x: 57.531 + y: 36.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_F6 + name: opentrons_96_filtertiprack_200ul_F6 + parent: opentrons_96_filtertiprack_200ul + position: + x: 57.531 + y: 27.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_G6 + name: opentrons_96_filtertiprack_200ul_G6 + parent: opentrons_96_filtertiprack_200ul + position: + x: 57.531 + y: 18.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_H6 + name: opentrons_96_filtertiprack_200ul_H6 + parent: opentrons_96_filtertiprack_200ul + position: + x: 57.531 + y: 9.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_A7 + name: opentrons_96_filtertiprack_200ul_A7 + parent: opentrons_96_filtertiprack_200ul + position: + x: 66.531 + y: 72.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_B7 + name: opentrons_96_filtertiprack_200ul_B7 + parent: opentrons_96_filtertiprack_200ul + position: + x: 66.531 + y: 63.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_C7 + name: opentrons_96_filtertiprack_200ul_C7 + parent: opentrons_96_filtertiprack_200ul + position: + x: 66.531 + y: 54.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_D7 + name: opentrons_96_filtertiprack_200ul_D7 + parent: opentrons_96_filtertiprack_200ul + position: + x: 66.531 + y: 45.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_E7 + name: opentrons_96_filtertiprack_200ul_E7 + parent: opentrons_96_filtertiprack_200ul + position: + x: 66.531 + y: 36.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_F7 + name: opentrons_96_filtertiprack_200ul_F7 + parent: opentrons_96_filtertiprack_200ul + position: + x: 66.531 + y: 27.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_G7 + name: opentrons_96_filtertiprack_200ul_G7 + parent: opentrons_96_filtertiprack_200ul + position: + x: 66.531 + y: 18.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_H7 + name: opentrons_96_filtertiprack_200ul_H7 + parent: opentrons_96_filtertiprack_200ul + position: + x: 66.531 + y: 9.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_A8 + name: opentrons_96_filtertiprack_200ul_A8 + parent: opentrons_96_filtertiprack_200ul + position: + x: 75.531 + y: 72.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_B8 + name: opentrons_96_filtertiprack_200ul_B8 + parent: opentrons_96_filtertiprack_200ul + position: + x: 75.531 + y: 63.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_C8 + name: opentrons_96_filtertiprack_200ul_C8 + parent: opentrons_96_filtertiprack_200ul + position: + x: 75.531 + y: 54.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_D8 + name: opentrons_96_filtertiprack_200ul_D8 + parent: opentrons_96_filtertiprack_200ul + position: + x: 75.531 + y: 45.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_E8 + name: opentrons_96_filtertiprack_200ul_E8 + parent: opentrons_96_filtertiprack_200ul + position: + x: 75.531 + y: 36.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_F8 + name: opentrons_96_filtertiprack_200ul_F8 + parent: opentrons_96_filtertiprack_200ul + position: + x: 75.531 + y: 27.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_G8 + name: opentrons_96_filtertiprack_200ul_G8 + parent: opentrons_96_filtertiprack_200ul + position: + x: 75.531 + y: 18.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_H8 + name: opentrons_96_filtertiprack_200ul_H8 + parent: opentrons_96_filtertiprack_200ul + position: + x: 75.531 + y: 9.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_A9 + name: opentrons_96_filtertiprack_200ul_A9 + parent: opentrons_96_filtertiprack_200ul + position: + x: 84.531 + y: 72.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_B9 + name: opentrons_96_filtertiprack_200ul_B9 + parent: opentrons_96_filtertiprack_200ul + position: + x: 84.531 + y: 63.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_C9 + name: opentrons_96_filtertiprack_200ul_C9 + parent: opentrons_96_filtertiprack_200ul + position: + x: 84.531 + y: 54.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_D9 + name: opentrons_96_filtertiprack_200ul_D9 + parent: opentrons_96_filtertiprack_200ul + position: + x: 84.531 + y: 45.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_E9 + name: opentrons_96_filtertiprack_200ul_E9 + parent: opentrons_96_filtertiprack_200ul + position: + x: 84.531 + y: 36.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_F9 + name: opentrons_96_filtertiprack_200ul_F9 + parent: opentrons_96_filtertiprack_200ul + position: + x: 84.531 + y: 27.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_G9 + name: opentrons_96_filtertiprack_200ul_G9 + parent: opentrons_96_filtertiprack_200ul + position: + x: 84.531 + y: 18.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_H9 + name: opentrons_96_filtertiprack_200ul_H9 + parent: opentrons_96_filtertiprack_200ul + position: + x: 84.531 + y: 9.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_A10 + name: opentrons_96_filtertiprack_200ul_A10 + parent: opentrons_96_filtertiprack_200ul + position: + x: 93.531 + y: 72.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_B10 + name: opentrons_96_filtertiprack_200ul_B10 + parent: opentrons_96_filtertiprack_200ul + position: + x: 93.531 + y: 63.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_C10 + name: opentrons_96_filtertiprack_200ul_C10 + parent: opentrons_96_filtertiprack_200ul + position: + x: 93.531 + y: 54.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_D10 + name: opentrons_96_filtertiprack_200ul_D10 + parent: opentrons_96_filtertiprack_200ul + position: + x: 93.531 + y: 45.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_E10 + name: opentrons_96_filtertiprack_200ul_E10 + parent: opentrons_96_filtertiprack_200ul + position: + x: 93.531 + y: 36.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_F10 + name: opentrons_96_filtertiprack_200ul_F10 + parent: opentrons_96_filtertiprack_200ul + position: + x: 93.531 + y: 27.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_G10 + name: opentrons_96_filtertiprack_200ul_G10 + parent: opentrons_96_filtertiprack_200ul + position: + x: 93.531 + y: 18.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_H10 + name: opentrons_96_filtertiprack_200ul_H10 + parent: opentrons_96_filtertiprack_200ul + position: + x: 93.531 + y: 9.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_A11 + name: opentrons_96_filtertiprack_200ul_A11 + parent: opentrons_96_filtertiprack_200ul + position: + x: 102.531 + y: 72.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_B11 + name: opentrons_96_filtertiprack_200ul_B11 + parent: opentrons_96_filtertiprack_200ul + position: + x: 102.531 + y: 63.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_C11 + name: opentrons_96_filtertiprack_200ul_C11 + parent: opentrons_96_filtertiprack_200ul + position: + x: 102.531 + y: 54.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_D11 + name: opentrons_96_filtertiprack_200ul_D11 + parent: opentrons_96_filtertiprack_200ul + position: + x: 102.531 + y: 45.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_E11 + name: opentrons_96_filtertiprack_200ul_E11 + parent: opentrons_96_filtertiprack_200ul + position: + x: 102.531 + y: 36.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_F11 + name: opentrons_96_filtertiprack_200ul_F11 + parent: opentrons_96_filtertiprack_200ul + position: + x: 102.531 + y: 27.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_G11 + name: opentrons_96_filtertiprack_200ul_G11 + parent: opentrons_96_filtertiprack_200ul + position: + x: 102.531 + y: 18.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_H11 + name: opentrons_96_filtertiprack_200ul_H11 + parent: opentrons_96_filtertiprack_200ul + position: + x: 102.531 + y: 9.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_A12 + name: opentrons_96_filtertiprack_200ul_A12 + parent: opentrons_96_filtertiprack_200ul + position: + x: 111.531 + y: 72.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_B12 + name: opentrons_96_filtertiprack_200ul_B12 + parent: opentrons_96_filtertiprack_200ul + position: + x: 111.531 + y: 63.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_C12 + name: opentrons_96_filtertiprack_200ul_C12 + parent: opentrons_96_filtertiprack_200ul + position: + x: 111.531 + y: 54.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_D12 + name: opentrons_96_filtertiprack_200ul_D12 + parent: opentrons_96_filtertiprack_200ul + position: + x: 111.531 + y: 45.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_E12 + name: opentrons_96_filtertiprack_200ul_E12 + parent: opentrons_96_filtertiprack_200ul + position: + x: 111.531 + y: 36.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_F12 + name: opentrons_96_filtertiprack_200ul_F12 + parent: opentrons_96_filtertiprack_200ul + position: + x: 111.531 + y: 27.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_G12 + name: opentrons_96_filtertiprack_200ul_G12 + parent: opentrons_96_filtertiprack_200ul + position: + x: 111.531 + y: 18.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: true + maximal_volume: 200.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_200ul_H12 + name: opentrons_96_filtertiprack_200ul_H12 + parent: opentrons_96_filtertiprack_200ul + position: + x: 111.531 + y: 9.391 + z: 5.39 + sample_id: null + type: container + description: Opentrons 96 filtertiprack 200ul + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/tip_racks.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +opentrons_96_filtertiprack_20ul: + category: + - tip_racks + class: + module: pylabrobot.resources.opentrons.tip_racks:opentrons_96_filtertiprack_20ul + type: pylabrobot + config_info: + - children: + - opentrons_96_filtertiprack_20ul_A1 + - opentrons_96_filtertiprack_20ul_B1 + - opentrons_96_filtertiprack_20ul_C1 + - opentrons_96_filtertiprack_20ul_D1 + - opentrons_96_filtertiprack_20ul_E1 + - opentrons_96_filtertiprack_20ul_F1 + - opentrons_96_filtertiprack_20ul_G1 + - opentrons_96_filtertiprack_20ul_H1 + - opentrons_96_filtertiprack_20ul_A2 + - opentrons_96_filtertiprack_20ul_B2 + - opentrons_96_filtertiprack_20ul_C2 + - opentrons_96_filtertiprack_20ul_D2 + - opentrons_96_filtertiprack_20ul_E2 + - opentrons_96_filtertiprack_20ul_F2 + - opentrons_96_filtertiprack_20ul_G2 + - opentrons_96_filtertiprack_20ul_H2 + - opentrons_96_filtertiprack_20ul_A3 + - opentrons_96_filtertiprack_20ul_B3 + - opentrons_96_filtertiprack_20ul_C3 + - opentrons_96_filtertiprack_20ul_D3 + - opentrons_96_filtertiprack_20ul_E3 + - opentrons_96_filtertiprack_20ul_F3 + - opentrons_96_filtertiprack_20ul_G3 + - opentrons_96_filtertiprack_20ul_H3 + - opentrons_96_filtertiprack_20ul_A4 + - opentrons_96_filtertiprack_20ul_B4 + - opentrons_96_filtertiprack_20ul_C4 + - opentrons_96_filtertiprack_20ul_D4 + - opentrons_96_filtertiprack_20ul_E4 + - opentrons_96_filtertiprack_20ul_F4 + - opentrons_96_filtertiprack_20ul_G4 + - opentrons_96_filtertiprack_20ul_H4 + - opentrons_96_filtertiprack_20ul_A5 + - opentrons_96_filtertiprack_20ul_B5 + - opentrons_96_filtertiprack_20ul_C5 + - opentrons_96_filtertiprack_20ul_D5 + - opentrons_96_filtertiprack_20ul_E5 + - opentrons_96_filtertiprack_20ul_F5 + - opentrons_96_filtertiprack_20ul_G5 + - opentrons_96_filtertiprack_20ul_H5 + - opentrons_96_filtertiprack_20ul_A6 + - opentrons_96_filtertiprack_20ul_B6 + - opentrons_96_filtertiprack_20ul_C6 + - opentrons_96_filtertiprack_20ul_D6 + - opentrons_96_filtertiprack_20ul_E6 + - opentrons_96_filtertiprack_20ul_F6 + - opentrons_96_filtertiprack_20ul_G6 + - opentrons_96_filtertiprack_20ul_H6 + - opentrons_96_filtertiprack_20ul_A7 + - opentrons_96_filtertiprack_20ul_B7 + - opentrons_96_filtertiprack_20ul_C7 + - opentrons_96_filtertiprack_20ul_D7 + - opentrons_96_filtertiprack_20ul_E7 + - opentrons_96_filtertiprack_20ul_F7 + - opentrons_96_filtertiprack_20ul_G7 + - opentrons_96_filtertiprack_20ul_H7 + - opentrons_96_filtertiprack_20ul_A8 + - opentrons_96_filtertiprack_20ul_B8 + - opentrons_96_filtertiprack_20ul_C8 + - opentrons_96_filtertiprack_20ul_D8 + - opentrons_96_filtertiprack_20ul_E8 + - opentrons_96_filtertiprack_20ul_F8 + - opentrons_96_filtertiprack_20ul_G8 + - opentrons_96_filtertiprack_20ul_H8 + - opentrons_96_filtertiprack_20ul_A9 + - opentrons_96_filtertiprack_20ul_B9 + - opentrons_96_filtertiprack_20ul_C9 + - opentrons_96_filtertiprack_20ul_D9 + - opentrons_96_filtertiprack_20ul_E9 + - opentrons_96_filtertiprack_20ul_F9 + - opentrons_96_filtertiprack_20ul_G9 + - opentrons_96_filtertiprack_20ul_H9 + - opentrons_96_filtertiprack_20ul_A10 + - opentrons_96_filtertiprack_20ul_B10 + - opentrons_96_filtertiprack_20ul_C10 + - opentrons_96_filtertiprack_20ul_D10 + - opentrons_96_filtertiprack_20ul_E10 + - opentrons_96_filtertiprack_20ul_F10 + - opentrons_96_filtertiprack_20ul_G10 + - opentrons_96_filtertiprack_20ul_H10 + - opentrons_96_filtertiprack_20ul_A11 + - opentrons_96_filtertiprack_20ul_B11 + - opentrons_96_filtertiprack_20ul_C11 + - opentrons_96_filtertiprack_20ul_D11 + - opentrons_96_filtertiprack_20ul_E11 + - opentrons_96_filtertiprack_20ul_F11 + - opentrons_96_filtertiprack_20ul_G11 + - opentrons_96_filtertiprack_20ul_H11 + - opentrons_96_filtertiprack_20ul_A12 + - opentrons_96_filtertiprack_20ul_B12 + - opentrons_96_filtertiprack_20ul_C12 + - opentrons_96_filtertiprack_20ul_D12 + - opentrons_96_filtertiprack_20ul_E12 + - opentrons_96_filtertiprack_20ul_F12 + - opentrons_96_filtertiprack_20ul_G12 + - opentrons_96_filtertiprack_20ul_H12 + class: '' + config: + barcode: null + category: tip_rack + model: Opentrons OT-2 96 Filter Tip Rack 20 µL + ordering: + A1: opentrons_96_filtertiprack_20ul_A1 + B1: opentrons_96_filtertiprack_20ul_B1 + C1: opentrons_96_filtertiprack_20ul_C1 + D1: opentrons_96_filtertiprack_20ul_D1 + E1: opentrons_96_filtertiprack_20ul_E1 + F1: opentrons_96_filtertiprack_20ul_F1 + G1: opentrons_96_filtertiprack_20ul_G1 + H1: opentrons_96_filtertiprack_20ul_H1 + A2: opentrons_96_filtertiprack_20ul_A2 + B2: opentrons_96_filtertiprack_20ul_B2 + C2: opentrons_96_filtertiprack_20ul_C2 + D2: opentrons_96_filtertiprack_20ul_D2 + E2: opentrons_96_filtertiprack_20ul_E2 + F2: opentrons_96_filtertiprack_20ul_F2 + G2: opentrons_96_filtertiprack_20ul_G2 + H2: opentrons_96_filtertiprack_20ul_H2 + A3: opentrons_96_filtertiprack_20ul_A3 + B3: opentrons_96_filtertiprack_20ul_B3 + C3: opentrons_96_filtertiprack_20ul_C3 + D3: opentrons_96_filtertiprack_20ul_D3 + E3: opentrons_96_filtertiprack_20ul_E3 + F3: opentrons_96_filtertiprack_20ul_F3 + G3: opentrons_96_filtertiprack_20ul_G3 + H3: opentrons_96_filtertiprack_20ul_H3 + A4: opentrons_96_filtertiprack_20ul_A4 + B4: opentrons_96_filtertiprack_20ul_B4 + C4: opentrons_96_filtertiprack_20ul_C4 + D4: opentrons_96_filtertiprack_20ul_D4 + E4: opentrons_96_filtertiprack_20ul_E4 + F4: opentrons_96_filtertiprack_20ul_F4 + G4: opentrons_96_filtertiprack_20ul_G4 + H4: opentrons_96_filtertiprack_20ul_H4 + A5: opentrons_96_filtertiprack_20ul_A5 + B5: opentrons_96_filtertiprack_20ul_B5 + C5: opentrons_96_filtertiprack_20ul_C5 + D5: opentrons_96_filtertiprack_20ul_D5 + E5: opentrons_96_filtertiprack_20ul_E5 + F5: opentrons_96_filtertiprack_20ul_F5 + G5: opentrons_96_filtertiprack_20ul_G5 + H5: opentrons_96_filtertiprack_20ul_H5 + A6: opentrons_96_filtertiprack_20ul_A6 + B6: opentrons_96_filtertiprack_20ul_B6 + C6: opentrons_96_filtertiprack_20ul_C6 + D6: opentrons_96_filtertiprack_20ul_D6 + E6: opentrons_96_filtertiprack_20ul_E6 + F6: opentrons_96_filtertiprack_20ul_F6 + G6: opentrons_96_filtertiprack_20ul_G6 + H6: opentrons_96_filtertiprack_20ul_H6 + A7: opentrons_96_filtertiprack_20ul_A7 + B7: opentrons_96_filtertiprack_20ul_B7 + C7: opentrons_96_filtertiprack_20ul_C7 + D7: opentrons_96_filtertiprack_20ul_D7 + E7: opentrons_96_filtertiprack_20ul_E7 + F7: opentrons_96_filtertiprack_20ul_F7 + G7: opentrons_96_filtertiprack_20ul_G7 + H7: opentrons_96_filtertiprack_20ul_H7 + A8: opentrons_96_filtertiprack_20ul_A8 + B8: opentrons_96_filtertiprack_20ul_B8 + C8: opentrons_96_filtertiprack_20ul_C8 + D8: opentrons_96_filtertiprack_20ul_D8 + E8: opentrons_96_filtertiprack_20ul_E8 + F8: opentrons_96_filtertiprack_20ul_F8 + G8: opentrons_96_filtertiprack_20ul_G8 + H8: opentrons_96_filtertiprack_20ul_H8 + A9: opentrons_96_filtertiprack_20ul_A9 + B9: opentrons_96_filtertiprack_20ul_B9 + C9: opentrons_96_filtertiprack_20ul_C9 + D9: opentrons_96_filtertiprack_20ul_D9 + E9: opentrons_96_filtertiprack_20ul_E9 + F9: opentrons_96_filtertiprack_20ul_F9 + G9: opentrons_96_filtertiprack_20ul_G9 + H9: opentrons_96_filtertiprack_20ul_H9 + A10: opentrons_96_filtertiprack_20ul_A10 + B10: opentrons_96_filtertiprack_20ul_B10 + C10: opentrons_96_filtertiprack_20ul_C10 + D10: opentrons_96_filtertiprack_20ul_D10 + E10: opentrons_96_filtertiprack_20ul_E10 + F10: opentrons_96_filtertiprack_20ul_F10 + G10: opentrons_96_filtertiprack_20ul_G10 + H10: opentrons_96_filtertiprack_20ul_H10 + A11: opentrons_96_filtertiprack_20ul_A11 + B11: opentrons_96_filtertiprack_20ul_B11 + C11: opentrons_96_filtertiprack_20ul_C11 + D11: opentrons_96_filtertiprack_20ul_D11 + E11: opentrons_96_filtertiprack_20ul_E11 + F11: opentrons_96_filtertiprack_20ul_F11 + G11: opentrons_96_filtertiprack_20ul_G11 + H11: opentrons_96_filtertiprack_20ul_H11 + A12: opentrons_96_filtertiprack_20ul_A12 + B12: opentrons_96_filtertiprack_20ul_B12 + C12: opentrons_96_filtertiprack_20ul_C12 + D12: opentrons_96_filtertiprack_20ul_D12 + E12: opentrons_96_filtertiprack_20ul_E12 + F12: opentrons_96_filtertiprack_20ul_F12 + G12: opentrons_96_filtertiprack_20ul_G12 + H12: opentrons_96_filtertiprack_20ul_H12 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.76 + size_y: 85.48 + size_z: 64.69 + type: TipRack + data: {} + id: opentrons_96_filtertiprack_20ul + name: opentrons_96_filtertiprack_20ul + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_A1 + name: opentrons_96_filtertiprack_20ul_A1 + parent: opentrons_96_filtertiprack_20ul + position: + x: 13.204 + y: 73.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_B1 + name: opentrons_96_filtertiprack_20ul_B1 + parent: opentrons_96_filtertiprack_20ul + position: + x: 13.204 + y: 64.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_C1 + name: opentrons_96_filtertiprack_20ul_C1 + parent: opentrons_96_filtertiprack_20ul + position: + x: 13.204 + y: 55.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_D1 + name: opentrons_96_filtertiprack_20ul_D1 + parent: opentrons_96_filtertiprack_20ul + position: + x: 13.204 + y: 46.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_E1 + name: opentrons_96_filtertiprack_20ul_E1 + parent: opentrons_96_filtertiprack_20ul + position: + x: 13.204 + y: 37.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_F1 + name: opentrons_96_filtertiprack_20ul_F1 + parent: opentrons_96_filtertiprack_20ul + position: + x: 13.204 + y: 28.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_G1 + name: opentrons_96_filtertiprack_20ul_G1 + parent: opentrons_96_filtertiprack_20ul + position: + x: 13.204 + y: 19.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_H1 + name: opentrons_96_filtertiprack_20ul_H1 + parent: opentrons_96_filtertiprack_20ul + position: + x: 13.204 + y: 10.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_A2 + name: opentrons_96_filtertiprack_20ul_A2 + parent: opentrons_96_filtertiprack_20ul + position: + x: 22.204 + y: 73.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_B2 + name: opentrons_96_filtertiprack_20ul_B2 + parent: opentrons_96_filtertiprack_20ul + position: + x: 22.204 + y: 64.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_C2 + name: opentrons_96_filtertiprack_20ul_C2 + parent: opentrons_96_filtertiprack_20ul + position: + x: 22.204 + y: 55.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_D2 + name: opentrons_96_filtertiprack_20ul_D2 + parent: opentrons_96_filtertiprack_20ul + position: + x: 22.204 + y: 46.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_E2 + name: opentrons_96_filtertiprack_20ul_E2 + parent: opentrons_96_filtertiprack_20ul + position: + x: 22.204 + y: 37.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_F2 + name: opentrons_96_filtertiprack_20ul_F2 + parent: opentrons_96_filtertiprack_20ul + position: + x: 22.204 + y: 28.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_G2 + name: opentrons_96_filtertiprack_20ul_G2 + parent: opentrons_96_filtertiprack_20ul + position: + x: 22.204 + y: 19.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_H2 + name: opentrons_96_filtertiprack_20ul_H2 + parent: opentrons_96_filtertiprack_20ul + position: + x: 22.204 + y: 10.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_A3 + name: opentrons_96_filtertiprack_20ul_A3 + parent: opentrons_96_filtertiprack_20ul + position: + x: 31.204 + y: 73.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_B3 + name: opentrons_96_filtertiprack_20ul_B3 + parent: opentrons_96_filtertiprack_20ul + position: + x: 31.204 + y: 64.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_C3 + name: opentrons_96_filtertiprack_20ul_C3 + parent: opentrons_96_filtertiprack_20ul + position: + x: 31.204 + y: 55.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_D3 + name: opentrons_96_filtertiprack_20ul_D3 + parent: opentrons_96_filtertiprack_20ul + position: + x: 31.204 + y: 46.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_E3 + name: opentrons_96_filtertiprack_20ul_E3 + parent: opentrons_96_filtertiprack_20ul + position: + x: 31.204 + y: 37.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_F3 + name: opentrons_96_filtertiprack_20ul_F3 + parent: opentrons_96_filtertiprack_20ul + position: + x: 31.204 + y: 28.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_G3 + name: opentrons_96_filtertiprack_20ul_G3 + parent: opentrons_96_filtertiprack_20ul + position: + x: 31.204 + y: 19.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_H3 + name: opentrons_96_filtertiprack_20ul_H3 + parent: opentrons_96_filtertiprack_20ul + position: + x: 31.204 + y: 10.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_A4 + name: opentrons_96_filtertiprack_20ul_A4 + parent: opentrons_96_filtertiprack_20ul + position: + x: 40.204 + y: 73.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_B4 + name: opentrons_96_filtertiprack_20ul_B4 + parent: opentrons_96_filtertiprack_20ul + position: + x: 40.204 + y: 64.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_C4 + name: opentrons_96_filtertiprack_20ul_C4 + parent: opentrons_96_filtertiprack_20ul + position: + x: 40.204 + y: 55.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_D4 + name: opentrons_96_filtertiprack_20ul_D4 + parent: opentrons_96_filtertiprack_20ul + position: + x: 40.204 + y: 46.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_E4 + name: opentrons_96_filtertiprack_20ul_E4 + parent: opentrons_96_filtertiprack_20ul + position: + x: 40.204 + y: 37.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_F4 + name: opentrons_96_filtertiprack_20ul_F4 + parent: opentrons_96_filtertiprack_20ul + position: + x: 40.204 + y: 28.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_G4 + name: opentrons_96_filtertiprack_20ul_G4 + parent: opentrons_96_filtertiprack_20ul + position: + x: 40.204 + y: 19.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_H4 + name: opentrons_96_filtertiprack_20ul_H4 + parent: opentrons_96_filtertiprack_20ul + position: + x: 40.204 + y: 10.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_A5 + name: opentrons_96_filtertiprack_20ul_A5 + parent: opentrons_96_filtertiprack_20ul + position: + x: 49.204 + y: 73.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_B5 + name: opentrons_96_filtertiprack_20ul_B5 + parent: opentrons_96_filtertiprack_20ul + position: + x: 49.204 + y: 64.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_C5 + name: opentrons_96_filtertiprack_20ul_C5 + parent: opentrons_96_filtertiprack_20ul + position: + x: 49.204 + y: 55.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_D5 + name: opentrons_96_filtertiprack_20ul_D5 + parent: opentrons_96_filtertiprack_20ul + position: + x: 49.204 + y: 46.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_E5 + name: opentrons_96_filtertiprack_20ul_E5 + parent: opentrons_96_filtertiprack_20ul + position: + x: 49.204 + y: 37.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_F5 + name: opentrons_96_filtertiprack_20ul_F5 + parent: opentrons_96_filtertiprack_20ul + position: + x: 49.204 + y: 28.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_G5 + name: opentrons_96_filtertiprack_20ul_G5 + parent: opentrons_96_filtertiprack_20ul + position: + x: 49.204 + y: 19.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_H5 + name: opentrons_96_filtertiprack_20ul_H5 + parent: opentrons_96_filtertiprack_20ul + position: + x: 49.204 + y: 10.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_A6 + name: opentrons_96_filtertiprack_20ul_A6 + parent: opentrons_96_filtertiprack_20ul + position: + x: 58.204 + y: 73.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_B6 + name: opentrons_96_filtertiprack_20ul_B6 + parent: opentrons_96_filtertiprack_20ul + position: + x: 58.204 + y: 64.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_C6 + name: opentrons_96_filtertiprack_20ul_C6 + parent: opentrons_96_filtertiprack_20ul + position: + x: 58.204 + y: 55.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_D6 + name: opentrons_96_filtertiprack_20ul_D6 + parent: opentrons_96_filtertiprack_20ul + position: + x: 58.204 + y: 46.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_E6 + name: opentrons_96_filtertiprack_20ul_E6 + parent: opentrons_96_filtertiprack_20ul + position: + x: 58.204 + y: 37.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_F6 + name: opentrons_96_filtertiprack_20ul_F6 + parent: opentrons_96_filtertiprack_20ul + position: + x: 58.204 + y: 28.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_G6 + name: opentrons_96_filtertiprack_20ul_G6 + parent: opentrons_96_filtertiprack_20ul + position: + x: 58.204 + y: 19.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_H6 + name: opentrons_96_filtertiprack_20ul_H6 + parent: opentrons_96_filtertiprack_20ul + position: + x: 58.204 + y: 10.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_A7 + name: opentrons_96_filtertiprack_20ul_A7 + parent: opentrons_96_filtertiprack_20ul + position: + x: 67.204 + y: 73.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_B7 + name: opentrons_96_filtertiprack_20ul_B7 + parent: opentrons_96_filtertiprack_20ul + position: + x: 67.204 + y: 64.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_C7 + name: opentrons_96_filtertiprack_20ul_C7 + parent: opentrons_96_filtertiprack_20ul + position: + x: 67.204 + y: 55.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_D7 + name: opentrons_96_filtertiprack_20ul_D7 + parent: opentrons_96_filtertiprack_20ul + position: + x: 67.204 + y: 46.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_E7 + name: opentrons_96_filtertiprack_20ul_E7 + parent: opentrons_96_filtertiprack_20ul + position: + x: 67.204 + y: 37.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_F7 + name: opentrons_96_filtertiprack_20ul_F7 + parent: opentrons_96_filtertiprack_20ul + position: + x: 67.204 + y: 28.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_G7 + name: opentrons_96_filtertiprack_20ul_G7 + parent: opentrons_96_filtertiprack_20ul + position: + x: 67.204 + y: 19.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_H7 + name: opentrons_96_filtertiprack_20ul_H7 + parent: opentrons_96_filtertiprack_20ul + position: + x: 67.204 + y: 10.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_A8 + name: opentrons_96_filtertiprack_20ul_A8 + parent: opentrons_96_filtertiprack_20ul + position: + x: 76.204 + y: 73.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_B8 + name: opentrons_96_filtertiprack_20ul_B8 + parent: opentrons_96_filtertiprack_20ul + position: + x: 76.204 + y: 64.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_C8 + name: opentrons_96_filtertiprack_20ul_C8 + parent: opentrons_96_filtertiprack_20ul + position: + x: 76.204 + y: 55.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_D8 + name: opentrons_96_filtertiprack_20ul_D8 + parent: opentrons_96_filtertiprack_20ul + position: + x: 76.204 + y: 46.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_E8 + name: opentrons_96_filtertiprack_20ul_E8 + parent: opentrons_96_filtertiprack_20ul + position: + x: 76.204 + y: 37.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_F8 + name: opentrons_96_filtertiprack_20ul_F8 + parent: opentrons_96_filtertiprack_20ul + position: + x: 76.204 + y: 28.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_G8 + name: opentrons_96_filtertiprack_20ul_G8 + parent: opentrons_96_filtertiprack_20ul + position: + x: 76.204 + y: 19.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_H8 + name: opentrons_96_filtertiprack_20ul_H8 + parent: opentrons_96_filtertiprack_20ul + position: + x: 76.204 + y: 10.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_A9 + name: opentrons_96_filtertiprack_20ul_A9 + parent: opentrons_96_filtertiprack_20ul + position: + x: 85.204 + y: 73.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_B9 + name: opentrons_96_filtertiprack_20ul_B9 + parent: opentrons_96_filtertiprack_20ul + position: + x: 85.204 + y: 64.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_C9 + name: opentrons_96_filtertiprack_20ul_C9 + parent: opentrons_96_filtertiprack_20ul + position: + x: 85.204 + y: 55.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_D9 + name: opentrons_96_filtertiprack_20ul_D9 + parent: opentrons_96_filtertiprack_20ul + position: + x: 85.204 + y: 46.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_E9 + name: opentrons_96_filtertiprack_20ul_E9 + parent: opentrons_96_filtertiprack_20ul + position: + x: 85.204 + y: 37.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_F9 + name: opentrons_96_filtertiprack_20ul_F9 + parent: opentrons_96_filtertiprack_20ul + position: + x: 85.204 + y: 28.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_G9 + name: opentrons_96_filtertiprack_20ul_G9 + parent: opentrons_96_filtertiprack_20ul + position: + x: 85.204 + y: 19.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_H9 + name: opentrons_96_filtertiprack_20ul_H9 + parent: opentrons_96_filtertiprack_20ul + position: + x: 85.204 + y: 10.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_A10 + name: opentrons_96_filtertiprack_20ul_A10 + parent: opentrons_96_filtertiprack_20ul + position: + x: 94.204 + y: 73.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_B10 + name: opentrons_96_filtertiprack_20ul_B10 + parent: opentrons_96_filtertiprack_20ul + position: + x: 94.204 + y: 64.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_C10 + name: opentrons_96_filtertiprack_20ul_C10 + parent: opentrons_96_filtertiprack_20ul + position: + x: 94.204 + y: 55.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_D10 + name: opentrons_96_filtertiprack_20ul_D10 + parent: opentrons_96_filtertiprack_20ul + position: + x: 94.204 + y: 46.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_E10 + name: opentrons_96_filtertiprack_20ul_E10 + parent: opentrons_96_filtertiprack_20ul + position: + x: 94.204 + y: 37.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_F10 + name: opentrons_96_filtertiprack_20ul_F10 + parent: opentrons_96_filtertiprack_20ul + position: + x: 94.204 + y: 28.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_G10 + name: opentrons_96_filtertiprack_20ul_G10 + parent: opentrons_96_filtertiprack_20ul + position: + x: 94.204 + y: 19.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_H10 + name: opentrons_96_filtertiprack_20ul_H10 + parent: opentrons_96_filtertiprack_20ul + position: + x: 94.204 + y: 10.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_A11 + name: opentrons_96_filtertiprack_20ul_A11 + parent: opentrons_96_filtertiprack_20ul + position: + x: 103.204 + y: 73.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_B11 + name: opentrons_96_filtertiprack_20ul_B11 + parent: opentrons_96_filtertiprack_20ul + position: + x: 103.204 + y: 64.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_C11 + name: opentrons_96_filtertiprack_20ul_C11 + parent: opentrons_96_filtertiprack_20ul + position: + x: 103.204 + y: 55.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_D11 + name: opentrons_96_filtertiprack_20ul_D11 + parent: opentrons_96_filtertiprack_20ul + position: + x: 103.204 + y: 46.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_E11 + name: opentrons_96_filtertiprack_20ul_E11 + parent: opentrons_96_filtertiprack_20ul + position: + x: 103.204 + y: 37.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_F11 + name: opentrons_96_filtertiprack_20ul_F11 + parent: opentrons_96_filtertiprack_20ul + position: + x: 103.204 + y: 28.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_G11 + name: opentrons_96_filtertiprack_20ul_G11 + parent: opentrons_96_filtertiprack_20ul + position: + x: 103.204 + y: 19.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_H11 + name: opentrons_96_filtertiprack_20ul_H11 + parent: opentrons_96_filtertiprack_20ul + position: + x: 103.204 + y: 10.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_A12 + name: opentrons_96_filtertiprack_20ul_A12 + parent: opentrons_96_filtertiprack_20ul + position: + x: 112.204 + y: 73.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_B12 + name: opentrons_96_filtertiprack_20ul_B12 + parent: opentrons_96_filtertiprack_20ul + position: + x: 112.204 + y: 64.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_C12 + name: opentrons_96_filtertiprack_20ul_C12 + parent: opentrons_96_filtertiprack_20ul + position: + x: 112.204 + y: 55.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_D12 + name: opentrons_96_filtertiprack_20ul_D12 + parent: opentrons_96_filtertiprack_20ul + position: + x: 112.204 + y: 46.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_E12 + name: opentrons_96_filtertiprack_20ul_E12 + parent: opentrons_96_filtertiprack_20ul + position: + x: 112.204 + y: 37.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_F12 + name: opentrons_96_filtertiprack_20ul_F12 + parent: opentrons_96_filtertiprack_20ul + position: + x: 112.204 + y: 28.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_G12 + name: opentrons_96_filtertiprack_20ul_G12 + parent: opentrons_96_filtertiprack_20ul + position: + x: 112.204 + y: 19.104 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: true + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_filtertiprack_20ul_H12 + name: opentrons_96_filtertiprack_20ul_H12 + parent: opentrons_96_filtertiprack_20ul + position: + x: 112.204 + y: 10.104 + z: 25.49 + sample_id: null + type: container + description: Opentrons 96 filtertiprack 20ul + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/tip_racks.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +opentrons_96_tiprack_1000ul: + category: + - tip_racks + class: + module: pylabrobot.resources.opentrons.tip_racks:opentrons_96_tiprack_1000ul + type: pylabrobot + config_info: + - children: + - opentrons_96_tiprack_1000ul_A1 + - opentrons_96_tiprack_1000ul_B1 + - opentrons_96_tiprack_1000ul_C1 + - opentrons_96_tiprack_1000ul_D1 + - opentrons_96_tiprack_1000ul_E1 + - opentrons_96_tiprack_1000ul_F1 + - opentrons_96_tiprack_1000ul_G1 + - opentrons_96_tiprack_1000ul_H1 + - opentrons_96_tiprack_1000ul_A2 + - opentrons_96_tiprack_1000ul_B2 + - opentrons_96_tiprack_1000ul_C2 + - opentrons_96_tiprack_1000ul_D2 + - opentrons_96_tiprack_1000ul_E2 + - opentrons_96_tiprack_1000ul_F2 + - opentrons_96_tiprack_1000ul_G2 + - opentrons_96_tiprack_1000ul_H2 + - opentrons_96_tiprack_1000ul_A3 + - opentrons_96_tiprack_1000ul_B3 + - opentrons_96_tiprack_1000ul_C3 + - opentrons_96_tiprack_1000ul_D3 + - opentrons_96_tiprack_1000ul_E3 + - opentrons_96_tiprack_1000ul_F3 + - opentrons_96_tiprack_1000ul_G3 + - opentrons_96_tiprack_1000ul_H3 + - opentrons_96_tiprack_1000ul_A4 + - opentrons_96_tiprack_1000ul_B4 + - opentrons_96_tiprack_1000ul_C4 + - opentrons_96_tiprack_1000ul_D4 + - opentrons_96_tiprack_1000ul_E4 + - opentrons_96_tiprack_1000ul_F4 + - opentrons_96_tiprack_1000ul_G4 + - opentrons_96_tiprack_1000ul_H4 + - opentrons_96_tiprack_1000ul_A5 + - opentrons_96_tiprack_1000ul_B5 + - opentrons_96_tiprack_1000ul_C5 + - opentrons_96_tiprack_1000ul_D5 + - opentrons_96_tiprack_1000ul_E5 + - opentrons_96_tiprack_1000ul_F5 + - opentrons_96_tiprack_1000ul_G5 + - opentrons_96_tiprack_1000ul_H5 + - opentrons_96_tiprack_1000ul_A6 + - opentrons_96_tiprack_1000ul_B6 + - opentrons_96_tiprack_1000ul_C6 + - opentrons_96_tiprack_1000ul_D6 + - opentrons_96_tiprack_1000ul_E6 + - opentrons_96_tiprack_1000ul_F6 + - opentrons_96_tiprack_1000ul_G6 + - opentrons_96_tiprack_1000ul_H6 + - opentrons_96_tiprack_1000ul_A7 + - opentrons_96_tiprack_1000ul_B7 + - opentrons_96_tiprack_1000ul_C7 + - opentrons_96_tiprack_1000ul_D7 + - opentrons_96_tiprack_1000ul_E7 + - opentrons_96_tiprack_1000ul_F7 + - opentrons_96_tiprack_1000ul_G7 + - opentrons_96_tiprack_1000ul_H7 + - opentrons_96_tiprack_1000ul_A8 + - opentrons_96_tiprack_1000ul_B8 + - opentrons_96_tiprack_1000ul_C8 + - opentrons_96_tiprack_1000ul_D8 + - opentrons_96_tiprack_1000ul_E8 + - opentrons_96_tiprack_1000ul_F8 + - opentrons_96_tiprack_1000ul_G8 + - opentrons_96_tiprack_1000ul_H8 + - opentrons_96_tiprack_1000ul_A9 + - opentrons_96_tiprack_1000ul_B9 + - opentrons_96_tiprack_1000ul_C9 + - opentrons_96_tiprack_1000ul_D9 + - opentrons_96_tiprack_1000ul_E9 + - opentrons_96_tiprack_1000ul_F9 + - opentrons_96_tiprack_1000ul_G9 + - opentrons_96_tiprack_1000ul_H9 + - opentrons_96_tiprack_1000ul_A10 + - opentrons_96_tiprack_1000ul_B10 + - opentrons_96_tiprack_1000ul_C10 + - opentrons_96_tiprack_1000ul_D10 + - opentrons_96_tiprack_1000ul_E10 + - opentrons_96_tiprack_1000ul_F10 + - opentrons_96_tiprack_1000ul_G10 + - opentrons_96_tiprack_1000ul_H10 + - opentrons_96_tiprack_1000ul_A11 + - opentrons_96_tiprack_1000ul_B11 + - opentrons_96_tiprack_1000ul_C11 + - opentrons_96_tiprack_1000ul_D11 + - opentrons_96_tiprack_1000ul_E11 + - opentrons_96_tiprack_1000ul_F11 + - opentrons_96_tiprack_1000ul_G11 + - opentrons_96_tiprack_1000ul_H11 + - opentrons_96_tiprack_1000ul_A12 + - opentrons_96_tiprack_1000ul_B12 + - opentrons_96_tiprack_1000ul_C12 + - opentrons_96_tiprack_1000ul_D12 + - opentrons_96_tiprack_1000ul_E12 + - opentrons_96_tiprack_1000ul_F12 + - opentrons_96_tiprack_1000ul_G12 + - opentrons_96_tiprack_1000ul_H12 + class: '' + config: + barcode: null + category: tip_rack + model: Opentrons OT-2 96 Tip Rack 1000 µL + ordering: + A1: opentrons_96_tiprack_1000ul_A1 + B1: opentrons_96_tiprack_1000ul_B1 + C1: opentrons_96_tiprack_1000ul_C1 + D1: opentrons_96_tiprack_1000ul_D1 + E1: opentrons_96_tiprack_1000ul_E1 + F1: opentrons_96_tiprack_1000ul_F1 + G1: opentrons_96_tiprack_1000ul_G1 + H1: opentrons_96_tiprack_1000ul_H1 + A2: opentrons_96_tiprack_1000ul_A2 + B2: opentrons_96_tiprack_1000ul_B2 + C2: opentrons_96_tiprack_1000ul_C2 + D2: opentrons_96_tiprack_1000ul_D2 + E2: opentrons_96_tiprack_1000ul_E2 + F2: opentrons_96_tiprack_1000ul_F2 + G2: opentrons_96_tiprack_1000ul_G2 + H2: opentrons_96_tiprack_1000ul_H2 + A3: opentrons_96_tiprack_1000ul_A3 + B3: opentrons_96_tiprack_1000ul_B3 + C3: opentrons_96_tiprack_1000ul_C3 + D3: opentrons_96_tiprack_1000ul_D3 + E3: opentrons_96_tiprack_1000ul_E3 + F3: opentrons_96_tiprack_1000ul_F3 + G3: opentrons_96_tiprack_1000ul_G3 + H3: opentrons_96_tiprack_1000ul_H3 + A4: opentrons_96_tiprack_1000ul_A4 + B4: opentrons_96_tiprack_1000ul_B4 + C4: opentrons_96_tiprack_1000ul_C4 + D4: opentrons_96_tiprack_1000ul_D4 + E4: opentrons_96_tiprack_1000ul_E4 + F4: opentrons_96_tiprack_1000ul_F4 + G4: opentrons_96_tiprack_1000ul_G4 + H4: opentrons_96_tiprack_1000ul_H4 + A5: opentrons_96_tiprack_1000ul_A5 + B5: opentrons_96_tiprack_1000ul_B5 + C5: opentrons_96_tiprack_1000ul_C5 + D5: opentrons_96_tiprack_1000ul_D5 + E5: opentrons_96_tiprack_1000ul_E5 + F5: opentrons_96_tiprack_1000ul_F5 + G5: opentrons_96_tiprack_1000ul_G5 + H5: opentrons_96_tiprack_1000ul_H5 + A6: opentrons_96_tiprack_1000ul_A6 + B6: opentrons_96_tiprack_1000ul_B6 + C6: opentrons_96_tiprack_1000ul_C6 + D6: opentrons_96_tiprack_1000ul_D6 + E6: opentrons_96_tiprack_1000ul_E6 + F6: opentrons_96_tiprack_1000ul_F6 + G6: opentrons_96_tiprack_1000ul_G6 + H6: opentrons_96_tiprack_1000ul_H6 + A7: opentrons_96_tiprack_1000ul_A7 + B7: opentrons_96_tiprack_1000ul_B7 + C7: opentrons_96_tiprack_1000ul_C7 + D7: opentrons_96_tiprack_1000ul_D7 + E7: opentrons_96_tiprack_1000ul_E7 + F7: opentrons_96_tiprack_1000ul_F7 + G7: opentrons_96_tiprack_1000ul_G7 + H7: opentrons_96_tiprack_1000ul_H7 + A8: opentrons_96_tiprack_1000ul_A8 + B8: opentrons_96_tiprack_1000ul_B8 + C8: opentrons_96_tiprack_1000ul_C8 + D8: opentrons_96_tiprack_1000ul_D8 + E8: opentrons_96_tiprack_1000ul_E8 + F8: opentrons_96_tiprack_1000ul_F8 + G8: opentrons_96_tiprack_1000ul_G8 + H8: opentrons_96_tiprack_1000ul_H8 + A9: opentrons_96_tiprack_1000ul_A9 + B9: opentrons_96_tiprack_1000ul_B9 + C9: opentrons_96_tiprack_1000ul_C9 + D9: opentrons_96_tiprack_1000ul_D9 + E9: opentrons_96_tiprack_1000ul_E9 + F9: opentrons_96_tiprack_1000ul_F9 + G9: opentrons_96_tiprack_1000ul_G9 + H9: opentrons_96_tiprack_1000ul_H9 + A10: opentrons_96_tiprack_1000ul_A10 + B10: opentrons_96_tiprack_1000ul_B10 + C10: opentrons_96_tiprack_1000ul_C10 + D10: opentrons_96_tiprack_1000ul_D10 + E10: opentrons_96_tiprack_1000ul_E10 + F10: opentrons_96_tiprack_1000ul_F10 + G10: opentrons_96_tiprack_1000ul_G10 + H10: opentrons_96_tiprack_1000ul_H10 + A11: opentrons_96_tiprack_1000ul_A11 + B11: opentrons_96_tiprack_1000ul_B11 + C11: opentrons_96_tiprack_1000ul_C11 + D11: opentrons_96_tiprack_1000ul_D11 + E11: opentrons_96_tiprack_1000ul_E11 + F11: opentrons_96_tiprack_1000ul_F11 + G11: opentrons_96_tiprack_1000ul_G11 + H11: opentrons_96_tiprack_1000ul_H11 + A12: opentrons_96_tiprack_1000ul_A12 + B12: opentrons_96_tiprack_1000ul_B12 + C12: opentrons_96_tiprack_1000ul_C12 + D12: opentrons_96_tiprack_1000ul_D12 + E12: opentrons_96_tiprack_1000ul_E12 + F12: opentrons_96_tiprack_1000ul_F12 + G12: opentrons_96_tiprack_1000ul_G12 + H12: opentrons_96_tiprack_1000ul_H12 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.76 + size_y: 85.48 + size_z: 97.47 + type: TipRack + data: {} + id: opentrons_96_tiprack_1000ul + name: opentrons_96_tiprack_1000ul + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_A1 + name: opentrons_96_tiprack_1000ul_A1 + parent: opentrons_96_tiprack_1000ul + position: + x: 11.824 + y: 71.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_B1 + name: opentrons_96_tiprack_1000ul_B1 + parent: opentrons_96_tiprack_1000ul + position: + x: 11.824 + y: 62.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_C1 + name: opentrons_96_tiprack_1000ul_C1 + parent: opentrons_96_tiprack_1000ul + position: + x: 11.824 + y: 53.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_D1 + name: opentrons_96_tiprack_1000ul_D1 + parent: opentrons_96_tiprack_1000ul + position: + x: 11.824 + y: 44.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_E1 + name: opentrons_96_tiprack_1000ul_E1 + parent: opentrons_96_tiprack_1000ul + position: + x: 11.824 + y: 35.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_F1 + name: opentrons_96_tiprack_1000ul_F1 + parent: opentrons_96_tiprack_1000ul + position: + x: 11.824 + y: 26.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_G1 + name: opentrons_96_tiprack_1000ul_G1 + parent: opentrons_96_tiprack_1000ul + position: + x: 11.824 + y: 17.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_H1 + name: opentrons_96_tiprack_1000ul_H1 + parent: opentrons_96_tiprack_1000ul + position: + x: 11.824 + y: 8.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_A2 + name: opentrons_96_tiprack_1000ul_A2 + parent: opentrons_96_tiprack_1000ul + position: + x: 20.824 + y: 71.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_B2 + name: opentrons_96_tiprack_1000ul_B2 + parent: opentrons_96_tiprack_1000ul + position: + x: 20.824 + y: 62.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_C2 + name: opentrons_96_tiprack_1000ul_C2 + parent: opentrons_96_tiprack_1000ul + position: + x: 20.824 + y: 53.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_D2 + name: opentrons_96_tiprack_1000ul_D2 + parent: opentrons_96_tiprack_1000ul + position: + x: 20.824 + y: 44.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_E2 + name: opentrons_96_tiprack_1000ul_E2 + parent: opentrons_96_tiprack_1000ul + position: + x: 20.824 + y: 35.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_F2 + name: opentrons_96_tiprack_1000ul_F2 + parent: opentrons_96_tiprack_1000ul + position: + x: 20.824 + y: 26.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_G2 + name: opentrons_96_tiprack_1000ul_G2 + parent: opentrons_96_tiprack_1000ul + position: + x: 20.824 + y: 17.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_H2 + name: opentrons_96_tiprack_1000ul_H2 + parent: opentrons_96_tiprack_1000ul + position: + x: 20.824 + y: 8.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_A3 + name: opentrons_96_tiprack_1000ul_A3 + parent: opentrons_96_tiprack_1000ul + position: + x: 29.824 + y: 71.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_B3 + name: opentrons_96_tiprack_1000ul_B3 + parent: opentrons_96_tiprack_1000ul + position: + x: 29.824 + y: 62.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_C3 + name: opentrons_96_tiprack_1000ul_C3 + parent: opentrons_96_tiprack_1000ul + position: + x: 29.824 + y: 53.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_D3 + name: opentrons_96_tiprack_1000ul_D3 + parent: opentrons_96_tiprack_1000ul + position: + x: 29.824 + y: 44.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_E3 + name: opentrons_96_tiprack_1000ul_E3 + parent: opentrons_96_tiprack_1000ul + position: + x: 29.824 + y: 35.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_F3 + name: opentrons_96_tiprack_1000ul_F3 + parent: opentrons_96_tiprack_1000ul + position: + x: 29.824 + y: 26.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_G3 + name: opentrons_96_tiprack_1000ul_G3 + parent: opentrons_96_tiprack_1000ul + position: + x: 29.824 + y: 17.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_H3 + name: opentrons_96_tiprack_1000ul_H3 + parent: opentrons_96_tiprack_1000ul + position: + x: 29.824 + y: 8.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_A4 + name: opentrons_96_tiprack_1000ul_A4 + parent: opentrons_96_tiprack_1000ul + position: + x: 38.824 + y: 71.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_B4 + name: opentrons_96_tiprack_1000ul_B4 + parent: opentrons_96_tiprack_1000ul + position: + x: 38.824 + y: 62.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_C4 + name: opentrons_96_tiprack_1000ul_C4 + parent: opentrons_96_tiprack_1000ul + position: + x: 38.824 + y: 53.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_D4 + name: opentrons_96_tiprack_1000ul_D4 + parent: opentrons_96_tiprack_1000ul + position: + x: 38.824 + y: 44.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_E4 + name: opentrons_96_tiprack_1000ul_E4 + parent: opentrons_96_tiprack_1000ul + position: + x: 38.824 + y: 35.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_F4 + name: opentrons_96_tiprack_1000ul_F4 + parent: opentrons_96_tiprack_1000ul + position: + x: 38.824 + y: 26.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_G4 + name: opentrons_96_tiprack_1000ul_G4 + parent: opentrons_96_tiprack_1000ul + position: + x: 38.824 + y: 17.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_H4 + name: opentrons_96_tiprack_1000ul_H4 + parent: opentrons_96_tiprack_1000ul + position: + x: 38.824 + y: 8.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_A5 + name: opentrons_96_tiprack_1000ul_A5 + parent: opentrons_96_tiprack_1000ul + position: + x: 47.824 + y: 71.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_B5 + name: opentrons_96_tiprack_1000ul_B5 + parent: opentrons_96_tiprack_1000ul + position: + x: 47.824 + y: 62.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_C5 + name: opentrons_96_tiprack_1000ul_C5 + parent: opentrons_96_tiprack_1000ul + position: + x: 47.824 + y: 53.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_D5 + name: opentrons_96_tiprack_1000ul_D5 + parent: opentrons_96_tiprack_1000ul + position: + x: 47.824 + y: 44.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_E5 + name: opentrons_96_tiprack_1000ul_E5 + parent: opentrons_96_tiprack_1000ul + position: + x: 47.824 + y: 35.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_F5 + name: opentrons_96_tiprack_1000ul_F5 + parent: opentrons_96_tiprack_1000ul + position: + x: 47.824 + y: 26.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_G5 + name: opentrons_96_tiprack_1000ul_G5 + parent: opentrons_96_tiprack_1000ul + position: + x: 47.824 + y: 17.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_H5 + name: opentrons_96_tiprack_1000ul_H5 + parent: opentrons_96_tiprack_1000ul + position: + x: 47.824 + y: 8.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_A6 + name: opentrons_96_tiprack_1000ul_A6 + parent: opentrons_96_tiprack_1000ul + position: + x: 56.824 + y: 71.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_B6 + name: opentrons_96_tiprack_1000ul_B6 + parent: opentrons_96_tiprack_1000ul + position: + x: 56.824 + y: 62.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_C6 + name: opentrons_96_tiprack_1000ul_C6 + parent: opentrons_96_tiprack_1000ul + position: + x: 56.824 + y: 53.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_D6 + name: opentrons_96_tiprack_1000ul_D6 + parent: opentrons_96_tiprack_1000ul + position: + x: 56.824 + y: 44.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_E6 + name: opentrons_96_tiprack_1000ul_E6 + parent: opentrons_96_tiprack_1000ul + position: + x: 56.824 + y: 35.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_F6 + name: opentrons_96_tiprack_1000ul_F6 + parent: opentrons_96_tiprack_1000ul + position: + x: 56.824 + y: 26.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_G6 + name: opentrons_96_tiprack_1000ul_G6 + parent: opentrons_96_tiprack_1000ul + position: + x: 56.824 + y: 17.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_H6 + name: opentrons_96_tiprack_1000ul_H6 + parent: opentrons_96_tiprack_1000ul + position: + x: 56.824 + y: 8.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_A7 + name: opentrons_96_tiprack_1000ul_A7 + parent: opentrons_96_tiprack_1000ul + position: + x: 65.824 + y: 71.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_B7 + name: opentrons_96_tiprack_1000ul_B7 + parent: opentrons_96_tiprack_1000ul + position: + x: 65.824 + y: 62.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_C7 + name: opentrons_96_tiprack_1000ul_C7 + parent: opentrons_96_tiprack_1000ul + position: + x: 65.824 + y: 53.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_D7 + name: opentrons_96_tiprack_1000ul_D7 + parent: opentrons_96_tiprack_1000ul + position: + x: 65.824 + y: 44.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_E7 + name: opentrons_96_tiprack_1000ul_E7 + parent: opentrons_96_tiprack_1000ul + position: + x: 65.824 + y: 35.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_F7 + name: opentrons_96_tiprack_1000ul_F7 + parent: opentrons_96_tiprack_1000ul + position: + x: 65.824 + y: 26.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_G7 + name: opentrons_96_tiprack_1000ul_G7 + parent: opentrons_96_tiprack_1000ul + position: + x: 65.824 + y: 17.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_H7 + name: opentrons_96_tiprack_1000ul_H7 + parent: opentrons_96_tiprack_1000ul + position: + x: 65.824 + y: 8.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_A8 + name: opentrons_96_tiprack_1000ul_A8 + parent: opentrons_96_tiprack_1000ul + position: + x: 74.824 + y: 71.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_B8 + name: opentrons_96_tiprack_1000ul_B8 + parent: opentrons_96_tiprack_1000ul + position: + x: 74.824 + y: 62.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_C8 + name: opentrons_96_tiprack_1000ul_C8 + parent: opentrons_96_tiprack_1000ul + position: + x: 74.824 + y: 53.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_D8 + name: opentrons_96_tiprack_1000ul_D8 + parent: opentrons_96_tiprack_1000ul + position: + x: 74.824 + y: 44.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_E8 + name: opentrons_96_tiprack_1000ul_E8 + parent: opentrons_96_tiprack_1000ul + position: + x: 74.824 + y: 35.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_F8 + name: opentrons_96_tiprack_1000ul_F8 + parent: opentrons_96_tiprack_1000ul + position: + x: 74.824 + y: 26.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_G8 + name: opentrons_96_tiprack_1000ul_G8 + parent: opentrons_96_tiprack_1000ul + position: + x: 74.824 + y: 17.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_H8 + name: opentrons_96_tiprack_1000ul_H8 + parent: opentrons_96_tiprack_1000ul + position: + x: 74.824 + y: 8.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_A9 + name: opentrons_96_tiprack_1000ul_A9 + parent: opentrons_96_tiprack_1000ul + position: + x: 83.824 + y: 71.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_B9 + name: opentrons_96_tiprack_1000ul_B9 + parent: opentrons_96_tiprack_1000ul + position: + x: 83.824 + y: 62.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_C9 + name: opentrons_96_tiprack_1000ul_C9 + parent: opentrons_96_tiprack_1000ul + position: + x: 83.824 + y: 53.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_D9 + name: opentrons_96_tiprack_1000ul_D9 + parent: opentrons_96_tiprack_1000ul + position: + x: 83.824 + y: 44.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_E9 + name: opentrons_96_tiprack_1000ul_E9 + parent: opentrons_96_tiprack_1000ul + position: + x: 83.824 + y: 35.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_F9 + name: opentrons_96_tiprack_1000ul_F9 + parent: opentrons_96_tiprack_1000ul + position: + x: 83.824 + y: 26.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_G9 + name: opentrons_96_tiprack_1000ul_G9 + parent: opentrons_96_tiprack_1000ul + position: + x: 83.824 + y: 17.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_H9 + name: opentrons_96_tiprack_1000ul_H9 + parent: opentrons_96_tiprack_1000ul + position: + x: 83.824 + y: 8.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_A10 + name: opentrons_96_tiprack_1000ul_A10 + parent: opentrons_96_tiprack_1000ul + position: + x: 92.824 + y: 71.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_B10 + name: opentrons_96_tiprack_1000ul_B10 + parent: opentrons_96_tiprack_1000ul + position: + x: 92.824 + y: 62.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_C10 + name: opentrons_96_tiprack_1000ul_C10 + parent: opentrons_96_tiprack_1000ul + position: + x: 92.824 + y: 53.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_D10 + name: opentrons_96_tiprack_1000ul_D10 + parent: opentrons_96_tiprack_1000ul + position: + x: 92.824 + y: 44.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_E10 + name: opentrons_96_tiprack_1000ul_E10 + parent: opentrons_96_tiprack_1000ul + position: + x: 92.824 + y: 35.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_F10 + name: opentrons_96_tiprack_1000ul_F10 + parent: opentrons_96_tiprack_1000ul + position: + x: 92.824 + y: 26.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_G10 + name: opentrons_96_tiprack_1000ul_G10 + parent: opentrons_96_tiprack_1000ul + position: + x: 92.824 + y: 17.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_H10 + name: opentrons_96_tiprack_1000ul_H10 + parent: opentrons_96_tiprack_1000ul + position: + x: 92.824 + y: 8.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_A11 + name: opentrons_96_tiprack_1000ul_A11 + parent: opentrons_96_tiprack_1000ul + position: + x: 101.824 + y: 71.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_B11 + name: opentrons_96_tiprack_1000ul_B11 + parent: opentrons_96_tiprack_1000ul + position: + x: 101.824 + y: 62.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_C11 + name: opentrons_96_tiprack_1000ul_C11 + parent: opentrons_96_tiprack_1000ul + position: + x: 101.824 + y: 53.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_D11 + name: opentrons_96_tiprack_1000ul_D11 + parent: opentrons_96_tiprack_1000ul + position: + x: 101.824 + y: 44.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_E11 + name: opentrons_96_tiprack_1000ul_E11 + parent: opentrons_96_tiprack_1000ul + position: + x: 101.824 + y: 35.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_F11 + name: opentrons_96_tiprack_1000ul_F11 + parent: opentrons_96_tiprack_1000ul + position: + x: 101.824 + y: 26.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_G11 + name: opentrons_96_tiprack_1000ul_G11 + parent: opentrons_96_tiprack_1000ul + position: + x: 101.824 + y: 17.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_H11 + name: opentrons_96_tiprack_1000ul_H11 + parent: opentrons_96_tiprack_1000ul + position: + x: 101.824 + y: 8.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_A12 + name: opentrons_96_tiprack_1000ul_A12 + parent: opentrons_96_tiprack_1000ul + position: + x: 110.824 + y: 71.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_B12 + name: opentrons_96_tiprack_1000ul_B12 + parent: opentrons_96_tiprack_1000ul + position: + x: 110.824 + y: 62.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_C12 + name: opentrons_96_tiprack_1000ul_C12 + parent: opentrons_96_tiprack_1000ul + position: + x: 110.824 + y: 53.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_D12 + name: opentrons_96_tiprack_1000ul_D12 + parent: opentrons_96_tiprack_1000ul + position: + x: 110.824 + y: 44.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_E12 + name: opentrons_96_tiprack_1000ul_E12 + parent: opentrons_96_tiprack_1000ul + position: + x: 110.824 + y: 35.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_F12 + name: opentrons_96_tiprack_1000ul_F12 + parent: opentrons_96_tiprack_1000ul + position: + x: 110.824 + y: 26.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_G12 + name: opentrons_96_tiprack_1000ul_G12 + parent: opentrons_96_tiprack_1000ul + position: + x: 110.824 + y: 17.684 + z: 9.47 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 5.112 + size_y: 5.112 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip: + fitting_depth: 7.95 + has_filter: false + maximal_volume: 1000.0 + total_tip_length: 88 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_1000ul_H12 + name: opentrons_96_tiprack_1000ul_H12 + parent: opentrons_96_tiprack_1000ul + position: + x: 110.824 + y: 8.684 + z: 9.47 + sample_id: null + type: container + description: Opentrons 96 tiprack 1000ul + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/tip_racks.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +opentrons_96_tiprack_10ul: + category: + - tip_racks + class: + module: pylabrobot.resources.opentrons.tip_racks:opentrons_96_tiprack_10ul + type: pylabrobot + config_info: + - children: + - opentrons_96_tiprack_10ul_A1 + - opentrons_96_tiprack_10ul_B1 + - opentrons_96_tiprack_10ul_C1 + - opentrons_96_tiprack_10ul_D1 + - opentrons_96_tiprack_10ul_E1 + - opentrons_96_tiprack_10ul_F1 + - opentrons_96_tiprack_10ul_G1 + - opentrons_96_tiprack_10ul_H1 + - opentrons_96_tiprack_10ul_A2 + - opentrons_96_tiprack_10ul_B2 + - opentrons_96_tiprack_10ul_C2 + - opentrons_96_tiprack_10ul_D2 + - opentrons_96_tiprack_10ul_E2 + - opentrons_96_tiprack_10ul_F2 + - opentrons_96_tiprack_10ul_G2 + - opentrons_96_tiprack_10ul_H2 + - opentrons_96_tiprack_10ul_A3 + - opentrons_96_tiprack_10ul_B3 + - opentrons_96_tiprack_10ul_C3 + - opentrons_96_tiprack_10ul_D3 + - opentrons_96_tiprack_10ul_E3 + - opentrons_96_tiprack_10ul_F3 + - opentrons_96_tiprack_10ul_G3 + - opentrons_96_tiprack_10ul_H3 + - opentrons_96_tiprack_10ul_A4 + - opentrons_96_tiprack_10ul_B4 + - opentrons_96_tiprack_10ul_C4 + - opentrons_96_tiprack_10ul_D4 + - opentrons_96_tiprack_10ul_E4 + - opentrons_96_tiprack_10ul_F4 + - opentrons_96_tiprack_10ul_G4 + - opentrons_96_tiprack_10ul_H4 + - opentrons_96_tiprack_10ul_A5 + - opentrons_96_tiprack_10ul_B5 + - opentrons_96_tiprack_10ul_C5 + - opentrons_96_tiprack_10ul_D5 + - opentrons_96_tiprack_10ul_E5 + - opentrons_96_tiprack_10ul_F5 + - opentrons_96_tiprack_10ul_G5 + - opentrons_96_tiprack_10ul_H5 + - opentrons_96_tiprack_10ul_A6 + - opentrons_96_tiprack_10ul_B6 + - opentrons_96_tiprack_10ul_C6 + - opentrons_96_tiprack_10ul_D6 + - opentrons_96_tiprack_10ul_E6 + - opentrons_96_tiprack_10ul_F6 + - opentrons_96_tiprack_10ul_G6 + - opentrons_96_tiprack_10ul_H6 + - opentrons_96_tiprack_10ul_A7 + - opentrons_96_tiprack_10ul_B7 + - opentrons_96_tiprack_10ul_C7 + - opentrons_96_tiprack_10ul_D7 + - opentrons_96_tiprack_10ul_E7 + - opentrons_96_tiprack_10ul_F7 + - opentrons_96_tiprack_10ul_G7 + - opentrons_96_tiprack_10ul_H7 + - opentrons_96_tiprack_10ul_A8 + - opentrons_96_tiprack_10ul_B8 + - opentrons_96_tiprack_10ul_C8 + - opentrons_96_tiprack_10ul_D8 + - opentrons_96_tiprack_10ul_E8 + - opentrons_96_tiprack_10ul_F8 + - opentrons_96_tiprack_10ul_G8 + - opentrons_96_tiprack_10ul_H8 + - opentrons_96_tiprack_10ul_A9 + - opentrons_96_tiprack_10ul_B9 + - opentrons_96_tiprack_10ul_C9 + - opentrons_96_tiprack_10ul_D9 + - opentrons_96_tiprack_10ul_E9 + - opentrons_96_tiprack_10ul_F9 + - opentrons_96_tiprack_10ul_G9 + - opentrons_96_tiprack_10ul_H9 + - opentrons_96_tiprack_10ul_A10 + - opentrons_96_tiprack_10ul_B10 + - opentrons_96_tiprack_10ul_C10 + - opentrons_96_tiprack_10ul_D10 + - opentrons_96_tiprack_10ul_E10 + - opentrons_96_tiprack_10ul_F10 + - opentrons_96_tiprack_10ul_G10 + - opentrons_96_tiprack_10ul_H10 + - opentrons_96_tiprack_10ul_A11 + - opentrons_96_tiprack_10ul_B11 + - opentrons_96_tiprack_10ul_C11 + - opentrons_96_tiprack_10ul_D11 + - opentrons_96_tiprack_10ul_E11 + - opentrons_96_tiprack_10ul_F11 + - opentrons_96_tiprack_10ul_G11 + - opentrons_96_tiprack_10ul_H11 + - opentrons_96_tiprack_10ul_A12 + - opentrons_96_tiprack_10ul_B12 + - opentrons_96_tiprack_10ul_C12 + - opentrons_96_tiprack_10ul_D12 + - opentrons_96_tiprack_10ul_E12 + - opentrons_96_tiprack_10ul_F12 + - opentrons_96_tiprack_10ul_G12 + - opentrons_96_tiprack_10ul_H12 + class: '' + config: + barcode: null + category: tip_rack + model: Opentrons OT-2 96 Tip Rack 10 µL + ordering: + A1: opentrons_96_tiprack_10ul_A1 + B1: opentrons_96_tiprack_10ul_B1 + C1: opentrons_96_tiprack_10ul_C1 + D1: opentrons_96_tiprack_10ul_D1 + E1: opentrons_96_tiprack_10ul_E1 + F1: opentrons_96_tiprack_10ul_F1 + G1: opentrons_96_tiprack_10ul_G1 + H1: opentrons_96_tiprack_10ul_H1 + A2: opentrons_96_tiprack_10ul_A2 + B2: opentrons_96_tiprack_10ul_B2 + C2: opentrons_96_tiprack_10ul_C2 + D2: opentrons_96_tiprack_10ul_D2 + E2: opentrons_96_tiprack_10ul_E2 + F2: opentrons_96_tiprack_10ul_F2 + G2: opentrons_96_tiprack_10ul_G2 + H2: opentrons_96_tiprack_10ul_H2 + A3: opentrons_96_tiprack_10ul_A3 + B3: opentrons_96_tiprack_10ul_B3 + C3: opentrons_96_tiprack_10ul_C3 + D3: opentrons_96_tiprack_10ul_D3 + E3: opentrons_96_tiprack_10ul_E3 + F3: opentrons_96_tiprack_10ul_F3 + G3: opentrons_96_tiprack_10ul_G3 + H3: opentrons_96_tiprack_10ul_H3 + A4: opentrons_96_tiprack_10ul_A4 + B4: opentrons_96_tiprack_10ul_B4 + C4: opentrons_96_tiprack_10ul_C4 + D4: opentrons_96_tiprack_10ul_D4 + E4: opentrons_96_tiprack_10ul_E4 + F4: opentrons_96_tiprack_10ul_F4 + G4: opentrons_96_tiprack_10ul_G4 + H4: opentrons_96_tiprack_10ul_H4 + A5: opentrons_96_tiprack_10ul_A5 + B5: opentrons_96_tiprack_10ul_B5 + C5: opentrons_96_tiprack_10ul_C5 + D5: opentrons_96_tiprack_10ul_D5 + E5: opentrons_96_tiprack_10ul_E5 + F5: opentrons_96_tiprack_10ul_F5 + G5: opentrons_96_tiprack_10ul_G5 + H5: opentrons_96_tiprack_10ul_H5 + A6: opentrons_96_tiprack_10ul_A6 + B6: opentrons_96_tiprack_10ul_B6 + C6: opentrons_96_tiprack_10ul_C6 + D6: opentrons_96_tiprack_10ul_D6 + E6: opentrons_96_tiprack_10ul_E6 + F6: opentrons_96_tiprack_10ul_F6 + G6: opentrons_96_tiprack_10ul_G6 + H6: opentrons_96_tiprack_10ul_H6 + A7: opentrons_96_tiprack_10ul_A7 + B7: opentrons_96_tiprack_10ul_B7 + C7: opentrons_96_tiprack_10ul_C7 + D7: opentrons_96_tiprack_10ul_D7 + E7: opentrons_96_tiprack_10ul_E7 + F7: opentrons_96_tiprack_10ul_F7 + G7: opentrons_96_tiprack_10ul_G7 + H7: opentrons_96_tiprack_10ul_H7 + A8: opentrons_96_tiprack_10ul_A8 + B8: opentrons_96_tiprack_10ul_B8 + C8: opentrons_96_tiprack_10ul_C8 + D8: opentrons_96_tiprack_10ul_D8 + E8: opentrons_96_tiprack_10ul_E8 + F8: opentrons_96_tiprack_10ul_F8 + G8: opentrons_96_tiprack_10ul_G8 + H8: opentrons_96_tiprack_10ul_H8 + A9: opentrons_96_tiprack_10ul_A9 + B9: opentrons_96_tiprack_10ul_B9 + C9: opentrons_96_tiprack_10ul_C9 + D9: opentrons_96_tiprack_10ul_D9 + E9: opentrons_96_tiprack_10ul_E9 + F9: opentrons_96_tiprack_10ul_F9 + G9: opentrons_96_tiprack_10ul_G9 + H9: opentrons_96_tiprack_10ul_H9 + A10: opentrons_96_tiprack_10ul_A10 + B10: opentrons_96_tiprack_10ul_B10 + C10: opentrons_96_tiprack_10ul_C10 + D10: opentrons_96_tiprack_10ul_D10 + E10: opentrons_96_tiprack_10ul_E10 + F10: opentrons_96_tiprack_10ul_F10 + G10: opentrons_96_tiprack_10ul_G10 + H10: opentrons_96_tiprack_10ul_H10 + A11: opentrons_96_tiprack_10ul_A11 + B11: opentrons_96_tiprack_10ul_B11 + C11: opentrons_96_tiprack_10ul_C11 + D11: opentrons_96_tiprack_10ul_D11 + E11: opentrons_96_tiprack_10ul_E11 + F11: opentrons_96_tiprack_10ul_F11 + G11: opentrons_96_tiprack_10ul_G11 + H11: opentrons_96_tiprack_10ul_H11 + A12: opentrons_96_tiprack_10ul_A12 + B12: opentrons_96_tiprack_10ul_B12 + C12: opentrons_96_tiprack_10ul_C12 + D12: opentrons_96_tiprack_10ul_D12 + E12: opentrons_96_tiprack_10ul_E12 + F12: opentrons_96_tiprack_10ul_F12 + G12: opentrons_96_tiprack_10ul_G12 + H12: opentrons_96_tiprack_10ul_H12 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.76 + size_y: 85.48 + size_z: 64.69 + type: TipRack + data: {} + id: opentrons_96_tiprack_10ul + name: opentrons_96_tiprack_10ul + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_A1 + name: opentrons_96_tiprack_10ul_A1 + parent: opentrons_96_tiprack_10ul + position: + x: 13.224 + y: 73.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_B1 + name: opentrons_96_tiprack_10ul_B1 + parent: opentrons_96_tiprack_10ul + position: + x: 13.224 + y: 64.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_C1 + name: opentrons_96_tiprack_10ul_C1 + parent: opentrons_96_tiprack_10ul + position: + x: 13.224 + y: 55.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_D1 + name: opentrons_96_tiprack_10ul_D1 + parent: opentrons_96_tiprack_10ul + position: + x: 13.224 + y: 46.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_E1 + name: opentrons_96_tiprack_10ul_E1 + parent: opentrons_96_tiprack_10ul + position: + x: 13.224 + y: 37.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_F1 + name: opentrons_96_tiprack_10ul_F1 + parent: opentrons_96_tiprack_10ul + position: + x: 13.224 + y: 28.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_G1 + name: opentrons_96_tiprack_10ul_G1 + parent: opentrons_96_tiprack_10ul + position: + x: 13.224 + y: 19.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_H1 + name: opentrons_96_tiprack_10ul_H1 + parent: opentrons_96_tiprack_10ul + position: + x: 13.224 + y: 10.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_A2 + name: opentrons_96_tiprack_10ul_A2 + parent: opentrons_96_tiprack_10ul + position: + x: 22.224 + y: 73.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_B2 + name: opentrons_96_tiprack_10ul_B2 + parent: opentrons_96_tiprack_10ul + position: + x: 22.224 + y: 64.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_C2 + name: opentrons_96_tiprack_10ul_C2 + parent: opentrons_96_tiprack_10ul + position: + x: 22.224 + y: 55.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_D2 + name: opentrons_96_tiprack_10ul_D2 + parent: opentrons_96_tiprack_10ul + position: + x: 22.224 + y: 46.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_E2 + name: opentrons_96_tiprack_10ul_E2 + parent: opentrons_96_tiprack_10ul + position: + x: 22.224 + y: 37.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_F2 + name: opentrons_96_tiprack_10ul_F2 + parent: opentrons_96_tiprack_10ul + position: + x: 22.224 + y: 28.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_G2 + name: opentrons_96_tiprack_10ul_G2 + parent: opentrons_96_tiprack_10ul + position: + x: 22.224 + y: 19.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_H2 + name: opentrons_96_tiprack_10ul_H2 + parent: opentrons_96_tiprack_10ul + position: + x: 22.224 + y: 10.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_A3 + name: opentrons_96_tiprack_10ul_A3 + parent: opentrons_96_tiprack_10ul + position: + x: 31.224 + y: 73.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_B3 + name: opentrons_96_tiprack_10ul_B3 + parent: opentrons_96_tiprack_10ul + position: + x: 31.224 + y: 64.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_C3 + name: opentrons_96_tiprack_10ul_C3 + parent: opentrons_96_tiprack_10ul + position: + x: 31.224 + y: 55.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_D3 + name: opentrons_96_tiprack_10ul_D3 + parent: opentrons_96_tiprack_10ul + position: + x: 31.224 + y: 46.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_E3 + name: opentrons_96_tiprack_10ul_E3 + parent: opentrons_96_tiprack_10ul + position: + x: 31.224 + y: 37.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_F3 + name: opentrons_96_tiprack_10ul_F3 + parent: opentrons_96_tiprack_10ul + position: + x: 31.224 + y: 28.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_G3 + name: opentrons_96_tiprack_10ul_G3 + parent: opentrons_96_tiprack_10ul + position: + x: 31.224 + y: 19.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_H3 + name: opentrons_96_tiprack_10ul_H3 + parent: opentrons_96_tiprack_10ul + position: + x: 31.224 + y: 10.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_A4 + name: opentrons_96_tiprack_10ul_A4 + parent: opentrons_96_tiprack_10ul + position: + x: 40.224 + y: 73.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_B4 + name: opentrons_96_tiprack_10ul_B4 + parent: opentrons_96_tiprack_10ul + position: + x: 40.224 + y: 64.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_C4 + name: opentrons_96_tiprack_10ul_C4 + parent: opentrons_96_tiprack_10ul + position: + x: 40.224 + y: 55.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_D4 + name: opentrons_96_tiprack_10ul_D4 + parent: opentrons_96_tiprack_10ul + position: + x: 40.224 + y: 46.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_E4 + name: opentrons_96_tiprack_10ul_E4 + parent: opentrons_96_tiprack_10ul + position: + x: 40.224 + y: 37.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_F4 + name: opentrons_96_tiprack_10ul_F4 + parent: opentrons_96_tiprack_10ul + position: + x: 40.224 + y: 28.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_G4 + name: opentrons_96_tiprack_10ul_G4 + parent: opentrons_96_tiprack_10ul + position: + x: 40.224 + y: 19.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_H4 + name: opentrons_96_tiprack_10ul_H4 + parent: opentrons_96_tiprack_10ul + position: + x: 40.224 + y: 10.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_A5 + name: opentrons_96_tiprack_10ul_A5 + parent: opentrons_96_tiprack_10ul + position: + x: 49.224 + y: 73.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_B5 + name: opentrons_96_tiprack_10ul_B5 + parent: opentrons_96_tiprack_10ul + position: + x: 49.224 + y: 64.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_C5 + name: opentrons_96_tiprack_10ul_C5 + parent: opentrons_96_tiprack_10ul + position: + x: 49.224 + y: 55.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_D5 + name: opentrons_96_tiprack_10ul_D5 + parent: opentrons_96_tiprack_10ul + position: + x: 49.224 + y: 46.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_E5 + name: opentrons_96_tiprack_10ul_E5 + parent: opentrons_96_tiprack_10ul + position: + x: 49.224 + y: 37.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_F5 + name: opentrons_96_tiprack_10ul_F5 + parent: opentrons_96_tiprack_10ul + position: + x: 49.224 + y: 28.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_G5 + name: opentrons_96_tiprack_10ul_G5 + parent: opentrons_96_tiprack_10ul + position: + x: 49.224 + y: 19.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_H5 + name: opentrons_96_tiprack_10ul_H5 + parent: opentrons_96_tiprack_10ul + position: + x: 49.224 + y: 10.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_A6 + name: opentrons_96_tiprack_10ul_A6 + parent: opentrons_96_tiprack_10ul + position: + x: 58.224 + y: 73.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_B6 + name: opentrons_96_tiprack_10ul_B6 + parent: opentrons_96_tiprack_10ul + position: + x: 58.224 + y: 64.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_C6 + name: opentrons_96_tiprack_10ul_C6 + parent: opentrons_96_tiprack_10ul + position: + x: 58.224 + y: 55.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_D6 + name: opentrons_96_tiprack_10ul_D6 + parent: opentrons_96_tiprack_10ul + position: + x: 58.224 + y: 46.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_E6 + name: opentrons_96_tiprack_10ul_E6 + parent: opentrons_96_tiprack_10ul + position: + x: 58.224 + y: 37.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_F6 + name: opentrons_96_tiprack_10ul_F6 + parent: opentrons_96_tiprack_10ul + position: + x: 58.224 + y: 28.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_G6 + name: opentrons_96_tiprack_10ul_G6 + parent: opentrons_96_tiprack_10ul + position: + x: 58.224 + y: 19.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_H6 + name: opentrons_96_tiprack_10ul_H6 + parent: opentrons_96_tiprack_10ul + position: + x: 58.224 + y: 10.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_A7 + name: opentrons_96_tiprack_10ul_A7 + parent: opentrons_96_tiprack_10ul + position: + x: 67.224 + y: 73.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_B7 + name: opentrons_96_tiprack_10ul_B7 + parent: opentrons_96_tiprack_10ul + position: + x: 67.224 + y: 64.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_C7 + name: opentrons_96_tiprack_10ul_C7 + parent: opentrons_96_tiprack_10ul + position: + x: 67.224 + y: 55.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_D7 + name: opentrons_96_tiprack_10ul_D7 + parent: opentrons_96_tiprack_10ul + position: + x: 67.224 + y: 46.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_E7 + name: opentrons_96_tiprack_10ul_E7 + parent: opentrons_96_tiprack_10ul + position: + x: 67.224 + y: 37.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_F7 + name: opentrons_96_tiprack_10ul_F7 + parent: opentrons_96_tiprack_10ul + position: + x: 67.224 + y: 28.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_G7 + name: opentrons_96_tiprack_10ul_G7 + parent: opentrons_96_tiprack_10ul + position: + x: 67.224 + y: 19.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_H7 + name: opentrons_96_tiprack_10ul_H7 + parent: opentrons_96_tiprack_10ul + position: + x: 67.224 + y: 10.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_A8 + name: opentrons_96_tiprack_10ul_A8 + parent: opentrons_96_tiprack_10ul + position: + x: 76.224 + y: 73.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_B8 + name: opentrons_96_tiprack_10ul_B8 + parent: opentrons_96_tiprack_10ul + position: + x: 76.224 + y: 64.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_C8 + name: opentrons_96_tiprack_10ul_C8 + parent: opentrons_96_tiprack_10ul + position: + x: 76.224 + y: 55.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_D8 + name: opentrons_96_tiprack_10ul_D8 + parent: opentrons_96_tiprack_10ul + position: + x: 76.224 + y: 46.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_E8 + name: opentrons_96_tiprack_10ul_E8 + parent: opentrons_96_tiprack_10ul + position: + x: 76.224 + y: 37.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_F8 + name: opentrons_96_tiprack_10ul_F8 + parent: opentrons_96_tiprack_10ul + position: + x: 76.224 + y: 28.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_G8 + name: opentrons_96_tiprack_10ul_G8 + parent: opentrons_96_tiprack_10ul + position: + x: 76.224 + y: 19.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_H8 + name: opentrons_96_tiprack_10ul_H8 + parent: opentrons_96_tiprack_10ul + position: + x: 76.224 + y: 10.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_A9 + name: opentrons_96_tiprack_10ul_A9 + parent: opentrons_96_tiprack_10ul + position: + x: 85.224 + y: 73.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_B9 + name: opentrons_96_tiprack_10ul_B9 + parent: opentrons_96_tiprack_10ul + position: + x: 85.224 + y: 64.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_C9 + name: opentrons_96_tiprack_10ul_C9 + parent: opentrons_96_tiprack_10ul + position: + x: 85.224 + y: 55.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_D9 + name: opentrons_96_tiprack_10ul_D9 + parent: opentrons_96_tiprack_10ul + position: + x: 85.224 + y: 46.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_E9 + name: opentrons_96_tiprack_10ul_E9 + parent: opentrons_96_tiprack_10ul + position: + x: 85.224 + y: 37.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_F9 + name: opentrons_96_tiprack_10ul_F9 + parent: opentrons_96_tiprack_10ul + position: + x: 85.224 + y: 28.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_G9 + name: opentrons_96_tiprack_10ul_G9 + parent: opentrons_96_tiprack_10ul + position: + x: 85.224 + y: 19.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_H9 + name: opentrons_96_tiprack_10ul_H9 + parent: opentrons_96_tiprack_10ul + position: + x: 85.224 + y: 10.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_A10 + name: opentrons_96_tiprack_10ul_A10 + parent: opentrons_96_tiprack_10ul + position: + x: 94.224 + y: 73.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_B10 + name: opentrons_96_tiprack_10ul_B10 + parent: opentrons_96_tiprack_10ul + position: + x: 94.224 + y: 64.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_C10 + name: opentrons_96_tiprack_10ul_C10 + parent: opentrons_96_tiprack_10ul + position: + x: 94.224 + y: 55.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_D10 + name: opentrons_96_tiprack_10ul_D10 + parent: opentrons_96_tiprack_10ul + position: + x: 94.224 + y: 46.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_E10 + name: opentrons_96_tiprack_10ul_E10 + parent: opentrons_96_tiprack_10ul + position: + x: 94.224 + y: 37.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_F10 + name: opentrons_96_tiprack_10ul_F10 + parent: opentrons_96_tiprack_10ul + position: + x: 94.224 + y: 28.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_G10 + name: opentrons_96_tiprack_10ul_G10 + parent: opentrons_96_tiprack_10ul + position: + x: 94.224 + y: 19.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_H10 + name: opentrons_96_tiprack_10ul_H10 + parent: opentrons_96_tiprack_10ul + position: + x: 94.224 + y: 10.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_A11 + name: opentrons_96_tiprack_10ul_A11 + parent: opentrons_96_tiprack_10ul + position: + x: 103.224 + y: 73.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_B11 + name: opentrons_96_tiprack_10ul_B11 + parent: opentrons_96_tiprack_10ul + position: + x: 103.224 + y: 64.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_C11 + name: opentrons_96_tiprack_10ul_C11 + parent: opentrons_96_tiprack_10ul + position: + x: 103.224 + y: 55.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_D11 + name: opentrons_96_tiprack_10ul_D11 + parent: opentrons_96_tiprack_10ul + position: + x: 103.224 + y: 46.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_E11 + name: opentrons_96_tiprack_10ul_E11 + parent: opentrons_96_tiprack_10ul + position: + x: 103.224 + y: 37.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_F11 + name: opentrons_96_tiprack_10ul_F11 + parent: opentrons_96_tiprack_10ul + position: + x: 103.224 + y: 28.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_G11 + name: opentrons_96_tiprack_10ul_G11 + parent: opentrons_96_tiprack_10ul + position: + x: 103.224 + y: 19.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_H11 + name: opentrons_96_tiprack_10ul_H11 + parent: opentrons_96_tiprack_10ul + position: + x: 103.224 + y: 10.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_A12 + name: opentrons_96_tiprack_10ul_A12 + parent: opentrons_96_tiprack_10ul + position: + x: 112.224 + y: 73.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_B12 + name: opentrons_96_tiprack_10ul_B12 + parent: opentrons_96_tiprack_10ul + position: + x: 112.224 + y: 64.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_C12 + name: opentrons_96_tiprack_10ul_C12 + parent: opentrons_96_tiprack_10ul + position: + x: 112.224 + y: 55.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_D12 + name: opentrons_96_tiprack_10ul_D12 + parent: opentrons_96_tiprack_10ul + position: + x: 112.224 + y: 46.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_E12 + name: opentrons_96_tiprack_10ul_E12 + parent: opentrons_96_tiprack_10ul + position: + x: 112.224 + y: 37.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_F12 + name: opentrons_96_tiprack_10ul_F12 + parent: opentrons_96_tiprack_10ul + position: + x: 112.224 + y: 28.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_G12 + name: opentrons_96_tiprack_10ul_G12 + parent: opentrons_96_tiprack_10ul + position: + x: 112.224 + y: 19.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 3.29 + has_filter: false + maximal_volume: 10.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_10ul_H12 + name: opentrons_96_tiprack_10ul_H12 + parent: opentrons_96_tiprack_10ul + position: + x: 112.224 + y: 10.084 + z: 25.49 + sample_id: null + type: container + description: Opentrons 96 tiprack 10ul + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/tip_racks.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +opentrons_96_tiprack_20ul: + category: + - tip_racks + class: + module: pylabrobot.resources.opentrons.tip_racks:opentrons_96_tiprack_20ul + type: pylabrobot + config_info: + - children: + - opentrons_96_tiprack_20ul_A1 + - opentrons_96_tiprack_20ul_B1 + - opentrons_96_tiprack_20ul_C1 + - opentrons_96_tiprack_20ul_D1 + - opentrons_96_tiprack_20ul_E1 + - opentrons_96_tiprack_20ul_F1 + - opentrons_96_tiprack_20ul_G1 + - opentrons_96_tiprack_20ul_H1 + - opentrons_96_tiprack_20ul_A2 + - opentrons_96_tiprack_20ul_B2 + - opentrons_96_tiprack_20ul_C2 + - opentrons_96_tiprack_20ul_D2 + - opentrons_96_tiprack_20ul_E2 + - opentrons_96_tiprack_20ul_F2 + - opentrons_96_tiprack_20ul_G2 + - opentrons_96_tiprack_20ul_H2 + - opentrons_96_tiprack_20ul_A3 + - opentrons_96_tiprack_20ul_B3 + - opentrons_96_tiprack_20ul_C3 + - opentrons_96_tiprack_20ul_D3 + - opentrons_96_tiprack_20ul_E3 + - opentrons_96_tiprack_20ul_F3 + - opentrons_96_tiprack_20ul_G3 + - opentrons_96_tiprack_20ul_H3 + - opentrons_96_tiprack_20ul_A4 + - opentrons_96_tiprack_20ul_B4 + - opentrons_96_tiprack_20ul_C4 + - opentrons_96_tiprack_20ul_D4 + - opentrons_96_tiprack_20ul_E4 + - opentrons_96_tiprack_20ul_F4 + - opentrons_96_tiprack_20ul_G4 + - opentrons_96_tiprack_20ul_H4 + - opentrons_96_tiprack_20ul_A5 + - opentrons_96_tiprack_20ul_B5 + - opentrons_96_tiprack_20ul_C5 + - opentrons_96_tiprack_20ul_D5 + - opentrons_96_tiprack_20ul_E5 + - opentrons_96_tiprack_20ul_F5 + - opentrons_96_tiprack_20ul_G5 + - opentrons_96_tiprack_20ul_H5 + - opentrons_96_tiprack_20ul_A6 + - opentrons_96_tiprack_20ul_B6 + - opentrons_96_tiprack_20ul_C6 + - opentrons_96_tiprack_20ul_D6 + - opentrons_96_tiprack_20ul_E6 + - opentrons_96_tiprack_20ul_F6 + - opentrons_96_tiprack_20ul_G6 + - opentrons_96_tiprack_20ul_H6 + - opentrons_96_tiprack_20ul_A7 + - opentrons_96_tiprack_20ul_B7 + - opentrons_96_tiprack_20ul_C7 + - opentrons_96_tiprack_20ul_D7 + - opentrons_96_tiprack_20ul_E7 + - opentrons_96_tiprack_20ul_F7 + - opentrons_96_tiprack_20ul_G7 + - opentrons_96_tiprack_20ul_H7 + - opentrons_96_tiprack_20ul_A8 + - opentrons_96_tiprack_20ul_B8 + - opentrons_96_tiprack_20ul_C8 + - opentrons_96_tiprack_20ul_D8 + - opentrons_96_tiprack_20ul_E8 + - opentrons_96_tiprack_20ul_F8 + - opentrons_96_tiprack_20ul_G8 + - opentrons_96_tiprack_20ul_H8 + - opentrons_96_tiprack_20ul_A9 + - opentrons_96_tiprack_20ul_B9 + - opentrons_96_tiprack_20ul_C9 + - opentrons_96_tiprack_20ul_D9 + - opentrons_96_tiprack_20ul_E9 + - opentrons_96_tiprack_20ul_F9 + - opentrons_96_tiprack_20ul_G9 + - opentrons_96_tiprack_20ul_H9 + - opentrons_96_tiprack_20ul_A10 + - opentrons_96_tiprack_20ul_B10 + - opentrons_96_tiprack_20ul_C10 + - opentrons_96_tiprack_20ul_D10 + - opentrons_96_tiprack_20ul_E10 + - opentrons_96_tiprack_20ul_F10 + - opentrons_96_tiprack_20ul_G10 + - opentrons_96_tiprack_20ul_H10 + - opentrons_96_tiprack_20ul_A11 + - opentrons_96_tiprack_20ul_B11 + - opentrons_96_tiprack_20ul_C11 + - opentrons_96_tiprack_20ul_D11 + - opentrons_96_tiprack_20ul_E11 + - opentrons_96_tiprack_20ul_F11 + - opentrons_96_tiprack_20ul_G11 + - opentrons_96_tiprack_20ul_H11 + - opentrons_96_tiprack_20ul_A12 + - opentrons_96_tiprack_20ul_B12 + - opentrons_96_tiprack_20ul_C12 + - opentrons_96_tiprack_20ul_D12 + - opentrons_96_tiprack_20ul_E12 + - opentrons_96_tiprack_20ul_F12 + - opentrons_96_tiprack_20ul_G12 + - opentrons_96_tiprack_20ul_H12 + class: '' + config: + barcode: null + category: tip_rack + model: Opentrons OT-2 96 Tip Rack 20 µL + ordering: + A1: opentrons_96_tiprack_20ul_A1 + B1: opentrons_96_tiprack_20ul_B1 + C1: opentrons_96_tiprack_20ul_C1 + D1: opentrons_96_tiprack_20ul_D1 + E1: opentrons_96_tiprack_20ul_E1 + F1: opentrons_96_tiprack_20ul_F1 + G1: opentrons_96_tiprack_20ul_G1 + H1: opentrons_96_tiprack_20ul_H1 + A2: opentrons_96_tiprack_20ul_A2 + B2: opentrons_96_tiprack_20ul_B2 + C2: opentrons_96_tiprack_20ul_C2 + D2: opentrons_96_tiprack_20ul_D2 + E2: opentrons_96_tiprack_20ul_E2 + F2: opentrons_96_tiprack_20ul_F2 + G2: opentrons_96_tiprack_20ul_G2 + H2: opentrons_96_tiprack_20ul_H2 + A3: opentrons_96_tiprack_20ul_A3 + B3: opentrons_96_tiprack_20ul_B3 + C3: opentrons_96_tiprack_20ul_C3 + D3: opentrons_96_tiprack_20ul_D3 + E3: opentrons_96_tiprack_20ul_E3 + F3: opentrons_96_tiprack_20ul_F3 + G3: opentrons_96_tiprack_20ul_G3 + H3: opentrons_96_tiprack_20ul_H3 + A4: opentrons_96_tiprack_20ul_A4 + B4: opentrons_96_tiprack_20ul_B4 + C4: opentrons_96_tiprack_20ul_C4 + D4: opentrons_96_tiprack_20ul_D4 + E4: opentrons_96_tiprack_20ul_E4 + F4: opentrons_96_tiprack_20ul_F4 + G4: opentrons_96_tiprack_20ul_G4 + H4: opentrons_96_tiprack_20ul_H4 + A5: opentrons_96_tiprack_20ul_A5 + B5: opentrons_96_tiprack_20ul_B5 + C5: opentrons_96_tiprack_20ul_C5 + D5: opentrons_96_tiprack_20ul_D5 + E5: opentrons_96_tiprack_20ul_E5 + F5: opentrons_96_tiprack_20ul_F5 + G5: opentrons_96_tiprack_20ul_G5 + H5: opentrons_96_tiprack_20ul_H5 + A6: opentrons_96_tiprack_20ul_A6 + B6: opentrons_96_tiprack_20ul_B6 + C6: opentrons_96_tiprack_20ul_C6 + D6: opentrons_96_tiprack_20ul_D6 + E6: opentrons_96_tiprack_20ul_E6 + F6: opentrons_96_tiprack_20ul_F6 + G6: opentrons_96_tiprack_20ul_G6 + H6: opentrons_96_tiprack_20ul_H6 + A7: opentrons_96_tiprack_20ul_A7 + B7: opentrons_96_tiprack_20ul_B7 + C7: opentrons_96_tiprack_20ul_C7 + D7: opentrons_96_tiprack_20ul_D7 + E7: opentrons_96_tiprack_20ul_E7 + F7: opentrons_96_tiprack_20ul_F7 + G7: opentrons_96_tiprack_20ul_G7 + H7: opentrons_96_tiprack_20ul_H7 + A8: opentrons_96_tiprack_20ul_A8 + B8: opentrons_96_tiprack_20ul_B8 + C8: opentrons_96_tiprack_20ul_C8 + D8: opentrons_96_tiprack_20ul_D8 + E8: opentrons_96_tiprack_20ul_E8 + F8: opentrons_96_tiprack_20ul_F8 + G8: opentrons_96_tiprack_20ul_G8 + H8: opentrons_96_tiprack_20ul_H8 + A9: opentrons_96_tiprack_20ul_A9 + B9: opentrons_96_tiprack_20ul_B9 + C9: opentrons_96_tiprack_20ul_C9 + D9: opentrons_96_tiprack_20ul_D9 + E9: opentrons_96_tiprack_20ul_E9 + F9: opentrons_96_tiprack_20ul_F9 + G9: opentrons_96_tiprack_20ul_G9 + H9: opentrons_96_tiprack_20ul_H9 + A10: opentrons_96_tiprack_20ul_A10 + B10: opentrons_96_tiprack_20ul_B10 + C10: opentrons_96_tiprack_20ul_C10 + D10: opentrons_96_tiprack_20ul_D10 + E10: opentrons_96_tiprack_20ul_E10 + F10: opentrons_96_tiprack_20ul_F10 + G10: opentrons_96_tiprack_20ul_G10 + H10: opentrons_96_tiprack_20ul_H10 + A11: opentrons_96_tiprack_20ul_A11 + B11: opentrons_96_tiprack_20ul_B11 + C11: opentrons_96_tiprack_20ul_C11 + D11: opentrons_96_tiprack_20ul_D11 + E11: opentrons_96_tiprack_20ul_E11 + F11: opentrons_96_tiprack_20ul_F11 + G11: opentrons_96_tiprack_20ul_G11 + H11: opentrons_96_tiprack_20ul_H11 + A12: opentrons_96_tiprack_20ul_A12 + B12: opentrons_96_tiprack_20ul_B12 + C12: opentrons_96_tiprack_20ul_C12 + D12: opentrons_96_tiprack_20ul_D12 + E12: opentrons_96_tiprack_20ul_E12 + F12: opentrons_96_tiprack_20ul_F12 + G12: opentrons_96_tiprack_20ul_G12 + H12: opentrons_96_tiprack_20ul_H12 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.76 + size_y: 85.48 + size_z: 64.69 + type: TipRack + data: {} + id: opentrons_96_tiprack_20ul + name: opentrons_96_tiprack_20ul + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_A1 + name: opentrons_96_tiprack_20ul_A1 + parent: opentrons_96_tiprack_20ul + position: + x: 13.224 + y: 73.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_B1 + name: opentrons_96_tiprack_20ul_B1 + parent: opentrons_96_tiprack_20ul + position: + x: 13.224 + y: 64.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_C1 + name: opentrons_96_tiprack_20ul_C1 + parent: opentrons_96_tiprack_20ul + position: + x: 13.224 + y: 55.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_D1 + name: opentrons_96_tiprack_20ul_D1 + parent: opentrons_96_tiprack_20ul + position: + x: 13.224 + y: 46.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_E1 + name: opentrons_96_tiprack_20ul_E1 + parent: opentrons_96_tiprack_20ul + position: + x: 13.224 + y: 37.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_F1 + name: opentrons_96_tiprack_20ul_F1 + parent: opentrons_96_tiprack_20ul + position: + x: 13.224 + y: 28.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_G1 + name: opentrons_96_tiprack_20ul_G1 + parent: opentrons_96_tiprack_20ul + position: + x: 13.224 + y: 19.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_H1 + name: opentrons_96_tiprack_20ul_H1 + parent: opentrons_96_tiprack_20ul + position: + x: 13.224 + y: 10.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_A2 + name: opentrons_96_tiprack_20ul_A2 + parent: opentrons_96_tiprack_20ul + position: + x: 22.224 + y: 73.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_B2 + name: opentrons_96_tiprack_20ul_B2 + parent: opentrons_96_tiprack_20ul + position: + x: 22.224 + y: 64.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_C2 + name: opentrons_96_tiprack_20ul_C2 + parent: opentrons_96_tiprack_20ul + position: + x: 22.224 + y: 55.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_D2 + name: opentrons_96_tiprack_20ul_D2 + parent: opentrons_96_tiprack_20ul + position: + x: 22.224 + y: 46.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_E2 + name: opentrons_96_tiprack_20ul_E2 + parent: opentrons_96_tiprack_20ul + position: + x: 22.224 + y: 37.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_F2 + name: opentrons_96_tiprack_20ul_F2 + parent: opentrons_96_tiprack_20ul + position: + x: 22.224 + y: 28.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_G2 + name: opentrons_96_tiprack_20ul_G2 + parent: opentrons_96_tiprack_20ul + position: + x: 22.224 + y: 19.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_H2 + name: opentrons_96_tiprack_20ul_H2 + parent: opentrons_96_tiprack_20ul + position: + x: 22.224 + y: 10.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_A3 + name: opentrons_96_tiprack_20ul_A3 + parent: opentrons_96_tiprack_20ul + position: + x: 31.224 + y: 73.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_B3 + name: opentrons_96_tiprack_20ul_B3 + parent: opentrons_96_tiprack_20ul + position: + x: 31.224 + y: 64.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_C3 + name: opentrons_96_tiprack_20ul_C3 + parent: opentrons_96_tiprack_20ul + position: + x: 31.224 + y: 55.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_D3 + name: opentrons_96_tiprack_20ul_D3 + parent: opentrons_96_tiprack_20ul + position: + x: 31.224 + y: 46.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_E3 + name: opentrons_96_tiprack_20ul_E3 + parent: opentrons_96_tiprack_20ul + position: + x: 31.224 + y: 37.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_F3 + name: opentrons_96_tiprack_20ul_F3 + parent: opentrons_96_tiprack_20ul + position: + x: 31.224 + y: 28.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_G3 + name: opentrons_96_tiprack_20ul_G3 + parent: opentrons_96_tiprack_20ul + position: + x: 31.224 + y: 19.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_H3 + name: opentrons_96_tiprack_20ul_H3 + parent: opentrons_96_tiprack_20ul + position: + x: 31.224 + y: 10.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_A4 + name: opentrons_96_tiprack_20ul_A4 + parent: opentrons_96_tiprack_20ul + position: + x: 40.224 + y: 73.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_B4 + name: opentrons_96_tiprack_20ul_B4 + parent: opentrons_96_tiprack_20ul + position: + x: 40.224 + y: 64.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_C4 + name: opentrons_96_tiprack_20ul_C4 + parent: opentrons_96_tiprack_20ul + position: + x: 40.224 + y: 55.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_D4 + name: opentrons_96_tiprack_20ul_D4 + parent: opentrons_96_tiprack_20ul + position: + x: 40.224 + y: 46.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_E4 + name: opentrons_96_tiprack_20ul_E4 + parent: opentrons_96_tiprack_20ul + position: + x: 40.224 + y: 37.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_F4 + name: opentrons_96_tiprack_20ul_F4 + parent: opentrons_96_tiprack_20ul + position: + x: 40.224 + y: 28.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_G4 + name: opentrons_96_tiprack_20ul_G4 + parent: opentrons_96_tiprack_20ul + position: + x: 40.224 + y: 19.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_H4 + name: opentrons_96_tiprack_20ul_H4 + parent: opentrons_96_tiprack_20ul + position: + x: 40.224 + y: 10.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_A5 + name: opentrons_96_tiprack_20ul_A5 + parent: opentrons_96_tiprack_20ul + position: + x: 49.224 + y: 73.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_B5 + name: opentrons_96_tiprack_20ul_B5 + parent: opentrons_96_tiprack_20ul + position: + x: 49.224 + y: 64.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_C5 + name: opentrons_96_tiprack_20ul_C5 + parent: opentrons_96_tiprack_20ul + position: + x: 49.224 + y: 55.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_D5 + name: opentrons_96_tiprack_20ul_D5 + parent: opentrons_96_tiprack_20ul + position: + x: 49.224 + y: 46.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_E5 + name: opentrons_96_tiprack_20ul_E5 + parent: opentrons_96_tiprack_20ul + position: + x: 49.224 + y: 37.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_F5 + name: opentrons_96_tiprack_20ul_F5 + parent: opentrons_96_tiprack_20ul + position: + x: 49.224 + y: 28.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_G5 + name: opentrons_96_tiprack_20ul_G5 + parent: opentrons_96_tiprack_20ul + position: + x: 49.224 + y: 19.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_H5 + name: opentrons_96_tiprack_20ul_H5 + parent: opentrons_96_tiprack_20ul + position: + x: 49.224 + y: 10.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_A6 + name: opentrons_96_tiprack_20ul_A6 + parent: opentrons_96_tiprack_20ul + position: + x: 58.224 + y: 73.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_B6 + name: opentrons_96_tiprack_20ul_B6 + parent: opentrons_96_tiprack_20ul + position: + x: 58.224 + y: 64.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_C6 + name: opentrons_96_tiprack_20ul_C6 + parent: opentrons_96_tiprack_20ul + position: + x: 58.224 + y: 55.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_D6 + name: opentrons_96_tiprack_20ul_D6 + parent: opentrons_96_tiprack_20ul + position: + x: 58.224 + y: 46.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_E6 + name: opentrons_96_tiprack_20ul_E6 + parent: opentrons_96_tiprack_20ul + position: + x: 58.224 + y: 37.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_F6 + name: opentrons_96_tiprack_20ul_F6 + parent: opentrons_96_tiprack_20ul + position: + x: 58.224 + y: 28.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_G6 + name: opentrons_96_tiprack_20ul_G6 + parent: opentrons_96_tiprack_20ul + position: + x: 58.224 + y: 19.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_H6 + name: opentrons_96_tiprack_20ul_H6 + parent: opentrons_96_tiprack_20ul + position: + x: 58.224 + y: 10.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_A7 + name: opentrons_96_tiprack_20ul_A7 + parent: opentrons_96_tiprack_20ul + position: + x: 67.224 + y: 73.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_B7 + name: opentrons_96_tiprack_20ul_B7 + parent: opentrons_96_tiprack_20ul + position: + x: 67.224 + y: 64.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_C7 + name: opentrons_96_tiprack_20ul_C7 + parent: opentrons_96_tiprack_20ul + position: + x: 67.224 + y: 55.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_D7 + name: opentrons_96_tiprack_20ul_D7 + parent: opentrons_96_tiprack_20ul + position: + x: 67.224 + y: 46.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_E7 + name: opentrons_96_tiprack_20ul_E7 + parent: opentrons_96_tiprack_20ul + position: + x: 67.224 + y: 37.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_F7 + name: opentrons_96_tiprack_20ul_F7 + parent: opentrons_96_tiprack_20ul + position: + x: 67.224 + y: 28.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_G7 + name: opentrons_96_tiprack_20ul_G7 + parent: opentrons_96_tiprack_20ul + position: + x: 67.224 + y: 19.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_H7 + name: opentrons_96_tiprack_20ul_H7 + parent: opentrons_96_tiprack_20ul + position: + x: 67.224 + y: 10.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_A8 + name: opentrons_96_tiprack_20ul_A8 + parent: opentrons_96_tiprack_20ul + position: + x: 76.224 + y: 73.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_B8 + name: opentrons_96_tiprack_20ul_B8 + parent: opentrons_96_tiprack_20ul + position: + x: 76.224 + y: 64.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_C8 + name: opentrons_96_tiprack_20ul_C8 + parent: opentrons_96_tiprack_20ul + position: + x: 76.224 + y: 55.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_D8 + name: opentrons_96_tiprack_20ul_D8 + parent: opentrons_96_tiprack_20ul + position: + x: 76.224 + y: 46.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_E8 + name: opentrons_96_tiprack_20ul_E8 + parent: opentrons_96_tiprack_20ul + position: + x: 76.224 + y: 37.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_F8 + name: opentrons_96_tiprack_20ul_F8 + parent: opentrons_96_tiprack_20ul + position: + x: 76.224 + y: 28.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_G8 + name: opentrons_96_tiprack_20ul_G8 + parent: opentrons_96_tiprack_20ul + position: + x: 76.224 + y: 19.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_H8 + name: opentrons_96_tiprack_20ul_H8 + parent: opentrons_96_tiprack_20ul + position: + x: 76.224 + y: 10.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_A9 + name: opentrons_96_tiprack_20ul_A9 + parent: opentrons_96_tiprack_20ul + position: + x: 85.224 + y: 73.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_B9 + name: opentrons_96_tiprack_20ul_B9 + parent: opentrons_96_tiprack_20ul + position: + x: 85.224 + y: 64.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_C9 + name: opentrons_96_tiprack_20ul_C9 + parent: opentrons_96_tiprack_20ul + position: + x: 85.224 + y: 55.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_D9 + name: opentrons_96_tiprack_20ul_D9 + parent: opentrons_96_tiprack_20ul + position: + x: 85.224 + y: 46.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_E9 + name: opentrons_96_tiprack_20ul_E9 + parent: opentrons_96_tiprack_20ul + position: + x: 85.224 + y: 37.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_F9 + name: opentrons_96_tiprack_20ul_F9 + parent: opentrons_96_tiprack_20ul + position: + x: 85.224 + y: 28.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_G9 + name: opentrons_96_tiprack_20ul_G9 + parent: opentrons_96_tiprack_20ul + position: + x: 85.224 + y: 19.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_H9 + name: opentrons_96_tiprack_20ul_H9 + parent: opentrons_96_tiprack_20ul + position: + x: 85.224 + y: 10.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_A10 + name: opentrons_96_tiprack_20ul_A10 + parent: opentrons_96_tiprack_20ul + position: + x: 94.224 + y: 73.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_B10 + name: opentrons_96_tiprack_20ul_B10 + parent: opentrons_96_tiprack_20ul + position: + x: 94.224 + y: 64.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_C10 + name: opentrons_96_tiprack_20ul_C10 + parent: opentrons_96_tiprack_20ul + position: + x: 94.224 + y: 55.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_D10 + name: opentrons_96_tiprack_20ul_D10 + parent: opentrons_96_tiprack_20ul + position: + x: 94.224 + y: 46.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_E10 + name: opentrons_96_tiprack_20ul_E10 + parent: opentrons_96_tiprack_20ul + position: + x: 94.224 + y: 37.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_F10 + name: opentrons_96_tiprack_20ul_F10 + parent: opentrons_96_tiprack_20ul + position: + x: 94.224 + y: 28.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_G10 + name: opentrons_96_tiprack_20ul_G10 + parent: opentrons_96_tiprack_20ul + position: + x: 94.224 + y: 19.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_H10 + name: opentrons_96_tiprack_20ul_H10 + parent: opentrons_96_tiprack_20ul + position: + x: 94.224 + y: 10.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_A11 + name: opentrons_96_tiprack_20ul_A11 + parent: opentrons_96_tiprack_20ul + position: + x: 103.224 + y: 73.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_B11 + name: opentrons_96_tiprack_20ul_B11 + parent: opentrons_96_tiprack_20ul + position: + x: 103.224 + y: 64.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_C11 + name: opentrons_96_tiprack_20ul_C11 + parent: opentrons_96_tiprack_20ul + position: + x: 103.224 + y: 55.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_D11 + name: opentrons_96_tiprack_20ul_D11 + parent: opentrons_96_tiprack_20ul + position: + x: 103.224 + y: 46.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_E11 + name: opentrons_96_tiprack_20ul_E11 + parent: opentrons_96_tiprack_20ul + position: + x: 103.224 + y: 37.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_F11 + name: opentrons_96_tiprack_20ul_F11 + parent: opentrons_96_tiprack_20ul + position: + x: 103.224 + y: 28.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_G11 + name: opentrons_96_tiprack_20ul_G11 + parent: opentrons_96_tiprack_20ul + position: + x: 103.224 + y: 19.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_H11 + name: opentrons_96_tiprack_20ul_H11 + parent: opentrons_96_tiprack_20ul + position: + x: 103.224 + y: 10.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_A12 + name: opentrons_96_tiprack_20ul_A12 + parent: opentrons_96_tiprack_20ul + position: + x: 112.224 + y: 73.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_B12 + name: opentrons_96_tiprack_20ul_B12 + parent: opentrons_96_tiprack_20ul + position: + x: 112.224 + y: 64.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_C12 + name: opentrons_96_tiprack_20ul_C12 + parent: opentrons_96_tiprack_20ul + position: + x: 112.224 + y: 55.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_D12 + name: opentrons_96_tiprack_20ul_D12 + parent: opentrons_96_tiprack_20ul + position: + x: 112.224 + y: 46.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_E12 + name: opentrons_96_tiprack_20ul_E12 + parent: opentrons_96_tiprack_20ul + position: + x: 112.224 + y: 37.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_F12 + name: opentrons_96_tiprack_20ul_F12 + parent: opentrons_96_tiprack_20ul + position: + x: 112.224 + y: 28.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_G12 + name: opentrons_96_tiprack_20ul_G12 + parent: opentrons_96_tiprack_20ul + position: + x: 112.224 + y: 19.084 + z: 25.49 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 2.312 + size_y: 2.312 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip: + fitting_depth: 8.25 + has_filter: false + maximal_volume: 20.0 + total_tip_length: 39.2 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_20ul_H12 + name: opentrons_96_tiprack_20ul_H12 + parent: opentrons_96_tiprack_20ul + position: + x: 112.224 + y: 10.084 + z: 25.49 + sample_id: null + type: container + description: Opentrons 96 tiprack 20ul + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/tip_racks.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +opentrons_96_tiprack_300ul: + category: + - tip_racks + class: + module: pylabrobot.resources.opentrons.tip_racks:opentrons_96_tiprack_300ul + type: pylabrobot + config_info: + - children: + - opentrons_96_tiprack_300ul_A1 + - opentrons_96_tiprack_300ul_B1 + - opentrons_96_tiprack_300ul_C1 + - opentrons_96_tiprack_300ul_D1 + - opentrons_96_tiprack_300ul_E1 + - opentrons_96_tiprack_300ul_F1 + - opentrons_96_tiprack_300ul_G1 + - opentrons_96_tiprack_300ul_H1 + - opentrons_96_tiprack_300ul_A2 + - opentrons_96_tiprack_300ul_B2 + - opentrons_96_tiprack_300ul_C2 + - opentrons_96_tiprack_300ul_D2 + - opentrons_96_tiprack_300ul_E2 + - opentrons_96_tiprack_300ul_F2 + - opentrons_96_tiprack_300ul_G2 + - opentrons_96_tiprack_300ul_H2 + - opentrons_96_tiprack_300ul_A3 + - opentrons_96_tiprack_300ul_B3 + - opentrons_96_tiprack_300ul_C3 + - opentrons_96_tiprack_300ul_D3 + - opentrons_96_tiprack_300ul_E3 + - opentrons_96_tiprack_300ul_F3 + - opentrons_96_tiprack_300ul_G3 + - opentrons_96_tiprack_300ul_H3 + - opentrons_96_tiprack_300ul_A4 + - opentrons_96_tiprack_300ul_B4 + - opentrons_96_tiprack_300ul_C4 + - opentrons_96_tiprack_300ul_D4 + - opentrons_96_tiprack_300ul_E4 + - opentrons_96_tiprack_300ul_F4 + - opentrons_96_tiprack_300ul_G4 + - opentrons_96_tiprack_300ul_H4 + - opentrons_96_tiprack_300ul_A5 + - opentrons_96_tiprack_300ul_B5 + - opentrons_96_tiprack_300ul_C5 + - opentrons_96_tiprack_300ul_D5 + - opentrons_96_tiprack_300ul_E5 + - opentrons_96_tiprack_300ul_F5 + - opentrons_96_tiprack_300ul_G5 + - opentrons_96_tiprack_300ul_H5 + - opentrons_96_tiprack_300ul_A6 + - opentrons_96_tiprack_300ul_B6 + - opentrons_96_tiprack_300ul_C6 + - opentrons_96_tiprack_300ul_D6 + - opentrons_96_tiprack_300ul_E6 + - opentrons_96_tiprack_300ul_F6 + - opentrons_96_tiprack_300ul_G6 + - opentrons_96_tiprack_300ul_H6 + - opentrons_96_tiprack_300ul_A7 + - opentrons_96_tiprack_300ul_B7 + - opentrons_96_tiprack_300ul_C7 + - opentrons_96_tiprack_300ul_D7 + - opentrons_96_tiprack_300ul_E7 + - opentrons_96_tiprack_300ul_F7 + - opentrons_96_tiprack_300ul_G7 + - opentrons_96_tiprack_300ul_H7 + - opentrons_96_tiprack_300ul_A8 + - opentrons_96_tiprack_300ul_B8 + - opentrons_96_tiprack_300ul_C8 + - opentrons_96_tiprack_300ul_D8 + - opentrons_96_tiprack_300ul_E8 + - opentrons_96_tiprack_300ul_F8 + - opentrons_96_tiprack_300ul_G8 + - opentrons_96_tiprack_300ul_H8 + - opentrons_96_tiprack_300ul_A9 + - opentrons_96_tiprack_300ul_B9 + - opentrons_96_tiprack_300ul_C9 + - opentrons_96_tiprack_300ul_D9 + - opentrons_96_tiprack_300ul_E9 + - opentrons_96_tiprack_300ul_F9 + - opentrons_96_tiprack_300ul_G9 + - opentrons_96_tiprack_300ul_H9 + - opentrons_96_tiprack_300ul_A10 + - opentrons_96_tiprack_300ul_B10 + - opentrons_96_tiprack_300ul_C10 + - opentrons_96_tiprack_300ul_D10 + - opentrons_96_tiprack_300ul_E10 + - opentrons_96_tiprack_300ul_F10 + - opentrons_96_tiprack_300ul_G10 + - opentrons_96_tiprack_300ul_H10 + - opentrons_96_tiprack_300ul_A11 + - opentrons_96_tiprack_300ul_B11 + - opentrons_96_tiprack_300ul_C11 + - opentrons_96_tiprack_300ul_D11 + - opentrons_96_tiprack_300ul_E11 + - opentrons_96_tiprack_300ul_F11 + - opentrons_96_tiprack_300ul_G11 + - opentrons_96_tiprack_300ul_H11 + - opentrons_96_tiprack_300ul_A12 + - opentrons_96_tiprack_300ul_B12 + - opentrons_96_tiprack_300ul_C12 + - opentrons_96_tiprack_300ul_D12 + - opentrons_96_tiprack_300ul_E12 + - opentrons_96_tiprack_300ul_F12 + - opentrons_96_tiprack_300ul_G12 + - opentrons_96_tiprack_300ul_H12 + class: '' + config: + barcode: null + category: tip_rack + model: Opentrons OT-2 96 Tip Rack 300 µL + ordering: + A1: opentrons_96_tiprack_300ul_A1 + B1: opentrons_96_tiprack_300ul_B1 + C1: opentrons_96_tiprack_300ul_C1 + D1: opentrons_96_tiprack_300ul_D1 + E1: opentrons_96_tiprack_300ul_E1 + F1: opentrons_96_tiprack_300ul_F1 + G1: opentrons_96_tiprack_300ul_G1 + H1: opentrons_96_tiprack_300ul_H1 + A2: opentrons_96_tiprack_300ul_A2 + B2: opentrons_96_tiprack_300ul_B2 + C2: opentrons_96_tiprack_300ul_C2 + D2: opentrons_96_tiprack_300ul_D2 + E2: opentrons_96_tiprack_300ul_E2 + F2: opentrons_96_tiprack_300ul_F2 + G2: opentrons_96_tiprack_300ul_G2 + H2: opentrons_96_tiprack_300ul_H2 + A3: opentrons_96_tiprack_300ul_A3 + B3: opentrons_96_tiprack_300ul_B3 + C3: opentrons_96_tiprack_300ul_C3 + D3: opentrons_96_tiprack_300ul_D3 + E3: opentrons_96_tiprack_300ul_E3 + F3: opentrons_96_tiprack_300ul_F3 + G3: opentrons_96_tiprack_300ul_G3 + H3: opentrons_96_tiprack_300ul_H3 + A4: opentrons_96_tiprack_300ul_A4 + B4: opentrons_96_tiprack_300ul_B4 + C4: opentrons_96_tiprack_300ul_C4 + D4: opentrons_96_tiprack_300ul_D4 + E4: opentrons_96_tiprack_300ul_E4 + F4: opentrons_96_tiprack_300ul_F4 + G4: opentrons_96_tiprack_300ul_G4 + H4: opentrons_96_tiprack_300ul_H4 + A5: opentrons_96_tiprack_300ul_A5 + B5: opentrons_96_tiprack_300ul_B5 + C5: opentrons_96_tiprack_300ul_C5 + D5: opentrons_96_tiprack_300ul_D5 + E5: opentrons_96_tiprack_300ul_E5 + F5: opentrons_96_tiprack_300ul_F5 + G5: opentrons_96_tiprack_300ul_G5 + H5: opentrons_96_tiprack_300ul_H5 + A6: opentrons_96_tiprack_300ul_A6 + B6: opentrons_96_tiprack_300ul_B6 + C6: opentrons_96_tiprack_300ul_C6 + D6: opentrons_96_tiprack_300ul_D6 + E6: opentrons_96_tiprack_300ul_E6 + F6: opentrons_96_tiprack_300ul_F6 + G6: opentrons_96_tiprack_300ul_G6 + H6: opentrons_96_tiprack_300ul_H6 + A7: opentrons_96_tiprack_300ul_A7 + B7: opentrons_96_tiprack_300ul_B7 + C7: opentrons_96_tiprack_300ul_C7 + D7: opentrons_96_tiprack_300ul_D7 + E7: opentrons_96_tiprack_300ul_E7 + F7: opentrons_96_tiprack_300ul_F7 + G7: opentrons_96_tiprack_300ul_G7 + H7: opentrons_96_tiprack_300ul_H7 + A8: opentrons_96_tiprack_300ul_A8 + B8: opentrons_96_tiprack_300ul_B8 + C8: opentrons_96_tiprack_300ul_C8 + D8: opentrons_96_tiprack_300ul_D8 + E8: opentrons_96_tiprack_300ul_E8 + F8: opentrons_96_tiprack_300ul_F8 + G8: opentrons_96_tiprack_300ul_G8 + H8: opentrons_96_tiprack_300ul_H8 + A9: opentrons_96_tiprack_300ul_A9 + B9: opentrons_96_tiprack_300ul_B9 + C9: opentrons_96_tiprack_300ul_C9 + D9: opentrons_96_tiprack_300ul_D9 + E9: opentrons_96_tiprack_300ul_E9 + F9: opentrons_96_tiprack_300ul_F9 + G9: opentrons_96_tiprack_300ul_G9 + H9: opentrons_96_tiprack_300ul_H9 + A10: opentrons_96_tiprack_300ul_A10 + B10: opentrons_96_tiprack_300ul_B10 + C10: opentrons_96_tiprack_300ul_C10 + D10: opentrons_96_tiprack_300ul_D10 + E10: opentrons_96_tiprack_300ul_E10 + F10: opentrons_96_tiprack_300ul_F10 + G10: opentrons_96_tiprack_300ul_G10 + H10: opentrons_96_tiprack_300ul_H10 + A11: opentrons_96_tiprack_300ul_A11 + B11: opentrons_96_tiprack_300ul_B11 + C11: opentrons_96_tiprack_300ul_C11 + D11: opentrons_96_tiprack_300ul_D11 + E11: opentrons_96_tiprack_300ul_E11 + F11: opentrons_96_tiprack_300ul_F11 + G11: opentrons_96_tiprack_300ul_G11 + H11: opentrons_96_tiprack_300ul_H11 + A12: opentrons_96_tiprack_300ul_A12 + B12: opentrons_96_tiprack_300ul_B12 + C12: opentrons_96_tiprack_300ul_C12 + D12: opentrons_96_tiprack_300ul_D12 + E12: opentrons_96_tiprack_300ul_E12 + F12: opentrons_96_tiprack_300ul_F12 + G12: opentrons_96_tiprack_300ul_G12 + H12: opentrons_96_tiprack_300ul_H12 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.76 + size_y: 85.48 + size_z: 64.49 + type: TipRack + data: {} + id: opentrons_96_tiprack_300ul + name: opentrons_96_tiprack_300ul + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_A1 + name: opentrons_96_tiprack_300ul_A1 + parent: opentrons_96_tiprack_300ul + position: + x: 12.531 + y: 72.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_B1 + name: opentrons_96_tiprack_300ul_B1 + parent: opentrons_96_tiprack_300ul + position: + x: 12.531 + y: 63.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_C1 + name: opentrons_96_tiprack_300ul_C1 + parent: opentrons_96_tiprack_300ul + position: + x: 12.531 + y: 54.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_D1 + name: opentrons_96_tiprack_300ul_D1 + parent: opentrons_96_tiprack_300ul + position: + x: 12.531 + y: 45.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_E1 + name: opentrons_96_tiprack_300ul_E1 + parent: opentrons_96_tiprack_300ul + position: + x: 12.531 + y: 36.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_F1 + name: opentrons_96_tiprack_300ul_F1 + parent: opentrons_96_tiprack_300ul + position: + x: 12.531 + y: 27.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_G1 + name: opentrons_96_tiprack_300ul_G1 + parent: opentrons_96_tiprack_300ul + position: + x: 12.531 + y: 18.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_H1 + name: opentrons_96_tiprack_300ul_H1 + parent: opentrons_96_tiprack_300ul + position: + x: 12.531 + y: 9.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_A2 + name: opentrons_96_tiprack_300ul_A2 + parent: opentrons_96_tiprack_300ul + position: + x: 21.531 + y: 72.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_B2 + name: opentrons_96_tiprack_300ul_B2 + parent: opentrons_96_tiprack_300ul + position: + x: 21.531 + y: 63.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_C2 + name: opentrons_96_tiprack_300ul_C2 + parent: opentrons_96_tiprack_300ul + position: + x: 21.531 + y: 54.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_D2 + name: opentrons_96_tiprack_300ul_D2 + parent: opentrons_96_tiprack_300ul + position: + x: 21.531 + y: 45.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_E2 + name: opentrons_96_tiprack_300ul_E2 + parent: opentrons_96_tiprack_300ul + position: + x: 21.531 + y: 36.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_F2 + name: opentrons_96_tiprack_300ul_F2 + parent: opentrons_96_tiprack_300ul + position: + x: 21.531 + y: 27.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_G2 + name: opentrons_96_tiprack_300ul_G2 + parent: opentrons_96_tiprack_300ul + position: + x: 21.531 + y: 18.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_H2 + name: opentrons_96_tiprack_300ul_H2 + parent: opentrons_96_tiprack_300ul + position: + x: 21.531 + y: 9.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_A3 + name: opentrons_96_tiprack_300ul_A3 + parent: opentrons_96_tiprack_300ul + position: + x: 30.531 + y: 72.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_B3 + name: opentrons_96_tiprack_300ul_B3 + parent: opentrons_96_tiprack_300ul + position: + x: 30.531 + y: 63.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_C3 + name: opentrons_96_tiprack_300ul_C3 + parent: opentrons_96_tiprack_300ul + position: + x: 30.531 + y: 54.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_D3 + name: opentrons_96_tiprack_300ul_D3 + parent: opentrons_96_tiprack_300ul + position: + x: 30.531 + y: 45.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_E3 + name: opentrons_96_tiprack_300ul_E3 + parent: opentrons_96_tiprack_300ul + position: + x: 30.531 + y: 36.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_F3 + name: opentrons_96_tiprack_300ul_F3 + parent: opentrons_96_tiprack_300ul + position: + x: 30.531 + y: 27.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_G3 + name: opentrons_96_tiprack_300ul_G3 + parent: opentrons_96_tiprack_300ul + position: + x: 30.531 + y: 18.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_H3 + name: opentrons_96_tiprack_300ul_H3 + parent: opentrons_96_tiprack_300ul + position: + x: 30.531 + y: 9.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_A4 + name: opentrons_96_tiprack_300ul_A4 + parent: opentrons_96_tiprack_300ul + position: + x: 39.531 + y: 72.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_B4 + name: opentrons_96_tiprack_300ul_B4 + parent: opentrons_96_tiprack_300ul + position: + x: 39.531 + y: 63.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_C4 + name: opentrons_96_tiprack_300ul_C4 + parent: opentrons_96_tiprack_300ul + position: + x: 39.531 + y: 54.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_D4 + name: opentrons_96_tiprack_300ul_D4 + parent: opentrons_96_tiprack_300ul + position: + x: 39.531 + y: 45.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_E4 + name: opentrons_96_tiprack_300ul_E4 + parent: opentrons_96_tiprack_300ul + position: + x: 39.531 + y: 36.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_F4 + name: opentrons_96_tiprack_300ul_F4 + parent: opentrons_96_tiprack_300ul + position: + x: 39.531 + y: 27.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_G4 + name: opentrons_96_tiprack_300ul_G4 + parent: opentrons_96_tiprack_300ul + position: + x: 39.531 + y: 18.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_H4 + name: opentrons_96_tiprack_300ul_H4 + parent: opentrons_96_tiprack_300ul + position: + x: 39.531 + y: 9.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_A5 + name: opentrons_96_tiprack_300ul_A5 + parent: opentrons_96_tiprack_300ul + position: + x: 48.531 + y: 72.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_B5 + name: opentrons_96_tiprack_300ul_B5 + parent: opentrons_96_tiprack_300ul + position: + x: 48.531 + y: 63.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_C5 + name: opentrons_96_tiprack_300ul_C5 + parent: opentrons_96_tiprack_300ul + position: + x: 48.531 + y: 54.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_D5 + name: opentrons_96_tiprack_300ul_D5 + parent: opentrons_96_tiprack_300ul + position: + x: 48.531 + y: 45.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_E5 + name: opentrons_96_tiprack_300ul_E5 + parent: opentrons_96_tiprack_300ul + position: + x: 48.531 + y: 36.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_F5 + name: opentrons_96_tiprack_300ul_F5 + parent: opentrons_96_tiprack_300ul + position: + x: 48.531 + y: 27.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_G5 + name: opentrons_96_tiprack_300ul_G5 + parent: opentrons_96_tiprack_300ul + position: + x: 48.531 + y: 18.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_H5 + name: opentrons_96_tiprack_300ul_H5 + parent: opentrons_96_tiprack_300ul + position: + x: 48.531 + y: 9.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_A6 + name: opentrons_96_tiprack_300ul_A6 + parent: opentrons_96_tiprack_300ul + position: + x: 57.531 + y: 72.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_B6 + name: opentrons_96_tiprack_300ul_B6 + parent: opentrons_96_tiprack_300ul + position: + x: 57.531 + y: 63.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_C6 + name: opentrons_96_tiprack_300ul_C6 + parent: opentrons_96_tiprack_300ul + position: + x: 57.531 + y: 54.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_D6 + name: opentrons_96_tiprack_300ul_D6 + parent: opentrons_96_tiprack_300ul + position: + x: 57.531 + y: 45.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_E6 + name: opentrons_96_tiprack_300ul_E6 + parent: opentrons_96_tiprack_300ul + position: + x: 57.531 + y: 36.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_F6 + name: opentrons_96_tiprack_300ul_F6 + parent: opentrons_96_tiprack_300ul + position: + x: 57.531 + y: 27.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_G6 + name: opentrons_96_tiprack_300ul_G6 + parent: opentrons_96_tiprack_300ul + position: + x: 57.531 + y: 18.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_H6 + name: opentrons_96_tiprack_300ul_H6 + parent: opentrons_96_tiprack_300ul + position: + x: 57.531 + y: 9.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_A7 + name: opentrons_96_tiprack_300ul_A7 + parent: opentrons_96_tiprack_300ul + position: + x: 66.531 + y: 72.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_B7 + name: opentrons_96_tiprack_300ul_B7 + parent: opentrons_96_tiprack_300ul + position: + x: 66.531 + y: 63.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_C7 + name: opentrons_96_tiprack_300ul_C7 + parent: opentrons_96_tiprack_300ul + position: + x: 66.531 + y: 54.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_D7 + name: opentrons_96_tiprack_300ul_D7 + parent: opentrons_96_tiprack_300ul + position: + x: 66.531 + y: 45.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_E7 + name: opentrons_96_tiprack_300ul_E7 + parent: opentrons_96_tiprack_300ul + position: + x: 66.531 + y: 36.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_F7 + name: opentrons_96_tiprack_300ul_F7 + parent: opentrons_96_tiprack_300ul + position: + x: 66.531 + y: 27.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_G7 + name: opentrons_96_tiprack_300ul_G7 + parent: opentrons_96_tiprack_300ul + position: + x: 66.531 + y: 18.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_H7 + name: opentrons_96_tiprack_300ul_H7 + parent: opentrons_96_tiprack_300ul + position: + x: 66.531 + y: 9.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_A8 + name: opentrons_96_tiprack_300ul_A8 + parent: opentrons_96_tiprack_300ul + position: + x: 75.531 + y: 72.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_B8 + name: opentrons_96_tiprack_300ul_B8 + parent: opentrons_96_tiprack_300ul + position: + x: 75.531 + y: 63.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_C8 + name: opentrons_96_tiprack_300ul_C8 + parent: opentrons_96_tiprack_300ul + position: + x: 75.531 + y: 54.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_D8 + name: opentrons_96_tiprack_300ul_D8 + parent: opentrons_96_tiprack_300ul + position: + x: 75.531 + y: 45.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_E8 + name: opentrons_96_tiprack_300ul_E8 + parent: opentrons_96_tiprack_300ul + position: + x: 75.531 + y: 36.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_F8 + name: opentrons_96_tiprack_300ul_F8 + parent: opentrons_96_tiprack_300ul + position: + x: 75.531 + y: 27.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_G8 + name: opentrons_96_tiprack_300ul_G8 + parent: opentrons_96_tiprack_300ul + position: + x: 75.531 + y: 18.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_H8 + name: opentrons_96_tiprack_300ul_H8 + parent: opentrons_96_tiprack_300ul + position: + x: 75.531 + y: 9.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_A9 + name: opentrons_96_tiprack_300ul_A9 + parent: opentrons_96_tiprack_300ul + position: + x: 84.531 + y: 72.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_B9 + name: opentrons_96_tiprack_300ul_B9 + parent: opentrons_96_tiprack_300ul + position: + x: 84.531 + y: 63.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_C9 + name: opentrons_96_tiprack_300ul_C9 + parent: opentrons_96_tiprack_300ul + position: + x: 84.531 + y: 54.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_D9 + name: opentrons_96_tiprack_300ul_D9 + parent: opentrons_96_tiprack_300ul + position: + x: 84.531 + y: 45.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_E9 + name: opentrons_96_tiprack_300ul_E9 + parent: opentrons_96_tiprack_300ul + position: + x: 84.531 + y: 36.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_F9 + name: opentrons_96_tiprack_300ul_F9 + parent: opentrons_96_tiprack_300ul + position: + x: 84.531 + y: 27.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_G9 + name: opentrons_96_tiprack_300ul_G9 + parent: opentrons_96_tiprack_300ul + position: + x: 84.531 + y: 18.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_H9 + name: opentrons_96_tiprack_300ul_H9 + parent: opentrons_96_tiprack_300ul + position: + x: 84.531 + y: 9.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_A10 + name: opentrons_96_tiprack_300ul_A10 + parent: opentrons_96_tiprack_300ul + position: + x: 93.531 + y: 72.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_B10 + name: opentrons_96_tiprack_300ul_B10 + parent: opentrons_96_tiprack_300ul + position: + x: 93.531 + y: 63.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_C10 + name: opentrons_96_tiprack_300ul_C10 + parent: opentrons_96_tiprack_300ul + position: + x: 93.531 + y: 54.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_D10 + name: opentrons_96_tiprack_300ul_D10 + parent: opentrons_96_tiprack_300ul + position: + x: 93.531 + y: 45.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_E10 + name: opentrons_96_tiprack_300ul_E10 + parent: opentrons_96_tiprack_300ul + position: + x: 93.531 + y: 36.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_F10 + name: opentrons_96_tiprack_300ul_F10 + parent: opentrons_96_tiprack_300ul + position: + x: 93.531 + y: 27.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_G10 + name: opentrons_96_tiprack_300ul_G10 + parent: opentrons_96_tiprack_300ul + position: + x: 93.531 + y: 18.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_H10 + name: opentrons_96_tiprack_300ul_H10 + parent: opentrons_96_tiprack_300ul + position: + x: 93.531 + y: 9.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_A11 + name: opentrons_96_tiprack_300ul_A11 + parent: opentrons_96_tiprack_300ul + position: + x: 102.531 + y: 72.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_B11 + name: opentrons_96_tiprack_300ul_B11 + parent: opentrons_96_tiprack_300ul + position: + x: 102.531 + y: 63.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_C11 + name: opentrons_96_tiprack_300ul_C11 + parent: opentrons_96_tiprack_300ul + position: + x: 102.531 + y: 54.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_D11 + name: opentrons_96_tiprack_300ul_D11 + parent: opentrons_96_tiprack_300ul + position: + x: 102.531 + y: 45.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_E11 + name: opentrons_96_tiprack_300ul_E11 + parent: opentrons_96_tiprack_300ul + position: + x: 102.531 + y: 36.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_F11 + name: opentrons_96_tiprack_300ul_F11 + parent: opentrons_96_tiprack_300ul + position: + x: 102.531 + y: 27.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_G11 + name: opentrons_96_tiprack_300ul_G11 + parent: opentrons_96_tiprack_300ul + position: + x: 102.531 + y: 18.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_H11 + name: opentrons_96_tiprack_300ul_H11 + parent: opentrons_96_tiprack_300ul + position: + x: 102.531 + y: 9.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_A12 + name: opentrons_96_tiprack_300ul_A12 + parent: opentrons_96_tiprack_300ul + position: + x: 111.531 + y: 72.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_B12 + name: opentrons_96_tiprack_300ul_B12 + parent: opentrons_96_tiprack_300ul + position: + x: 111.531 + y: 63.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_C12 + name: opentrons_96_tiprack_300ul_C12 + parent: opentrons_96_tiprack_300ul + position: + x: 111.531 + y: 54.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_D12 + name: opentrons_96_tiprack_300ul_D12 + parent: opentrons_96_tiprack_300ul + position: + x: 111.531 + y: 45.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_E12 + name: opentrons_96_tiprack_300ul_E12 + parent: opentrons_96_tiprack_300ul + position: + x: 111.531 + y: 36.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_F12 + name: opentrons_96_tiprack_300ul_F12 + parent: opentrons_96_tiprack_300ul + position: + x: 111.531 + y: 27.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_G12 + name: opentrons_96_tiprack_300ul_G12 + parent: opentrons_96_tiprack_300ul + position: + x: 111.531 + y: 18.391 + z: 5.39 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.698 + size_y: 3.698 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip: + fitting_depth: 7.47 + has_filter: false + maximal_volume: 300.0 + total_tip_length: 59.3 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_tiprack_300ul_H12 + name: opentrons_96_tiprack_300ul_H12 + parent: opentrons_96_tiprack_300ul + position: + x: 111.531 + y: 9.391 + z: 5.39 + sample_id: null + type: container + description: Opentrons 96 tiprack 300ul + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/tip_racks.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +tipone_96_tiprack_200ul: + category: + - tip_racks + class: + module: pylabrobot.resources.opentrons.tip_racks:tipone_96_tiprack_200ul + type: pylabrobot + config_info: + - children: + - tipone_96_tiprack_200ul_A1 + - tipone_96_tiprack_200ul_B1 + - tipone_96_tiprack_200ul_C1 + - tipone_96_tiprack_200ul_D1 + - tipone_96_tiprack_200ul_E1 + - tipone_96_tiprack_200ul_F1 + - tipone_96_tiprack_200ul_G1 + - tipone_96_tiprack_200ul_H1 + - tipone_96_tiprack_200ul_A2 + - tipone_96_tiprack_200ul_B2 + - tipone_96_tiprack_200ul_C2 + - tipone_96_tiprack_200ul_D2 + - tipone_96_tiprack_200ul_E2 + - tipone_96_tiprack_200ul_F2 + - tipone_96_tiprack_200ul_G2 + - tipone_96_tiprack_200ul_H2 + - tipone_96_tiprack_200ul_A3 + - tipone_96_tiprack_200ul_B3 + - tipone_96_tiprack_200ul_C3 + - tipone_96_tiprack_200ul_D3 + - tipone_96_tiprack_200ul_E3 + - tipone_96_tiprack_200ul_F3 + - tipone_96_tiprack_200ul_G3 + - tipone_96_tiprack_200ul_H3 + - tipone_96_tiprack_200ul_A4 + - tipone_96_tiprack_200ul_B4 + - tipone_96_tiprack_200ul_C4 + - tipone_96_tiprack_200ul_D4 + - tipone_96_tiprack_200ul_E4 + - tipone_96_tiprack_200ul_F4 + - tipone_96_tiprack_200ul_G4 + - tipone_96_tiprack_200ul_H4 + - tipone_96_tiprack_200ul_A5 + - tipone_96_tiprack_200ul_B5 + - tipone_96_tiprack_200ul_C5 + - tipone_96_tiprack_200ul_D5 + - tipone_96_tiprack_200ul_E5 + - tipone_96_tiprack_200ul_F5 + - tipone_96_tiprack_200ul_G5 + - tipone_96_tiprack_200ul_H5 + - tipone_96_tiprack_200ul_A6 + - tipone_96_tiprack_200ul_B6 + - tipone_96_tiprack_200ul_C6 + - tipone_96_tiprack_200ul_D6 + - tipone_96_tiprack_200ul_E6 + - tipone_96_tiprack_200ul_F6 + - tipone_96_tiprack_200ul_G6 + - tipone_96_tiprack_200ul_H6 + - tipone_96_tiprack_200ul_A7 + - tipone_96_tiprack_200ul_B7 + - tipone_96_tiprack_200ul_C7 + - tipone_96_tiprack_200ul_D7 + - tipone_96_tiprack_200ul_E7 + - tipone_96_tiprack_200ul_F7 + - tipone_96_tiprack_200ul_G7 + - tipone_96_tiprack_200ul_H7 + - tipone_96_tiprack_200ul_A8 + - tipone_96_tiprack_200ul_B8 + - tipone_96_tiprack_200ul_C8 + - tipone_96_tiprack_200ul_D8 + - tipone_96_tiprack_200ul_E8 + - tipone_96_tiprack_200ul_F8 + - tipone_96_tiprack_200ul_G8 + - tipone_96_tiprack_200ul_H8 + - tipone_96_tiprack_200ul_A9 + - tipone_96_tiprack_200ul_B9 + - tipone_96_tiprack_200ul_C9 + - tipone_96_tiprack_200ul_D9 + - tipone_96_tiprack_200ul_E9 + - tipone_96_tiprack_200ul_F9 + - tipone_96_tiprack_200ul_G9 + - tipone_96_tiprack_200ul_H9 + - tipone_96_tiprack_200ul_A10 + - tipone_96_tiprack_200ul_B10 + - tipone_96_tiprack_200ul_C10 + - tipone_96_tiprack_200ul_D10 + - tipone_96_tiprack_200ul_E10 + - tipone_96_tiprack_200ul_F10 + - tipone_96_tiprack_200ul_G10 + - tipone_96_tiprack_200ul_H10 + - tipone_96_tiprack_200ul_A11 + - tipone_96_tiprack_200ul_B11 + - tipone_96_tiprack_200ul_C11 + - tipone_96_tiprack_200ul_D11 + - tipone_96_tiprack_200ul_E11 + - tipone_96_tiprack_200ul_F11 + - tipone_96_tiprack_200ul_G11 + - tipone_96_tiprack_200ul_H11 + - tipone_96_tiprack_200ul_A12 + - tipone_96_tiprack_200ul_B12 + - tipone_96_tiprack_200ul_C12 + - tipone_96_tiprack_200ul_D12 + - tipone_96_tiprack_200ul_E12 + - tipone_96_tiprack_200ul_F12 + - tipone_96_tiprack_200ul_G12 + - tipone_96_tiprack_200ul_H12 + class: '' + config: + barcode: null + category: tip_rack + model: TipOne 96 Tip Rack 200 µL + ordering: + A1: tipone_96_tiprack_200ul_A1 + B1: tipone_96_tiprack_200ul_B1 + C1: tipone_96_tiprack_200ul_C1 + D1: tipone_96_tiprack_200ul_D1 + E1: tipone_96_tiprack_200ul_E1 + F1: tipone_96_tiprack_200ul_F1 + G1: tipone_96_tiprack_200ul_G1 + H1: tipone_96_tiprack_200ul_H1 + A2: tipone_96_tiprack_200ul_A2 + B2: tipone_96_tiprack_200ul_B2 + C2: tipone_96_tiprack_200ul_C2 + D2: tipone_96_tiprack_200ul_D2 + E2: tipone_96_tiprack_200ul_E2 + F2: tipone_96_tiprack_200ul_F2 + G2: tipone_96_tiprack_200ul_G2 + H2: tipone_96_tiprack_200ul_H2 + A3: tipone_96_tiprack_200ul_A3 + B3: tipone_96_tiprack_200ul_B3 + C3: tipone_96_tiprack_200ul_C3 + D3: tipone_96_tiprack_200ul_D3 + E3: tipone_96_tiprack_200ul_E3 + F3: tipone_96_tiprack_200ul_F3 + G3: tipone_96_tiprack_200ul_G3 + H3: tipone_96_tiprack_200ul_H3 + A4: tipone_96_tiprack_200ul_A4 + B4: tipone_96_tiprack_200ul_B4 + C4: tipone_96_tiprack_200ul_C4 + D4: tipone_96_tiprack_200ul_D4 + E4: tipone_96_tiprack_200ul_E4 + F4: tipone_96_tiprack_200ul_F4 + G4: tipone_96_tiprack_200ul_G4 + H4: tipone_96_tiprack_200ul_H4 + A5: tipone_96_tiprack_200ul_A5 + B5: tipone_96_tiprack_200ul_B5 + C5: tipone_96_tiprack_200ul_C5 + D5: tipone_96_tiprack_200ul_D5 + E5: tipone_96_tiprack_200ul_E5 + F5: tipone_96_tiprack_200ul_F5 + G5: tipone_96_tiprack_200ul_G5 + H5: tipone_96_tiprack_200ul_H5 + A6: tipone_96_tiprack_200ul_A6 + B6: tipone_96_tiprack_200ul_B6 + C6: tipone_96_tiprack_200ul_C6 + D6: tipone_96_tiprack_200ul_D6 + E6: tipone_96_tiprack_200ul_E6 + F6: tipone_96_tiprack_200ul_F6 + G6: tipone_96_tiprack_200ul_G6 + H6: tipone_96_tiprack_200ul_H6 + A7: tipone_96_tiprack_200ul_A7 + B7: tipone_96_tiprack_200ul_B7 + C7: tipone_96_tiprack_200ul_C7 + D7: tipone_96_tiprack_200ul_D7 + E7: tipone_96_tiprack_200ul_E7 + F7: tipone_96_tiprack_200ul_F7 + G7: tipone_96_tiprack_200ul_G7 + H7: tipone_96_tiprack_200ul_H7 + A8: tipone_96_tiprack_200ul_A8 + B8: tipone_96_tiprack_200ul_B8 + C8: tipone_96_tiprack_200ul_C8 + D8: tipone_96_tiprack_200ul_D8 + E8: tipone_96_tiprack_200ul_E8 + F8: tipone_96_tiprack_200ul_F8 + G8: tipone_96_tiprack_200ul_G8 + H8: tipone_96_tiprack_200ul_H8 + A9: tipone_96_tiprack_200ul_A9 + B9: tipone_96_tiprack_200ul_B9 + C9: tipone_96_tiprack_200ul_C9 + D9: tipone_96_tiprack_200ul_D9 + E9: tipone_96_tiprack_200ul_E9 + F9: tipone_96_tiprack_200ul_F9 + G9: tipone_96_tiprack_200ul_G9 + H9: tipone_96_tiprack_200ul_H9 + A10: tipone_96_tiprack_200ul_A10 + B10: tipone_96_tiprack_200ul_B10 + C10: tipone_96_tiprack_200ul_C10 + D10: tipone_96_tiprack_200ul_D10 + E10: tipone_96_tiprack_200ul_E10 + F10: tipone_96_tiprack_200ul_F10 + G10: tipone_96_tiprack_200ul_G10 + H10: tipone_96_tiprack_200ul_H10 + A11: tipone_96_tiprack_200ul_A11 + B11: tipone_96_tiprack_200ul_B11 + C11: tipone_96_tiprack_200ul_C11 + D11: tipone_96_tiprack_200ul_D11 + E11: tipone_96_tiprack_200ul_E11 + F11: tipone_96_tiprack_200ul_F11 + G11: tipone_96_tiprack_200ul_G11 + H11: tipone_96_tiprack_200ul_H11 + A12: tipone_96_tiprack_200ul_A12 + B12: tipone_96_tiprack_200ul_B12 + C12: tipone_96_tiprack_200ul_C12 + D12: tipone_96_tiprack_200ul_D12 + E12: tipone_96_tiprack_200ul_E12 + F12: tipone_96_tiprack_200ul_F12 + G12: tipone_96_tiprack_200ul_G12 + H12: tipone_96_tiprack_200ul_H12 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.76 + size_y: 85.48 + size_z: 63.9 + type: TipRack + data: {} + id: tipone_96_tiprack_200ul + name: tipone_96_tiprack_200ul + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_A1 + name: tipone_96_tiprack_200ul_A1 + parent: tipone_96_tiprack_200ul + position: + x: 11.4275 + y: 69.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_B1 + name: tipone_96_tiprack_200ul_B1 + parent: tipone_96_tiprack_200ul + position: + x: 11.4275 + y: 60.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_C1 + name: tipone_96_tiprack_200ul_C1 + parent: tipone_96_tiprack_200ul + position: + x: 11.4275 + y: 51.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_D1 + name: tipone_96_tiprack_200ul_D1 + parent: tipone_96_tiprack_200ul + position: + x: 11.4275 + y: 42.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_E1 + name: tipone_96_tiprack_200ul_E1 + parent: tipone_96_tiprack_200ul + position: + x: 11.4275 + y: 33.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_F1 + name: tipone_96_tiprack_200ul_F1 + parent: tipone_96_tiprack_200ul + position: + x: 11.4275 + y: 24.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_G1 + name: tipone_96_tiprack_200ul_G1 + parent: tipone_96_tiprack_200ul + position: + x: 11.4275 + y: 15.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_H1 + name: tipone_96_tiprack_200ul_H1 + parent: tipone_96_tiprack_200ul + position: + x: 11.4275 + y: 6.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_A2 + name: tipone_96_tiprack_200ul_A2 + parent: tipone_96_tiprack_200ul + position: + x: 20.4275 + y: 69.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_B2 + name: tipone_96_tiprack_200ul_B2 + parent: tipone_96_tiprack_200ul + position: + x: 20.4275 + y: 60.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_C2 + name: tipone_96_tiprack_200ul_C2 + parent: tipone_96_tiprack_200ul + position: + x: 20.4275 + y: 51.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_D2 + name: tipone_96_tiprack_200ul_D2 + parent: tipone_96_tiprack_200ul + position: + x: 20.4275 + y: 42.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_E2 + name: tipone_96_tiprack_200ul_E2 + parent: tipone_96_tiprack_200ul + position: + x: 20.4275 + y: 33.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_F2 + name: tipone_96_tiprack_200ul_F2 + parent: tipone_96_tiprack_200ul + position: + x: 20.4275 + y: 24.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_G2 + name: tipone_96_tiprack_200ul_G2 + parent: tipone_96_tiprack_200ul + position: + x: 20.4275 + y: 15.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_H2 + name: tipone_96_tiprack_200ul_H2 + parent: tipone_96_tiprack_200ul + position: + x: 20.4275 + y: 6.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_A3 + name: tipone_96_tiprack_200ul_A3 + parent: tipone_96_tiprack_200ul + position: + x: 29.4275 + y: 69.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_B3 + name: tipone_96_tiprack_200ul_B3 + parent: tipone_96_tiprack_200ul + position: + x: 29.4275 + y: 60.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_C3 + name: tipone_96_tiprack_200ul_C3 + parent: tipone_96_tiprack_200ul + position: + x: 29.4275 + y: 51.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_D3 + name: tipone_96_tiprack_200ul_D3 + parent: tipone_96_tiprack_200ul + position: + x: 29.4275 + y: 42.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_E3 + name: tipone_96_tiprack_200ul_E3 + parent: tipone_96_tiprack_200ul + position: + x: 29.4275 + y: 33.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_F3 + name: tipone_96_tiprack_200ul_F3 + parent: tipone_96_tiprack_200ul + position: + x: 29.4275 + y: 24.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_G3 + name: tipone_96_tiprack_200ul_G3 + parent: tipone_96_tiprack_200ul + position: + x: 29.4275 + y: 15.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_H3 + name: tipone_96_tiprack_200ul_H3 + parent: tipone_96_tiprack_200ul + position: + x: 29.4275 + y: 6.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_A4 + name: tipone_96_tiprack_200ul_A4 + parent: tipone_96_tiprack_200ul + position: + x: 38.4275 + y: 69.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_B4 + name: tipone_96_tiprack_200ul_B4 + parent: tipone_96_tiprack_200ul + position: + x: 38.4275 + y: 60.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_C4 + name: tipone_96_tiprack_200ul_C4 + parent: tipone_96_tiprack_200ul + position: + x: 38.4275 + y: 51.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_D4 + name: tipone_96_tiprack_200ul_D4 + parent: tipone_96_tiprack_200ul + position: + x: 38.4275 + y: 42.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_E4 + name: tipone_96_tiprack_200ul_E4 + parent: tipone_96_tiprack_200ul + position: + x: 38.4275 + y: 33.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_F4 + name: tipone_96_tiprack_200ul_F4 + parent: tipone_96_tiprack_200ul + position: + x: 38.4275 + y: 24.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_G4 + name: tipone_96_tiprack_200ul_G4 + parent: tipone_96_tiprack_200ul + position: + x: 38.4275 + y: 15.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_H4 + name: tipone_96_tiprack_200ul_H4 + parent: tipone_96_tiprack_200ul + position: + x: 38.4275 + y: 6.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_A5 + name: tipone_96_tiprack_200ul_A5 + parent: tipone_96_tiprack_200ul + position: + x: 47.4275 + y: 69.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_B5 + name: tipone_96_tiprack_200ul_B5 + parent: tipone_96_tiprack_200ul + position: + x: 47.4275 + y: 60.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_C5 + name: tipone_96_tiprack_200ul_C5 + parent: tipone_96_tiprack_200ul + position: + x: 47.4275 + y: 51.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_D5 + name: tipone_96_tiprack_200ul_D5 + parent: tipone_96_tiprack_200ul + position: + x: 47.4275 + y: 42.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_E5 + name: tipone_96_tiprack_200ul_E5 + parent: tipone_96_tiprack_200ul + position: + x: 47.4275 + y: 33.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_F5 + name: tipone_96_tiprack_200ul_F5 + parent: tipone_96_tiprack_200ul + position: + x: 47.4275 + y: 24.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_G5 + name: tipone_96_tiprack_200ul_G5 + parent: tipone_96_tiprack_200ul + position: + x: 47.4275 + y: 15.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_H5 + name: tipone_96_tiprack_200ul_H5 + parent: tipone_96_tiprack_200ul + position: + x: 47.4275 + y: 6.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_A6 + name: tipone_96_tiprack_200ul_A6 + parent: tipone_96_tiprack_200ul + position: + x: 56.4275 + y: 69.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_B6 + name: tipone_96_tiprack_200ul_B6 + parent: tipone_96_tiprack_200ul + position: + x: 56.4275 + y: 60.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_C6 + name: tipone_96_tiprack_200ul_C6 + parent: tipone_96_tiprack_200ul + position: + x: 56.4275 + y: 51.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_D6 + name: tipone_96_tiprack_200ul_D6 + parent: tipone_96_tiprack_200ul + position: + x: 56.4275 + y: 42.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_E6 + name: tipone_96_tiprack_200ul_E6 + parent: tipone_96_tiprack_200ul + position: + x: 56.4275 + y: 33.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_F6 + name: tipone_96_tiprack_200ul_F6 + parent: tipone_96_tiprack_200ul + position: + x: 56.4275 + y: 24.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_G6 + name: tipone_96_tiprack_200ul_G6 + parent: tipone_96_tiprack_200ul + position: + x: 56.4275 + y: 15.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_H6 + name: tipone_96_tiprack_200ul_H6 + parent: tipone_96_tiprack_200ul + position: + x: 56.4275 + y: 6.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_A7 + name: tipone_96_tiprack_200ul_A7 + parent: tipone_96_tiprack_200ul + position: + x: 65.4275 + y: 69.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_B7 + name: tipone_96_tiprack_200ul_B7 + parent: tipone_96_tiprack_200ul + position: + x: 65.4275 + y: 60.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_C7 + name: tipone_96_tiprack_200ul_C7 + parent: tipone_96_tiprack_200ul + position: + x: 65.4275 + y: 51.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_D7 + name: tipone_96_tiprack_200ul_D7 + parent: tipone_96_tiprack_200ul + position: + x: 65.4275 + y: 42.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_E7 + name: tipone_96_tiprack_200ul_E7 + parent: tipone_96_tiprack_200ul + position: + x: 65.4275 + y: 33.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_F7 + name: tipone_96_tiprack_200ul_F7 + parent: tipone_96_tiprack_200ul + position: + x: 65.4275 + y: 24.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_G7 + name: tipone_96_tiprack_200ul_G7 + parent: tipone_96_tiprack_200ul + position: + x: 65.4275 + y: 15.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_H7 + name: tipone_96_tiprack_200ul_H7 + parent: tipone_96_tiprack_200ul + position: + x: 65.4275 + y: 6.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_A8 + name: tipone_96_tiprack_200ul_A8 + parent: tipone_96_tiprack_200ul + position: + x: 74.4275 + y: 69.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_B8 + name: tipone_96_tiprack_200ul_B8 + parent: tipone_96_tiprack_200ul + position: + x: 74.4275 + y: 60.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_C8 + name: tipone_96_tiprack_200ul_C8 + parent: tipone_96_tiprack_200ul + position: + x: 74.4275 + y: 51.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_D8 + name: tipone_96_tiprack_200ul_D8 + parent: tipone_96_tiprack_200ul + position: + x: 74.4275 + y: 42.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_E8 + name: tipone_96_tiprack_200ul_E8 + parent: tipone_96_tiprack_200ul + position: + x: 74.4275 + y: 33.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_F8 + name: tipone_96_tiprack_200ul_F8 + parent: tipone_96_tiprack_200ul + position: + x: 74.4275 + y: 24.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_G8 + name: tipone_96_tiprack_200ul_G8 + parent: tipone_96_tiprack_200ul + position: + x: 74.4275 + y: 15.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_H8 + name: tipone_96_tiprack_200ul_H8 + parent: tipone_96_tiprack_200ul + position: + x: 74.4275 + y: 6.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_A9 + name: tipone_96_tiprack_200ul_A9 + parent: tipone_96_tiprack_200ul + position: + x: 83.4275 + y: 69.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_B9 + name: tipone_96_tiprack_200ul_B9 + parent: tipone_96_tiprack_200ul + position: + x: 83.4275 + y: 60.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_C9 + name: tipone_96_tiprack_200ul_C9 + parent: tipone_96_tiprack_200ul + position: + x: 83.4275 + y: 51.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_D9 + name: tipone_96_tiprack_200ul_D9 + parent: tipone_96_tiprack_200ul + position: + x: 83.4275 + y: 42.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_E9 + name: tipone_96_tiprack_200ul_E9 + parent: tipone_96_tiprack_200ul + position: + x: 83.4275 + y: 33.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_F9 + name: tipone_96_tiprack_200ul_F9 + parent: tipone_96_tiprack_200ul + position: + x: 83.4275 + y: 24.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_G9 + name: tipone_96_tiprack_200ul_G9 + parent: tipone_96_tiprack_200ul + position: + x: 83.4275 + y: 15.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_H9 + name: tipone_96_tiprack_200ul_H9 + parent: tipone_96_tiprack_200ul + position: + x: 83.4275 + y: 6.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_A10 + name: tipone_96_tiprack_200ul_A10 + parent: tipone_96_tiprack_200ul + position: + x: 92.4275 + y: 69.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_B10 + name: tipone_96_tiprack_200ul_B10 + parent: tipone_96_tiprack_200ul + position: + x: 92.4275 + y: 60.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_C10 + name: tipone_96_tiprack_200ul_C10 + parent: tipone_96_tiprack_200ul + position: + x: 92.4275 + y: 51.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_D10 + name: tipone_96_tiprack_200ul_D10 + parent: tipone_96_tiprack_200ul + position: + x: 92.4275 + y: 42.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_E10 + name: tipone_96_tiprack_200ul_E10 + parent: tipone_96_tiprack_200ul + position: + x: 92.4275 + y: 33.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_F10 + name: tipone_96_tiprack_200ul_F10 + parent: tipone_96_tiprack_200ul + position: + x: 92.4275 + y: 24.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_G10 + name: tipone_96_tiprack_200ul_G10 + parent: tipone_96_tiprack_200ul + position: + x: 92.4275 + y: 15.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_H10 + name: tipone_96_tiprack_200ul_H10 + parent: tipone_96_tiprack_200ul + position: + x: 92.4275 + y: 6.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_A11 + name: tipone_96_tiprack_200ul_A11 + parent: tipone_96_tiprack_200ul + position: + x: 101.4275 + y: 69.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_B11 + name: tipone_96_tiprack_200ul_B11 + parent: tipone_96_tiprack_200ul + position: + x: 101.4275 + y: 60.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_C11 + name: tipone_96_tiprack_200ul_C11 + parent: tipone_96_tiprack_200ul + position: + x: 101.4275 + y: 51.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_D11 + name: tipone_96_tiprack_200ul_D11 + parent: tipone_96_tiprack_200ul + position: + x: 101.4275 + y: 42.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_E11 + name: tipone_96_tiprack_200ul_E11 + parent: tipone_96_tiprack_200ul + position: + x: 101.4275 + y: 33.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_F11 + name: tipone_96_tiprack_200ul_F11 + parent: tipone_96_tiprack_200ul + position: + x: 101.4275 + y: 24.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_G11 + name: tipone_96_tiprack_200ul_G11 + parent: tipone_96_tiprack_200ul + position: + x: 101.4275 + y: 15.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_H11 + name: tipone_96_tiprack_200ul_H11 + parent: tipone_96_tiprack_200ul + position: + x: 101.4275 + y: 6.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_A12 + name: tipone_96_tiprack_200ul_A12 + parent: tipone_96_tiprack_200ul + position: + x: 110.4275 + y: 69.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_B12 + name: tipone_96_tiprack_200ul_B12 + parent: tipone_96_tiprack_200ul + position: + x: 110.4275 + y: 60.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_C12 + name: tipone_96_tiprack_200ul_C12 + parent: tipone_96_tiprack_200ul + position: + x: 110.4275 + y: 51.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_D12 + name: tipone_96_tiprack_200ul_D12 + parent: tipone_96_tiprack_200ul + position: + x: 110.4275 + y: 42.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_E12 + name: tipone_96_tiprack_200ul_E12 + parent: tipone_96_tiprack_200ul + position: + x: 110.4275 + y: 33.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_F12 + name: tipone_96_tiprack_200ul_F12 + parent: tipone_96_tiprack_200ul + position: + x: 110.4275 + y: 24.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_G12 + name: tipone_96_tiprack_200ul_G12 + parent: tipone_96_tiprack_200ul + position: + x: 110.4275 + y: 15.9875 + z: 53.36 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tip_spot + model: null + prototype_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.525 + size_y: 4.525 + size_z: 0 + type: TipSpot + data: + pending_tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip: + fitting_depth: 6.1 + has_filter: false + maximal_volume: 200.0 + total_tip_length: 50.93 + type: Tip + tip_state: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: tipone_96_tiprack_200ul_H12 + name: tipone_96_tiprack_200ul_H12 + parent: tipone_96_tiprack_200ul + position: + x: 110.4275 + y: 6.9875 + z: 53.36 + sample_id: null + type: container + description: TipOne 96 tiprack 200ul + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/tip_racks.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 diff --git a/unilabos/registry/resources/opentrons/tube_racks.yaml b/unilabos/registry/resources/opentrons/tube_racks.yaml index 6a33d81..6d3a431 100644 --- a/unilabos/registry/resources/opentrons/tube_racks.yaml +++ b/unilabos/registry/resources/opentrons/tube_racks.yaml @@ -1,119 +1,16304 @@ -opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap: - description: Opentrons 24 tuberack eppendorf 2ml safelock snapcap - class: - module: pylabrobot.resources.opentrons.tube_racks:opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap - type: pylabrobot - -opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic: - description: Opentrons 24 tuberack eppendorf 2ml safelock snapcap acrylic - class: - module: pylabrobot.resources.opentrons.tube_racks:opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic - type: pylabrobot - -opentrons_6_tuberack_falcon_50ml_conical: - description: Opentrons 6 tuberack falcon 50ml conical - class: - module: pylabrobot.resources.opentrons.tube_racks:opentrons_6_tuberack_falcon_50ml_conical - type: pylabrobot - -opentrons_15_tuberack_nest_15ml_conical: - description: Opentrons 15 tuberack nest 15ml conical - class: - module: pylabrobot.resources.opentrons.tube_racks:opentrons_15_tuberack_nest_15ml_conical - type: pylabrobot - -opentrons_24_tuberack_nest_2ml_screwcap: - description: Opentrons 24 tuberack nest 2ml screwcap - class: - module: pylabrobot.resources.opentrons.tube_racks:opentrons_24_tuberack_nest_2ml_screwcap - type: pylabrobot - -opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic: - description: Opentrons 24 tuberack generic 0.75ml snapcap acrylic - class: - module: pylabrobot.resources.opentrons.tube_racks:opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic - type: pylabrobot - -opentrons_10_tuberack_nest_4x50ml_6x15ml_conical: - description: Opentrons 10 tuberack nest 4x50ml 6x15ml conical - class: - module: pylabrobot.resources.opentrons.tube_racks:opentrons_10_tuberack_nest_4x50ml_6x15ml_conical - type: pylabrobot - -opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic: - description: Opentrons 10 tuberack falcon 4x50ml 6x15ml conical acrylic - class: - module: pylabrobot.resources.opentrons.tube_racks:opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic - type: pylabrobot - -opentrons_24_tuberack_nest_1point5ml_screwcap: - description: Opentrons 24 tuberack nest 1.5ml screwcap - class: - module: pylabrobot.resources.opentrons.tube_racks:opentrons_24_tuberack_nest_1point5ml_screwcap - type: pylabrobot - -opentrons_24_tuberack_nest_1point5ml_snapcap: - description: Opentrons 24 tuberack nest 1.5ml snapcap - class: - module: pylabrobot.resources.opentrons.tube_racks:opentrons_24_tuberack_nest_1point5ml_snapcap - type: pylabrobot - opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical: - description: Opentrons 10 tuberack falcon 4x50ml 6x15ml conical - class: + category: + - tube_racks + class: module: pylabrobot.resources.opentrons.tube_racks:opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical type: pylabrobot - -opentrons_24_tuberack_nest_2ml_snapcap: - description: Opentrons 24 tuberack nest 2ml snapcap - class: - module: pylabrobot.resources.opentrons.tube_racks:opentrons_24_tuberack_nest_2ml_snapcap + config_info: + - children: + - opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_A1 + - opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_B1 + - opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_C1 + - opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_A2 + - opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_B2 + - opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_C2 + - opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_A3 + - opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_B3 + - opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_A4 + - opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_B4 + class: '' + config: + barcode: null + category: null + model: Opentrons 10 Tube Rack with Falcon 4x50 mL, 6x15 mL Conical + ordering: + A1: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_A1 + B1: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_B1 + C1: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_C1 + A2: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_A2 + B2: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_B2 + C2: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_C2 + A3: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_A3 + B3: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_B3 + A4: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_A4 + B4: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_B4 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.75 + size_y: 85.5 + size_z: 124.35 + type: TubeRack + data: {} + id: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical + name: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.536 + size_y: 10.536 + size_z: 117.5 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_A1 + name: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_A1 + parent: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical + position: + x: 8.612 + y: 62.482 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.536 + size_y: 10.536 + size_z: 117.5 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_B1 + name: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_B1 + parent: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical + position: + x: 8.612 + y: 37.482 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.536 + size_y: 10.536 + size_z: 117.5 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_C1 + name: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_C1 + parent: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical + position: + x: 8.612 + y: 12.482 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.536 + size_y: 10.536 + size_z: 117.5 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_A2 + name: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_A2 + parent: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical + position: + x: 33.612 + y: 62.482 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.536 + size_y: 10.536 + size_z: 117.5 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_B2 + name: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_B2 + parent: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical + position: + x: 33.612 + y: 37.482 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.536 + size_y: 10.536 + size_z: 117.5 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_C2 + name: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_C2 + parent: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical + position: + x: 33.612 + y: 12.482 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 50000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 19.665 + size_y: 19.665 + size_z: 113 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_A3 + name: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_A3 + parent: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical + position: + x: 61.5475 + y: 50.4175 + z: 7.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 50000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 19.665 + size_y: 19.665 + size_z: 113 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_B3 + name: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_B3 + parent: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical + position: + x: 61.5475 + y: 15.4175 + z: 7.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 50000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 19.665 + size_y: 19.665 + size_z: 113 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_A4 + name: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_A4 + parent: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical + position: + x: 96.5475 + y: 50.4175 + z: 7.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 50000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 19.665 + size_y: 19.665 + size_z: 113 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_B4 + name: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_B4 + parent: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical + position: + x: 96.5475 + y: 15.4175 + z: 7.3 + sample_id: null + type: container + description: Opentrons 10 tuberack falcon 4x50ml 6x15ml conical + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/tube_racks.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic: + category: + - tube_racks + class: + module: pylabrobot.resources.opentrons.tube_racks:opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic type: pylabrobot - -opentrons_24_tuberack_nest_0point5ml_screwcap: - description: Opentrons 24 tuberack nest 0.5ml screwcap - class: - module: pylabrobot.resources.opentrons.tube_racks:opentrons_24_tuberack_nest_0point5ml_screwcap + config_info: + - children: + - opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_A1 + - opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_B1 + - opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_C1 + - opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_A2 + - opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_B2 + - opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_C2 + - opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_A3 + - opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_B3 + - opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_A4 + - opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_B4 + class: '' + config: + barcode: null + category: null + model: Opentrons 10 Tube Rack (Acrylic) with Falcon 4x50 mL, 6x15 mL Conical + ordering: + A1: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_A1 + B1: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_B1 + C1: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_C1 + A2: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_A2 + B2: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_B2 + C2: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_C2 + A3: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_A3 + B3: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_B3 + A4: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_A4 + B4: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_B4 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.75 + size_y: 85.5 + size_z: 123.76 + type: TubeRack + data: {} + id: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic + name: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.536 + size_y: 10.536 + size_z: 117.98 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_A1 + name: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_A1 + parent: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic + position: + x: 13.732 + y: 68.732 + z: 5.78 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.536 + size_y: 10.536 + size_z: 117.98 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_B1 + name: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_B1 + parent: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic + position: + x: 13.732 + y: 37.232 + z: 5.78 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.536 + size_y: 10.536 + size_z: 117.98 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_C1 + name: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_C1 + parent: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic + position: + x: 13.732 + y: 5.732 + z: 5.78 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.536 + size_y: 10.536 + size_z: 117.98 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_A2 + name: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_A2 + parent: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic + position: + x: 36.732 + y: 68.732 + z: 5.78 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.536 + size_y: 10.536 + size_z: 117.98 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_B2 + name: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_B2 + parent: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic + position: + x: 36.732 + y: 37.232 + z: 5.78 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.536 + size_y: 10.536 + size_z: 117.98 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_C2 + name: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_C2 + parent: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic + position: + x: 36.732 + y: 5.732 + z: 5.78 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 50000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 19.665 + size_y: 19.665 + size_z: 113.85 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_A3 + name: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_A3 + parent: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic + position: + x: 60.3675 + y: 52.3675 + z: 5.95 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 50000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 19.665 + size_y: 19.665 + size_z: 113.85 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_B3 + name: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_B3 + parent: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic + position: + x: 60.3675 + y: 6.9675 + z: 5.95 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 50000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 19.665 + size_y: 19.665 + size_z: 113.85 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_A4 + name: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_A4 + parent: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic + position: + x: 96.2675 + y: 52.3675 + z: 5.95 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 50000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 19.665 + size_y: 19.665 + size_z: 113.85 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_B4 + name: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic_B4 + parent: opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical_acrylic + position: + x: 96.2675 + y: 6.9675 + z: 5.95 + sample_id: null + type: container + description: Opentrons 10 tuberack falcon 4x50ml 6x15ml conical acrylic + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/tube_racks.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +opentrons_10_tuberack_nest_4x50ml_6x15ml_conical: + category: + - tube_racks + class: + module: pylabrobot.resources.opentrons.tube_racks:opentrons_10_tuberack_nest_4x50ml_6x15ml_conical type: pylabrobot - -opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap: - description: Opentrons 24 tuberack eppendorf 1.5ml safelock snapcap - class: - module: pylabrobot.resources.opentrons.tube_racks:opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap - type: pylabrobot - -opentrons_6_tuberack_nest_50ml_conical: - description: Opentrons 6 tuberack nest 50ml conical - class: - module: pylabrobot.resources.opentrons.tube_racks:opentrons_6_tuberack_nest_50ml_conical - type: pylabrobot - + config_info: + - children: + - opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_A1 + - opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_B1 + - opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_C1 + - opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_A2 + - opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_B2 + - opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_C2 + - opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_A3 + - opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_B3 + - opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_A4 + - opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_B4 + class: '' + config: + barcode: null + category: null + model: Opentrons 10 Tube Rack with NEST 4x50 mL, 6x15 mL Conical + ordering: + A1: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_A1 + B1: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_B1 + C1: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_C1 + A2: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_A2 + B2: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_B2 + C2: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_C2 + A3: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_A3 + B3: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_B3 + A4: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_A4 + B4: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_B4 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.76 + size_y: 85.48 + size_z: 124.65 + type: TubeRack + data: {} + id: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical + name: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.96 + size_y: 10.96 + size_z: 117.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_A1 + name: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_A1 + parent: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical + position: + x: 8.4 + y: 62.27 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.96 + size_y: 10.96 + size_z: 117.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_B1 + name: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_B1 + parent: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical + position: + x: 8.4 + y: 37.27 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.96 + size_y: 10.96 + size_z: 117.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_C1 + name: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_C1 + parent: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical + position: + x: 8.4 + y: 12.27 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.96 + size_y: 10.96 + size_z: 117.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_A2 + name: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_A2 + parent: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical + position: + x: 33.4 + y: 62.27 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.96 + size_y: 10.96 + size_z: 117.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_B2 + name: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_B2 + parent: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical + position: + x: 33.4 + y: 37.27 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.96 + size_y: 10.96 + size_z: 117.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_C2 + name: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_C2 + parent: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical + position: + x: 33.4 + y: 12.27 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 50000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 19.764 + size_y: 19.764 + size_z: 113.05 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_A3 + name: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_A3 + parent: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical + position: + x: 61.498 + y: 50.368 + z: 7.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 50000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 19.764 + size_y: 19.764 + size_z: 113.05 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_B3 + name: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_B3 + parent: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical + position: + x: 61.498 + y: 15.368 + z: 7.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 50000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 19.764 + size_y: 19.764 + size_z: 113.05 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_A4 + name: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_A4 + parent: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical + position: + x: 96.498 + y: 50.368 + z: 7.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 50000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 19.764 + size_y: 19.764 + size_z: 113.05 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_B4 + name: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical_B4 + parent: opentrons_10_tuberack_nest_4x50ml_6x15ml_conical + position: + x: 96.498 + y: 15.368 + z: 7.3 + sample_id: null + type: container + description: Opentrons 10 tuberack nest 4x50ml 6x15ml conical + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/tube_racks.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 opentrons_15_tuberack_falcon_15ml_conical: - description: Opentrons 15 tuberack falcon 15ml conical - class: + category: + - tube_racks + class: module: pylabrobot.resources.opentrons.tube_racks:opentrons_15_tuberack_falcon_15ml_conical type: pylabrobot - -opentrons_24_tuberack_generic_2ml_screwcap: - description: Opentrons 24 tuberack generic 2ml screwcap - class: - module: pylabrobot.resources.opentrons.tube_racks:opentrons_24_tuberack_generic_2ml_screwcap + config_info: + - children: + - opentrons_15_tuberack_falcon_15ml_conical_A1 + - opentrons_15_tuberack_falcon_15ml_conical_B1 + - opentrons_15_tuberack_falcon_15ml_conical_C1 + - opentrons_15_tuberack_falcon_15ml_conical_A2 + - opentrons_15_tuberack_falcon_15ml_conical_B2 + - opentrons_15_tuberack_falcon_15ml_conical_C2 + - opentrons_15_tuberack_falcon_15ml_conical_A3 + - opentrons_15_tuberack_falcon_15ml_conical_B3 + - opentrons_15_tuberack_falcon_15ml_conical_C3 + - opentrons_15_tuberack_falcon_15ml_conical_A4 + - opentrons_15_tuberack_falcon_15ml_conical_B4 + - opentrons_15_tuberack_falcon_15ml_conical_C4 + - opentrons_15_tuberack_falcon_15ml_conical_A5 + - opentrons_15_tuberack_falcon_15ml_conical_B5 + - opentrons_15_tuberack_falcon_15ml_conical_C5 + class: '' + config: + barcode: null + category: null + model: Opentrons 15 Tube Rack with Falcon 15 mL Conical + ordering: + A1: opentrons_15_tuberack_falcon_15ml_conical_A1 + B1: opentrons_15_tuberack_falcon_15ml_conical_B1 + C1: opentrons_15_tuberack_falcon_15ml_conical_C1 + A2: opentrons_15_tuberack_falcon_15ml_conical_A2 + B2: opentrons_15_tuberack_falcon_15ml_conical_B2 + C2: opentrons_15_tuberack_falcon_15ml_conical_C2 + A3: opentrons_15_tuberack_falcon_15ml_conical_A3 + B3: opentrons_15_tuberack_falcon_15ml_conical_B3 + C3: opentrons_15_tuberack_falcon_15ml_conical_C3 + A4: opentrons_15_tuberack_falcon_15ml_conical_A4 + B4: opentrons_15_tuberack_falcon_15ml_conical_B4 + C4: opentrons_15_tuberack_falcon_15ml_conical_C4 + A5: opentrons_15_tuberack_falcon_15ml_conical_A5 + B5: opentrons_15_tuberack_falcon_15ml_conical_B5 + C5: opentrons_15_tuberack_falcon_15ml_conical_C5 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.76 + size_y: 85.48 + size_z: 124.35 + type: TubeRack + data: {} + id: opentrons_15_tuberack_falcon_15ml_conical + name: opentrons_15_tuberack_falcon_15ml_conical + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.536 + size_y: 10.536 + size_z: 117.5 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_15_tuberack_falcon_15ml_conical_A1 + name: opentrons_15_tuberack_falcon_15ml_conical_A1 + parent: opentrons_15_tuberack_falcon_15ml_conical + position: + x: 8.612 + y: 62.472 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.536 + size_y: 10.536 + size_z: 117.5 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_15_tuberack_falcon_15ml_conical_B1 + name: opentrons_15_tuberack_falcon_15ml_conical_B1 + parent: opentrons_15_tuberack_falcon_15ml_conical + position: + x: 8.612 + y: 37.472 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.536 + size_y: 10.536 + size_z: 117.5 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_15_tuberack_falcon_15ml_conical_C1 + name: opentrons_15_tuberack_falcon_15ml_conical_C1 + parent: opentrons_15_tuberack_falcon_15ml_conical + position: + x: 8.612 + y: 12.472 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.536 + size_y: 10.536 + size_z: 117.5 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_15_tuberack_falcon_15ml_conical_A2 + name: opentrons_15_tuberack_falcon_15ml_conical_A2 + parent: opentrons_15_tuberack_falcon_15ml_conical + position: + x: 33.612 + y: 62.472 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.536 + size_y: 10.536 + size_z: 117.5 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_15_tuberack_falcon_15ml_conical_B2 + name: opentrons_15_tuberack_falcon_15ml_conical_B2 + parent: opentrons_15_tuberack_falcon_15ml_conical + position: + x: 33.612 + y: 37.472 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.536 + size_y: 10.536 + size_z: 117.5 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_15_tuberack_falcon_15ml_conical_C2 + name: opentrons_15_tuberack_falcon_15ml_conical_C2 + parent: opentrons_15_tuberack_falcon_15ml_conical + position: + x: 33.612 + y: 12.472 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.536 + size_y: 10.536 + size_z: 117.5 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_15_tuberack_falcon_15ml_conical_A3 + name: opentrons_15_tuberack_falcon_15ml_conical_A3 + parent: opentrons_15_tuberack_falcon_15ml_conical + position: + x: 58.612 + y: 62.472 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.536 + size_y: 10.536 + size_z: 117.5 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_15_tuberack_falcon_15ml_conical_B3 + name: opentrons_15_tuberack_falcon_15ml_conical_B3 + parent: opentrons_15_tuberack_falcon_15ml_conical + position: + x: 58.612 + y: 37.472 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.536 + size_y: 10.536 + size_z: 117.5 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_15_tuberack_falcon_15ml_conical_C3 + name: opentrons_15_tuberack_falcon_15ml_conical_C3 + parent: opentrons_15_tuberack_falcon_15ml_conical + position: + x: 58.612 + y: 12.472 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.536 + size_y: 10.536 + size_z: 117.5 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_15_tuberack_falcon_15ml_conical_A4 + name: opentrons_15_tuberack_falcon_15ml_conical_A4 + parent: opentrons_15_tuberack_falcon_15ml_conical + position: + x: 83.612 + y: 62.472 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.536 + size_y: 10.536 + size_z: 117.5 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_15_tuberack_falcon_15ml_conical_B4 + name: opentrons_15_tuberack_falcon_15ml_conical_B4 + parent: opentrons_15_tuberack_falcon_15ml_conical + position: + x: 83.612 + y: 37.472 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.536 + size_y: 10.536 + size_z: 117.5 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_15_tuberack_falcon_15ml_conical_C4 + name: opentrons_15_tuberack_falcon_15ml_conical_C4 + parent: opentrons_15_tuberack_falcon_15ml_conical + position: + x: 83.612 + y: 12.472 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.536 + size_y: 10.536 + size_z: 117.5 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_15_tuberack_falcon_15ml_conical_A5 + name: opentrons_15_tuberack_falcon_15ml_conical_A5 + parent: opentrons_15_tuberack_falcon_15ml_conical + position: + x: 108.612 + y: 62.472 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.536 + size_y: 10.536 + size_z: 117.5 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_15_tuberack_falcon_15ml_conical_B5 + name: opentrons_15_tuberack_falcon_15ml_conical_B5 + parent: opentrons_15_tuberack_falcon_15ml_conical + position: + x: 108.612 + y: 37.472 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.536 + size_y: 10.536 + size_z: 117.5 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_15_tuberack_falcon_15ml_conical_C5 + name: opentrons_15_tuberack_falcon_15ml_conical_C5 + parent: opentrons_15_tuberack_falcon_15ml_conical + position: + x: 108.612 + y: 12.472 + z: 6.85 + sample_id: null + type: container + description: Opentrons 15 tuberack falcon 15ml conical + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/tube_racks.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +opentrons_15_tuberack_nest_15ml_conical: + category: + - tube_racks + class: + module: pylabrobot.resources.opentrons.tube_racks:opentrons_15_tuberack_nest_15ml_conical type: pylabrobot - -opentrons_96_well_aluminum_block: - description: Opentrons 96 well aluminum block - class: - module: pylabrobot.resources.opentrons.tube_racks:opentrons_96_well_aluminum_block - type: pylabrobot - + config_info: + - children: + - opentrons_15_tuberack_nest_15ml_conical_A1 + - opentrons_15_tuberack_nest_15ml_conical_B1 + - opentrons_15_tuberack_nest_15ml_conical_C1 + - opentrons_15_tuberack_nest_15ml_conical_A2 + - opentrons_15_tuberack_nest_15ml_conical_B2 + - opentrons_15_tuberack_nest_15ml_conical_C2 + - opentrons_15_tuberack_nest_15ml_conical_A3 + - opentrons_15_tuberack_nest_15ml_conical_B3 + - opentrons_15_tuberack_nest_15ml_conical_C3 + - opentrons_15_tuberack_nest_15ml_conical_A4 + - opentrons_15_tuberack_nest_15ml_conical_B4 + - opentrons_15_tuberack_nest_15ml_conical_C4 + - opentrons_15_tuberack_nest_15ml_conical_A5 + - opentrons_15_tuberack_nest_15ml_conical_B5 + - opentrons_15_tuberack_nest_15ml_conical_C5 + class: '' + config: + barcode: null + category: null + model: Opentrons 15 Tube Rack with NEST 15 mL Conical + ordering: + A1: opentrons_15_tuberack_nest_15ml_conical_A1 + B1: opentrons_15_tuberack_nest_15ml_conical_B1 + C1: opentrons_15_tuberack_nest_15ml_conical_C1 + A2: opentrons_15_tuberack_nest_15ml_conical_A2 + B2: opentrons_15_tuberack_nest_15ml_conical_B2 + C2: opentrons_15_tuberack_nest_15ml_conical_C2 + A3: opentrons_15_tuberack_nest_15ml_conical_A3 + B3: opentrons_15_tuberack_nest_15ml_conical_B3 + C3: opentrons_15_tuberack_nest_15ml_conical_C3 + A4: opentrons_15_tuberack_nest_15ml_conical_A4 + B4: opentrons_15_tuberack_nest_15ml_conical_B4 + C4: opentrons_15_tuberack_nest_15ml_conical_C4 + A5: opentrons_15_tuberack_nest_15ml_conical_A5 + B5: opentrons_15_tuberack_nest_15ml_conical_B5 + C5: opentrons_15_tuberack_nest_15ml_conical_C5 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.76 + size_y: 85.48 + size_z: 124.65 + type: TubeRack + data: {} + id: opentrons_15_tuberack_nest_15ml_conical + name: opentrons_15_tuberack_nest_15ml_conical + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.96 + size_y: 10.96 + size_z: 117.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_15_tuberack_nest_15ml_conical_A1 + name: opentrons_15_tuberack_nest_15ml_conical_A1 + parent: opentrons_15_tuberack_nest_15ml_conical + position: + x: 8.4 + y: 62.26 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.96 + size_y: 10.96 + size_z: 117.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_15_tuberack_nest_15ml_conical_B1 + name: opentrons_15_tuberack_nest_15ml_conical_B1 + parent: opentrons_15_tuberack_nest_15ml_conical + position: + x: 8.4 + y: 37.26 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.96 + size_y: 10.96 + size_z: 117.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_15_tuberack_nest_15ml_conical_C1 + name: opentrons_15_tuberack_nest_15ml_conical_C1 + parent: opentrons_15_tuberack_nest_15ml_conical + position: + x: 8.4 + y: 12.26 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.96 + size_y: 10.96 + size_z: 117.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_15_tuberack_nest_15ml_conical_A2 + name: opentrons_15_tuberack_nest_15ml_conical_A2 + parent: opentrons_15_tuberack_nest_15ml_conical + position: + x: 33.4 + y: 62.26 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.96 + size_y: 10.96 + size_z: 117.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_15_tuberack_nest_15ml_conical_B2 + name: opentrons_15_tuberack_nest_15ml_conical_B2 + parent: opentrons_15_tuberack_nest_15ml_conical + position: + x: 33.4 + y: 37.26 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.96 + size_y: 10.96 + size_z: 117.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_15_tuberack_nest_15ml_conical_C2 + name: opentrons_15_tuberack_nest_15ml_conical_C2 + parent: opentrons_15_tuberack_nest_15ml_conical + position: + x: 33.4 + y: 12.26 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.96 + size_y: 10.96 + size_z: 117.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_15_tuberack_nest_15ml_conical_A3 + name: opentrons_15_tuberack_nest_15ml_conical_A3 + parent: opentrons_15_tuberack_nest_15ml_conical + position: + x: 58.4 + y: 62.26 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.96 + size_y: 10.96 + size_z: 117.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_15_tuberack_nest_15ml_conical_B3 + name: opentrons_15_tuberack_nest_15ml_conical_B3 + parent: opentrons_15_tuberack_nest_15ml_conical + position: + x: 58.4 + y: 37.26 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.96 + size_y: 10.96 + size_z: 117.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_15_tuberack_nest_15ml_conical_C3 + name: opentrons_15_tuberack_nest_15ml_conical_C3 + parent: opentrons_15_tuberack_nest_15ml_conical + position: + x: 58.4 + y: 12.26 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.96 + size_y: 10.96 + size_z: 117.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_15_tuberack_nest_15ml_conical_A4 + name: opentrons_15_tuberack_nest_15ml_conical_A4 + parent: opentrons_15_tuberack_nest_15ml_conical + position: + x: 83.4 + y: 62.26 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.96 + size_y: 10.96 + size_z: 117.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_15_tuberack_nest_15ml_conical_B4 + name: opentrons_15_tuberack_nest_15ml_conical_B4 + parent: opentrons_15_tuberack_nest_15ml_conical + position: + x: 83.4 + y: 37.26 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.96 + size_y: 10.96 + size_z: 117.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_15_tuberack_nest_15ml_conical_C4 + name: opentrons_15_tuberack_nest_15ml_conical_C4 + parent: opentrons_15_tuberack_nest_15ml_conical + position: + x: 83.4 + y: 12.26 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.96 + size_y: 10.96 + size_z: 117.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_15_tuberack_nest_15ml_conical_A5 + name: opentrons_15_tuberack_nest_15ml_conical_A5 + parent: opentrons_15_tuberack_nest_15ml_conical + position: + x: 108.4 + y: 62.26 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.96 + size_y: 10.96 + size_z: 117.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_15_tuberack_nest_15ml_conical_B5 + name: opentrons_15_tuberack_nest_15ml_conical_B5 + parent: opentrons_15_tuberack_nest_15ml_conical + position: + x: 108.4 + y: 37.26 + z: 6.85 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 15000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 10.96 + size_y: 10.96 + size_z: 117.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_15_tuberack_nest_15ml_conical_C5 + name: opentrons_15_tuberack_nest_15ml_conical_C5 + parent: opentrons_15_tuberack_nest_15ml_conical + position: + x: 108.4 + y: 12.26 + z: 6.85 + sample_id: null + type: container + description: Opentrons 15 tuberack nest 15ml conical + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/tube_racks.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 opentrons_24_aluminumblock_generic_2ml_screwcap: - description: Opentrons 24 aluminumblock generic 2ml screwcap - class: + category: + - tube_racks + class: module: pylabrobot.resources.opentrons.tube_racks:opentrons_24_aluminumblock_generic_2ml_screwcap type: pylabrobot - + config_info: + - children: + - opentrons_24_aluminumblock_generic_2ml_screwcap_A1 + - opentrons_24_aluminumblock_generic_2ml_screwcap_B1 + - opentrons_24_aluminumblock_generic_2ml_screwcap_C1 + - opentrons_24_aluminumblock_generic_2ml_screwcap_D1 + - opentrons_24_aluminumblock_generic_2ml_screwcap_A2 + - opentrons_24_aluminumblock_generic_2ml_screwcap_B2 + - opentrons_24_aluminumblock_generic_2ml_screwcap_C2 + - opentrons_24_aluminumblock_generic_2ml_screwcap_D2 + - opentrons_24_aluminumblock_generic_2ml_screwcap_A3 + - opentrons_24_aluminumblock_generic_2ml_screwcap_B3 + - opentrons_24_aluminumblock_generic_2ml_screwcap_C3 + - opentrons_24_aluminumblock_generic_2ml_screwcap_D3 + - opentrons_24_aluminumblock_generic_2ml_screwcap_A4 + - opentrons_24_aluminumblock_generic_2ml_screwcap_B4 + - opentrons_24_aluminumblock_generic_2ml_screwcap_C4 + - opentrons_24_aluminumblock_generic_2ml_screwcap_D4 + - opentrons_24_aluminumblock_generic_2ml_screwcap_A5 + - opentrons_24_aluminumblock_generic_2ml_screwcap_B5 + - opentrons_24_aluminumblock_generic_2ml_screwcap_C5 + - opentrons_24_aluminumblock_generic_2ml_screwcap_D5 + - opentrons_24_aluminumblock_generic_2ml_screwcap_A6 + - opentrons_24_aluminumblock_generic_2ml_screwcap_B6 + - opentrons_24_aluminumblock_generic_2ml_screwcap_C6 + - opentrons_24_aluminumblock_generic_2ml_screwcap_D6 + class: '' + config: + barcode: null + category: null + model: Opentrons 24 Well Aluminum Block with Generic 2 mL Screwcap + ordering: + A1: opentrons_24_aluminumblock_generic_2ml_screwcap_A1 + B1: opentrons_24_aluminumblock_generic_2ml_screwcap_B1 + C1: opentrons_24_aluminumblock_generic_2ml_screwcap_C1 + D1: opentrons_24_aluminumblock_generic_2ml_screwcap_D1 + A2: opentrons_24_aluminumblock_generic_2ml_screwcap_A2 + B2: opentrons_24_aluminumblock_generic_2ml_screwcap_B2 + C2: opentrons_24_aluminumblock_generic_2ml_screwcap_C2 + D2: opentrons_24_aluminumblock_generic_2ml_screwcap_D2 + A3: opentrons_24_aluminumblock_generic_2ml_screwcap_A3 + B3: opentrons_24_aluminumblock_generic_2ml_screwcap_B3 + C3: opentrons_24_aluminumblock_generic_2ml_screwcap_C3 + D3: opentrons_24_aluminumblock_generic_2ml_screwcap_D3 + A4: opentrons_24_aluminumblock_generic_2ml_screwcap_A4 + B4: opentrons_24_aluminumblock_generic_2ml_screwcap_B4 + C4: opentrons_24_aluminumblock_generic_2ml_screwcap_C4 + D4: opentrons_24_aluminumblock_generic_2ml_screwcap_D4 + A5: opentrons_24_aluminumblock_generic_2ml_screwcap_A5 + B5: opentrons_24_aluminumblock_generic_2ml_screwcap_B5 + C5: opentrons_24_aluminumblock_generic_2ml_screwcap_C5 + D5: opentrons_24_aluminumblock_generic_2ml_screwcap_D5 + A6: opentrons_24_aluminumblock_generic_2ml_screwcap_A6 + B6: opentrons_24_aluminumblock_generic_2ml_screwcap_B6 + C6: opentrons_24_aluminumblock_generic_2ml_screwcap_C6 + D6: opentrons_24_aluminumblock_generic_2ml_screwcap_D6 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.75 + size_y: 85.5 + size_z: 48.7 + type: TubeRack + data: {} + id: opentrons_24_aluminumblock_generic_2ml_screwcap + name: opentrons_24_aluminumblock_generic_2ml_screwcap + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_generic_2ml_screwcap_A1 + name: opentrons_24_aluminumblock_generic_2ml_screwcap_A1 + parent: opentrons_24_aluminumblock_generic_2ml_screwcap + position: + x: 17.745 + y: 65.625 + z: 6.7 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_generic_2ml_screwcap_B1 + name: opentrons_24_aluminumblock_generic_2ml_screwcap_B1 + parent: opentrons_24_aluminumblock_generic_2ml_screwcap + position: + x: 17.745 + y: 48.375 + z: 6.7 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_generic_2ml_screwcap_C1 + name: opentrons_24_aluminumblock_generic_2ml_screwcap_C1 + parent: opentrons_24_aluminumblock_generic_2ml_screwcap + position: + x: 17.745 + y: 31.125 + z: 6.7 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_generic_2ml_screwcap_D1 + name: opentrons_24_aluminumblock_generic_2ml_screwcap_D1 + parent: opentrons_24_aluminumblock_generic_2ml_screwcap + position: + x: 17.745 + y: 13.875 + z: 6.7 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_generic_2ml_screwcap_A2 + name: opentrons_24_aluminumblock_generic_2ml_screwcap_A2 + parent: opentrons_24_aluminumblock_generic_2ml_screwcap + position: + x: 34.995 + y: 65.625 + z: 6.7 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_generic_2ml_screwcap_B2 + name: opentrons_24_aluminumblock_generic_2ml_screwcap_B2 + parent: opentrons_24_aluminumblock_generic_2ml_screwcap + position: + x: 34.995 + y: 48.375 + z: 6.7 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_generic_2ml_screwcap_C2 + name: opentrons_24_aluminumblock_generic_2ml_screwcap_C2 + parent: opentrons_24_aluminumblock_generic_2ml_screwcap + position: + x: 34.995 + y: 31.125 + z: 6.7 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_generic_2ml_screwcap_D2 + name: opentrons_24_aluminumblock_generic_2ml_screwcap_D2 + parent: opentrons_24_aluminumblock_generic_2ml_screwcap + position: + x: 34.995 + y: 13.875 + z: 6.7 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_generic_2ml_screwcap_A3 + name: opentrons_24_aluminumblock_generic_2ml_screwcap_A3 + parent: opentrons_24_aluminumblock_generic_2ml_screwcap + position: + x: 52.245 + y: 65.625 + z: 6.7 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_generic_2ml_screwcap_B3 + name: opentrons_24_aluminumblock_generic_2ml_screwcap_B3 + parent: opentrons_24_aluminumblock_generic_2ml_screwcap + position: + x: 52.245 + y: 48.375 + z: 6.7 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_generic_2ml_screwcap_C3 + name: opentrons_24_aluminumblock_generic_2ml_screwcap_C3 + parent: opentrons_24_aluminumblock_generic_2ml_screwcap + position: + x: 52.245 + y: 31.125 + z: 6.7 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_generic_2ml_screwcap_D3 + name: opentrons_24_aluminumblock_generic_2ml_screwcap_D3 + parent: opentrons_24_aluminumblock_generic_2ml_screwcap + position: + x: 52.245 + y: 13.875 + z: 6.7 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_generic_2ml_screwcap_A4 + name: opentrons_24_aluminumblock_generic_2ml_screwcap_A4 + parent: opentrons_24_aluminumblock_generic_2ml_screwcap + position: + x: 69.495 + y: 65.625 + z: 6.7 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_generic_2ml_screwcap_B4 + name: opentrons_24_aluminumblock_generic_2ml_screwcap_B4 + parent: opentrons_24_aluminumblock_generic_2ml_screwcap + position: + x: 69.495 + y: 48.375 + z: 6.7 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_generic_2ml_screwcap_C4 + name: opentrons_24_aluminumblock_generic_2ml_screwcap_C4 + parent: opentrons_24_aluminumblock_generic_2ml_screwcap + position: + x: 69.495 + y: 31.125 + z: 6.7 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_generic_2ml_screwcap_D4 + name: opentrons_24_aluminumblock_generic_2ml_screwcap_D4 + parent: opentrons_24_aluminumblock_generic_2ml_screwcap + position: + x: 69.495 + y: 13.875 + z: 6.7 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_generic_2ml_screwcap_A5 + name: opentrons_24_aluminumblock_generic_2ml_screwcap_A5 + parent: opentrons_24_aluminumblock_generic_2ml_screwcap + position: + x: 86.745 + y: 65.625 + z: 6.7 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_generic_2ml_screwcap_B5 + name: opentrons_24_aluminumblock_generic_2ml_screwcap_B5 + parent: opentrons_24_aluminumblock_generic_2ml_screwcap + position: + x: 86.745 + y: 48.375 + z: 6.7 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_generic_2ml_screwcap_C5 + name: opentrons_24_aluminumblock_generic_2ml_screwcap_C5 + parent: opentrons_24_aluminumblock_generic_2ml_screwcap + position: + x: 86.745 + y: 31.125 + z: 6.7 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_generic_2ml_screwcap_D5 + name: opentrons_24_aluminumblock_generic_2ml_screwcap_D5 + parent: opentrons_24_aluminumblock_generic_2ml_screwcap + position: + x: 86.745 + y: 13.875 + z: 6.7 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_generic_2ml_screwcap_A6 + name: opentrons_24_aluminumblock_generic_2ml_screwcap_A6 + parent: opentrons_24_aluminumblock_generic_2ml_screwcap + position: + x: 103.995 + y: 65.625 + z: 6.7 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_generic_2ml_screwcap_B6 + name: opentrons_24_aluminumblock_generic_2ml_screwcap_B6 + parent: opentrons_24_aluminumblock_generic_2ml_screwcap + position: + x: 103.995 + y: 48.375 + z: 6.7 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_generic_2ml_screwcap_C6 + name: opentrons_24_aluminumblock_generic_2ml_screwcap_C6 + parent: opentrons_24_aluminumblock_generic_2ml_screwcap + position: + x: 103.995 + y: 31.125 + z: 6.7 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_generic_2ml_screwcap_D6 + name: opentrons_24_aluminumblock_generic_2ml_screwcap_D6 + parent: opentrons_24_aluminumblock_generic_2ml_screwcap + position: + x: 103.995 + y: 13.875 + z: 6.7 + sample_id: null + type: container + description: Opentrons 24 aluminumblock generic 2ml screwcap + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/tube_racks.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 opentrons_24_aluminumblock_nest_1point5ml_snapcap: - description: Opentrons 24 aluminumblock nest 1.5ml snapcap - class: + category: + - tube_racks + class: module: pylabrobot.resources.opentrons.tube_racks:opentrons_24_aluminumblock_nest_1point5ml_snapcap type: pylabrobot + config_info: + - children: + - opentrons_24_aluminumblock_nest_1point5ml_snapcap_A1 + - opentrons_24_aluminumblock_nest_1point5ml_snapcap_B1 + - opentrons_24_aluminumblock_nest_1point5ml_snapcap_C1 + - opentrons_24_aluminumblock_nest_1point5ml_snapcap_D1 + - opentrons_24_aluminumblock_nest_1point5ml_snapcap_A2 + - opentrons_24_aluminumblock_nest_1point5ml_snapcap_B2 + - opentrons_24_aluminumblock_nest_1point5ml_snapcap_C2 + - opentrons_24_aluminumblock_nest_1point5ml_snapcap_D2 + - opentrons_24_aluminumblock_nest_1point5ml_snapcap_A3 + - opentrons_24_aluminumblock_nest_1point5ml_snapcap_B3 + - opentrons_24_aluminumblock_nest_1point5ml_snapcap_C3 + - opentrons_24_aluminumblock_nest_1point5ml_snapcap_D3 + - opentrons_24_aluminumblock_nest_1point5ml_snapcap_A4 + - opentrons_24_aluminumblock_nest_1point5ml_snapcap_B4 + - opentrons_24_aluminumblock_nest_1point5ml_snapcap_C4 + - opentrons_24_aluminumblock_nest_1point5ml_snapcap_D4 + - opentrons_24_aluminumblock_nest_1point5ml_snapcap_A5 + - opentrons_24_aluminumblock_nest_1point5ml_snapcap_B5 + - opentrons_24_aluminumblock_nest_1point5ml_snapcap_C5 + - opentrons_24_aluminumblock_nest_1point5ml_snapcap_D5 + - opentrons_24_aluminumblock_nest_1point5ml_snapcap_A6 + - opentrons_24_aluminumblock_nest_1point5ml_snapcap_B6 + - opentrons_24_aluminumblock_nest_1point5ml_snapcap_C6 + - opentrons_24_aluminumblock_nest_1point5ml_snapcap_D6 + class: '' + config: + barcode: null + category: null + model: Opentrons 24 Well Aluminum Block with NEST 1.5 mL Snapcap + ordering: + A1: opentrons_24_aluminumblock_nest_1point5ml_snapcap_A1 + B1: opentrons_24_aluminumblock_nest_1point5ml_snapcap_B1 + C1: opentrons_24_aluminumblock_nest_1point5ml_snapcap_C1 + D1: opentrons_24_aluminumblock_nest_1point5ml_snapcap_D1 + A2: opentrons_24_aluminumblock_nest_1point5ml_snapcap_A2 + B2: opentrons_24_aluminumblock_nest_1point5ml_snapcap_B2 + C2: opentrons_24_aluminumblock_nest_1point5ml_snapcap_C2 + D2: opentrons_24_aluminumblock_nest_1point5ml_snapcap_D2 + A3: opentrons_24_aluminumblock_nest_1point5ml_snapcap_A3 + B3: opentrons_24_aluminumblock_nest_1point5ml_snapcap_B3 + C3: opentrons_24_aluminumblock_nest_1point5ml_snapcap_C3 + D3: opentrons_24_aluminumblock_nest_1point5ml_snapcap_D3 + A4: opentrons_24_aluminumblock_nest_1point5ml_snapcap_A4 + B4: opentrons_24_aluminumblock_nest_1point5ml_snapcap_B4 + C4: opentrons_24_aluminumblock_nest_1point5ml_snapcap_C4 + D4: opentrons_24_aluminumblock_nest_1point5ml_snapcap_D4 + A5: opentrons_24_aluminumblock_nest_1point5ml_snapcap_A5 + B5: opentrons_24_aluminumblock_nest_1point5ml_snapcap_B5 + C5: opentrons_24_aluminumblock_nest_1point5ml_snapcap_C5 + D5: opentrons_24_aluminumblock_nest_1point5ml_snapcap_D5 + A6: opentrons_24_aluminumblock_nest_1point5ml_snapcap_A6 + B6: opentrons_24_aluminumblock_nest_1point5ml_snapcap_B6 + C6: opentrons_24_aluminumblock_nest_1point5ml_snapcap_C6 + D6: opentrons_24_aluminumblock_nest_1point5ml_snapcap_D6 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.75 + size_y: 85.5 + size_z: 43.7 + type: TubeRack + data: {} + id: opentrons_24_aluminumblock_nest_1point5ml_snapcap + name: opentrons_24_aluminumblock_nest_1point5ml_snapcap + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_nest_1point5ml_snapcap_A1 + name: opentrons_24_aluminumblock_nest_1point5ml_snapcap_A1 + parent: opentrons_24_aluminumblock_nest_1point5ml_snapcap + position: + x: 17.144 + y: 65.014 + z: 5.8 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_nest_1point5ml_snapcap_B1 + name: opentrons_24_aluminumblock_nest_1point5ml_snapcap_B1 + parent: opentrons_24_aluminumblock_nest_1point5ml_snapcap + position: + x: 17.144 + y: 47.764 + z: 5.8 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_nest_1point5ml_snapcap_C1 + name: opentrons_24_aluminumblock_nest_1point5ml_snapcap_C1 + parent: opentrons_24_aluminumblock_nest_1point5ml_snapcap + position: + x: 17.144 + y: 30.514 + z: 5.8 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_nest_1point5ml_snapcap_D1 + name: opentrons_24_aluminumblock_nest_1point5ml_snapcap_D1 + parent: opentrons_24_aluminumblock_nest_1point5ml_snapcap + position: + x: 17.144 + y: 13.264 + z: 5.8 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_nest_1point5ml_snapcap_A2 + name: opentrons_24_aluminumblock_nest_1point5ml_snapcap_A2 + parent: opentrons_24_aluminumblock_nest_1point5ml_snapcap + position: + x: 34.394 + y: 65.014 + z: 5.8 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_nest_1point5ml_snapcap_B2 + name: opentrons_24_aluminumblock_nest_1point5ml_snapcap_B2 + parent: opentrons_24_aluminumblock_nest_1point5ml_snapcap + position: + x: 34.394 + y: 47.764 + z: 5.8 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_nest_1point5ml_snapcap_C2 + name: opentrons_24_aluminumblock_nest_1point5ml_snapcap_C2 + parent: opentrons_24_aluminumblock_nest_1point5ml_snapcap + position: + x: 34.394 + y: 30.514 + z: 5.8 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_nest_1point5ml_snapcap_D2 + name: opentrons_24_aluminumblock_nest_1point5ml_snapcap_D2 + parent: opentrons_24_aluminumblock_nest_1point5ml_snapcap + position: + x: 34.394 + y: 13.264 + z: 5.8 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_nest_1point5ml_snapcap_A3 + name: opentrons_24_aluminumblock_nest_1point5ml_snapcap_A3 + parent: opentrons_24_aluminumblock_nest_1point5ml_snapcap + position: + x: 51.644 + y: 65.014 + z: 5.8 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_nest_1point5ml_snapcap_B3 + name: opentrons_24_aluminumblock_nest_1point5ml_snapcap_B3 + parent: opentrons_24_aluminumblock_nest_1point5ml_snapcap + position: + x: 51.644 + y: 47.764 + z: 5.8 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_nest_1point5ml_snapcap_C3 + name: opentrons_24_aluminumblock_nest_1point5ml_snapcap_C3 + parent: opentrons_24_aluminumblock_nest_1point5ml_snapcap + position: + x: 51.644 + y: 30.514 + z: 5.8 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_nest_1point5ml_snapcap_D3 + name: opentrons_24_aluminumblock_nest_1point5ml_snapcap_D3 + parent: opentrons_24_aluminumblock_nest_1point5ml_snapcap + position: + x: 51.644 + y: 13.264 + z: 5.8 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_nest_1point5ml_snapcap_A4 + name: opentrons_24_aluminumblock_nest_1point5ml_snapcap_A4 + parent: opentrons_24_aluminumblock_nest_1point5ml_snapcap + position: + x: 68.894 + y: 65.014 + z: 5.8 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_nest_1point5ml_snapcap_B4 + name: opentrons_24_aluminumblock_nest_1point5ml_snapcap_B4 + parent: opentrons_24_aluminumblock_nest_1point5ml_snapcap + position: + x: 68.894 + y: 47.764 + z: 5.8 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_nest_1point5ml_snapcap_C4 + name: opentrons_24_aluminumblock_nest_1point5ml_snapcap_C4 + parent: opentrons_24_aluminumblock_nest_1point5ml_snapcap + position: + x: 68.894 + y: 30.514 + z: 5.8 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_nest_1point5ml_snapcap_D4 + name: opentrons_24_aluminumblock_nest_1point5ml_snapcap_D4 + parent: opentrons_24_aluminumblock_nest_1point5ml_snapcap + position: + x: 68.894 + y: 13.264 + z: 5.8 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_nest_1point5ml_snapcap_A5 + name: opentrons_24_aluminumblock_nest_1point5ml_snapcap_A5 + parent: opentrons_24_aluminumblock_nest_1point5ml_snapcap + position: + x: 86.144 + y: 65.014 + z: 5.8 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_nest_1point5ml_snapcap_B5 + name: opentrons_24_aluminumblock_nest_1point5ml_snapcap_B5 + parent: opentrons_24_aluminumblock_nest_1point5ml_snapcap + position: + x: 86.144 + y: 47.764 + z: 5.8 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_nest_1point5ml_snapcap_C5 + name: opentrons_24_aluminumblock_nest_1point5ml_snapcap_C5 + parent: opentrons_24_aluminumblock_nest_1point5ml_snapcap + position: + x: 86.144 + y: 30.514 + z: 5.8 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_nest_1point5ml_snapcap_D5 + name: opentrons_24_aluminumblock_nest_1point5ml_snapcap_D5 + parent: opentrons_24_aluminumblock_nest_1point5ml_snapcap + position: + x: 86.144 + y: 13.264 + z: 5.8 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_nest_1point5ml_snapcap_A6 + name: opentrons_24_aluminumblock_nest_1point5ml_snapcap_A6 + parent: opentrons_24_aluminumblock_nest_1point5ml_snapcap + position: + x: 103.394 + y: 65.014 + z: 5.8 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_nest_1point5ml_snapcap_B6 + name: opentrons_24_aluminumblock_nest_1point5ml_snapcap_B6 + parent: opentrons_24_aluminumblock_nest_1point5ml_snapcap + position: + x: 103.394 + y: 47.764 + z: 5.8 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_nest_1point5ml_snapcap_C6 + name: opentrons_24_aluminumblock_nest_1point5ml_snapcap_C6 + parent: opentrons_24_aluminumblock_nest_1point5ml_snapcap + position: + x: 103.394 + y: 30.514 + z: 5.8 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_aluminumblock_nest_1point5ml_snapcap_D6 + name: opentrons_24_aluminumblock_nest_1point5ml_snapcap_D6 + parent: opentrons_24_aluminumblock_nest_1point5ml_snapcap + position: + x: 103.394 + y: 13.264 + z: 5.8 + sample_id: null + type: container + description: Opentrons 24 aluminumblock nest 1.5ml snapcap + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/tube_racks.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap: + category: + - tube_racks + class: + module: pylabrobot.resources.opentrons.tube_racks:opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap + type: pylabrobot + config_info: + - children: + - opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_A1 + - opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_B1 + - opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_C1 + - opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_D1 + - opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_A2 + - opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_B2 + - opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_C2 + - opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_D2 + - opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_A3 + - opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_B3 + - opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_C3 + - opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_D3 + - opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_A4 + - opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_B4 + - opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_C4 + - opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_D4 + - opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_A5 + - opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_B5 + - opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_C5 + - opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_D5 + - opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_A6 + - opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_B6 + - opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_C6 + - opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_D6 + class: '' + config: + barcode: null + category: null + model: Opentrons 24 Tube Rack with Eppendorf 1.5 mL Safe-Lock Snapcap + ordering: + A1: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_A1 + B1: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_B1 + C1: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_C1 + D1: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_D1 + A2: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_A2 + B2: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_B2 + C2: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_C2 + D2: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_D2 + A3: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_A3 + B3: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_B3 + C3: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_C3 + D3: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_D3 + A4: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_A4 + B4: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_B4 + C4: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_C4 + D4: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_D4 + A5: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_A5 + B5: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_B5 + C5: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_C5 + D5: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_D5 + A6: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_A6 + B6: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_B6 + C6: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_C6 + D6: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_D6 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.75 + size_y: 85.5 + size_z: 79.85 + type: TubeRack + data: {} + id: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap + name: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.152 + size_y: 6.152 + size_z: 37.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_A1 + name: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_A1 + parent: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap + position: + x: 15.134 + y: 72.354 + z: 42.05 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.152 + size_y: 6.152 + size_z: 37.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_B1 + name: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_B1 + parent: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap + position: + x: 15.134 + y: 53.074 + z: 42.05 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.152 + size_y: 6.152 + size_z: 37.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_C1 + name: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_C1 + parent: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap + position: + x: 15.134 + y: 33.794 + z: 42.05 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.152 + size_y: 6.152 + size_z: 37.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_D1 + name: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_D1 + parent: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap + position: + x: 15.134 + y: 14.514 + z: 42.05 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.152 + size_y: 6.152 + size_z: 37.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_A2 + name: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_A2 + parent: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap + position: + x: 35.024 + y: 72.354 + z: 42.05 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.152 + size_y: 6.152 + size_z: 37.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_B2 + name: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_B2 + parent: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap + position: + x: 35.024 + y: 53.074 + z: 42.05 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.152 + size_y: 6.152 + size_z: 37.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_C2 + name: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_C2 + parent: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap + position: + x: 35.024 + y: 33.794 + z: 42.05 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.152 + size_y: 6.152 + size_z: 37.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_D2 + name: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_D2 + parent: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap + position: + x: 35.024 + y: 14.514 + z: 42.05 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.152 + size_y: 6.152 + size_z: 37.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_A3 + name: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_A3 + parent: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap + position: + x: 54.914 + y: 72.354 + z: 42.05 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.152 + size_y: 6.152 + size_z: 37.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_B3 + name: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_B3 + parent: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap + position: + x: 54.914 + y: 53.074 + z: 42.05 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.152 + size_y: 6.152 + size_z: 37.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_C3 + name: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_C3 + parent: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap + position: + x: 54.914 + y: 33.794 + z: 42.05 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.152 + size_y: 6.152 + size_z: 37.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_D3 + name: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_D3 + parent: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap + position: + x: 54.914 + y: 14.514 + z: 42.05 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.152 + size_y: 6.152 + size_z: 37.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_A4 + name: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_A4 + parent: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap + position: + x: 74.804 + y: 72.354 + z: 42.05 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.152 + size_y: 6.152 + size_z: 37.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_B4 + name: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_B4 + parent: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap + position: + x: 74.804 + y: 53.074 + z: 42.05 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.152 + size_y: 6.152 + size_z: 37.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_C4 + name: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_C4 + parent: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap + position: + x: 74.804 + y: 33.794 + z: 42.05 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.152 + size_y: 6.152 + size_z: 37.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_D4 + name: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_D4 + parent: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap + position: + x: 74.804 + y: 14.514 + z: 42.05 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.152 + size_y: 6.152 + size_z: 37.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_A5 + name: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_A5 + parent: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap + position: + x: 94.694 + y: 72.354 + z: 42.05 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.152 + size_y: 6.152 + size_z: 37.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_B5 + name: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_B5 + parent: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap + position: + x: 94.694 + y: 53.074 + z: 42.05 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.152 + size_y: 6.152 + size_z: 37.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_C5 + name: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_C5 + parent: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap + position: + x: 94.694 + y: 33.794 + z: 42.05 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.152 + size_y: 6.152 + size_z: 37.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_D5 + name: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_D5 + parent: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap + position: + x: 94.694 + y: 14.514 + z: 42.05 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.152 + size_y: 6.152 + size_z: 37.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_A6 + name: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_A6 + parent: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap + position: + x: 114.584 + y: 72.354 + z: 42.05 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.152 + size_y: 6.152 + size_z: 37.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_B6 + name: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_B6 + parent: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap + position: + x: 114.584 + y: 53.074 + z: 42.05 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.152 + size_y: 6.152 + size_z: 37.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_C6 + name: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_C6 + parent: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap + position: + x: 114.584 + y: 33.794 + z: 42.05 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.152 + size_y: 6.152 + size_z: 37.8 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_D6 + name: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap_D6 + parent: opentrons_24_tuberack_eppendorf_1point5ml_safelock_snapcap + position: + x: 114.584 + y: 14.514 + z: 42.05 + sample_id: null + type: container + description: Opentrons 24 tuberack eppendorf 1.5ml safelock snapcap + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/tube_racks.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap: + category: + - tube_racks + class: + module: pylabrobot.resources.opentrons.tube_racks:opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap + type: pylabrobot + config_info: + - children: + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_A1 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_B1 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_C1 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_D1 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_A2 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_B2 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_C2 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_D2 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_A3 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_B3 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_C3 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_D3 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_A4 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_B4 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_C4 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_D4 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_A5 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_B5 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_C5 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_D5 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_A6 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_B6 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_C6 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_D6 + class: '' + config: + barcode: null + category: null + model: Opentrons 24 Tube Rack with Eppendorf 2 mL Safe-Lock Snapcap + ordering: + A1: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_A1 + B1: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_B1 + C1: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_C1 + D1: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_D1 + A2: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_A2 + B2: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_B2 + C2: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_C2 + D2: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_D2 + A3: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_A3 + B3: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_B3 + C3: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_C3 + D3: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_D3 + A4: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_A4 + B4: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_B4 + C4: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_C4 + D4: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_D4 + A5: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_A5 + B5: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_B5 + C5: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_C5 + D5: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_D5 + A6: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_A6 + B6: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_B6 + C6: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_C6 + D6: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_D6 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.75 + size_y: 85.5 + size_z: 79.85 + type: TubeRack + data: {} + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 39.1 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_A1 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_A1 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap + position: + x: 15.0985 + y: 72.3185 + z: 41.27 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 39.1 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_B1 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_B1 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap + position: + x: 15.0985 + y: 53.0385 + z: 41.27 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 39.1 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_C1 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_C1 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap + position: + x: 15.0985 + y: 33.7585 + z: 41.27 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 39.1 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_D1 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_D1 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap + position: + x: 15.0985 + y: 14.4785 + z: 41.27 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 39.1 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_A2 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_A2 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap + position: + x: 34.9885 + y: 72.3185 + z: 41.27 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 39.1 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_B2 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_B2 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap + position: + x: 34.9885 + y: 53.0385 + z: 41.27 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 39.1 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_C2 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_C2 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap + position: + x: 34.9885 + y: 33.7585 + z: 41.27 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 39.1 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_D2 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_D2 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap + position: + x: 34.9885 + y: 14.4785 + z: 41.27 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 39.1 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_A3 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_A3 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap + position: + x: 54.8785 + y: 72.3185 + z: 41.27 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 39.1 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_B3 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_B3 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap + position: + x: 54.8785 + y: 53.0385 + z: 41.27 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 39.1 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_C3 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_C3 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap + position: + x: 54.8785 + y: 33.7585 + z: 41.27 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 39.1 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_D3 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_D3 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap + position: + x: 54.8785 + y: 14.4785 + z: 41.27 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 39.1 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_A4 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_A4 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap + position: + x: 74.7685 + y: 72.3185 + z: 41.27 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 39.1 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_B4 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_B4 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap + position: + x: 74.7685 + y: 53.0385 + z: 41.27 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 39.1 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_C4 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_C4 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap + position: + x: 74.7685 + y: 33.7585 + z: 41.27 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 39.1 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_D4 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_D4 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap + position: + x: 74.7685 + y: 14.4785 + z: 41.27 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 39.1 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_A5 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_A5 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap + position: + x: 94.6585 + y: 72.3185 + z: 41.27 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 39.1 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_B5 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_B5 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap + position: + x: 94.6585 + y: 53.0385 + z: 41.27 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 39.1 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_C5 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_C5 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap + position: + x: 94.6585 + y: 33.7585 + z: 41.27 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 39.1 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_D5 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_D5 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap + position: + x: 94.6585 + y: 14.4785 + z: 41.27 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 39.1 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_A6 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_A6 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap + position: + x: 114.5485 + y: 72.3185 + z: 41.27 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 39.1 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_B6 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_B6 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap + position: + x: 114.5485 + y: 53.0385 + z: 41.27 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 39.1 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_C6 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_C6 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap + position: + x: 114.5485 + y: 33.7585 + z: 41.27 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.223 + size_y: 6.223 + size_z: 39.1 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_D6 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_D6 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap + position: + x: 114.5485 + y: 14.4785 + z: 41.27 + sample_id: null + type: container + description: Opentrons 24 tuberack eppendorf 2ml safelock snapcap + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/tube_racks.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic: + category: + - tube_racks + class: + module: pylabrobot.resources.opentrons.tube_racks:opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic + type: pylabrobot + config_info: + - children: + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_A1 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_B1 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_C1 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_D1 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_A2 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_B2 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_C2 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_D2 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_A3 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_B3 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_C3 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_D3 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_A4 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_B4 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_C4 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_D4 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_A5 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_B5 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_C5 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_D5 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_A6 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_B6 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_C6 + - opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_D6 + class: '' + config: + barcode: null + category: null + model: Opentrons 24 Tube Rack (Acrylic) with Eppendorf 2 mL Safe-Lock Snapcap + ordering: + A1: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_A1 + B1: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_B1 + C1: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_C1 + D1: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_D1 + A2: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_A2 + B2: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_B2 + C2: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_C2 + D2: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_D2 + A3: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_A3 + B3: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_B3 + C3: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_C3 + D3: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_D3 + A4: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_A4 + B4: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_B4 + C4: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_C4 + D4: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_D4 + A5: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_A5 + B5: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_B5 + C5: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_C5 + D5: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_D5 + A6: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_A6 + B6: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_B6 + C6: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_C6 + D6: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_D6 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.76 + size_y: 85.48 + size_z: 52 + type: TubeRack + data: {} + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.0 + size_y: 7.0 + size_z: 38.58 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_A1 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_A1 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic + position: + x: 11.78 + y: 68.9 + z: 13.42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.0 + size_y: 7.0 + size_z: 38.58 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_B1 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_B1 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic + position: + x: 11.78 + y: 49.4 + z: 13.42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.0 + size_y: 7.0 + size_z: 38.58 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_C1 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_C1 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic + position: + x: 11.78 + y: 29.9 + z: 13.42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.0 + size_y: 7.0 + size_z: 38.58 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_D1 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_D1 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic + position: + x: 11.78 + y: 10.4 + z: 13.42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.0 + size_y: 7.0 + size_z: 38.58 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_A2 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_A2 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic + position: + x: 31.28 + y: 68.9 + z: 13.42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.0 + size_y: 7.0 + size_z: 38.58 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_B2 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_B2 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic + position: + x: 31.28 + y: 49.4 + z: 13.42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.0 + size_y: 7.0 + size_z: 38.58 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_C2 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_C2 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic + position: + x: 31.28 + y: 29.9 + z: 13.42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.0 + size_y: 7.0 + size_z: 38.58 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_D2 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_D2 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic + position: + x: 31.28 + y: 10.4 + z: 13.42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.0 + size_y: 7.0 + size_z: 38.58 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_A3 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_A3 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic + position: + x: 50.78 + y: 68.9 + z: 13.42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.0 + size_y: 7.0 + size_z: 38.58 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_B3 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_B3 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic + position: + x: 50.78 + y: 49.4 + z: 13.42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.0 + size_y: 7.0 + size_z: 38.58 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_C3 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_C3 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic + position: + x: 50.78 + y: 29.9 + z: 13.42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.0 + size_y: 7.0 + size_z: 38.58 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_D3 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_D3 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic + position: + x: 50.78 + y: 10.4 + z: 13.42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.0 + size_y: 7.0 + size_z: 38.58 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_A4 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_A4 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic + position: + x: 70.28 + y: 68.9 + z: 13.42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.0 + size_y: 7.0 + size_z: 38.58 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_B4 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_B4 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic + position: + x: 70.28 + y: 49.4 + z: 13.42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.0 + size_y: 7.0 + size_z: 38.58 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_C4 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_C4 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic + position: + x: 70.28 + y: 29.9 + z: 13.42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.0 + size_y: 7.0 + size_z: 38.58 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_D4 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_D4 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic + position: + x: 70.28 + y: 10.4 + z: 13.42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.0 + size_y: 7.0 + size_z: 38.58 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_A5 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_A5 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic + position: + x: 89.78 + y: 68.9 + z: 13.42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.0 + size_y: 7.0 + size_z: 38.58 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_B5 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_B5 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic + position: + x: 89.78 + y: 49.4 + z: 13.42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.0 + size_y: 7.0 + size_z: 38.58 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_C5 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_C5 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic + position: + x: 89.78 + y: 29.9 + z: 13.42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.0 + size_y: 7.0 + size_z: 38.58 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_D5 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_D5 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic + position: + x: 89.78 + y: 10.4 + z: 13.42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.0 + size_y: 7.0 + size_z: 38.58 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_A6 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_A6 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic + position: + x: 109.28 + y: 68.9 + z: 13.42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.0 + size_y: 7.0 + size_z: 38.58 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_B6 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_B6 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic + position: + x: 109.28 + y: 49.4 + z: 13.42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.0 + size_y: 7.0 + size_z: 38.58 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_C6 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_C6 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic + position: + x: 109.28 + y: 29.9 + z: 13.42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.0 + size_y: 7.0 + size_z: 38.58 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_D6 + name: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic_D6 + parent: opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap_acrylic + position: + x: 109.28 + y: 10.4 + z: 13.42 + sample_id: null + type: container + description: Opentrons 24 tuberack eppendorf 2ml safelock snapcap acrylic + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/tube_racks.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic: + category: + - tube_racks + class: + module: pylabrobot.resources.opentrons.tube_racks:opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic + type: pylabrobot + config_info: + - children: + - opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_A1 + - opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_B1 + - opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_C1 + - opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_D1 + - opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_A2 + - opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_B2 + - opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_C2 + - opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_D2 + - opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_A3 + - opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_B3 + - opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_C3 + - opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_D3 + - opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_A4 + - opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_B4 + - opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_C4 + - opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_D4 + - opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_A5 + - opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_B5 + - opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_C5 + - opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_D5 + - opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_A6 + - opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_B6 + - opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_C6 + - opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_D6 + class: '' + config: + barcode: null + category: null + model: Opentrons 24 Tube Rack (Acrylic) with Generic 0.75 mL Snapcap + ordering: + A1: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_A1 + B1: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_B1 + C1: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_C1 + D1: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_D1 + A2: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_A2 + B2: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_B2 + C2: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_C2 + D2: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_D2 + A3: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_A3 + B3: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_B3 + C3: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_C3 + D3: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_D3 + A4: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_A4 + B4: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_B4 + C4: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_C4 + D4: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_D4 + A5: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_A5 + B5: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_B5 + C5: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_C5 + D5: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_D5 + A6: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_A6 + B6: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_B6 + C6: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_C6 + D6: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_D6 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.76 + size_y: 85.48 + size_z: 55 + type: TubeRack + data: {} + id: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic + name: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 750 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 20 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_A1 + name: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_A1 + parent: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic + position: + x: 14.6385 + y: 68.4985 + z: 35 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 750 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 20 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_B1 + name: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_B1 + parent: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic + position: + x: 14.6385 + y: 48.9385 + z: 35 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 750 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 20 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_C1 + name: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_C1 + parent: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic + position: + x: 14.6385 + y: 29.3785 + z: 35 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 750 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 20 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_D1 + name: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_D1 + parent: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic + position: + x: 14.6385 + y: 9.8185 + z: 35 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 750 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 20 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_A2 + name: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_A2 + parent: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic + position: + x: 34.1985 + y: 68.4985 + z: 35 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 750 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 20 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_B2 + name: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_B2 + parent: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic + position: + x: 34.1985 + y: 48.9385 + z: 35 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 750 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 20 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_C2 + name: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_C2 + parent: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic + position: + x: 34.1985 + y: 29.3785 + z: 35 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 750 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 20 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_D2 + name: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_D2 + parent: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic + position: + x: 34.1985 + y: 9.8185 + z: 35 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 750 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 20 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_A3 + name: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_A3 + parent: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic + position: + x: 53.7585 + y: 68.4985 + z: 35 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 750 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 20 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_B3 + name: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_B3 + parent: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic + position: + x: 53.7585 + y: 48.9385 + z: 35 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 750 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 20 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_C3 + name: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_C3 + parent: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic + position: + x: 53.7585 + y: 29.3785 + z: 35 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 750 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 20 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_D3 + name: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_D3 + parent: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic + position: + x: 53.7585 + y: 9.8185 + z: 35 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 750 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 20 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_A4 + name: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_A4 + parent: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic + position: + x: 73.3185 + y: 68.4985 + z: 35 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 750 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 20 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_B4 + name: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_B4 + parent: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic + position: + x: 73.3185 + y: 48.9385 + z: 35 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 750 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 20 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_C4 + name: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_C4 + parent: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic + position: + x: 73.3185 + y: 29.3785 + z: 35 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 750 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 20 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_D4 + name: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_D4 + parent: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic + position: + x: 73.3185 + y: 9.8185 + z: 35 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 750 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 20 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_A5 + name: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_A5 + parent: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic + position: + x: 92.8785 + y: 68.4985 + z: 35 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 750 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 20 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_B5 + name: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_B5 + parent: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic + position: + x: 92.8785 + y: 48.9385 + z: 35 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 750 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 20 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_C5 + name: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_C5 + parent: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic + position: + x: 92.8785 + y: 29.3785 + z: 35 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 750 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 20 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_D5 + name: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_D5 + parent: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic + position: + x: 92.8785 + y: 9.8185 + z: 35 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 750 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 20 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_A6 + name: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_A6 + parent: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic + position: + x: 112.4385 + y: 68.4985 + z: 35 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 750 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 20 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_B6 + name: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_B6 + parent: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic + position: + x: 112.4385 + y: 48.9385 + z: 35 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 750 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 20 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_C6 + name: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_C6 + parent: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic + position: + x: 112.4385 + y: 29.3785 + z: 35 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 750 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 4.243 + size_y: 4.243 + size_z: 20 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_D6 + name: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic_D6 + parent: opentrons_24_tuberack_generic_0point75ml_snapcap_acrylic + position: + x: 112.4385 + y: 9.8185 + z: 35 + sample_id: null + type: container + description: Opentrons 24 tuberack generic 0.75ml snapcap acrylic + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/tube_racks.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +opentrons_24_tuberack_generic_2ml_screwcap: + category: + - tube_racks + class: + module: pylabrobot.resources.opentrons.tube_racks:opentrons_24_tuberack_generic_2ml_screwcap + type: pylabrobot + config_info: + - children: + - opentrons_24_tuberack_generic_2ml_screwcap_A1 + - opentrons_24_tuberack_generic_2ml_screwcap_B1 + - opentrons_24_tuberack_generic_2ml_screwcap_C1 + - opentrons_24_tuberack_generic_2ml_screwcap_D1 + - opentrons_24_tuberack_generic_2ml_screwcap_A2 + - opentrons_24_tuberack_generic_2ml_screwcap_B2 + - opentrons_24_tuberack_generic_2ml_screwcap_C2 + - opentrons_24_tuberack_generic_2ml_screwcap_D2 + - opentrons_24_tuberack_generic_2ml_screwcap_A3 + - opentrons_24_tuberack_generic_2ml_screwcap_B3 + - opentrons_24_tuberack_generic_2ml_screwcap_C3 + - opentrons_24_tuberack_generic_2ml_screwcap_D3 + - opentrons_24_tuberack_generic_2ml_screwcap_A4 + - opentrons_24_tuberack_generic_2ml_screwcap_B4 + - opentrons_24_tuberack_generic_2ml_screwcap_C4 + - opentrons_24_tuberack_generic_2ml_screwcap_D4 + - opentrons_24_tuberack_generic_2ml_screwcap_A5 + - opentrons_24_tuberack_generic_2ml_screwcap_B5 + - opentrons_24_tuberack_generic_2ml_screwcap_C5 + - opentrons_24_tuberack_generic_2ml_screwcap_D5 + - opentrons_24_tuberack_generic_2ml_screwcap_A6 + - opentrons_24_tuberack_generic_2ml_screwcap_B6 + - opentrons_24_tuberack_generic_2ml_screwcap_C6 + - opentrons_24_tuberack_generic_2ml_screwcap_D6 + class: '' + config: + barcode: null + category: null + model: Opentrons 24 Tube Rack with Generic 2 mL Screwcap + ordering: + A1: opentrons_24_tuberack_generic_2ml_screwcap_A1 + B1: opentrons_24_tuberack_generic_2ml_screwcap_B1 + C1: opentrons_24_tuberack_generic_2ml_screwcap_C1 + D1: opentrons_24_tuberack_generic_2ml_screwcap_D1 + A2: opentrons_24_tuberack_generic_2ml_screwcap_A2 + B2: opentrons_24_tuberack_generic_2ml_screwcap_B2 + C2: opentrons_24_tuberack_generic_2ml_screwcap_C2 + D2: opentrons_24_tuberack_generic_2ml_screwcap_D2 + A3: opentrons_24_tuberack_generic_2ml_screwcap_A3 + B3: opentrons_24_tuberack_generic_2ml_screwcap_B3 + C3: opentrons_24_tuberack_generic_2ml_screwcap_C3 + D3: opentrons_24_tuberack_generic_2ml_screwcap_D3 + A4: opentrons_24_tuberack_generic_2ml_screwcap_A4 + B4: opentrons_24_tuberack_generic_2ml_screwcap_B4 + C4: opentrons_24_tuberack_generic_2ml_screwcap_C4 + D4: opentrons_24_tuberack_generic_2ml_screwcap_D4 + A5: opentrons_24_tuberack_generic_2ml_screwcap_A5 + B5: opentrons_24_tuberack_generic_2ml_screwcap_B5 + C5: opentrons_24_tuberack_generic_2ml_screwcap_C5 + D5: opentrons_24_tuberack_generic_2ml_screwcap_D5 + A6: opentrons_24_tuberack_generic_2ml_screwcap_A6 + B6: opentrons_24_tuberack_generic_2ml_screwcap_B6 + C6: opentrons_24_tuberack_generic_2ml_screwcap_C6 + D6: opentrons_24_tuberack_generic_2ml_screwcap_D6 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.75 + size_y: 85.5 + size_z: 84 + type: TubeRack + data: {} + id: opentrons_24_tuberack_generic_2ml_screwcap + name: opentrons_24_tuberack_generic_2ml_screwcap + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_2ml_screwcap_A1 + name: opentrons_24_tuberack_generic_2ml_screwcap_A1 + parent: opentrons_24_tuberack_generic_2ml_screwcap + position: + x: 15.205 + y: 72.425 + z: 42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_2ml_screwcap_B1 + name: opentrons_24_tuberack_generic_2ml_screwcap_B1 + parent: opentrons_24_tuberack_generic_2ml_screwcap + position: + x: 15.205 + y: 53.145 + z: 42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_2ml_screwcap_C1 + name: opentrons_24_tuberack_generic_2ml_screwcap_C1 + parent: opentrons_24_tuberack_generic_2ml_screwcap + position: + x: 15.205 + y: 33.865 + z: 42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_2ml_screwcap_D1 + name: opentrons_24_tuberack_generic_2ml_screwcap_D1 + parent: opentrons_24_tuberack_generic_2ml_screwcap + position: + x: 15.205 + y: 14.585 + z: 42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_2ml_screwcap_A2 + name: opentrons_24_tuberack_generic_2ml_screwcap_A2 + parent: opentrons_24_tuberack_generic_2ml_screwcap + position: + x: 35.095 + y: 72.425 + z: 42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_2ml_screwcap_B2 + name: opentrons_24_tuberack_generic_2ml_screwcap_B2 + parent: opentrons_24_tuberack_generic_2ml_screwcap + position: + x: 35.095 + y: 53.145 + z: 42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_2ml_screwcap_C2 + name: opentrons_24_tuberack_generic_2ml_screwcap_C2 + parent: opentrons_24_tuberack_generic_2ml_screwcap + position: + x: 35.095 + y: 33.865 + z: 42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_2ml_screwcap_D2 + name: opentrons_24_tuberack_generic_2ml_screwcap_D2 + parent: opentrons_24_tuberack_generic_2ml_screwcap + position: + x: 35.095 + y: 14.585 + z: 42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_2ml_screwcap_A3 + name: opentrons_24_tuberack_generic_2ml_screwcap_A3 + parent: opentrons_24_tuberack_generic_2ml_screwcap + position: + x: 54.985 + y: 72.425 + z: 42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_2ml_screwcap_B3 + name: opentrons_24_tuberack_generic_2ml_screwcap_B3 + parent: opentrons_24_tuberack_generic_2ml_screwcap + position: + x: 54.985 + y: 53.145 + z: 42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_2ml_screwcap_C3 + name: opentrons_24_tuberack_generic_2ml_screwcap_C3 + parent: opentrons_24_tuberack_generic_2ml_screwcap + position: + x: 54.985 + y: 33.865 + z: 42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_2ml_screwcap_D3 + name: opentrons_24_tuberack_generic_2ml_screwcap_D3 + parent: opentrons_24_tuberack_generic_2ml_screwcap + position: + x: 54.985 + y: 14.585 + z: 42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_2ml_screwcap_A4 + name: opentrons_24_tuberack_generic_2ml_screwcap_A4 + parent: opentrons_24_tuberack_generic_2ml_screwcap + position: + x: 74.875 + y: 72.425 + z: 42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_2ml_screwcap_B4 + name: opentrons_24_tuberack_generic_2ml_screwcap_B4 + parent: opentrons_24_tuberack_generic_2ml_screwcap + position: + x: 74.875 + y: 53.145 + z: 42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_2ml_screwcap_C4 + name: opentrons_24_tuberack_generic_2ml_screwcap_C4 + parent: opentrons_24_tuberack_generic_2ml_screwcap + position: + x: 74.875 + y: 33.865 + z: 42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_2ml_screwcap_D4 + name: opentrons_24_tuberack_generic_2ml_screwcap_D4 + parent: opentrons_24_tuberack_generic_2ml_screwcap + position: + x: 74.875 + y: 14.585 + z: 42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_2ml_screwcap_A5 + name: opentrons_24_tuberack_generic_2ml_screwcap_A5 + parent: opentrons_24_tuberack_generic_2ml_screwcap + position: + x: 94.765 + y: 72.425 + z: 42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_2ml_screwcap_B5 + name: opentrons_24_tuberack_generic_2ml_screwcap_B5 + parent: opentrons_24_tuberack_generic_2ml_screwcap + position: + x: 94.765 + y: 53.145 + z: 42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_2ml_screwcap_C5 + name: opentrons_24_tuberack_generic_2ml_screwcap_C5 + parent: opentrons_24_tuberack_generic_2ml_screwcap + position: + x: 94.765 + y: 33.865 + z: 42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_2ml_screwcap_D5 + name: opentrons_24_tuberack_generic_2ml_screwcap_D5 + parent: opentrons_24_tuberack_generic_2ml_screwcap + position: + x: 94.765 + y: 14.585 + z: 42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_2ml_screwcap_A6 + name: opentrons_24_tuberack_generic_2ml_screwcap_A6 + parent: opentrons_24_tuberack_generic_2ml_screwcap + position: + x: 114.655 + y: 72.425 + z: 42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_2ml_screwcap_B6 + name: opentrons_24_tuberack_generic_2ml_screwcap_B6 + parent: opentrons_24_tuberack_generic_2ml_screwcap + position: + x: 114.655 + y: 53.145 + z: 42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_2ml_screwcap_C6 + name: opentrons_24_tuberack_generic_2ml_screwcap_C6 + parent: opentrons_24_tuberack_generic_2ml_screwcap + position: + x: 114.655 + y: 33.865 + z: 42 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.01 + size_y: 6.01 + size_z: 42 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_generic_2ml_screwcap_D6 + name: opentrons_24_tuberack_generic_2ml_screwcap_D6 + parent: opentrons_24_tuberack_generic_2ml_screwcap + position: + x: 114.655 + y: 14.585 + z: 42 + sample_id: null + type: container + description: Opentrons 24 tuberack generic 2ml screwcap + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/tube_racks.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +opentrons_24_tuberack_nest_0point5ml_screwcap: + category: + - tube_racks + class: + module: pylabrobot.resources.opentrons.tube_racks:opentrons_24_tuberack_nest_0point5ml_screwcap + type: pylabrobot + config_info: + - children: + - opentrons_24_tuberack_nest_0point5ml_screwcap_A1 + - opentrons_24_tuberack_nest_0point5ml_screwcap_B1 + - opentrons_24_tuberack_nest_0point5ml_screwcap_C1 + - opentrons_24_tuberack_nest_0point5ml_screwcap_D1 + - opentrons_24_tuberack_nest_0point5ml_screwcap_A2 + - opentrons_24_tuberack_nest_0point5ml_screwcap_B2 + - opentrons_24_tuberack_nest_0point5ml_screwcap_C2 + - opentrons_24_tuberack_nest_0point5ml_screwcap_D2 + - opentrons_24_tuberack_nest_0point5ml_screwcap_A3 + - opentrons_24_tuberack_nest_0point5ml_screwcap_B3 + - opentrons_24_tuberack_nest_0point5ml_screwcap_C3 + - opentrons_24_tuberack_nest_0point5ml_screwcap_D3 + - opentrons_24_tuberack_nest_0point5ml_screwcap_A4 + - opentrons_24_tuberack_nest_0point5ml_screwcap_B4 + - opentrons_24_tuberack_nest_0point5ml_screwcap_C4 + - opentrons_24_tuberack_nest_0point5ml_screwcap_D4 + - opentrons_24_tuberack_nest_0point5ml_screwcap_A5 + - opentrons_24_tuberack_nest_0point5ml_screwcap_B5 + - opentrons_24_tuberack_nest_0point5ml_screwcap_C5 + - opentrons_24_tuberack_nest_0point5ml_screwcap_D5 + - opentrons_24_tuberack_nest_0point5ml_screwcap_A6 + - opentrons_24_tuberack_nest_0point5ml_screwcap_B6 + - opentrons_24_tuberack_nest_0point5ml_screwcap_C6 + - opentrons_24_tuberack_nest_0point5ml_screwcap_D6 + class: '' + config: + barcode: null + category: null + model: Opentrons 24 Tube Rack with NEST 0.5 mL Screwcap + ordering: + A1: opentrons_24_tuberack_nest_0point5ml_screwcap_A1 + B1: opentrons_24_tuberack_nest_0point5ml_screwcap_B1 + C1: opentrons_24_tuberack_nest_0point5ml_screwcap_C1 + D1: opentrons_24_tuberack_nest_0point5ml_screwcap_D1 + A2: opentrons_24_tuberack_nest_0point5ml_screwcap_A2 + B2: opentrons_24_tuberack_nest_0point5ml_screwcap_B2 + C2: opentrons_24_tuberack_nest_0point5ml_screwcap_C2 + D2: opentrons_24_tuberack_nest_0point5ml_screwcap_D2 + A3: opentrons_24_tuberack_nest_0point5ml_screwcap_A3 + B3: opentrons_24_tuberack_nest_0point5ml_screwcap_B3 + C3: opentrons_24_tuberack_nest_0point5ml_screwcap_C3 + D3: opentrons_24_tuberack_nest_0point5ml_screwcap_D3 + A4: opentrons_24_tuberack_nest_0point5ml_screwcap_A4 + B4: opentrons_24_tuberack_nest_0point5ml_screwcap_B4 + C4: opentrons_24_tuberack_nest_0point5ml_screwcap_C4 + D4: opentrons_24_tuberack_nest_0point5ml_screwcap_D4 + A5: opentrons_24_tuberack_nest_0point5ml_screwcap_A5 + B5: opentrons_24_tuberack_nest_0point5ml_screwcap_B5 + C5: opentrons_24_tuberack_nest_0point5ml_screwcap_C5 + D5: opentrons_24_tuberack_nest_0point5ml_screwcap_D5 + A6: opentrons_24_tuberack_nest_0point5ml_screwcap_A6 + B6: opentrons_24_tuberack_nest_0point5ml_screwcap_B6 + C6: opentrons_24_tuberack_nest_0point5ml_screwcap_C6 + D6: opentrons_24_tuberack_nest_0point5ml_screwcap_D6 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.75 + size_y: 85.5 + size_z: 85.2 + type: TubeRack + data: {} + id: opentrons_24_tuberack_nest_0point5ml_screwcap + name: opentrons_24_tuberack_nest_0point5ml_screwcap + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 25.2 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_0point5ml_screwcap_A1 + name: opentrons_24_tuberack_nest_0point5ml_screwcap_A1 + parent: opentrons_24_tuberack_nest_0point5ml_screwcap + position: + x: 15.1375 + y: 72.3575 + z: 60 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 25.2 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_0point5ml_screwcap_B1 + name: opentrons_24_tuberack_nest_0point5ml_screwcap_B1 + parent: opentrons_24_tuberack_nest_0point5ml_screwcap + position: + x: 15.1375 + y: 53.0775 + z: 60 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 25.2 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_0point5ml_screwcap_C1 + name: opentrons_24_tuberack_nest_0point5ml_screwcap_C1 + parent: opentrons_24_tuberack_nest_0point5ml_screwcap + position: + x: 15.1375 + y: 33.7975 + z: 60 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 25.2 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_0point5ml_screwcap_D1 + name: opentrons_24_tuberack_nest_0point5ml_screwcap_D1 + parent: opentrons_24_tuberack_nest_0point5ml_screwcap + position: + x: 15.1375 + y: 14.5175 + z: 60 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 25.2 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_0point5ml_screwcap_A2 + name: opentrons_24_tuberack_nest_0point5ml_screwcap_A2 + parent: opentrons_24_tuberack_nest_0point5ml_screwcap + position: + x: 35.0275 + y: 72.3575 + z: 60 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 25.2 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_0point5ml_screwcap_B2 + name: opentrons_24_tuberack_nest_0point5ml_screwcap_B2 + parent: opentrons_24_tuberack_nest_0point5ml_screwcap + position: + x: 35.0275 + y: 53.0775 + z: 60 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 25.2 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_0point5ml_screwcap_C2 + name: opentrons_24_tuberack_nest_0point5ml_screwcap_C2 + parent: opentrons_24_tuberack_nest_0point5ml_screwcap + position: + x: 35.0275 + y: 33.7975 + z: 60 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 25.2 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_0point5ml_screwcap_D2 + name: opentrons_24_tuberack_nest_0point5ml_screwcap_D2 + parent: opentrons_24_tuberack_nest_0point5ml_screwcap + position: + x: 35.0275 + y: 14.5175 + z: 60 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 25.2 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_0point5ml_screwcap_A3 + name: opentrons_24_tuberack_nest_0point5ml_screwcap_A3 + parent: opentrons_24_tuberack_nest_0point5ml_screwcap + position: + x: 54.9175 + y: 72.3575 + z: 60 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 25.2 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_0point5ml_screwcap_B3 + name: opentrons_24_tuberack_nest_0point5ml_screwcap_B3 + parent: opentrons_24_tuberack_nest_0point5ml_screwcap + position: + x: 54.9175 + y: 53.0775 + z: 60 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 25.2 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_0point5ml_screwcap_C3 + name: opentrons_24_tuberack_nest_0point5ml_screwcap_C3 + parent: opentrons_24_tuberack_nest_0point5ml_screwcap + position: + x: 54.9175 + y: 33.7975 + z: 60 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 25.2 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_0point5ml_screwcap_D3 + name: opentrons_24_tuberack_nest_0point5ml_screwcap_D3 + parent: opentrons_24_tuberack_nest_0point5ml_screwcap + position: + x: 54.9175 + y: 14.5175 + z: 60 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 25.2 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_0point5ml_screwcap_A4 + name: opentrons_24_tuberack_nest_0point5ml_screwcap_A4 + parent: opentrons_24_tuberack_nest_0point5ml_screwcap + position: + x: 74.8075 + y: 72.3575 + z: 60 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 25.2 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_0point5ml_screwcap_B4 + name: opentrons_24_tuberack_nest_0point5ml_screwcap_B4 + parent: opentrons_24_tuberack_nest_0point5ml_screwcap + position: + x: 74.8075 + y: 53.0775 + z: 60 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 25.2 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_0point5ml_screwcap_C4 + name: opentrons_24_tuberack_nest_0point5ml_screwcap_C4 + parent: opentrons_24_tuberack_nest_0point5ml_screwcap + position: + x: 74.8075 + y: 33.7975 + z: 60 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 25.2 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_0point5ml_screwcap_D4 + name: opentrons_24_tuberack_nest_0point5ml_screwcap_D4 + parent: opentrons_24_tuberack_nest_0point5ml_screwcap + position: + x: 74.8075 + y: 14.5175 + z: 60 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 25.2 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_0point5ml_screwcap_A5 + name: opentrons_24_tuberack_nest_0point5ml_screwcap_A5 + parent: opentrons_24_tuberack_nest_0point5ml_screwcap + position: + x: 94.6975 + y: 72.3575 + z: 60 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 25.2 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_0point5ml_screwcap_B5 + name: opentrons_24_tuberack_nest_0point5ml_screwcap_B5 + parent: opentrons_24_tuberack_nest_0point5ml_screwcap + position: + x: 94.6975 + y: 53.0775 + z: 60 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 25.2 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_0point5ml_screwcap_C5 + name: opentrons_24_tuberack_nest_0point5ml_screwcap_C5 + parent: opentrons_24_tuberack_nest_0point5ml_screwcap + position: + x: 94.6975 + y: 33.7975 + z: 60 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 25.2 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_0point5ml_screwcap_D5 + name: opentrons_24_tuberack_nest_0point5ml_screwcap_D5 + parent: opentrons_24_tuberack_nest_0point5ml_screwcap + position: + x: 94.6975 + y: 14.5175 + z: 60 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 25.2 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_0point5ml_screwcap_A6 + name: opentrons_24_tuberack_nest_0point5ml_screwcap_A6 + parent: opentrons_24_tuberack_nest_0point5ml_screwcap + position: + x: 114.5875 + y: 72.3575 + z: 60 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 25.2 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_0point5ml_screwcap_B6 + name: opentrons_24_tuberack_nest_0point5ml_screwcap_B6 + parent: opentrons_24_tuberack_nest_0point5ml_screwcap + position: + x: 114.5875 + y: 53.0775 + z: 60 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 25.2 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_0point5ml_screwcap_C6 + name: opentrons_24_tuberack_nest_0point5ml_screwcap_C6 + parent: opentrons_24_tuberack_nest_0point5ml_screwcap + position: + x: 114.5875 + y: 33.7975 + z: 60 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 25.2 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_0point5ml_screwcap_D6 + name: opentrons_24_tuberack_nest_0point5ml_screwcap_D6 + parent: opentrons_24_tuberack_nest_0point5ml_screwcap + position: + x: 114.5875 + y: 14.5175 + z: 60 + sample_id: null + type: container + description: Opentrons 24 tuberack nest 0.5ml screwcap + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/tube_racks.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +opentrons_24_tuberack_nest_1point5ml_screwcap: + category: + - tube_racks + class: + module: pylabrobot.resources.opentrons.tube_racks:opentrons_24_tuberack_nest_1point5ml_screwcap + type: pylabrobot + config_info: + - children: + - opentrons_24_tuberack_nest_1point5ml_screwcap_A1 + - opentrons_24_tuberack_nest_1point5ml_screwcap_B1 + - opentrons_24_tuberack_nest_1point5ml_screwcap_C1 + - opentrons_24_tuberack_nest_1point5ml_screwcap_D1 + - opentrons_24_tuberack_nest_1point5ml_screwcap_A2 + - opentrons_24_tuberack_nest_1point5ml_screwcap_B2 + - opentrons_24_tuberack_nest_1point5ml_screwcap_C2 + - opentrons_24_tuberack_nest_1point5ml_screwcap_D2 + - opentrons_24_tuberack_nest_1point5ml_screwcap_A3 + - opentrons_24_tuberack_nest_1point5ml_screwcap_B3 + - opentrons_24_tuberack_nest_1point5ml_screwcap_C3 + - opentrons_24_tuberack_nest_1point5ml_screwcap_D3 + - opentrons_24_tuberack_nest_1point5ml_screwcap_A4 + - opentrons_24_tuberack_nest_1point5ml_screwcap_B4 + - opentrons_24_tuberack_nest_1point5ml_screwcap_C4 + - opentrons_24_tuberack_nest_1point5ml_screwcap_D4 + - opentrons_24_tuberack_nest_1point5ml_screwcap_A5 + - opentrons_24_tuberack_nest_1point5ml_screwcap_B5 + - opentrons_24_tuberack_nest_1point5ml_screwcap_C5 + - opentrons_24_tuberack_nest_1point5ml_screwcap_D5 + - opentrons_24_tuberack_nest_1point5ml_screwcap_A6 + - opentrons_24_tuberack_nest_1point5ml_screwcap_B6 + - opentrons_24_tuberack_nest_1point5ml_screwcap_C6 + - opentrons_24_tuberack_nest_1point5ml_screwcap_D6 + class: '' + config: + barcode: null + category: null + model: Opentrons 24 Tube Rack with NEST 1.5 mL Screwcap + ordering: + A1: opentrons_24_tuberack_nest_1point5ml_screwcap_A1 + B1: opentrons_24_tuberack_nest_1point5ml_screwcap_B1 + C1: opentrons_24_tuberack_nest_1point5ml_screwcap_C1 + D1: opentrons_24_tuberack_nest_1point5ml_screwcap_D1 + A2: opentrons_24_tuberack_nest_1point5ml_screwcap_A2 + B2: opentrons_24_tuberack_nest_1point5ml_screwcap_B2 + C2: opentrons_24_tuberack_nest_1point5ml_screwcap_C2 + D2: opentrons_24_tuberack_nest_1point5ml_screwcap_D2 + A3: opentrons_24_tuberack_nest_1point5ml_screwcap_A3 + B3: opentrons_24_tuberack_nest_1point5ml_screwcap_B3 + C3: opentrons_24_tuberack_nest_1point5ml_screwcap_C3 + D3: opentrons_24_tuberack_nest_1point5ml_screwcap_D3 + A4: opentrons_24_tuberack_nest_1point5ml_screwcap_A4 + B4: opentrons_24_tuberack_nest_1point5ml_screwcap_B4 + C4: opentrons_24_tuberack_nest_1point5ml_screwcap_C4 + D4: opentrons_24_tuberack_nest_1point5ml_screwcap_D4 + A5: opentrons_24_tuberack_nest_1point5ml_screwcap_A5 + B5: opentrons_24_tuberack_nest_1point5ml_screwcap_B5 + C5: opentrons_24_tuberack_nest_1point5ml_screwcap_C5 + D5: opentrons_24_tuberack_nest_1point5ml_screwcap_D5 + A6: opentrons_24_tuberack_nest_1point5ml_screwcap_A6 + B6: opentrons_24_tuberack_nest_1point5ml_screwcap_B6 + C6: opentrons_24_tuberack_nest_1point5ml_screwcap_C6 + D6: opentrons_24_tuberack_nest_1point5ml_screwcap_D6 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.75 + size_y: 85.5 + size_z: 85.2 + type: TubeRack + data: {} + id: opentrons_24_tuberack_nest_1point5ml_screwcap + name: opentrons_24_tuberack_nest_1point5ml_screwcap + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 43.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_screwcap_A1 + name: opentrons_24_tuberack_nest_1point5ml_screwcap_A1 + parent: opentrons_24_tuberack_nest_1point5ml_screwcap + position: + x: 15.1375 + y: 72.3575 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 43.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_screwcap_B1 + name: opentrons_24_tuberack_nest_1point5ml_screwcap_B1 + parent: opentrons_24_tuberack_nest_1point5ml_screwcap + position: + x: 15.1375 + y: 53.0775 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 43.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_screwcap_C1 + name: opentrons_24_tuberack_nest_1point5ml_screwcap_C1 + parent: opentrons_24_tuberack_nest_1point5ml_screwcap + position: + x: 15.1375 + y: 33.7975 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 43.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_screwcap_D1 + name: opentrons_24_tuberack_nest_1point5ml_screwcap_D1 + parent: opentrons_24_tuberack_nest_1point5ml_screwcap + position: + x: 15.1375 + y: 14.5175 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 43.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_screwcap_A2 + name: opentrons_24_tuberack_nest_1point5ml_screwcap_A2 + parent: opentrons_24_tuberack_nest_1point5ml_screwcap + position: + x: 35.0275 + y: 72.3575 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 43.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_screwcap_B2 + name: opentrons_24_tuberack_nest_1point5ml_screwcap_B2 + parent: opentrons_24_tuberack_nest_1point5ml_screwcap + position: + x: 35.0275 + y: 53.0775 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 43.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_screwcap_C2 + name: opentrons_24_tuberack_nest_1point5ml_screwcap_C2 + parent: opentrons_24_tuberack_nest_1point5ml_screwcap + position: + x: 35.0275 + y: 33.7975 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 43.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_screwcap_D2 + name: opentrons_24_tuberack_nest_1point5ml_screwcap_D2 + parent: opentrons_24_tuberack_nest_1point5ml_screwcap + position: + x: 35.0275 + y: 14.5175 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 43.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_screwcap_A3 + name: opentrons_24_tuberack_nest_1point5ml_screwcap_A3 + parent: opentrons_24_tuberack_nest_1point5ml_screwcap + position: + x: 54.9175 + y: 72.3575 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 43.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_screwcap_B3 + name: opentrons_24_tuberack_nest_1point5ml_screwcap_B3 + parent: opentrons_24_tuberack_nest_1point5ml_screwcap + position: + x: 54.9175 + y: 53.0775 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 43.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_screwcap_C3 + name: opentrons_24_tuberack_nest_1point5ml_screwcap_C3 + parent: opentrons_24_tuberack_nest_1point5ml_screwcap + position: + x: 54.9175 + y: 33.7975 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 43.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_screwcap_D3 + name: opentrons_24_tuberack_nest_1point5ml_screwcap_D3 + parent: opentrons_24_tuberack_nest_1point5ml_screwcap + position: + x: 54.9175 + y: 14.5175 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 43.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_screwcap_A4 + name: opentrons_24_tuberack_nest_1point5ml_screwcap_A4 + parent: opentrons_24_tuberack_nest_1point5ml_screwcap + position: + x: 74.8075 + y: 72.3575 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 43.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_screwcap_B4 + name: opentrons_24_tuberack_nest_1point5ml_screwcap_B4 + parent: opentrons_24_tuberack_nest_1point5ml_screwcap + position: + x: 74.8075 + y: 53.0775 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 43.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_screwcap_C4 + name: opentrons_24_tuberack_nest_1point5ml_screwcap_C4 + parent: opentrons_24_tuberack_nest_1point5ml_screwcap + position: + x: 74.8075 + y: 33.7975 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 43.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_screwcap_D4 + name: opentrons_24_tuberack_nest_1point5ml_screwcap_D4 + parent: opentrons_24_tuberack_nest_1point5ml_screwcap + position: + x: 74.8075 + y: 14.5175 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 43.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_screwcap_A5 + name: opentrons_24_tuberack_nest_1point5ml_screwcap_A5 + parent: opentrons_24_tuberack_nest_1point5ml_screwcap + position: + x: 94.6975 + y: 72.3575 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 43.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_screwcap_B5 + name: opentrons_24_tuberack_nest_1point5ml_screwcap_B5 + parent: opentrons_24_tuberack_nest_1point5ml_screwcap + position: + x: 94.6975 + y: 53.0775 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 43.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_screwcap_C5 + name: opentrons_24_tuberack_nest_1point5ml_screwcap_C5 + parent: opentrons_24_tuberack_nest_1point5ml_screwcap + position: + x: 94.6975 + y: 33.7975 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 43.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_screwcap_D5 + name: opentrons_24_tuberack_nest_1point5ml_screwcap_D5 + parent: opentrons_24_tuberack_nest_1point5ml_screwcap + position: + x: 94.6975 + y: 14.5175 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 43.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_screwcap_A6 + name: opentrons_24_tuberack_nest_1point5ml_screwcap_A6 + parent: opentrons_24_tuberack_nest_1point5ml_screwcap + position: + x: 114.5875 + y: 72.3575 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 43.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_screwcap_B6 + name: opentrons_24_tuberack_nest_1point5ml_screwcap_B6 + parent: opentrons_24_tuberack_nest_1point5ml_screwcap + position: + x: 114.5875 + y: 53.0775 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 43.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_screwcap_C6 + name: opentrons_24_tuberack_nest_1point5ml_screwcap_C6 + parent: opentrons_24_tuberack_nest_1point5ml_screwcap + position: + x: 114.5875 + y: 33.7975 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 43.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_screwcap_D6 + name: opentrons_24_tuberack_nest_1point5ml_screwcap_D6 + parent: opentrons_24_tuberack_nest_1point5ml_screwcap + position: + x: 114.5875 + y: 14.5175 + z: 41.3 + sample_id: null + type: container + description: Opentrons 24 tuberack nest 1.5ml screwcap + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/tube_racks.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +opentrons_24_tuberack_nest_1point5ml_snapcap: + category: + - tube_racks + class: + module: pylabrobot.resources.opentrons.tube_racks:opentrons_24_tuberack_nest_1point5ml_snapcap + type: pylabrobot + config_info: + - children: + - opentrons_24_tuberack_nest_1point5ml_snapcap_A1 + - opentrons_24_tuberack_nest_1point5ml_snapcap_B1 + - opentrons_24_tuberack_nest_1point5ml_snapcap_C1 + - opentrons_24_tuberack_nest_1point5ml_snapcap_D1 + - opentrons_24_tuberack_nest_1point5ml_snapcap_A2 + - opentrons_24_tuberack_nest_1point5ml_snapcap_B2 + - opentrons_24_tuberack_nest_1point5ml_snapcap_C2 + - opentrons_24_tuberack_nest_1point5ml_snapcap_D2 + - opentrons_24_tuberack_nest_1point5ml_snapcap_A3 + - opentrons_24_tuberack_nest_1point5ml_snapcap_B3 + - opentrons_24_tuberack_nest_1point5ml_snapcap_C3 + - opentrons_24_tuberack_nest_1point5ml_snapcap_D3 + - opentrons_24_tuberack_nest_1point5ml_snapcap_A4 + - opentrons_24_tuberack_nest_1point5ml_snapcap_B4 + - opentrons_24_tuberack_nest_1point5ml_snapcap_C4 + - opentrons_24_tuberack_nest_1point5ml_snapcap_D4 + - opentrons_24_tuberack_nest_1point5ml_snapcap_A5 + - opentrons_24_tuberack_nest_1point5ml_snapcap_B5 + - opentrons_24_tuberack_nest_1point5ml_snapcap_C5 + - opentrons_24_tuberack_nest_1point5ml_snapcap_D5 + - opentrons_24_tuberack_nest_1point5ml_snapcap_A6 + - opentrons_24_tuberack_nest_1point5ml_snapcap_B6 + - opentrons_24_tuberack_nest_1point5ml_snapcap_C6 + - opentrons_24_tuberack_nest_1point5ml_snapcap_D6 + class: '' + config: + barcode: null + category: null + model: Opentrons 24 Tube Rack with NEST 1.5 mL Snapcap + ordering: + A1: opentrons_24_tuberack_nest_1point5ml_snapcap_A1 + B1: opentrons_24_tuberack_nest_1point5ml_snapcap_B1 + C1: opentrons_24_tuberack_nest_1point5ml_snapcap_C1 + D1: opentrons_24_tuberack_nest_1point5ml_snapcap_D1 + A2: opentrons_24_tuberack_nest_1point5ml_snapcap_A2 + B2: opentrons_24_tuberack_nest_1point5ml_snapcap_B2 + C2: opentrons_24_tuberack_nest_1point5ml_snapcap_C2 + D2: opentrons_24_tuberack_nest_1point5ml_snapcap_D2 + A3: opentrons_24_tuberack_nest_1point5ml_snapcap_A3 + B3: opentrons_24_tuberack_nest_1point5ml_snapcap_B3 + C3: opentrons_24_tuberack_nest_1point5ml_snapcap_C3 + D3: opentrons_24_tuberack_nest_1point5ml_snapcap_D3 + A4: opentrons_24_tuberack_nest_1point5ml_snapcap_A4 + B4: opentrons_24_tuberack_nest_1point5ml_snapcap_B4 + C4: opentrons_24_tuberack_nest_1point5ml_snapcap_C4 + D4: opentrons_24_tuberack_nest_1point5ml_snapcap_D4 + A5: opentrons_24_tuberack_nest_1point5ml_snapcap_A5 + B5: opentrons_24_tuberack_nest_1point5ml_snapcap_B5 + C5: opentrons_24_tuberack_nest_1point5ml_snapcap_C5 + D5: opentrons_24_tuberack_nest_1point5ml_snapcap_D5 + A6: opentrons_24_tuberack_nest_1point5ml_snapcap_A6 + B6: opentrons_24_tuberack_nest_1point5ml_snapcap_B6 + C6: opentrons_24_tuberack_nest_1point5ml_snapcap_C6 + D6: opentrons_24_tuberack_nest_1point5ml_snapcap_D6 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.75 + size_y: 85.5 + size_z: 79.55 + type: TubeRack + data: {} + id: opentrons_24_tuberack_nest_1point5ml_snapcap + name: opentrons_24_tuberack_nest_1point5ml_snapcap + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_snapcap_A1 + name: opentrons_24_tuberack_nest_1point5ml_snapcap_A1 + parent: opentrons_24_tuberack_nest_1point5ml_snapcap + position: + x: 14.604 + y: 71.824 + z: 41.65 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_snapcap_B1 + name: opentrons_24_tuberack_nest_1point5ml_snapcap_B1 + parent: opentrons_24_tuberack_nest_1point5ml_snapcap + position: + x: 14.604 + y: 52.544 + z: 41.65 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_snapcap_C1 + name: opentrons_24_tuberack_nest_1point5ml_snapcap_C1 + parent: opentrons_24_tuberack_nest_1point5ml_snapcap + position: + x: 14.604 + y: 33.264 + z: 41.65 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_snapcap_D1 + name: opentrons_24_tuberack_nest_1point5ml_snapcap_D1 + parent: opentrons_24_tuberack_nest_1point5ml_snapcap + position: + x: 14.604 + y: 13.984 + z: 41.65 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_snapcap_A2 + name: opentrons_24_tuberack_nest_1point5ml_snapcap_A2 + parent: opentrons_24_tuberack_nest_1point5ml_snapcap + position: + x: 34.494 + y: 71.824 + z: 41.65 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_snapcap_B2 + name: opentrons_24_tuberack_nest_1point5ml_snapcap_B2 + parent: opentrons_24_tuberack_nest_1point5ml_snapcap + position: + x: 34.494 + y: 52.544 + z: 41.65 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_snapcap_C2 + name: opentrons_24_tuberack_nest_1point5ml_snapcap_C2 + parent: opentrons_24_tuberack_nest_1point5ml_snapcap + position: + x: 34.494 + y: 33.264 + z: 41.65 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_snapcap_D2 + name: opentrons_24_tuberack_nest_1point5ml_snapcap_D2 + parent: opentrons_24_tuberack_nest_1point5ml_snapcap + position: + x: 34.494 + y: 13.984 + z: 41.65 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_snapcap_A3 + name: opentrons_24_tuberack_nest_1point5ml_snapcap_A3 + parent: opentrons_24_tuberack_nest_1point5ml_snapcap + position: + x: 54.384 + y: 71.824 + z: 41.65 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_snapcap_B3 + name: opentrons_24_tuberack_nest_1point5ml_snapcap_B3 + parent: opentrons_24_tuberack_nest_1point5ml_snapcap + position: + x: 54.384 + y: 52.544 + z: 41.65 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_snapcap_C3 + name: opentrons_24_tuberack_nest_1point5ml_snapcap_C3 + parent: opentrons_24_tuberack_nest_1point5ml_snapcap + position: + x: 54.384 + y: 33.264 + z: 41.65 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_snapcap_D3 + name: opentrons_24_tuberack_nest_1point5ml_snapcap_D3 + parent: opentrons_24_tuberack_nest_1point5ml_snapcap + position: + x: 54.384 + y: 13.984 + z: 41.65 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_snapcap_A4 + name: opentrons_24_tuberack_nest_1point5ml_snapcap_A4 + parent: opentrons_24_tuberack_nest_1point5ml_snapcap + position: + x: 74.274 + y: 71.824 + z: 41.65 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_snapcap_B4 + name: opentrons_24_tuberack_nest_1point5ml_snapcap_B4 + parent: opentrons_24_tuberack_nest_1point5ml_snapcap + position: + x: 74.274 + y: 52.544 + z: 41.65 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_snapcap_C4 + name: opentrons_24_tuberack_nest_1point5ml_snapcap_C4 + parent: opentrons_24_tuberack_nest_1point5ml_snapcap + position: + x: 74.274 + y: 33.264 + z: 41.65 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_snapcap_D4 + name: opentrons_24_tuberack_nest_1point5ml_snapcap_D4 + parent: opentrons_24_tuberack_nest_1point5ml_snapcap + position: + x: 74.274 + y: 13.984 + z: 41.65 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_snapcap_A5 + name: opentrons_24_tuberack_nest_1point5ml_snapcap_A5 + parent: opentrons_24_tuberack_nest_1point5ml_snapcap + position: + x: 94.164 + y: 71.824 + z: 41.65 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_snapcap_B5 + name: opentrons_24_tuberack_nest_1point5ml_snapcap_B5 + parent: opentrons_24_tuberack_nest_1point5ml_snapcap + position: + x: 94.164 + y: 52.544 + z: 41.65 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_snapcap_C5 + name: opentrons_24_tuberack_nest_1point5ml_snapcap_C5 + parent: opentrons_24_tuberack_nest_1point5ml_snapcap + position: + x: 94.164 + y: 33.264 + z: 41.65 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_snapcap_D5 + name: opentrons_24_tuberack_nest_1point5ml_snapcap_D5 + parent: opentrons_24_tuberack_nest_1point5ml_snapcap + position: + x: 94.164 + y: 13.984 + z: 41.65 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_snapcap_A6 + name: opentrons_24_tuberack_nest_1point5ml_snapcap_A6 + parent: opentrons_24_tuberack_nest_1point5ml_snapcap + position: + x: 114.054 + y: 71.824 + z: 41.65 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_snapcap_B6 + name: opentrons_24_tuberack_nest_1point5ml_snapcap_B6 + parent: opentrons_24_tuberack_nest_1point5ml_snapcap + position: + x: 114.054 + y: 52.544 + z: 41.65 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_snapcap_C6 + name: opentrons_24_tuberack_nest_1point5ml_snapcap_C6 + parent: opentrons_24_tuberack_nest_1point5ml_snapcap + position: + x: 114.054 + y: 33.264 + z: 41.65 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 1500 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.212 + size_y: 7.212 + size_z: 37.9 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_1point5ml_snapcap_D6 + name: opentrons_24_tuberack_nest_1point5ml_snapcap_D6 + parent: opentrons_24_tuberack_nest_1point5ml_snapcap + position: + x: 114.054 + y: 13.984 + z: 41.65 + sample_id: null + type: container + description: Opentrons 24 tuberack nest 1.5ml snapcap + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/tube_racks.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +opentrons_24_tuberack_nest_2ml_screwcap: + category: + - tube_racks + class: + module: pylabrobot.resources.opentrons.tube_racks:opentrons_24_tuberack_nest_2ml_screwcap + type: pylabrobot + config_info: + - children: + - opentrons_24_tuberack_nest_2ml_screwcap_A1 + - opentrons_24_tuberack_nest_2ml_screwcap_B1 + - opentrons_24_tuberack_nest_2ml_screwcap_C1 + - opentrons_24_tuberack_nest_2ml_screwcap_D1 + - opentrons_24_tuberack_nest_2ml_screwcap_A2 + - opentrons_24_tuberack_nest_2ml_screwcap_B2 + - opentrons_24_tuberack_nest_2ml_screwcap_C2 + - opentrons_24_tuberack_nest_2ml_screwcap_D2 + - opentrons_24_tuberack_nest_2ml_screwcap_A3 + - opentrons_24_tuberack_nest_2ml_screwcap_B3 + - opentrons_24_tuberack_nest_2ml_screwcap_C3 + - opentrons_24_tuberack_nest_2ml_screwcap_D3 + - opentrons_24_tuberack_nest_2ml_screwcap_A4 + - opentrons_24_tuberack_nest_2ml_screwcap_B4 + - opentrons_24_tuberack_nest_2ml_screwcap_C4 + - opentrons_24_tuberack_nest_2ml_screwcap_D4 + - opentrons_24_tuberack_nest_2ml_screwcap_A5 + - opentrons_24_tuberack_nest_2ml_screwcap_B5 + - opentrons_24_tuberack_nest_2ml_screwcap_C5 + - opentrons_24_tuberack_nest_2ml_screwcap_D5 + - opentrons_24_tuberack_nest_2ml_screwcap_A6 + - opentrons_24_tuberack_nest_2ml_screwcap_B6 + - opentrons_24_tuberack_nest_2ml_screwcap_C6 + - opentrons_24_tuberack_nest_2ml_screwcap_D6 + class: '' + config: + barcode: null + category: null + model: Opentrons 24 Tube Rack with NEST 2 mL Screwcap + ordering: + A1: opentrons_24_tuberack_nest_2ml_screwcap_A1 + B1: opentrons_24_tuberack_nest_2ml_screwcap_B1 + C1: opentrons_24_tuberack_nest_2ml_screwcap_C1 + D1: opentrons_24_tuberack_nest_2ml_screwcap_D1 + A2: opentrons_24_tuberack_nest_2ml_screwcap_A2 + B2: opentrons_24_tuberack_nest_2ml_screwcap_B2 + C2: opentrons_24_tuberack_nest_2ml_screwcap_C2 + D2: opentrons_24_tuberack_nest_2ml_screwcap_D2 + A3: opentrons_24_tuberack_nest_2ml_screwcap_A3 + B3: opentrons_24_tuberack_nest_2ml_screwcap_B3 + C3: opentrons_24_tuberack_nest_2ml_screwcap_C3 + D3: opentrons_24_tuberack_nest_2ml_screwcap_D3 + A4: opentrons_24_tuberack_nest_2ml_screwcap_A4 + B4: opentrons_24_tuberack_nest_2ml_screwcap_B4 + C4: opentrons_24_tuberack_nest_2ml_screwcap_C4 + D4: opentrons_24_tuberack_nest_2ml_screwcap_D4 + A5: opentrons_24_tuberack_nest_2ml_screwcap_A5 + B5: opentrons_24_tuberack_nest_2ml_screwcap_B5 + C5: opentrons_24_tuberack_nest_2ml_screwcap_C5 + D5: opentrons_24_tuberack_nest_2ml_screwcap_D5 + A6: opentrons_24_tuberack_nest_2ml_screwcap_A6 + B6: opentrons_24_tuberack_nest_2ml_screwcap_B6 + C6: opentrons_24_tuberack_nest_2ml_screwcap_C6 + D6: opentrons_24_tuberack_nest_2ml_screwcap_D6 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.75 + size_y: 85.5 + size_z: 85.35 + type: TubeRack + data: {} + id: opentrons_24_tuberack_nest_2ml_screwcap + name: opentrons_24_tuberack_nest_2ml_screwcap + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 44.05 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_screwcap_A1 + name: opentrons_24_tuberack_nest_2ml_screwcap_A1 + parent: opentrons_24_tuberack_nest_2ml_screwcap + position: + x: 15.1375 + y: 72.3575 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 44.05 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_screwcap_B1 + name: opentrons_24_tuberack_nest_2ml_screwcap_B1 + parent: opentrons_24_tuberack_nest_2ml_screwcap + position: + x: 15.1375 + y: 53.0775 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 44.05 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_screwcap_C1 + name: opentrons_24_tuberack_nest_2ml_screwcap_C1 + parent: opentrons_24_tuberack_nest_2ml_screwcap + position: + x: 15.1375 + y: 33.7975 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 44.05 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_screwcap_D1 + name: opentrons_24_tuberack_nest_2ml_screwcap_D1 + parent: opentrons_24_tuberack_nest_2ml_screwcap + position: + x: 15.1375 + y: 14.5175 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 44.05 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_screwcap_A2 + name: opentrons_24_tuberack_nest_2ml_screwcap_A2 + parent: opentrons_24_tuberack_nest_2ml_screwcap + position: + x: 35.0275 + y: 72.3575 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 44.05 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_screwcap_B2 + name: opentrons_24_tuberack_nest_2ml_screwcap_B2 + parent: opentrons_24_tuberack_nest_2ml_screwcap + position: + x: 35.0275 + y: 53.0775 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 44.05 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_screwcap_C2 + name: opentrons_24_tuberack_nest_2ml_screwcap_C2 + parent: opentrons_24_tuberack_nest_2ml_screwcap + position: + x: 35.0275 + y: 33.7975 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 44.05 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_screwcap_D2 + name: opentrons_24_tuberack_nest_2ml_screwcap_D2 + parent: opentrons_24_tuberack_nest_2ml_screwcap + position: + x: 35.0275 + y: 14.5175 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 44.05 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_screwcap_A3 + name: opentrons_24_tuberack_nest_2ml_screwcap_A3 + parent: opentrons_24_tuberack_nest_2ml_screwcap + position: + x: 54.9175 + y: 72.3575 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 44.05 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_screwcap_B3 + name: opentrons_24_tuberack_nest_2ml_screwcap_B3 + parent: opentrons_24_tuberack_nest_2ml_screwcap + position: + x: 54.9175 + y: 53.0775 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 44.05 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_screwcap_C3 + name: opentrons_24_tuberack_nest_2ml_screwcap_C3 + parent: opentrons_24_tuberack_nest_2ml_screwcap + position: + x: 54.9175 + y: 33.7975 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 44.05 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_screwcap_D3 + name: opentrons_24_tuberack_nest_2ml_screwcap_D3 + parent: opentrons_24_tuberack_nest_2ml_screwcap + position: + x: 54.9175 + y: 14.5175 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 44.05 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_screwcap_A4 + name: opentrons_24_tuberack_nest_2ml_screwcap_A4 + parent: opentrons_24_tuberack_nest_2ml_screwcap + position: + x: 74.8075 + y: 72.3575 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 44.05 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_screwcap_B4 + name: opentrons_24_tuberack_nest_2ml_screwcap_B4 + parent: opentrons_24_tuberack_nest_2ml_screwcap + position: + x: 74.8075 + y: 53.0775 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 44.05 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_screwcap_C4 + name: opentrons_24_tuberack_nest_2ml_screwcap_C4 + parent: opentrons_24_tuberack_nest_2ml_screwcap + position: + x: 74.8075 + y: 33.7975 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 44.05 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_screwcap_D4 + name: opentrons_24_tuberack_nest_2ml_screwcap_D4 + parent: opentrons_24_tuberack_nest_2ml_screwcap + position: + x: 74.8075 + y: 14.5175 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 44.05 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_screwcap_A5 + name: opentrons_24_tuberack_nest_2ml_screwcap_A5 + parent: opentrons_24_tuberack_nest_2ml_screwcap + position: + x: 94.6975 + y: 72.3575 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 44.05 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_screwcap_B5 + name: opentrons_24_tuberack_nest_2ml_screwcap_B5 + parent: opentrons_24_tuberack_nest_2ml_screwcap + position: + x: 94.6975 + y: 53.0775 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 44.05 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_screwcap_C5 + name: opentrons_24_tuberack_nest_2ml_screwcap_C5 + parent: opentrons_24_tuberack_nest_2ml_screwcap + position: + x: 94.6975 + y: 33.7975 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 44.05 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_screwcap_D5 + name: opentrons_24_tuberack_nest_2ml_screwcap_D5 + parent: opentrons_24_tuberack_nest_2ml_screwcap + position: + x: 94.6975 + y: 14.5175 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 44.05 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_screwcap_A6 + name: opentrons_24_tuberack_nest_2ml_screwcap_A6 + parent: opentrons_24_tuberack_nest_2ml_screwcap + position: + x: 114.5875 + y: 72.3575 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 44.05 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_screwcap_B6 + name: opentrons_24_tuberack_nest_2ml_screwcap_B6 + parent: opentrons_24_tuberack_nest_2ml_screwcap + position: + x: 114.5875 + y: 53.0775 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 44.05 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_screwcap_C6 + name: opentrons_24_tuberack_nest_2ml_screwcap_C6 + parent: opentrons_24_tuberack_nest_2ml_screwcap + position: + x: 114.5875 + y: 33.7975 + z: 41.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 6.145 + size_y: 6.145 + size_z: 44.05 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_screwcap_D6 + name: opentrons_24_tuberack_nest_2ml_screwcap_D6 + parent: opentrons_24_tuberack_nest_2ml_screwcap + position: + x: 114.5875 + y: 14.5175 + z: 41.3 + sample_id: null + type: container + description: Opentrons 24 tuberack nest 2ml screwcap + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/tube_racks.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +opentrons_24_tuberack_nest_2ml_snapcap: + category: + - tube_racks + class: + module: pylabrobot.resources.opentrons.tube_racks:opentrons_24_tuberack_nest_2ml_snapcap + type: pylabrobot + config_info: + - children: + - opentrons_24_tuberack_nest_2ml_snapcap_A1 + - opentrons_24_tuberack_nest_2ml_snapcap_B1 + - opentrons_24_tuberack_nest_2ml_snapcap_C1 + - opentrons_24_tuberack_nest_2ml_snapcap_D1 + - opentrons_24_tuberack_nest_2ml_snapcap_A2 + - opentrons_24_tuberack_nest_2ml_snapcap_B2 + - opentrons_24_tuberack_nest_2ml_snapcap_C2 + - opentrons_24_tuberack_nest_2ml_snapcap_D2 + - opentrons_24_tuberack_nest_2ml_snapcap_A3 + - opentrons_24_tuberack_nest_2ml_snapcap_B3 + - opentrons_24_tuberack_nest_2ml_snapcap_C3 + - opentrons_24_tuberack_nest_2ml_snapcap_D3 + - opentrons_24_tuberack_nest_2ml_snapcap_A4 + - opentrons_24_tuberack_nest_2ml_snapcap_B4 + - opentrons_24_tuberack_nest_2ml_snapcap_C4 + - opentrons_24_tuberack_nest_2ml_snapcap_D4 + - opentrons_24_tuberack_nest_2ml_snapcap_A5 + - opentrons_24_tuberack_nest_2ml_snapcap_B5 + - opentrons_24_tuberack_nest_2ml_snapcap_C5 + - opentrons_24_tuberack_nest_2ml_snapcap_D5 + - opentrons_24_tuberack_nest_2ml_snapcap_A6 + - opentrons_24_tuberack_nest_2ml_snapcap_B6 + - opentrons_24_tuberack_nest_2ml_snapcap_C6 + - opentrons_24_tuberack_nest_2ml_snapcap_D6 + class: '' + config: + barcode: null + category: null + model: Opentrons 24 Tube Rack with NEST 2 mL Snapcap + ordering: + A1: opentrons_24_tuberack_nest_2ml_snapcap_A1 + B1: opentrons_24_tuberack_nest_2ml_snapcap_B1 + C1: opentrons_24_tuberack_nest_2ml_snapcap_C1 + D1: opentrons_24_tuberack_nest_2ml_snapcap_D1 + A2: opentrons_24_tuberack_nest_2ml_snapcap_A2 + B2: opentrons_24_tuberack_nest_2ml_snapcap_B2 + C2: opentrons_24_tuberack_nest_2ml_snapcap_C2 + D2: opentrons_24_tuberack_nest_2ml_snapcap_D2 + A3: opentrons_24_tuberack_nest_2ml_snapcap_A3 + B3: opentrons_24_tuberack_nest_2ml_snapcap_B3 + C3: opentrons_24_tuberack_nest_2ml_snapcap_C3 + D3: opentrons_24_tuberack_nest_2ml_snapcap_D3 + A4: opentrons_24_tuberack_nest_2ml_snapcap_A4 + B4: opentrons_24_tuberack_nest_2ml_snapcap_B4 + C4: opentrons_24_tuberack_nest_2ml_snapcap_C4 + D4: opentrons_24_tuberack_nest_2ml_snapcap_D4 + A5: opentrons_24_tuberack_nest_2ml_snapcap_A5 + B5: opentrons_24_tuberack_nest_2ml_snapcap_B5 + C5: opentrons_24_tuberack_nest_2ml_snapcap_C5 + D5: opentrons_24_tuberack_nest_2ml_snapcap_D5 + A6: opentrons_24_tuberack_nest_2ml_snapcap_A6 + B6: opentrons_24_tuberack_nest_2ml_snapcap_B6 + C6: opentrons_24_tuberack_nest_2ml_snapcap_C6 + D6: opentrons_24_tuberack_nest_2ml_snapcap_D6 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.75 + size_y: 85.5 + size_z: 79.45 + type: TubeRack + data: {} + id: opentrons_24_tuberack_nest_2ml_snapcap + name: opentrons_24_tuberack_nest_2ml_snapcap + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.198 + size_y: 7.198 + size_z: 39.28 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_snapcap_A1 + name: opentrons_24_tuberack_nest_2ml_snapcap_A1 + parent: opentrons_24_tuberack_nest_2ml_snapcap + position: + x: 14.611 + y: 71.831 + z: 40.17 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.198 + size_y: 7.198 + size_z: 39.28 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_snapcap_B1 + name: opentrons_24_tuberack_nest_2ml_snapcap_B1 + parent: opentrons_24_tuberack_nest_2ml_snapcap + position: + x: 14.611 + y: 52.551 + z: 40.17 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.198 + size_y: 7.198 + size_z: 39.28 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_snapcap_C1 + name: opentrons_24_tuberack_nest_2ml_snapcap_C1 + parent: opentrons_24_tuberack_nest_2ml_snapcap + position: + x: 14.611 + y: 33.271 + z: 40.17 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.198 + size_y: 7.198 + size_z: 39.28 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_snapcap_D1 + name: opentrons_24_tuberack_nest_2ml_snapcap_D1 + parent: opentrons_24_tuberack_nest_2ml_snapcap + position: + x: 14.611 + y: 13.991 + z: 40.17 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.198 + size_y: 7.198 + size_z: 39.28 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_snapcap_A2 + name: opentrons_24_tuberack_nest_2ml_snapcap_A2 + parent: opentrons_24_tuberack_nest_2ml_snapcap + position: + x: 34.501 + y: 71.831 + z: 40.17 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.198 + size_y: 7.198 + size_z: 39.28 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_snapcap_B2 + name: opentrons_24_tuberack_nest_2ml_snapcap_B2 + parent: opentrons_24_tuberack_nest_2ml_snapcap + position: + x: 34.501 + y: 52.551 + z: 40.17 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.198 + size_y: 7.198 + size_z: 39.28 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_snapcap_C2 + name: opentrons_24_tuberack_nest_2ml_snapcap_C2 + parent: opentrons_24_tuberack_nest_2ml_snapcap + position: + x: 34.501 + y: 33.271 + z: 40.17 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.198 + size_y: 7.198 + size_z: 39.28 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_snapcap_D2 + name: opentrons_24_tuberack_nest_2ml_snapcap_D2 + parent: opentrons_24_tuberack_nest_2ml_snapcap + position: + x: 34.501 + y: 13.991 + z: 40.17 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.198 + size_y: 7.198 + size_z: 39.28 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_snapcap_A3 + name: opentrons_24_tuberack_nest_2ml_snapcap_A3 + parent: opentrons_24_tuberack_nest_2ml_snapcap + position: + x: 54.391 + y: 71.831 + z: 40.17 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.198 + size_y: 7.198 + size_z: 39.28 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_snapcap_B3 + name: opentrons_24_tuberack_nest_2ml_snapcap_B3 + parent: opentrons_24_tuberack_nest_2ml_snapcap + position: + x: 54.391 + y: 52.551 + z: 40.17 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.198 + size_y: 7.198 + size_z: 39.28 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_snapcap_C3 + name: opentrons_24_tuberack_nest_2ml_snapcap_C3 + parent: opentrons_24_tuberack_nest_2ml_snapcap + position: + x: 54.391 + y: 33.271 + z: 40.17 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.198 + size_y: 7.198 + size_z: 39.28 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_snapcap_D3 + name: opentrons_24_tuberack_nest_2ml_snapcap_D3 + parent: opentrons_24_tuberack_nest_2ml_snapcap + position: + x: 54.391 + y: 13.991 + z: 40.17 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.198 + size_y: 7.198 + size_z: 39.28 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_snapcap_A4 + name: opentrons_24_tuberack_nest_2ml_snapcap_A4 + parent: opentrons_24_tuberack_nest_2ml_snapcap + position: + x: 74.281 + y: 71.831 + z: 40.17 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.198 + size_y: 7.198 + size_z: 39.28 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_snapcap_B4 + name: opentrons_24_tuberack_nest_2ml_snapcap_B4 + parent: opentrons_24_tuberack_nest_2ml_snapcap + position: + x: 74.281 + y: 52.551 + z: 40.17 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.198 + size_y: 7.198 + size_z: 39.28 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_snapcap_C4 + name: opentrons_24_tuberack_nest_2ml_snapcap_C4 + parent: opentrons_24_tuberack_nest_2ml_snapcap + position: + x: 74.281 + y: 33.271 + z: 40.17 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.198 + size_y: 7.198 + size_z: 39.28 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_snapcap_D4 + name: opentrons_24_tuberack_nest_2ml_snapcap_D4 + parent: opentrons_24_tuberack_nest_2ml_snapcap + position: + x: 74.281 + y: 13.991 + z: 40.17 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.198 + size_y: 7.198 + size_z: 39.28 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_snapcap_A5 + name: opentrons_24_tuberack_nest_2ml_snapcap_A5 + parent: opentrons_24_tuberack_nest_2ml_snapcap + position: + x: 94.171 + y: 71.831 + z: 40.17 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.198 + size_y: 7.198 + size_z: 39.28 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_snapcap_B5 + name: opentrons_24_tuberack_nest_2ml_snapcap_B5 + parent: opentrons_24_tuberack_nest_2ml_snapcap + position: + x: 94.171 + y: 52.551 + z: 40.17 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.198 + size_y: 7.198 + size_z: 39.28 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_snapcap_C5 + name: opentrons_24_tuberack_nest_2ml_snapcap_C5 + parent: opentrons_24_tuberack_nest_2ml_snapcap + position: + x: 94.171 + y: 33.271 + z: 40.17 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.198 + size_y: 7.198 + size_z: 39.28 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_snapcap_D5 + name: opentrons_24_tuberack_nest_2ml_snapcap_D5 + parent: opentrons_24_tuberack_nest_2ml_snapcap + position: + x: 94.171 + y: 13.991 + z: 40.17 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.198 + size_y: 7.198 + size_z: 39.28 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_snapcap_A6 + name: opentrons_24_tuberack_nest_2ml_snapcap_A6 + parent: opentrons_24_tuberack_nest_2ml_snapcap + position: + x: 114.061 + y: 71.831 + z: 40.17 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.198 + size_y: 7.198 + size_z: 39.28 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_snapcap_B6 + name: opentrons_24_tuberack_nest_2ml_snapcap_B6 + parent: opentrons_24_tuberack_nest_2ml_snapcap + position: + x: 114.061 + y: 52.551 + z: 40.17 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.198 + size_y: 7.198 + size_z: 39.28 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_snapcap_C6 + name: opentrons_24_tuberack_nest_2ml_snapcap_C6 + parent: opentrons_24_tuberack_nest_2ml_snapcap + position: + x: 114.061 + y: 33.271 + z: 40.17 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 2000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 7.198 + size_y: 7.198 + size_z: 39.28 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_24_tuberack_nest_2ml_snapcap_D6 + name: opentrons_24_tuberack_nest_2ml_snapcap_D6 + parent: opentrons_24_tuberack_nest_2ml_snapcap + position: + x: 114.061 + y: 13.991 + z: 40.17 + sample_id: null + type: container + description: Opentrons 24 tuberack nest 2ml snapcap + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/tube_racks.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +opentrons_6_tuberack_falcon_50ml_conical: + category: + - tube_racks + class: + module: pylabrobot.resources.opentrons.tube_racks:opentrons_6_tuberack_falcon_50ml_conical + type: pylabrobot + config_info: + - children: + - opentrons_6_tuberack_falcon_50ml_conical_A1 + - opentrons_6_tuberack_falcon_50ml_conical_B1 + - opentrons_6_tuberack_falcon_50ml_conical_A2 + - opentrons_6_tuberack_falcon_50ml_conical_B2 + - opentrons_6_tuberack_falcon_50ml_conical_A3 + - opentrons_6_tuberack_falcon_50ml_conical_B3 + class: '' + config: + barcode: null + category: null + model: Opentrons 6 Tube Rack with Falcon 50 mL Conical + ordering: + A1: opentrons_6_tuberack_falcon_50ml_conical_A1 + B1: opentrons_6_tuberack_falcon_50ml_conical_B1 + A2: opentrons_6_tuberack_falcon_50ml_conical_A2 + B2: opentrons_6_tuberack_falcon_50ml_conical_B2 + A3: opentrons_6_tuberack_falcon_50ml_conical_A3 + B3: opentrons_6_tuberack_falcon_50ml_conical_B3 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.76 + size_y: 85.48 + size_z: 120.3 + type: TubeRack + data: {} + id: opentrons_6_tuberack_falcon_50ml_conical + name: opentrons_6_tuberack_falcon_50ml_conical + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 50000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 19.665 + size_y: 19.665 + size_z: 113 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_6_tuberack_falcon_50ml_conical_A1 + name: opentrons_6_tuberack_falcon_50ml_conical_A1 + parent: opentrons_6_tuberack_falcon_50ml_conical + position: + x: 25.6675 + y: 50.4075 + z: 7.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 50000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 19.665 + size_y: 19.665 + size_z: 113 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_6_tuberack_falcon_50ml_conical_B1 + name: opentrons_6_tuberack_falcon_50ml_conical_B1 + parent: opentrons_6_tuberack_falcon_50ml_conical + position: + x: 25.6675 + y: 15.4075 + z: 7.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 50000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 19.665 + size_y: 19.665 + size_z: 113 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_6_tuberack_falcon_50ml_conical_A2 + name: opentrons_6_tuberack_falcon_50ml_conical_A2 + parent: opentrons_6_tuberack_falcon_50ml_conical + position: + x: 60.6675 + y: 50.4075 + z: 7.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 50000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 19.665 + size_y: 19.665 + size_z: 113 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_6_tuberack_falcon_50ml_conical_B2 + name: opentrons_6_tuberack_falcon_50ml_conical_B2 + parent: opentrons_6_tuberack_falcon_50ml_conical + position: + x: 60.6675 + y: 15.4075 + z: 7.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 50000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 19.665 + size_y: 19.665 + size_z: 113 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_6_tuberack_falcon_50ml_conical_A3 + name: opentrons_6_tuberack_falcon_50ml_conical_A3 + parent: opentrons_6_tuberack_falcon_50ml_conical + position: + x: 95.6675 + y: 50.4075 + z: 7.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 50000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 19.665 + size_y: 19.665 + size_z: 113 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_6_tuberack_falcon_50ml_conical_B3 + name: opentrons_6_tuberack_falcon_50ml_conical_B3 + parent: opentrons_6_tuberack_falcon_50ml_conical + position: + x: 95.6675 + y: 15.4075 + z: 7.3 + sample_id: null + type: container + description: Opentrons 6 tuberack falcon 50ml conical + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/tube_racks.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +opentrons_6_tuberack_nest_50ml_conical: + category: + - tube_racks + class: + module: pylabrobot.resources.opentrons.tube_racks:opentrons_6_tuberack_nest_50ml_conical + type: pylabrobot + config_info: + - children: + - opentrons_6_tuberack_nest_50ml_conical_A1 + - opentrons_6_tuberack_nest_50ml_conical_B1 + - opentrons_6_tuberack_nest_50ml_conical_A2 + - opentrons_6_tuberack_nest_50ml_conical_B2 + - opentrons_6_tuberack_nest_50ml_conical_A3 + - opentrons_6_tuberack_nest_50ml_conical_B3 + class: '' + config: + barcode: null + category: null + model: Opentrons 6 Tube Rack with NEST 50 mL Conical + ordering: + A1: opentrons_6_tuberack_nest_50ml_conical_A1 + B1: opentrons_6_tuberack_nest_50ml_conical_B1 + A2: opentrons_6_tuberack_nest_50ml_conical_A2 + B2: opentrons_6_tuberack_nest_50ml_conical_B2 + A3: opentrons_6_tuberack_nest_50ml_conical_A3 + B3: opentrons_6_tuberack_nest_50ml_conical_B3 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.76 + size_y: 85.48 + size_z: 120.35 + type: TubeRack + data: {} + id: opentrons_6_tuberack_nest_50ml_conical + name: opentrons_6_tuberack_nest_50ml_conical + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 50000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 19.764 + size_y: 19.764 + size_z: 113.05 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_6_tuberack_nest_50ml_conical_A1 + name: opentrons_6_tuberack_nest_50ml_conical_A1 + parent: opentrons_6_tuberack_nest_50ml_conical + position: + x: 25.618 + y: 50.358 + z: 7.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 50000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 19.764 + size_y: 19.764 + size_z: 113.05 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_6_tuberack_nest_50ml_conical_B1 + name: opentrons_6_tuberack_nest_50ml_conical_B1 + parent: opentrons_6_tuberack_nest_50ml_conical + position: + x: 25.618 + y: 15.358 + z: 7.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 50000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 19.764 + size_y: 19.764 + size_z: 113.05 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_6_tuberack_nest_50ml_conical_A2 + name: opentrons_6_tuberack_nest_50ml_conical_A2 + parent: opentrons_6_tuberack_nest_50ml_conical + position: + x: 60.618 + y: 50.358 + z: 7.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 50000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 19.764 + size_y: 19.764 + size_z: 113.05 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_6_tuberack_nest_50ml_conical_B2 + name: opentrons_6_tuberack_nest_50ml_conical_B2 + parent: opentrons_6_tuberack_nest_50ml_conical + position: + x: 60.618 + y: 15.358 + z: 7.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 50000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 19.764 + size_y: 19.764 + size_z: 113.05 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_6_tuberack_nest_50ml_conical_A3 + name: opentrons_6_tuberack_nest_50ml_conical_A3 + parent: opentrons_6_tuberack_nest_50ml_conical + position: + x: 95.618 + y: 50.358 + z: 7.3 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 50000 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 19.764 + size_y: 19.764 + size_z: 113.05 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_6_tuberack_nest_50ml_conical_B3 + name: opentrons_6_tuberack_nest_50ml_conical_B3 + parent: opentrons_6_tuberack_nest_50ml_conical + position: + x: 95.618 + y: 15.358 + z: 7.3 + sample_id: null + type: container + description: Opentrons 6 tuberack nest 50ml conical + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/tube_racks.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 +opentrons_96_well_aluminum_block: + category: + - tube_racks + class: + module: pylabrobot.resources.opentrons.tube_racks:opentrons_96_well_aluminum_block + type: pylabrobot + config_info: + - children: + - opentrons_96_well_aluminum_block_A1 + - opentrons_96_well_aluminum_block_B1 + - opentrons_96_well_aluminum_block_C1 + - opentrons_96_well_aluminum_block_D1 + - opentrons_96_well_aluminum_block_E1 + - opentrons_96_well_aluminum_block_F1 + - opentrons_96_well_aluminum_block_G1 + - opentrons_96_well_aluminum_block_H1 + - opentrons_96_well_aluminum_block_A2 + - opentrons_96_well_aluminum_block_B2 + - opentrons_96_well_aluminum_block_C2 + - opentrons_96_well_aluminum_block_D2 + - opentrons_96_well_aluminum_block_E2 + - opentrons_96_well_aluminum_block_F2 + - opentrons_96_well_aluminum_block_G2 + - opentrons_96_well_aluminum_block_H2 + - opentrons_96_well_aluminum_block_A3 + - opentrons_96_well_aluminum_block_B3 + - opentrons_96_well_aluminum_block_C3 + - opentrons_96_well_aluminum_block_D3 + - opentrons_96_well_aluminum_block_E3 + - opentrons_96_well_aluminum_block_F3 + - opentrons_96_well_aluminum_block_G3 + - opentrons_96_well_aluminum_block_H3 + - opentrons_96_well_aluminum_block_A4 + - opentrons_96_well_aluminum_block_B4 + - opentrons_96_well_aluminum_block_C4 + - opentrons_96_well_aluminum_block_D4 + - opentrons_96_well_aluminum_block_E4 + - opentrons_96_well_aluminum_block_F4 + - opentrons_96_well_aluminum_block_G4 + - opentrons_96_well_aluminum_block_H4 + - opentrons_96_well_aluminum_block_A5 + - opentrons_96_well_aluminum_block_B5 + - opentrons_96_well_aluminum_block_C5 + - opentrons_96_well_aluminum_block_D5 + - opentrons_96_well_aluminum_block_E5 + - opentrons_96_well_aluminum_block_F5 + - opentrons_96_well_aluminum_block_G5 + - opentrons_96_well_aluminum_block_H5 + - opentrons_96_well_aluminum_block_A6 + - opentrons_96_well_aluminum_block_B6 + - opentrons_96_well_aluminum_block_C6 + - opentrons_96_well_aluminum_block_D6 + - opentrons_96_well_aluminum_block_E6 + - opentrons_96_well_aluminum_block_F6 + - opentrons_96_well_aluminum_block_G6 + - opentrons_96_well_aluminum_block_H6 + - opentrons_96_well_aluminum_block_A7 + - opentrons_96_well_aluminum_block_B7 + - opentrons_96_well_aluminum_block_C7 + - opentrons_96_well_aluminum_block_D7 + - opentrons_96_well_aluminum_block_E7 + - opentrons_96_well_aluminum_block_F7 + - opentrons_96_well_aluminum_block_G7 + - opentrons_96_well_aluminum_block_H7 + - opentrons_96_well_aluminum_block_A8 + - opentrons_96_well_aluminum_block_B8 + - opentrons_96_well_aluminum_block_C8 + - opentrons_96_well_aluminum_block_D8 + - opentrons_96_well_aluminum_block_E8 + - opentrons_96_well_aluminum_block_F8 + - opentrons_96_well_aluminum_block_G8 + - opentrons_96_well_aluminum_block_H8 + - opentrons_96_well_aluminum_block_A9 + - opentrons_96_well_aluminum_block_B9 + - opentrons_96_well_aluminum_block_C9 + - opentrons_96_well_aluminum_block_D9 + - opentrons_96_well_aluminum_block_E9 + - opentrons_96_well_aluminum_block_F9 + - opentrons_96_well_aluminum_block_G9 + - opentrons_96_well_aluminum_block_H9 + - opentrons_96_well_aluminum_block_A10 + - opentrons_96_well_aluminum_block_B10 + - opentrons_96_well_aluminum_block_C10 + - opentrons_96_well_aluminum_block_D10 + - opentrons_96_well_aluminum_block_E10 + - opentrons_96_well_aluminum_block_F10 + - opentrons_96_well_aluminum_block_G10 + - opentrons_96_well_aluminum_block_H10 + - opentrons_96_well_aluminum_block_A11 + - opentrons_96_well_aluminum_block_B11 + - opentrons_96_well_aluminum_block_C11 + - opentrons_96_well_aluminum_block_D11 + - opentrons_96_well_aluminum_block_E11 + - opentrons_96_well_aluminum_block_F11 + - opentrons_96_well_aluminum_block_G11 + - opentrons_96_well_aluminum_block_H11 + - opentrons_96_well_aluminum_block_A12 + - opentrons_96_well_aluminum_block_B12 + - opentrons_96_well_aluminum_block_C12 + - opentrons_96_well_aluminum_block_D12 + - opentrons_96_well_aluminum_block_E12 + - opentrons_96_well_aluminum_block_F12 + - opentrons_96_well_aluminum_block_G12 + - opentrons_96_well_aluminum_block_H12 + class: '' + config: + barcode: null + category: null + model: Opentrons 96 Well Aluminum Block + ordering: + A1: opentrons_96_well_aluminum_block_A1 + B1: opentrons_96_well_aluminum_block_B1 + C1: opentrons_96_well_aluminum_block_C1 + D1: opentrons_96_well_aluminum_block_D1 + E1: opentrons_96_well_aluminum_block_E1 + F1: opentrons_96_well_aluminum_block_F1 + G1: opentrons_96_well_aluminum_block_G1 + H1: opentrons_96_well_aluminum_block_H1 + A2: opentrons_96_well_aluminum_block_A2 + B2: opentrons_96_well_aluminum_block_B2 + C2: opentrons_96_well_aluminum_block_C2 + D2: opentrons_96_well_aluminum_block_D2 + E2: opentrons_96_well_aluminum_block_E2 + F2: opentrons_96_well_aluminum_block_F2 + G2: opentrons_96_well_aluminum_block_G2 + H2: opentrons_96_well_aluminum_block_H2 + A3: opentrons_96_well_aluminum_block_A3 + B3: opentrons_96_well_aluminum_block_B3 + C3: opentrons_96_well_aluminum_block_C3 + D3: opentrons_96_well_aluminum_block_D3 + E3: opentrons_96_well_aluminum_block_E3 + F3: opentrons_96_well_aluminum_block_F3 + G3: opentrons_96_well_aluminum_block_G3 + H3: opentrons_96_well_aluminum_block_H3 + A4: opentrons_96_well_aluminum_block_A4 + B4: opentrons_96_well_aluminum_block_B4 + C4: opentrons_96_well_aluminum_block_C4 + D4: opentrons_96_well_aluminum_block_D4 + E4: opentrons_96_well_aluminum_block_E4 + F4: opentrons_96_well_aluminum_block_F4 + G4: opentrons_96_well_aluminum_block_G4 + H4: opentrons_96_well_aluminum_block_H4 + A5: opentrons_96_well_aluminum_block_A5 + B5: opentrons_96_well_aluminum_block_B5 + C5: opentrons_96_well_aluminum_block_C5 + D5: opentrons_96_well_aluminum_block_D5 + E5: opentrons_96_well_aluminum_block_E5 + F5: opentrons_96_well_aluminum_block_F5 + G5: opentrons_96_well_aluminum_block_G5 + H5: opentrons_96_well_aluminum_block_H5 + A6: opentrons_96_well_aluminum_block_A6 + B6: opentrons_96_well_aluminum_block_B6 + C6: opentrons_96_well_aluminum_block_C6 + D6: opentrons_96_well_aluminum_block_D6 + E6: opentrons_96_well_aluminum_block_E6 + F6: opentrons_96_well_aluminum_block_F6 + G6: opentrons_96_well_aluminum_block_G6 + H6: opentrons_96_well_aluminum_block_H6 + A7: opentrons_96_well_aluminum_block_A7 + B7: opentrons_96_well_aluminum_block_B7 + C7: opentrons_96_well_aluminum_block_C7 + D7: opentrons_96_well_aluminum_block_D7 + E7: opentrons_96_well_aluminum_block_E7 + F7: opentrons_96_well_aluminum_block_F7 + G7: opentrons_96_well_aluminum_block_G7 + H7: opentrons_96_well_aluminum_block_H7 + A8: opentrons_96_well_aluminum_block_A8 + B8: opentrons_96_well_aluminum_block_B8 + C8: opentrons_96_well_aluminum_block_C8 + D8: opentrons_96_well_aluminum_block_D8 + E8: opentrons_96_well_aluminum_block_E8 + F8: opentrons_96_well_aluminum_block_F8 + G8: opentrons_96_well_aluminum_block_G8 + H8: opentrons_96_well_aluminum_block_H8 + A9: opentrons_96_well_aluminum_block_A9 + B9: opentrons_96_well_aluminum_block_B9 + C9: opentrons_96_well_aluminum_block_C9 + D9: opentrons_96_well_aluminum_block_D9 + E9: opentrons_96_well_aluminum_block_E9 + F9: opentrons_96_well_aluminum_block_F9 + G9: opentrons_96_well_aluminum_block_G9 + H9: opentrons_96_well_aluminum_block_H9 + A10: opentrons_96_well_aluminum_block_A10 + B10: opentrons_96_well_aluminum_block_B10 + C10: opentrons_96_well_aluminum_block_C10 + D10: opentrons_96_well_aluminum_block_D10 + E10: opentrons_96_well_aluminum_block_E10 + F10: opentrons_96_well_aluminum_block_F10 + G10: opentrons_96_well_aluminum_block_G10 + H10: opentrons_96_well_aluminum_block_H10 + A11: opentrons_96_well_aluminum_block_A11 + B11: opentrons_96_well_aluminum_block_B11 + C11: opentrons_96_well_aluminum_block_C11 + D11: opentrons_96_well_aluminum_block_D11 + E11: opentrons_96_well_aluminum_block_E11 + F11: opentrons_96_well_aluminum_block_F11 + G11: opentrons_96_well_aluminum_block_G11 + H11: opentrons_96_well_aluminum_block_H11 + A12: opentrons_96_well_aluminum_block_A12 + B12: opentrons_96_well_aluminum_block_B12 + C12: opentrons_96_well_aluminum_block_C12 + D12: opentrons_96_well_aluminum_block_D12 + E12: opentrons_96_well_aluminum_block_E12 + F12: opentrons_96_well_aluminum_block_F12 + G12: opentrons_96_well_aluminum_block_G12 + H12: opentrons_96_well_aluminum_block_H12 + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 127.76 + size_y: 85.48 + size_z: 18.16 + type: TubeRack + data: {} + id: opentrons_96_well_aluminum_block + name: opentrons_96_well_aluminum_block + parent: null + position: + x: 0 + y: 0 + z: 0 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_A1 + name: opentrons_96_well_aluminum_block_A1 + parent: opentrons_96_well_aluminum_block + position: + x: 12.492 + y: 72.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_B1 + name: opentrons_96_well_aluminum_block_B1 + parent: opentrons_96_well_aluminum_block + position: + x: 12.492 + y: 63.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_C1 + name: opentrons_96_well_aluminum_block_C1 + parent: opentrons_96_well_aluminum_block + position: + x: 12.492 + y: 54.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_D1 + name: opentrons_96_well_aluminum_block_D1 + parent: opentrons_96_well_aluminum_block + position: + x: 12.492 + y: 45.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_E1 + name: opentrons_96_well_aluminum_block_E1 + parent: opentrons_96_well_aluminum_block + position: + x: 12.492 + y: 36.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_F1 + name: opentrons_96_well_aluminum_block_F1 + parent: opentrons_96_well_aluminum_block + position: + x: 12.492 + y: 27.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_G1 + name: opentrons_96_well_aluminum_block_G1 + parent: opentrons_96_well_aluminum_block + position: + x: 12.492 + y: 18.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_H1 + name: opentrons_96_well_aluminum_block_H1 + parent: opentrons_96_well_aluminum_block + position: + x: 12.492 + y: 9.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_A2 + name: opentrons_96_well_aluminum_block_A2 + parent: opentrons_96_well_aluminum_block + position: + x: 21.492 + y: 72.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_B2 + name: opentrons_96_well_aluminum_block_B2 + parent: opentrons_96_well_aluminum_block + position: + x: 21.492 + y: 63.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_C2 + name: opentrons_96_well_aluminum_block_C2 + parent: opentrons_96_well_aluminum_block + position: + x: 21.492 + y: 54.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_D2 + name: opentrons_96_well_aluminum_block_D2 + parent: opentrons_96_well_aluminum_block + position: + x: 21.492 + y: 45.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_E2 + name: opentrons_96_well_aluminum_block_E2 + parent: opentrons_96_well_aluminum_block + position: + x: 21.492 + y: 36.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_F2 + name: opentrons_96_well_aluminum_block_F2 + parent: opentrons_96_well_aluminum_block + position: + x: 21.492 + y: 27.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_G2 + name: opentrons_96_well_aluminum_block_G2 + parent: opentrons_96_well_aluminum_block + position: + x: 21.492 + y: 18.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_H2 + name: opentrons_96_well_aluminum_block_H2 + parent: opentrons_96_well_aluminum_block + position: + x: 21.492 + y: 9.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_A3 + name: opentrons_96_well_aluminum_block_A3 + parent: opentrons_96_well_aluminum_block + position: + x: 30.492 + y: 72.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_B3 + name: opentrons_96_well_aluminum_block_B3 + parent: opentrons_96_well_aluminum_block + position: + x: 30.492 + y: 63.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_C3 + name: opentrons_96_well_aluminum_block_C3 + parent: opentrons_96_well_aluminum_block + position: + x: 30.492 + y: 54.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_D3 + name: opentrons_96_well_aluminum_block_D3 + parent: opentrons_96_well_aluminum_block + position: + x: 30.492 + y: 45.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_E3 + name: opentrons_96_well_aluminum_block_E3 + parent: opentrons_96_well_aluminum_block + position: + x: 30.492 + y: 36.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_F3 + name: opentrons_96_well_aluminum_block_F3 + parent: opentrons_96_well_aluminum_block + position: + x: 30.492 + y: 27.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_G3 + name: opentrons_96_well_aluminum_block_G3 + parent: opentrons_96_well_aluminum_block + position: + x: 30.492 + y: 18.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_H3 + name: opentrons_96_well_aluminum_block_H3 + parent: opentrons_96_well_aluminum_block + position: + x: 30.492 + y: 9.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_A4 + name: opentrons_96_well_aluminum_block_A4 + parent: opentrons_96_well_aluminum_block + position: + x: 39.492 + y: 72.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_B4 + name: opentrons_96_well_aluminum_block_B4 + parent: opentrons_96_well_aluminum_block + position: + x: 39.492 + y: 63.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_C4 + name: opentrons_96_well_aluminum_block_C4 + parent: opentrons_96_well_aluminum_block + position: + x: 39.492 + y: 54.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_D4 + name: opentrons_96_well_aluminum_block_D4 + parent: opentrons_96_well_aluminum_block + position: + x: 39.492 + y: 45.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_E4 + name: opentrons_96_well_aluminum_block_E4 + parent: opentrons_96_well_aluminum_block + position: + x: 39.492 + y: 36.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_F4 + name: opentrons_96_well_aluminum_block_F4 + parent: opentrons_96_well_aluminum_block + position: + x: 39.492 + y: 27.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_G4 + name: opentrons_96_well_aluminum_block_G4 + parent: opentrons_96_well_aluminum_block + position: + x: 39.492 + y: 18.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_H4 + name: opentrons_96_well_aluminum_block_H4 + parent: opentrons_96_well_aluminum_block + position: + x: 39.492 + y: 9.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_A5 + name: opentrons_96_well_aluminum_block_A5 + parent: opentrons_96_well_aluminum_block + position: + x: 48.492 + y: 72.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_B5 + name: opentrons_96_well_aluminum_block_B5 + parent: opentrons_96_well_aluminum_block + position: + x: 48.492 + y: 63.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_C5 + name: opentrons_96_well_aluminum_block_C5 + parent: opentrons_96_well_aluminum_block + position: + x: 48.492 + y: 54.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_D5 + name: opentrons_96_well_aluminum_block_D5 + parent: opentrons_96_well_aluminum_block + position: + x: 48.492 + y: 45.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_E5 + name: opentrons_96_well_aluminum_block_E5 + parent: opentrons_96_well_aluminum_block + position: + x: 48.492 + y: 36.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_F5 + name: opentrons_96_well_aluminum_block_F5 + parent: opentrons_96_well_aluminum_block + position: + x: 48.492 + y: 27.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_G5 + name: opentrons_96_well_aluminum_block_G5 + parent: opentrons_96_well_aluminum_block + position: + x: 48.492 + y: 18.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_H5 + name: opentrons_96_well_aluminum_block_H5 + parent: opentrons_96_well_aluminum_block + position: + x: 48.492 + y: 9.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_A6 + name: opentrons_96_well_aluminum_block_A6 + parent: opentrons_96_well_aluminum_block + position: + x: 57.492 + y: 72.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_B6 + name: opentrons_96_well_aluminum_block_B6 + parent: opentrons_96_well_aluminum_block + position: + x: 57.492 + y: 63.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_C6 + name: opentrons_96_well_aluminum_block_C6 + parent: opentrons_96_well_aluminum_block + position: + x: 57.492 + y: 54.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_D6 + name: opentrons_96_well_aluminum_block_D6 + parent: opentrons_96_well_aluminum_block + position: + x: 57.492 + y: 45.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_E6 + name: opentrons_96_well_aluminum_block_E6 + parent: opentrons_96_well_aluminum_block + position: + x: 57.492 + y: 36.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_F6 + name: opentrons_96_well_aluminum_block_F6 + parent: opentrons_96_well_aluminum_block + position: + x: 57.492 + y: 27.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_G6 + name: opentrons_96_well_aluminum_block_G6 + parent: opentrons_96_well_aluminum_block + position: + x: 57.492 + y: 18.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_H6 + name: opentrons_96_well_aluminum_block_H6 + parent: opentrons_96_well_aluminum_block + position: + x: 57.492 + y: 9.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_A7 + name: opentrons_96_well_aluminum_block_A7 + parent: opentrons_96_well_aluminum_block + position: + x: 66.492 + y: 72.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_B7 + name: opentrons_96_well_aluminum_block_B7 + parent: opentrons_96_well_aluminum_block + position: + x: 66.492 + y: 63.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_C7 + name: opentrons_96_well_aluminum_block_C7 + parent: opentrons_96_well_aluminum_block + position: + x: 66.492 + y: 54.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_D7 + name: opentrons_96_well_aluminum_block_D7 + parent: opentrons_96_well_aluminum_block + position: + x: 66.492 + y: 45.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_E7 + name: opentrons_96_well_aluminum_block_E7 + parent: opentrons_96_well_aluminum_block + position: + x: 66.492 + y: 36.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_F7 + name: opentrons_96_well_aluminum_block_F7 + parent: opentrons_96_well_aluminum_block + position: + x: 66.492 + y: 27.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_G7 + name: opentrons_96_well_aluminum_block_G7 + parent: opentrons_96_well_aluminum_block + position: + x: 66.492 + y: 18.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_H7 + name: opentrons_96_well_aluminum_block_H7 + parent: opentrons_96_well_aluminum_block + position: + x: 66.492 + y: 9.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_A8 + name: opentrons_96_well_aluminum_block_A8 + parent: opentrons_96_well_aluminum_block + position: + x: 75.492 + y: 72.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_B8 + name: opentrons_96_well_aluminum_block_B8 + parent: opentrons_96_well_aluminum_block + position: + x: 75.492 + y: 63.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_C8 + name: opentrons_96_well_aluminum_block_C8 + parent: opentrons_96_well_aluminum_block + position: + x: 75.492 + y: 54.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_D8 + name: opentrons_96_well_aluminum_block_D8 + parent: opentrons_96_well_aluminum_block + position: + x: 75.492 + y: 45.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_E8 + name: opentrons_96_well_aluminum_block_E8 + parent: opentrons_96_well_aluminum_block + position: + x: 75.492 + y: 36.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_F8 + name: opentrons_96_well_aluminum_block_F8 + parent: opentrons_96_well_aluminum_block + position: + x: 75.492 + y: 27.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_G8 + name: opentrons_96_well_aluminum_block_G8 + parent: opentrons_96_well_aluminum_block + position: + x: 75.492 + y: 18.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_H8 + name: opentrons_96_well_aluminum_block_H8 + parent: opentrons_96_well_aluminum_block + position: + x: 75.492 + y: 9.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_A9 + name: opentrons_96_well_aluminum_block_A9 + parent: opentrons_96_well_aluminum_block + position: + x: 84.492 + y: 72.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_B9 + name: opentrons_96_well_aluminum_block_B9 + parent: opentrons_96_well_aluminum_block + position: + x: 84.492 + y: 63.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_C9 + name: opentrons_96_well_aluminum_block_C9 + parent: opentrons_96_well_aluminum_block + position: + x: 84.492 + y: 54.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_D9 + name: opentrons_96_well_aluminum_block_D9 + parent: opentrons_96_well_aluminum_block + position: + x: 84.492 + y: 45.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_E9 + name: opentrons_96_well_aluminum_block_E9 + parent: opentrons_96_well_aluminum_block + position: + x: 84.492 + y: 36.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_F9 + name: opentrons_96_well_aluminum_block_F9 + parent: opentrons_96_well_aluminum_block + position: + x: 84.492 + y: 27.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_G9 + name: opentrons_96_well_aluminum_block_G9 + parent: opentrons_96_well_aluminum_block + position: + x: 84.492 + y: 18.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_H9 + name: opentrons_96_well_aluminum_block_H9 + parent: opentrons_96_well_aluminum_block + position: + x: 84.492 + y: 9.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_A10 + name: opentrons_96_well_aluminum_block_A10 + parent: opentrons_96_well_aluminum_block + position: + x: 93.492 + y: 72.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_B10 + name: opentrons_96_well_aluminum_block_B10 + parent: opentrons_96_well_aluminum_block + position: + x: 93.492 + y: 63.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_C10 + name: opentrons_96_well_aluminum_block_C10 + parent: opentrons_96_well_aluminum_block + position: + x: 93.492 + y: 54.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_D10 + name: opentrons_96_well_aluminum_block_D10 + parent: opentrons_96_well_aluminum_block + position: + x: 93.492 + y: 45.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_E10 + name: opentrons_96_well_aluminum_block_E10 + parent: opentrons_96_well_aluminum_block + position: + x: 93.492 + y: 36.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_F10 + name: opentrons_96_well_aluminum_block_F10 + parent: opentrons_96_well_aluminum_block + position: + x: 93.492 + y: 27.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_G10 + name: opentrons_96_well_aluminum_block_G10 + parent: opentrons_96_well_aluminum_block + position: + x: 93.492 + y: 18.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_H10 + name: opentrons_96_well_aluminum_block_H10 + parent: opentrons_96_well_aluminum_block + position: + x: 93.492 + y: 9.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_A11 + name: opentrons_96_well_aluminum_block_A11 + parent: opentrons_96_well_aluminum_block + position: + x: 102.492 + y: 72.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_B11 + name: opentrons_96_well_aluminum_block_B11 + parent: opentrons_96_well_aluminum_block + position: + x: 102.492 + y: 63.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_C11 + name: opentrons_96_well_aluminum_block_C11 + parent: opentrons_96_well_aluminum_block + position: + x: 102.492 + y: 54.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_D11 + name: opentrons_96_well_aluminum_block_D11 + parent: opentrons_96_well_aluminum_block + position: + x: 102.492 + y: 45.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_E11 + name: opentrons_96_well_aluminum_block_E11 + parent: opentrons_96_well_aluminum_block + position: + x: 102.492 + y: 36.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_F11 + name: opentrons_96_well_aluminum_block_F11 + parent: opentrons_96_well_aluminum_block + position: + x: 102.492 + y: 27.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_G11 + name: opentrons_96_well_aluminum_block_G11 + parent: opentrons_96_well_aluminum_block + position: + x: 102.492 + y: 18.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_H11 + name: opentrons_96_well_aluminum_block_H11 + parent: opentrons_96_well_aluminum_block + position: + x: 102.492 + y: 9.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_A12 + name: opentrons_96_well_aluminum_block_A12 + parent: opentrons_96_well_aluminum_block + position: + x: 111.492 + y: 72.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_B12 + name: opentrons_96_well_aluminum_block_B12 + parent: opentrons_96_well_aluminum_block + position: + x: 111.492 + y: 63.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_C12 + name: opentrons_96_well_aluminum_block_C12 + parent: opentrons_96_well_aluminum_block + position: + x: 111.492 + y: 54.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_D12 + name: opentrons_96_well_aluminum_block_D12 + parent: opentrons_96_well_aluminum_block + position: + x: 111.492 + y: 45.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_E12 + name: opentrons_96_well_aluminum_block_E12 + parent: opentrons_96_well_aluminum_block + position: + x: 111.492 + y: 36.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_F12 + name: opentrons_96_well_aluminum_block_F12 + parent: opentrons_96_well_aluminum_block + position: + x: 111.492 + y: 27.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_G12 + name: opentrons_96_well_aluminum_block_G12 + parent: opentrons_96_well_aluminum_block + position: + x: 111.492 + y: 18.352 + z: 3.38 + sample_id: null + type: container + - children: [] + class: '' + config: + barcode: null + category: tube + compute_height_from_volume: null + compute_volume_from_height: null + material_z_thickness: null + max_volume: 210.73584127999996 + model: null + rotation: + type: Rotation + x: 0 + y: 0 + z: 0 + size_x: 3.776 + size_y: 3.776 + size_z: 14.78 + type: Tube + data: + liquid_history: [] + liquids: [] + pending_liquids: [] + id: opentrons_96_well_aluminum_block_H12 + name: opentrons_96_well_aluminum_block_H12 + parent: opentrons_96_well_aluminum_block + position: + x: 111.492 + y: 9.352 + z: 3.38 + sample_id: null + type: container + description: Opentrons 96 well aluminum block + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/opentrons/tube_racks.yaml + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 diff --git a/unilabos/registry/resources/organic/container.yaml b/unilabos/registry/resources/organic/container.yaml index 2186b70..2860098 100644 --- a/unilabos/registry/resources/organic/container.yaml +++ b/unilabos/registry/resources/organic/container.yaml @@ -1,28 +1,35 @@ container: - description: regular organic container - icon: Flask.webp - class: + category: + - container + class: module: unilabos.resources.container:RegularContainer type: unilabos + config_info: [] + description: regular organic container + file_path: C:/Users/10230/PycharmProjects/Uni-Lab-OS/unilabos/registry/resources/organic/container.yaml handles: - - handler_key: top - label: top - io_type: target - data_type: fluid - side: NORTH - data_source: handle - data_key: fluid_in - - handler_key: bottom - label: bottom - io_type: source - data_type: fluid - side: SOUTH - data_source: handle - data_key: fluid_out - - handler_key: bind - label: bind - io_type: target - data_type: mechanical - side: SOUTH - data_source: handle - data_key: mechanical_port \ No newline at end of file + - data_key: fluid_in + data_source: handle + data_type: fluid + handler_key: top + io_type: target + label: top + side: NORTH + - data_key: fluid_out + data_source: handle + data_type: fluid + handler_key: bottom + io_type: source + label: bottom + side: SOUTH + - data_key: mechanical_port + data_source: handle + data_type: mechanical + handler_key: bind + io_type: target + label: bind + side: SOUTH + icon: Flask.webp + init_param_schema: {} + registry_type: resource + version: 1.0.0 diff --git a/unilabos/utils/type_check.py b/unilabos/utils/type_check.py index 52a6f0b..c22de3c 100644 --- a/unilabos/utils/type_check.py +++ b/unilabos/utils/type_check.py @@ -1,5 +1,6 @@ import collections.abc import json +from collections import OrderedDict from typing import get_origin, get_args import yaml @@ -29,6 +30,14 @@ class NoAliasDumper(yaml.SafeDumper): return True +# 为NoAliasDumper添加OrderedDict的representation方法 +def represent_ordereddict(dumper, data): + return dumper.represent_mapping("tag:yaml.org,2002:map", data.items()) + + +# 注册OrderedDict的representer +NoAliasDumper.add_representer(OrderedDict, represent_ordereddict) + class ResultInfoEncoder(json.JSONEncoder): """专门用于处理任务执行结果信息的JSON编码器""" From fd3dbcf1ff3f4febc7599e3e2220ffd738cd213b Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Sat, 19 Jul 2025 01:56:41 +0800 Subject: [PATCH 86/96] fix devices --- unilabos/registry/devices/liquid_handler.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unilabos/registry/devices/liquid_handler.yaml b/unilabos/registry/devices/liquid_handler.yaml index 513ee41..7e6e781 100644 --- a/unilabos/registry/devices/liquid_handler.yaml +++ b/unilabos/registry/devices/liquid_handler.yaml @@ -7364,7 +7364,7 @@ liquid_handler.prcxi: type: '' handles: [] placeholder_keys: - tip_racks: unilabos_devices + tip_racks: unilabos_resources result: {} schema: description: '' From 4cd40865b416fcfdcc5b2f8d965e93c13561202d Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Sat, 19 Jul 2025 02:24:00 +0800 Subject: [PATCH 87/96] fix resource check serialize --- unilabos/ros/nodes/base_device_node.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/unilabos/ros/nodes/base_device_node.py b/unilabos/ros/nodes/base_device_node.py index 4e3e304..eebaf59 100644 --- a/unilabos/ros/nodes/base_device_node.py +++ b/unilabos/ros/nodes/base_device_node.py @@ -656,6 +656,8 @@ class BaseROS2DeviceNode(Node, Generic[T]): if v in ["unilabos_msgs/Resource", "sequence"]: self.lab_logger().info(f"查询资源状态: Key: {k} Type: {v}") current_resources = [] + # TODO: resource后面需要分组 + only_one_resource = False try: if len(action_kwargs[k]) > 1: for i in action_kwargs[k]: @@ -665,6 +667,7 @@ class BaseROS2DeviceNode(Node, Generic[T]): response = await self._resource_clients["resource_get"].call_async(r) current_resources.extend(response.resources) else: + only_one_resource = True r = ResourceGet.Request() r.id = ( action_kwargs[k]["id"] @@ -682,7 +685,10 @@ class BaseROS2DeviceNode(Node, Generic[T]): type_hint = action_paramtypes[k] final_type = get_type_class(type_hint) # 判断 ACTION 是否需要特殊的物料类型如 pylabrobot.resources.Resource,并做转换 - final_resource = [convert_resources_to_type([i], final_type)[0] for i in resources_list] + if only_one_resource: + final_resource = convert_resources_to_type(resources_list, final_type) + else: + final_resource = [convert_resources_to_type([i], final_type)[0] for i in resources_list] action_kwargs[k] = self.resource_tracker.figure_resource(final_resource) ##### self.lab_logger().info(f"准备执行: {action_kwargs}, 函数: {ACTION.__name__}") From c2dfe689aa623e2ac9f543f23cfe0ccadb1e33ae Mon Sep 17 00:00:00 2001 From: Junhan Chang Date: Sat, 19 Jul 2025 04:19:57 +0800 Subject: [PATCH 88/96] fix: Protocol node resource run (#65) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * stir和adjustph的中的bug修不好 * fix sub-resource query in protocol node compiling * add resource placeholder to vessels * add the rest yaml * Update work_station.yaml --------- Co-authored-by: KCFeng425 <2100011801@stu.pku.edu.cn> --- unilabos/compile/adjustph_protocol.py | 17 +++- unilabos/compile/evaporate_protocol.py | 18 ++-- unilabos/compile/recrystallize_protocol.py | 77 ++++++++++++++-- unilabos/compile/stir_protocol.py | 2 +- unilabos/compile/wash_solid_protocol.py | 2 +- .../devices/virtual/virtual_multiway_valve.py | 25 ++++- unilabos/devices/virtual/virtual_rotavap.py | 16 +++- unilabos/registry/devices/virtual_device.yaml | 84 ++--------------- unilabos/registry/devices/work_station.yaml | 92 ++++++++++++++++++- unilabos/resources/graphio.py | 2 +- unilabos/ros/nodes/presets/protocol_node.py | 65 +++++-------- 11 files changed, 252 insertions(+), 148 deletions(-) diff --git a/unilabos/compile/adjustph_protocol.py b/unilabos/compile/adjustph_protocol.py index 4d39e93..374268a 100644 --- a/unilabos/compile/adjustph_protocol.py +++ b/unilabos/compile/adjustph_protocol.py @@ -1,6 +1,6 @@ import networkx as nx import logging -from typing import List, Dict, Any +from typing import List, Dict, Any, Union from .pump_protocol import generate_pump_protocol_with_rinsing logger = logging.getLogger(__name__) @@ -216,7 +216,7 @@ def calculate_reagent_volume(target_ph_value: float, reagent: str, vessel_volume def generate_adjust_ph_protocol( G: nx.DiGraph, - vessel: dict, # 🔧 修改:从字符串改为字典类型 + vessel:Union[dict,str], # 🔧 修改:从字符串改为字典类型 ph_value: float, reagent: str, **kwargs @@ -235,8 +235,17 @@ def generate_adjust_ph_protocol( List[Dict[str, Any]]: 动作序列 """ - # 🔧 核心修改:从字典中提取容器ID - vessel_id = vessel["id"] + # 统一处理vessel参数 + if isinstance(vessel, dict): + vessel_id = list(vessel.values())[0].get("id", "") + vessel_data = vessel.get("data", {}) + else: + vessel_id = str(vessel) + vessel_data = G.nodes[vessel_id].get("data", {}) if vessel_id in G.nodes() else {} + + if not vessel_id: + debug_print(f"❌ vessel 参数无效,必须包含id字段或直接提供容器ID. vessel: {vessel}") + raise ValueError("vessel 参数无效,必须包含id字段或直接提供容器ID") debug_print("=" * 60) debug_print("🧪 开始生成pH调节协议") diff --git a/unilabos/compile/evaporate_protocol.py b/unilabos/compile/evaporate_protocol.py index 7f93192..56228c2 100644 --- a/unilabos/compile/evaporate_protocol.py +++ b/unilabos/compile/evaporate_protocol.py @@ -22,7 +22,7 @@ def parse_time_input(time_input: Union[str, float]) -> float: """ if isinstance(time_input, (int, float)): debug_print(f"⏱️ 时间输入为数字: {time_input}s ✨") - return float(time_input) + return float(time_input) # 🔧 确保返回float if not time_input or not str(time_input).strip(): debug_print(f"⚠️ 时间输入为空,使用默认值: 180s (3分钟) 🕐") @@ -48,7 +48,7 @@ def parse_time_input(time_input: Union[str, float]) -> float: try: value = float(time_str) debug_print(f"✅ 时间解析成功: {time_str} → {value}s(无单位,默认秒)⏰") - return value + return float(value) # 🔧 确保返回float except ValueError: debug_print(f"❌ 无法解析时间: '{time_str}',使用默认值180s (3分钟) 😅") return 180.0 @@ -70,7 +70,7 @@ def parse_time_input(time_input: Union[str, float]) -> float: time_sec = value # 已经是s debug_print(f"🕐 时间转换: {value}s → {time_sec}s (已是秒) ⏰") - return time_sec + return float(time_sec) # 🔧 确保返回float def find_rotavap_device(G: nx.DiGraph, vessel: str = None) -> Optional[str]: """ @@ -389,12 +389,12 @@ def generate_evaporate_protocol( "device_id": rotavap_device, "action_name": "evaporate", "action_kwargs": { - "vessel": target_vessel, # 使用 target_vessel - "pressure": pressure, - "temp": temp, - "time": final_time, - "stir_speed": stir_speed, - "solvent": solvent + "vessel": target_vessel, + "pressure": float(pressure), + "temp": float(temp), + "time": float(final_time), # 🔧 强制转换为float类型 + "stir_speed": float(stir_speed), + "solvent": str(solvent) } } action_sequence.append(evaporate_action) diff --git a/unilabos/compile/recrystallize_protocol.py b/unilabos/compile/recrystallize_protocol.py index b6f4aff..7c15310 100644 --- a/unilabos/compile/recrystallize_protocol.py +++ b/unilabos/compile/recrystallize_protocol.py @@ -170,33 +170,94 @@ def find_solvent_vessel(G: nx.DiGraph, solvent: str) -> str: debug_print(f" 🎉 通过名称匹配找到容器: {vessel_name} ✨") return vessel_name - # 第二步:通过模糊匹配 + # 第二步:通过模糊匹配(节点ID和名称) debug_print(" 🔍 步骤2: 模糊名称匹配...") for node_id in G.nodes(): if G.nodes[node_id].get('type') == 'container': node_name = G.nodes[node_id].get('name', '').lower() if solvent.lower() in node_id.lower() or solvent.lower() in node_name: - debug_print(f" 🎉 通过模糊匹配找到容器: {node_id} ✨") + debug_print(f" 🎉 通过模糊匹配找到容器: {node_id} (名称: {node_name}) ✨") return node_id - # 第三步:通过液体类型匹配 - debug_print(" 🧪 步骤3: 液体类型匹配...") + # 第三步:通过配置中的试剂信息匹配 + debug_print(" 🧪 步骤3: 配置试剂信息匹配...") + for node_id in G.nodes(): + if G.nodes[node_id].get('type') == 'container': + # 检查 config 中的 reagent 字段 + node_config = G.nodes[node_id].get('config', {}) + config_reagent = node_config.get('reagent', '').lower() + + if config_reagent and solvent.lower() == config_reagent: + debug_print(f" 🎉 通过config.reagent匹配找到容器: {node_id} (试剂: {config_reagent}) ✨") + return node_id + + # 第四步:通过数据中的试剂信息匹配 + debug_print(" 🧪 步骤4: 数据试剂信息匹配...") for node_id in G.nodes(): if G.nodes[node_id].get('type') == 'container': vessel_data = G.nodes[node_id].get('data', {}) - liquids = vessel_data.get('liquid', []) + # 检查 data 中的 reagent_name 字段 + reagent_name = vessel_data.get('reagent_name', '').lower() + if reagent_name and solvent.lower() == reagent_name: + debug_print(f" 🎉 通过data.reagent_name匹配找到容器: {node_id} (试剂: {reagent_name}) ✨") + return node_id + + # 检查 data 中的液体信息 + liquids = vessel_data.get('liquid', []) for liquid in liquids: if isinstance(liquid, dict): liquid_type = (liquid.get('liquid_type') or liquid.get('name', '')).lower() - reagent_name = vessel_data.get('reagent_name', '').lower() - if solvent.lower() in liquid_type or solvent.lower() in reagent_name: - debug_print(f" 🎉 通过液体类型匹配找到容器: {node_id} ✨") + if solvent.lower() in liquid_type: + debug_print(f" 🎉 通过液体类型匹配找到容器: {node_id} (液体类型: {liquid_type}) ✨") return node_id + # 第五步:部分匹配(如果前面都没找到) + debug_print(" 🔍 步骤5: 部分匹配...") + for node_id in G.nodes(): + if G.nodes[node_id].get('type') == 'container': + node_config = G.nodes[node_id].get('config', {}) + node_data = G.nodes[node_id].get('data', {}) + node_name = G.nodes[node_id].get('name', '').lower() + + config_reagent = node_config.get('reagent', '').lower() + data_reagent = node_data.get('reagent_name', '').lower() + + # 检查是否包含溶剂名称 + if (solvent.lower() in config_reagent or + solvent.lower() in data_reagent or + solvent.lower() in node_name or + solvent.lower() in node_id.lower()): + debug_print(f" 🎉 通过部分匹配找到容器: {node_id} ✨") + debug_print(f" - 节点名称: {node_name}") + debug_print(f" - 配置试剂: {config_reagent}") + debug_print(f" - 数据试剂: {data_reagent}") + return node_id + + # 调试信息:列出所有容器 + debug_print(" 🔎 调试信息:列出所有容器...") + container_list = [] + for node_id in G.nodes(): + if G.nodes[node_id].get('type') == 'container': + node_config = G.nodes[node_id].get('config', {}) + node_data = G.nodes[node_id].get('data', {}) + node_name = G.nodes[node_id].get('name', '') + + container_info = { + 'id': node_id, + 'name': node_name, + 'config_reagent': node_config.get('reagent', ''), + 'data_reagent': node_data.get('reagent_name', '') + } + container_list.append(container_info) + debug_print(f" - 容器: {node_id}, 名称: {node_name}, config试剂: {node_config.get('reagent', '')}, data试剂: {node_data.get('reagent_name', '')}") + debug_print(f"❌ 找不到溶剂 '{solvent}' 对应的容器 😭") + debug_print(f"🔍 查找的溶剂: '{solvent}' (小写: '{solvent.lower()}')") + debug_print(f"📊 总共发现 {len(container_list)} 个容器") + raise ValueError(f"找不到溶剂 '{solvent}' 对应的容器") diff --git a/unilabos/compile/stir_protocol.py b/unilabos/compile/stir_protocol.py index 70405ff..e13c1f8 100644 --- a/unilabos/compile/stir_protocol.py +++ b/unilabos/compile/stir_protocol.py @@ -149,7 +149,7 @@ def extract_vessel_id(vessel: Union[str, dict]) -> str: str: vessel_id """ if isinstance(vessel, dict): - vessel_id = vessel.get("id", "") + vessel_id = list(vessel.values())[0].get("id", "") debug_print(f"🔧 从vessel字典提取ID: {vessel_id}") return vessel_id elif isinstance(vessel, str): diff --git a/unilabos/compile/wash_solid_protocol.py b/unilabos/compile/wash_solid_protocol.py index e19d768..b167c85 100644 --- a/unilabos/compile/wash_solid_protocol.py +++ b/unilabos/compile/wash_solid_protocol.py @@ -165,7 +165,7 @@ def extract_vessel_id(vessel: Union[str, dict]) -> str: str: vessel_id """ if isinstance(vessel, dict): - vessel_id = vessel.get("id", "") + vessel_id = list(vessel.values())[0].get("id", "") debug_print(f"🔧 从vessel字典提取ID: {vessel_id}") return vessel_id elif isinstance(vessel, str): diff --git a/unilabos/devices/virtual/virtual_multiway_valve.py b/unilabos/devices/virtual/virtual_multiway_valve.py index 468175c..3cd68a1 100644 --- a/unilabos/devices/virtual/virtual_multiway_valve.py +++ b/unilabos/devices/virtual/virtual_multiway_valve.py @@ -70,11 +70,32 @@ class VirtualMultiwayValve: command: 目标位置 (0-8) 或位置字符串 0: transfer pump位置 1-8: 其他设备位置 + 'default': 默认位置(0号位) """ try: - # 如果是字符串形式的位置,先转换为数字 + # 🔧 处理特殊字符串命令 if isinstance(command, str): - pos = int(command) + command_lower = command.lower().strip() + + # 处理特殊命令 + if command_lower in ['default', 'pump', 'transfer_pump', 'home']: + pos = 0 # 默认位置为0号位(transfer pump) + self.logger.info(f"🔧 特殊命令 '{command}' 映射到位置 {pos}") + elif command_lower in ['open']: + pos = 0 # open命令也映射到0号位 + self.logger.info(f"🔧 OPEN命令映射到位置 {pos}") + elif command_lower in ['close', 'closed']: + # 关闭命令保持当前位置 + pos = self._current_position + self.logger.info(f"🔧 CLOSE命令保持当前位置 {pos}") + else: + # 尝试转换为数字 + try: + pos = int(command) + except ValueError: + error_msg = f"无法识别的命令: '{command}'" + self.logger.error(f"❌ {error_msg}") + raise ValueError(error_msg) else: pos = int(command) diff --git a/unilabos/devices/virtual/virtual_rotavap.py b/unilabos/devices/virtual/virtual_rotavap.py index dd1cca4..61e66a3 100644 --- a/unilabos/devices/virtual/virtual_rotavap.py +++ b/unilabos/devices/virtual/virtual_rotavap.py @@ -88,6 +88,20 @@ class VirtualRotavap: ) -> bool: """Execute evaporate action - 简化版 🌪️""" + # 🔧 新增:确保time参数是数值类型 + if isinstance(time, str): + try: + time = float(time) + except ValueError: + self.logger.error(f"❌ 无法转换时间参数 '{time}' 为数值,使用默认值180.0秒") + time = 180.0 + elif not isinstance(time, (int, float)): + self.logger.error(f"❌ 时间参数类型无效: {type(time)},使用默认值180.0秒") + time = 180.0 + + # 确保time是float类型 + time = float(time) + # 🔧 简化处理:如果vessel就是设备自己,直接操作 if vessel == self.device_id: debug_print(f"🎯 在设备 {self.device_id} 上直接执行蒸发操作") @@ -158,7 +172,7 @@ class VirtualRotavap: }) return False - # 开始蒸发 + # 开始蒸发 - 🔧 现在time已经确保是float类型 self.logger.info(f"🚀 启动蒸发程序! 预计用时 {time/60:.1f}分钟 ⏱️") self.data.update({ diff --git a/unilabos/registry/devices/virtual_device.yaml b/unilabos/registry/devices/virtual_device.yaml index 572456a..dca2dad 100644 --- a/unilabos/registry/devices/virtual_device.yaml +++ b/unilabos/registry/devices/virtual_device.yaml @@ -4580,7 +4580,6 @@ virtual_solid_dispenser: feedback: {} goal: properties: {} - required: [] type: object result: {} required: @@ -4588,30 +4587,6 @@ virtual_solid_dispenser: title: cleanup参数 type: object type: UniLabJsonCommandAsync - auto-find_solid_reagent_bottle: - feedback: {} - goal: {} - goal_default: - reagent_name: null - handles: [] - result: {} - schema: - description: '' - properties: - feedback: {} - goal: - properties: - reagent_name: - type: string - required: - - reagent_name - type: object - result: {} - required: - - goal - title: find_solid_reagent_bottle参数 - type: object - type: UniLabJsonCommand auto-initialize: feedback: {} goal: {} @@ -4624,7 +4599,6 @@ virtual_solid_dispenser: feedback: {} goal: properties: {} - required: [] type: object result: {} required: @@ -4632,58 +4606,9 @@ virtual_solid_dispenser: title: initialize参数 type: object type: UniLabJsonCommandAsync - auto-parse_mass_string: - feedback: {} - goal: {} - goal_default: - mass_str: null - handles: [] - result: {} - schema: - description: '' - properties: - feedback: {} - goal: - properties: - mass_str: - type: string - required: - - mass_str - type: object - result: {} - required: - - goal - title: parse_mass_string参数 - type: object - type: UniLabJsonCommand - auto-parse_mol_string: - feedback: {} - goal: {} - goal_default: - mol_str: null - handles: [] - result: {} - schema: - description: '' - properties: - feedback: {} - goal: - properties: - mol_str: - type: string - required: - - mol_str - type: object - result: {} - required: - - goal - title: parse_mol_string参数 - type: object - type: UniLabJsonCommand module: unilabos.devices.virtual.virtual_solid_dispenser:VirtualSolidDispenser status_types: current_reagent: str - device_info: dict dispensed_amount: float status: str total_operations: int @@ -4716,14 +4641,18 @@ virtual_solid_dispenser: type: object device_id: type: string + max_capacity: + default: 100.0 + type: number + precision: + default: 0.001 + type: number required: [] type: object data: properties: current_reagent: type: string - device_info: - type: object dispensed_amount: type: number status: @@ -4735,7 +4664,6 @@ virtual_solid_dispenser: - current_reagent - dispensed_amount - total_operations - - device_info type: object version: 1.0.0 virtual_stirrer: diff --git a/unilabos/registry/devices/work_station.yaml b/unilabos/registry/devices/work_station.yaml index 7e861f5..3d906dc 100644 --- a/unilabos/registry/devices/work_station.yaml +++ b/unilabos/registry/devices/work_station.yaml @@ -245,8 +245,13 @@ workstation: feedback: {} goal: amount: amount + equiv: equiv + event: event mass: mass + mol: mol purpose: purpose + rate_spec: rate_spec + ratio: ratio reagent: reagent stir: stir stir_speed: stir_speed @@ -470,6 +475,11 @@ workstation: ph_value: ph_value reagent: reagent vessel: vessel + volume: volume + stir: stir + stir_speed: stir_speed + stir_time: stir_time + settling_time: settling_time goal_default: ph_value: 0.0 reagent: '' @@ -493,6 +503,11 @@ workstation: z: 0.0 sample_id: '' type: '' + volume: 0.0 + stir: false + stir_speed: 300.0 + stir_time: 60.0 + settling_time: 30.0 handles: input: - data_key: vessel @@ -511,6 +526,8 @@ workstation: data_type: resource handler_key: VesselOut label: Vessel + placeholder_keys: + vessel: unilabos_resources result: {} schema: description: '' @@ -605,6 +622,21 @@ workstation: - data title: Resource type: object + volume: + type: number + description: 'Volume of the solution to adjust pH' + stir: + type: boolean + description: "是否启用搅拌" + stir_speed: + type: number + description: "搅拌速度(RPM)" + stir_time: + type: number + description: "搅拌时间(秒)" + settling_time: + type: number + description: "pH平衡时间(秒)" required: - vessel - ph_value @@ -674,6 +706,8 @@ workstation: data_type: resource handler_key: VesselOut label: Vessel + placeholder_keys: + vessel: unilabos_resources result: {} schema: description: '' @@ -853,6 +887,8 @@ workstation: data_type: resource handler_key: VesselOut label: Vessel + placeholder_keys: + vessel: unilabos_resources result: {} schema: description: '' @@ -1060,6 +1096,8 @@ workstation: data_type: resource handler_key: VesselOut label: Vessel + placeholder_keys: + vessel: unilabos_resources result: {} schema: description: '' @@ -1191,6 +1229,10 @@ workstation: feedback: {} goal: amount: amount + event: event + mass: mass + mol: mol + reagent: reagent solvent: solvent stir_speed: stir_speed temp: temp @@ -1246,6 +1288,8 @@ workstation: data_type: resource handler_key: VesselOut label: Vessel + placeholder_keys: + vessel: unilabos_resources result: {} schema: description: '' @@ -1429,6 +1473,8 @@ workstation: data_type: resource handler_key: VesselOut label: Vessel + placeholder_keys: + vessel: unilabos_resources result: {} schema: description: '' @@ -1585,6 +1631,8 @@ workstation: data_type: resource handler_key: VesselOut label: Vessel + placeholder_keys: + vessel: unilabos_resources result: {} schema: description: '' @@ -1778,6 +1826,8 @@ workstation: data_type: resource handler_key: vessel_out label: Evaporation Vessel + placeholder_keys: + vessel: unilabos_nodes result: {} schema: description: '' @@ -2014,6 +2064,9 @@ workstation: data_type: resource handler_key: filtrate_out label: Filtrate Vessel + placeholder_keys: + filtrate_vessel: unilabos_resources + vessel: unilabos_nodes result: {} schema: description: '' @@ -2195,7 +2248,7 @@ workstation: type: number required: - vessel - - filtrate_vessel + - #filtrate_vessel - stir - stir_speed - temp @@ -2325,6 +2378,9 @@ workstation: data_type: resource handler_key: ToVesselOut label: To Vessel + placeholder_keys: + from_vessel: unilabos_resources + to_vessel: unilabos_resources result: {} schema: description: '' @@ -2656,6 +2712,8 @@ workstation: data_type: resource handler_key: VesselOut label: Vessel + placeholder_keys: + vessel: unilabos_resources result: {} schema: description: '' @@ -2835,6 +2893,8 @@ workstation: data_type: resource handler_key: VesselOut label: Vessel + placeholder_keys: + vessel: unilabos_resources result: {} schema: description: '' @@ -2986,6 +3046,8 @@ workstation: data_type: resource handler_key: VesselOut label: Vessel + placeholder_keys: + vessel: unilabos_resources result: {} schema: description: '' @@ -3135,6 +3197,8 @@ workstation: data_type: resource handler_key: VesselOut label: Vessel + placeholder_keys: + vessel: unilabos_resources result: {} schema: description: '' @@ -3354,6 +3418,9 @@ workstation: data_type: resource handler_key: ToVesselOut label: To Vessel + placeholder_keys: + from_vessel: unilabos_nodes + to_vessel: unilabos_nodes result: {} schema: description: '' @@ -3667,6 +3734,8 @@ workstation: data_type: resource handler_key: VesselOut label: Vessel + placeholder_keys: + vessel: unilabos_resources result: {} schema: description: '' @@ -4019,6 +4088,10 @@ workstation: data_type: resource handler_key: ToVesselOut label: To Vessel + placeholder_keys: + column: unilabos_devices + from_vessel: unilabos_resources + to_vessel: unilabos_resources result: {} schema: description: '' @@ -4422,6 +4495,11 @@ workstation: data_type: resource handler_key: ToVesselOut label: To Vessel + placeholder_keys: + from_vessel: unilabos_resources + to_vessel: unilabos_resources + waste_phase_to_vessel: unilabos_resources + waste_vessel: unilabos_resources result: {} schema: description: '' @@ -5053,6 +5131,8 @@ workstation: data_type: resource handler_key: VesselOut label: Vessel + placeholder_keys: + vessel: unilabos_resources result: {} schema: description: '' @@ -5225,6 +5305,8 @@ workstation: data_type: resource handler_key: VesselOut label: Vessel + placeholder_keys: + vessel: unilabos_resources result: {} schema: description: '' @@ -5391,6 +5473,8 @@ workstation: data_type: resource handler_key: VesselOut label: Vessel + placeholder_keys: + vessel: unilabos_resources result: {} schema: description: '' @@ -5556,6 +5640,9 @@ workstation: data_type: resource handler_key: ToVesselOut label: To Vessel + placeholder_keys: + from_vessel: unilabos_nodes + to_vessel: unilabos_nodes result: {} schema: description: '' @@ -5722,6 +5809,9 @@ workstation: data_type: resource handler_key: filtrate_vessel_out label: Filtrate Vessel + placeholder_keys: + filtrate_vessel: unilabos_resources + vessel: unilabos_resources result: {} schema: description: '' diff --git a/unilabos/resources/graphio.py b/unilabos/resources/graphio.py index a392438..3e3ece3 100644 --- a/unilabos/resources/graphio.py +++ b/unilabos/resources/graphio.py @@ -248,7 +248,7 @@ def dict_to_nested_dict(nodes: dict, devices_only: bool = False) -> dict: root_nodes = { node["id"]: node for node in nodes_list - if node.get("parent", node.get("parent_name")) in [None, "", "None", np.nan] + if node.get("parent", node.get("parent_name")) in [None, "", "None", np.nan] or len(nodes_list) == 1 } # 如果存在多个根节点,返回所有根节点 diff --git a/unilabos/ros/nodes/presets/protocol_node.py b/unilabos/ros/nodes/presets/protocol_node.py index a17d4e9..72e3d65 100644 --- a/unilabos/ros/nodes/presets/protocol_node.py +++ b/unilabos/ros/nodes/presets/protocol_node.py @@ -189,45 +189,26 @@ class ROS2ProtocolNode(BaseROS2DeviceNode): # # 🔧 完全禁用Host查询,直接使用转换后的数据 # print(f"🔧 跳过Host查询,直接使用转换后的数据") - - # 🔧 额外验证:确保vessel数据完整 - if 'vessel' in protocol_kwargs: - vessel_data = protocol_kwargs['vessel'] - #print(f"🔍 验证vessel数据: {vessel_data}") - - # 如果vessel是空字典,尝试重新构建 - if not vessel_data or (isinstance(vessel_data, dict) and not vessel_data): - # print(f"⚠️ vessel数据为空,尝试从原始goal重新提取...") - - # 直接从原始goal提取vessel - if hasattr(goal, 'vessel') and goal.vessel: - # print(f"🔍 原始goal.vessel: {goal.vessel}") - # 手动转换vessel - vessel_data = { - 'id': goal.vessel.id, - 'name': goal.vessel.name, - 'type': goal.vessel.type, - 'category': goal.vessel.category, - 'config': goal.vessel.config, - 'data': goal.vessel.data - } - protocol_kwargs['vessel'] = vessel_data - # print(f"✅ 手动重建vessel数据: {vessel_data}") - else: - # print(f"❌ 无法从原始goal提取vessel数据") - # 创建一个基本的vessel - vessel_data = {'id': 'default_vessel'} - protocol_kwargs['vessel'] = vessel_data - # print(f"🔧 创建默认vessel: {vessel_data}") + # 向Host查询物料当前状态 + for k, v in goal.get_fields_and_field_types().items(): + if v in ["unilabos_msgs/Resource", "sequence"]: + r = ResourceGet.Request() + resource_id = ( + protocol_kwargs[k]["id"] if v == "unilabos_msgs/Resource" else protocol_kwargs[k][0]["id"] + ) + r.id = resource_id + r.with_children = True + response = await self._resource_clients["resource_get"].call_async(r) + protocol_kwargs[k] = list_to_nested_dict( + [convert_from_ros_msg(rs) for rs in response.resources] + ) - #print(f"🔍 最终传递给协议的 protocol_kwargs: {protocol_kwargs}") - #print(f"🔍 最终的 vessel: {protocol_kwargs.get('vessel', 'NOT_FOUND')}") + self.lab_logger().info(f"🔍 最终传递给协议的 protocol_kwargs: {protocol_kwargs}") + self.lab_logger().info(f"🔍 最终的 vessel: {protocol_kwargs.get('vessel', 'NOT_FOUND')}") from unilabos.resources.graphio import physical_setup_graph self.lab_logger().info(f"Working on physical setup: {physical_setup_graph}") - self.lab_logger().info(f"Protocol kwargs: {goal}") - self.lab_logger().info(f"Protocol kwargs: {action_value_mapping}") protocol_steps = protocol_steps_generator(G=physical_setup_graph, **protocol_kwargs) self.lab_logger().info(f"Goal received: {protocol_kwargs}, running steps: \n{protocol_steps}") @@ -263,14 +244,14 @@ class ROS2ProtocolNode(BaseROS2DeviceNode): } ) - # # 向Host更新物料当前状态 - # for k, v in goal.get_fields_and_field_types().items(): - # if v in ["unilabos_msgs/Resource", "sequence"]: - # r = ResourceUpdate.Request() - # r.resources = [ - # convert_to_ros_msg(Resource, rs) for rs in nested_dict_to_list(protocol_kwargs[k]) - # ] - # response = await self._resource_clients["resource_update"].call_async(r) + # 向Host更新物料当前状态 + for k, v in goal.get_fields_and_field_types().items(): + if v in ["unilabos_msgs/Resource", "sequence"]: + r = ResourceUpdate.Request() + r.resources = [ + convert_to_ros_msg(Resource, rs) for rs in nested_dict_to_list(protocol_kwargs[k]) + ] + response = await self._resource_clients["resource_update"].call_async(r) # 设置成功状态和返回值 execution_success = True From fd18b211478a103c9359c59d0dc3818c2776c57f Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Sat, 19 Jul 2025 10:38:58 +0800 Subject: [PATCH 89/96] =?UTF-8?q?=E9=87=87=E7=94=A8http=E6=8A=A5=E9=80=81r?= =?UTF-8?q?esource?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- unilabos/app/register.py | 24 ++++-- unilabos/app/web/client.py | 23 ++++- unilabos/registry/devices/virtual_device.yaml | 84 +++++++++++++++++-- unilabos/registry/devices/work_station.yaml | 28 +------ unilabos/registry/registry.py | 2 + 5 files changed, 123 insertions(+), 38 deletions(-) diff --git a/unilabos/app/register.py b/unilabos/app/register.py index 40e4107..7a78cf9 100644 --- a/unilabos/app/register.py +++ b/unilabos/app/register.py @@ -18,10 +18,22 @@ def register_devices_and_resources(mqtt_client, lab_registry): mqtt_client.publish_registry(device_info["id"], device_info, False) logger.debug(f"[UniLab Register] 注册设备: {device_info['id']}") - # 注册资源信息 + # 注册资源信息 - 使用HTTP方式 + from unilabos.app.web.client import http_client + + resources_to_register = {} for resource_info in lab_registry.obtain_registry_resource_info(): - mqtt_client.publish_registry(resource_info["id"], resource_info, False) - logger.debug(f"[UniLab Register] 注册资源: {resource_info['id']}") + resources_to_register[resource_info["id"]] = resource_info + logger.debug(f"[UniLab Register] 准备注册资源: {resource_info['id']}") + + if resources_to_register: + start_time = time.time() + response = http_client.resource_registry(resources_to_register) + cost_time = time.time() - start_time + if response.status_code in [200, 201]: + logger.info(f"[UniLab Register] 成功通过HTTP注册 {len(resources_to_register)} 个资源 {cost_time}ms") + else: + logger.error(f"[UniLab Register] HTTP注册资源失败: {response.status_code}, {response.text} {cost_time}ms") time.sleep(10) @@ -53,11 +65,9 @@ def main(): help="是否补全注册表", ) args = parser.parse_args() - + load_config_from_file(args.config) # 构建注册表 build_registry(args.registry, args.complete_registry) - load_config_from_file(args.config) - from unilabos.app.mq import mqtt_client # 连接mqtt @@ -70,4 +80,4 @@ def main(): if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/unilabos/app/web/client.py b/unilabos/app/web/client.py index 09b6ede..923e904 100644 --- a/unilabos/app/web/client.py +++ b/unilabos/app/web/client.py @@ -40,8 +40,9 @@ class HTTPClient: Returns: Response: API响应对象 """ + database_param = 1 if database_process_later else 0 response = requests.post( - f"{self.remote_addr}/lab/resource/edge/batch_create/?database_process_later={1 if database_process_later else 0}", + f"{self.remote_addr}/lab/resource/edge/batch_create/?database_process_later={database_param}", json=resources, headers={"Authorization": f"lab {self.auth}"}, timeout=100, @@ -149,6 +150,26 @@ class HTTPClient: ) return response + def resource_registry(self, registry_data: Dict[str, Any]) -> requests.Response: + """ + 注册资源到服务器 + + Args: + registry_data: 注册表数据,格式为 {resource_id: resource_info} + + Returns: + Response: API响应对象 + """ + response = requests.post( + f"{self.remote_addr}/lab/registry/", + json=registry_data, + headers={"Authorization": f"lab {self.auth}"}, + timeout=30, + ) + if response.status_code not in [200, 201]: + logger.error(f"注册资源失败: {response.status_code}, {response.text}") + return response + # 创建默认客户端实例 http_client = HTTPClient() diff --git a/unilabos/registry/devices/virtual_device.yaml b/unilabos/registry/devices/virtual_device.yaml index dca2dad..572456a 100644 --- a/unilabos/registry/devices/virtual_device.yaml +++ b/unilabos/registry/devices/virtual_device.yaml @@ -4580,6 +4580,7 @@ virtual_solid_dispenser: feedback: {} goal: properties: {} + required: [] type: object result: {} required: @@ -4587,6 +4588,30 @@ virtual_solid_dispenser: title: cleanup参数 type: object type: UniLabJsonCommandAsync + auto-find_solid_reagent_bottle: + feedback: {} + goal: {} + goal_default: + reagent_name: null + handles: [] + result: {} + schema: + description: '' + properties: + feedback: {} + goal: + properties: + reagent_name: + type: string + required: + - reagent_name + type: object + result: {} + required: + - goal + title: find_solid_reagent_bottle参数 + type: object + type: UniLabJsonCommand auto-initialize: feedback: {} goal: {} @@ -4599,6 +4624,7 @@ virtual_solid_dispenser: feedback: {} goal: properties: {} + required: [] type: object result: {} required: @@ -4606,9 +4632,58 @@ virtual_solid_dispenser: title: initialize参数 type: object type: UniLabJsonCommandAsync + auto-parse_mass_string: + feedback: {} + goal: {} + goal_default: + mass_str: null + handles: [] + result: {} + schema: + description: '' + properties: + feedback: {} + goal: + properties: + mass_str: + type: string + required: + - mass_str + type: object + result: {} + required: + - goal + title: parse_mass_string参数 + type: object + type: UniLabJsonCommand + auto-parse_mol_string: + feedback: {} + goal: {} + goal_default: + mol_str: null + handles: [] + result: {} + schema: + description: '' + properties: + feedback: {} + goal: + properties: + mol_str: + type: string + required: + - mol_str + type: object + result: {} + required: + - goal + title: parse_mol_string参数 + type: object + type: UniLabJsonCommand module: unilabos.devices.virtual.virtual_solid_dispenser:VirtualSolidDispenser status_types: current_reagent: str + device_info: dict dispensed_amount: float status: str total_operations: int @@ -4641,18 +4716,14 @@ virtual_solid_dispenser: type: object device_id: type: string - max_capacity: - default: 100.0 - type: number - precision: - default: 0.001 - type: number required: [] type: object data: properties: current_reagent: type: string + device_info: + type: object dispensed_amount: type: number status: @@ -4664,6 +4735,7 @@ virtual_solid_dispenser: - current_reagent - dispensed_amount - total_operations + - device_info type: object version: 1.0.0 virtual_stirrer: diff --git a/unilabos/registry/devices/work_station.yaml b/unilabos/registry/devices/work_station.yaml index 3d906dc..c1cc5aa 100644 --- a/unilabos/registry/devices/work_station.yaml +++ b/unilabos/registry/devices/work_station.yaml @@ -474,12 +474,12 @@ workstation: goal: ph_value: ph_value reagent: reagent - vessel: vessel - volume: volume + settling_time: settling_time stir: stir stir_speed: stir_speed stir_time: stir_time - settling_time: settling_time + vessel: vessel + volume: volume goal_default: ph_value: 0.0 reagent: '' @@ -503,11 +503,6 @@ workstation: z: 0.0 sample_id: '' type: '' - volume: 0.0 - stir: false - stir_speed: 300.0 - stir_time: 60.0 - settling_time: 30.0 handles: input: - data_key: vessel @@ -622,21 +617,6 @@ workstation: - data title: Resource type: object - volume: - type: number - description: 'Volume of the solution to adjust pH' - stir: - type: boolean - description: "是否启用搅拌" - stir_speed: - type: number - description: "搅拌速度(RPM)" - stir_time: - type: number - description: "搅拌时间(秒)" - settling_time: - type: number - description: "pH平衡时间(秒)" required: - vessel - ph_value @@ -2248,7 +2228,7 @@ workstation: type: number required: - vessel - - #filtrate_vessel + - filtrate_vessel - stir - stir_speed - temp diff --git a/unilabos/registry/registry.py b/unilabos/registry/registry.py index a7583e3..780ba90 100644 --- a/unilabos/registry/registry.py +++ b/unilabos/registry/registry.py @@ -127,6 +127,8 @@ class Registry: }, }, "version": "1.0.0", + "category": [], + "config_info": [], "icon": "icon_device.webp", "registry_type": "device", "handles": [], From 3c9cca88ea501323c86a6ae327bc2204914d88ab Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Sat, 19 Jul 2025 11:09:24 +0800 Subject: [PATCH 90/96] =?UTF-8?q?=E9=87=87=E7=94=A8http=E6=8A=A5=E9=80=81r?= =?UTF-8?q?esource?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 ++- README.md | 2 +- README_zh.md | 2 +- recipes/ros-humble-unilabos-msgs/recipe.yaml | 2 +- recipes/unilabos/recipe.yaml | 2 +- setup.py | 2 +- test/experiments/prcxi.json | 2 +- 7 files changed, 8 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 5591f09..51d4de2 100644 --- a/.gitignore +++ b/.gitignore @@ -241,4 +241,5 @@ unilabos/device_mesh/view_robot.rviz # Certs **/.certs local_test2.py -ros-humble-unilabos-msgs-0.9.13-h6403a04_5.tar.bz2 +*.tar.bz2 +*.tar.gz diff --git a/README.md b/README.md index ab6320c..011db12 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.13-xxxxx.tar.bz2 +conda install ros-humble-unilabos-msgs-0.9.14-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 50084af..91e9b8d 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.13-xxxxx.tar.bz2 +conda install ros-humble-unilabos-msgs-0.9.14-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 89738d0..9f4d631 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.13 + version: 0.9.14 source: path: ../../unilabos_msgs folder: ros-humble-unilabos-msgs/src/work diff --git a/recipes/unilabos/recipe.yaml b/recipes/unilabos/recipe.yaml index 2463cc5..1a1b400 100644 --- a/recipes/unilabos/recipe.yaml +++ b/recipes/unilabos/recipe.yaml @@ -1,6 +1,6 @@ package: name: unilabos - version: "0.9.13" + version: "0.9.14" source: path: ../.. diff --git a/setup.py b/setup.py index 7a0f97f..97e21ef 100644 --- a/setup.py +++ b/setup.py @@ -4,7 +4,7 @@ package_name = 'unilabos' setup( name=package_name, - version='0.9.13', + version='0.9.14', packages=find_packages(), include_package_data=True, install_requires=['setuptools'], diff --git a/test/experiments/prcxi.json b/test/experiments/prcxi.json index d72768f..a6c93a3 100644 --- a/test/experiments/prcxi.json +++ b/test/experiments/prcxi.json @@ -21,7 +21,7 @@ "timeout": 10.0, "axis": "Right", "channel_num": 1, - "setup": false, + "setup": true, "debug": false, "simulator": false, "matrix_id": "fd383e6d-2d0e-40b5-9c01-1b2870b1f1b1" From de4da95616aa36c37e2d91b2347a9f6392c80785 Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Sat, 19 Jul 2025 13:18:03 +0800 Subject: [PATCH 91/96] update --- .gitignore | 1 + .../liquid_handler_abstract.py | 2 + .../devices/liquid_handling/prcxi/prcxi.py | 55 ++++++++++--------- 3 files changed, 31 insertions(+), 27 deletions(-) diff --git a/.gitignore b/.gitignore index 5591f09..6529fb0 100644 --- a/.gitignore +++ b/.gitignore @@ -242,3 +242,4 @@ unilabos/device_mesh/view_robot.rviz **/.certs local_test2.py ros-humble-unilabos-msgs-0.9.13-h6403a04_5.tar.bz2 +ros-humble-unilabos-msgs-0.9.12-h6403a04_5.tar.bz2 diff --git a/unilabos/devices/liquid_handling/liquid_handler_abstract.py b/unilabos/devices/liquid_handling/liquid_handler_abstract.py index 242fcb3..d44a9ae 100644 --- a/unilabos/devices/liquid_handling/liquid_handler_abstract.py +++ b/unilabos/devices/liquid_handling/liquid_handler_abstract.py @@ -104,6 +104,8 @@ class LiquidHandlerMiddleware(LiquidHandler): offsets: Optional[List[Coordinate]] = None, **backend_kwargs, ): + print('222'*200) + print(tip_spots) if self._simulator: return await self._simulate_handler.pick_up_tips(tip_spots, use_channels, offsets, **backend_kwargs) return await super().pick_up_tips(tip_spots, use_channels, offsets, **backend_kwargs) diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index 602fa7a..155e099 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -1279,22 +1279,23 @@ if __name__ == "__main__": # asyncio.run(handler.mix([plate1.children[0]], mix_time=3, mix_vol=5, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) # print(plate1.children[0]) # asyncio.run(handler.discard_tips()) - -# asyncio.run(handler.add_liquid( -# asp_vols=[10]*2, -# dis_vols=[10]*2, -# reagent_sources=[plate11.children[0]], -# targets=plate11.children[-2:], -# use_channels=[0], -# flow_rates=[None] * 4, -# offsets=[Coordinate(0, 0, 0)] * 4, -# liquid_height=[None] * 2, -# blow_out_air_volume=[None] * 2, -# delays=None, -# mix_time=3, -# mix_vol=5, -# spread="wide", -# )) + print('1111'*500) + print(plate11.children[-2:]) + asyncio.run(handler.add_liquid( + asp_vols=[10]*2, + dis_vols=[10]*2, + reagent_sources=[plate11.children[0]], + targets=plate11.children[-2:], + use_channels=[0], + flow_rates=[None] * 4, + offsets=[Coordinate(0, 0, 0)] * 4, + liquid_height=[None] * 2, + blow_out_air_volume=[None] * 2, + delays=None, + mix_time=3, + mix_vol=5, + spread="wide", +)) # asyncio.run(handler.transfer_liquid( # asp_vols=[10]*2, @@ -1312,17 +1313,17 @@ if __name__ == "__main__": # tip_racks=[plate8] # )) - asyncio.run(handler.remove_liquid( - vols=[10]*2, - sources=plate11.children[:2], - waste_liquid=plate11.children[43], - use_channels=[0], - offsets=[Coordinate(0, 0, 0)] * 4, - liquid_height=[None] * 2, - blow_out_air_volume=[None] * 2, - delays=None, - spread="wide" -)) +# asyncio.run(handler.remove_liquid( +# vols=[10]*2, +# sources=plate11.children[:2], +# waste_liquid=plate11.children[43], +# use_channels=[0], +# offsets=[Coordinate(0, 0, 0)] * 4, +# liquid_height=[None] * 2, +# blow_out_air_volume=[None] * 2, +# delays=None, +# spread="wide" +# )) From b08026f861b6663bf60b3a519686c83e3f818616 Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Sat, 19 Jul 2025 13:19:27 +0800 Subject: [PATCH 92/96] Update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 5591f09..91910c9 100644 --- a/.gitignore +++ b/.gitignore @@ -242,3 +242,4 @@ unilabos/device_mesh/view_robot.rviz **/.certs local_test2.py ros-humble-unilabos-msgs-0.9.13-h6403a04_5.tar.bz2 +*.bz2 From 34dd65d280bc16c4b3a2aefab98593fb3655cbdd Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Sat, 19 Jul 2025 13:22:06 +0800 Subject: [PATCH 93/96] bump version to 0.10.0 --- README.md | 2 +- README_zh.md | 2 +- recipes/ros-humble-unilabos-msgs/recipe.yaml | 2 +- recipes/unilabos/recipe.yaml | 2 +- setup.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 011db12..f58cf3e 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.14-xxxxx.tar.bz2 +conda install ros-humble-unilabos-msgs-0.10.0-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 91e9b8d..ef555e7 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.14-xxxxx.tar.bz2 +conda install ros-humble-unilabos-msgs-0.10.0-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 9f4d631..81c390b 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.14 + version: 0.10.0 source: path: ../../unilabos_msgs folder: ros-humble-unilabos-msgs/src/work diff --git a/recipes/unilabos/recipe.yaml b/recipes/unilabos/recipe.yaml index 1a1b400..3b97b9a 100644 --- a/recipes/unilabos/recipe.yaml +++ b/recipes/unilabos/recipe.yaml @@ -1,6 +1,6 @@ package: name: unilabos - version: "0.9.14" + version: "0.10.0" source: path: ../.. diff --git a/setup.py b/setup.py index 97e21ef..f256bd6 100644 --- a/setup.py +++ b/setup.py @@ -4,7 +4,7 @@ package_name = 'unilabos' setup( name=package_name, - version='0.9.14', + version='0.10.0', packages=find_packages(), include_package_data=True, install_requires=['setuptools'], From 1467b9ac919aef5be50b3a45679b701aa92d719a Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Sat, 19 Jul 2025 14:04:58 +0800 Subject: [PATCH 94/96] default param simulator --- unilabos/devices/liquid_handling/liquid_handler_abstract.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unilabos/devices/liquid_handling/liquid_handler_abstract.py b/unilabos/devices/liquid_handling/liquid_handler_abstract.py index d44a9ae..699c367 100644 --- a/unilabos/devices/liquid_handling/liquid_handler_abstract.py +++ b/unilabos/devices/liquid_handling/liquid_handler_abstract.py @@ -535,7 +535,7 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): """Extended LiquidHandler with additional operations.""" support_touch_tip = True - def __init__(self, backend: LiquidHandlerBackend, deck: Deck, simulator: bool, channel_num:int = 8): + def __init__(self, backend: LiquidHandlerBackend, deck: Deck, simulator: bool=False, channel_num:int = 8): """Initialize a LiquidHandler. Args: From 98e9d0958339f516e1c9d8ee8bc17cc7325bb9cc Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Sat, 19 Jul 2025 15:01:00 +0800 Subject: [PATCH 95/96] slim --- .../comprehensive_slim.json | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 test/experiments/comprehensive_protocol/comprehensive_slim.json diff --git a/test/experiments/comprehensive_protocol/comprehensive_slim.json b/test/experiments/comprehensive_protocol/comprehensive_slim.json new file mode 100644 index 0000000..d9dd773 --- /dev/null +++ b/test/experiments/comprehensive_protocol/comprehensive_slim.json @@ -0,0 +1,70 @@ +{ + "nodes": [ + { + "id": "OrganicSynthesisStation", + "name": "有机化学流程综合测试工作站", + "children": [ + "heater_1" + ], + "parent": null, + "type": "device", + "class": "workstation", + "position": { + "x": 600, + "y": 400, + "z": 0 + }, + "config": { + "protocol_type": [ + "AddProtocol", + "TransferProtocol", + "StartStirProtocol", + "StopStirProtocol", + "StirProtocol", + "RunColumnProtocol", + "CentrifugeProtocol", + "FilterProtocol", + "CleanVesselProtocol", + "DissolveProtocol", + "FilterThroughProtocol", + "WashSolidProtocol", + "SeparateProtocol", + "EvaporateProtocol", + "HeatChillProtocol", + "HeatChillStartProtocol", + "HeatChillStopProtocol", + "EvacuateAndRefillProtocol", + "PumpTransferProtocol", + "AdjustPHProtocol", + "ResetHandlingProtocol", + "DryProtocol", + "HydrogenateProtocol", + "RecrystallizeProtocol" + ] + }, + "data": {} + }, + { + "id": "heater_1", + "name": "加热器", + "children": [], + "parent": "OrganicSynthesisStation", + "type": "device", + "class": "virtual_heatchill", + "position": { + "x": 450, + "y": 450, + "z": 0 + }, + "config": { + "max_temp": 200.0, + "min_temp": -20.0 + }, + "data": { + "status": "Idle", + "current_temp": 25.0 + } + } + ], + "links": [] +} \ No newline at end of file From a8cf389b00f1bd815a7d53e0a79a145808bfdd8f Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Sat, 19 Jul 2025 15:16:08 +0800 Subject: [PATCH 96/96] Update --- .../liquid_handler_abstract.py | 24 +- .../devices/liquid_handling/prcxi/prcxi.py | 677 +++++++++--------- 2 files changed, 361 insertions(+), 340 deletions(-) diff --git a/unilabos/devices/liquid_handling/liquid_handler_abstract.py b/unilabos/devices/liquid_handling/liquid_handler_abstract.py index d44a9ae..d5a8fbf 100644 --- a/unilabos/devices/liquid_handling/liquid_handler_abstract.py +++ b/unilabos/devices/liquid_handling/liquid_handler_abstract.py @@ -622,12 +622,10 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): spread=spread, ) await self.discard_tips() - elif len(use_channels) == 8 and self.backend.num_channels == 8: - tip = [] - for _ in range(len(use_channels)): - tip.extend(next(self.current_tip)) - await self.pick_up_tips(tip) + elif len(use_channels) == 8 and self.backend.num_channels == 8: + + # 对于8个的情况,需要判断此时任务是不是能被8通道移液站来成功处理 if len(sources) % 8 != 0: raise ValueError(f"Length of `sources` {len(sources)} must be a multiple of 8 for 8-channel mode.") @@ -635,7 +633,6 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): # 8个8个来取任务序列 for i in range(0, len(sources), 8): - # 取出8个任务 tip = [] for _ in range(len(use_channels)): tip.extend(next(self.current_tip)) @@ -764,19 +761,16 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): await self.custom_delay(seconds=delays[1]) await self.touch_tip(targets[_]) await self.discard_tips() - elif len(use_channels) == 8: + elif len(use_channels) == 8: # 对于8个的情况,需要判断此时任务是不是能被8通道移液站来成功处理 if len(targets) % 8 != 0: raise ValueError(f"Length of `targets` {len(targets)} must be a multiple of 8 for 8-channel mode.") - - # 8个8个来取任务序列 - + tip = [] + for _ in range(len(use_channels)): + tip.extend(next(self.current_tip)) + await self.pick_up_tips(tip) for i in range(0, len(targets), 8): - tip = [] - for _ in range(len(use_channels)): - tip.extend(next(self.current_tip)) - await self.pick_up_tips(tip) current_targets = targets[i:i + 8] current_reagent_sources = reagent_sources[i:i + 8] current_asp_vols = asp_vols[i:i + 8] @@ -826,7 +820,7 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): if delays is not None: await self.custom_delay(seconds=delays[1]) await self.touch_tip(current_targets) - await self.discard_tips() + await self.discard_tips() # except Exception as e: diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index 155e099..2f13242 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -455,7 +455,7 @@ class PRCXI9300Backend(LiquidHandlerBackend): # print(plate_indexes[0]) PlateNo = plate_indexes[0] + 1 hole_col = tip_columns[0] + 1 - + hole_row = 1 if self._num_channels == 1: hole_row = tipspot_index % 8 + 1 @@ -476,7 +476,7 @@ class PRCXI9300Backend(LiquidHandlerBackend): dosage=0, plate_no=PlateNo, is_whole_plate=False, - hole_row=3, + hole_row=1, hole_col=3, blending_times=0, balance_height=0, @@ -974,156 +974,9 @@ if __name__ == "__main__": # # 2. backend需要支持num channel为1的情况 # # 3. 设计一个单点动作流程,可以跑 # # 4. - # deck = PRCXI9300Deck(name="PRCXI_Deck", size_x=100, size_y=100, size_z=100) - # plate1 = PRCXI9300Container(name="rackT1", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) - # plate1.load_state({ - # "Material": { - # "uuid": "80652665f6a54402b2408d50b40398df", - # "Co#de": "ZX-001-1000", - # "Name": "1000μL Tip头", - # "SummaryName": "1000μL Tip头", - # "PipetteHeight": 100, - # "materialEnum": 1 - # } - # }) - - # plate2 = PRCXI9300Container(name="plateT2", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) - # plate2.load_state({ - # "Material": { - # "uuid": "57b1e4711e9e4a32b529f3132fc5931f", - # } - # }) - - # plate3 = PRCXI9300Container(name="plateT3", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) - # plate3.load_state({ - # "Material": { - # "uuid": "57b1e4711e9e4a32b529f3132fc5931f", - # } - # }) - - # plate4 = PRCXI9300Container(name="rackT4", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) - # plate4.load_state({ - # "Material": { - # "uuid": "80652665f6a54402b2408d50b40398df", - # "Code": "ZX-001-1000", - # "Name": "1000μL Tip头", - # "SummaryName": "1000μL Tip头", - # "PipetteHeight": 100, - # "materialEnum": 1 - # } - # }) - - # plate5 = PRCXI9300Container(name="plateT5", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) - # plate5.load_state({ - # "Material": { - # "uuid": "57b1e4711e9e4a32b529f3132fc5931f", - # } - # }) - # plate6 = PRCXI9300Trash(name="trash", size_x=50, size_y=500, size_z=10, category="trash") - # plate6.load_state({ - # "Material": { - # "uuid": "57b1e4711e9e4a32b529f3132fc5931f", - # } - # }) - - # from pylabrobot.resources.opentrons.tip_racks import tipone_96_tiprack_200ul - # from pylabrobot.resources.opentrons.plates import corning_96_wellplate_360ul_flat - - # tip_rack = tipone_96_tiprack_200ul("TipRack") - # well_containers = corning_96_wellplate_360ul_flat("Plate") - # # from pprint import pprint - # # pprint(well_containers.children) - # plate1.assign_child_resource(tip_rack, location=Coordinate(0, 0, 0)) - # plate2.assign_child_resource(well_containers, location=Coordinate(0, 0, 0)) - - # deck.assign_child_resource(plate1, location=Coordinate(0, 0, 0)) - # deck.assign_child_resource(plate2, location=Coordinate(0, 0, 0)) - # deck.assign_child_resource(plate3, location=Coordinate(0, 0, 0)) - # deck.assign_child_resource(plate4, location=Coordinate(0, 0, 0)) - # deck.assign_child_resource(plate5, location=Coordinate(0, 0, 0)) - # deck.assign_child_resource(plate6, location=Coordinate(0, 0, 0)) - - # print(plate2) - # # plate_2_liquids = [[(None, 500)]]*96 - - # # plate2.set_well_liquids(plate_2_liquids) - - - # handler = PRCXI9300Handler(deck=deck, host="192.168.3.9", port=9999, timeout=10.0, setup=False, debug=True, matrix_id="fd383e6d-2d0e-40b5-9c01-1b2870b1f1b1") - # handler.set_tiprack([tip_rack]) # Set the tip rack for the handler - # asyncio.run(handler.setup()) # Initialize the handler and setup the connection - # from pylabrobot.resources import set_volume_tracking - - # # from pylabrobot.resources import set_tip_tracking - # set_volume_tracking(enabled=True) - # plate2.set_well_liquids([("Water", 100)] * plate2.num_items) - # asyncio.run(handler.create_protocol(protocol_name="Test Protocol")) # Initialize the backend and setup the connection - # # asyncio.run(handler.pick_up_tips(tip_rack.children[:8],[0,1,2,3,4,5,6,7])) - - # # asyncio.run(handler.aspirate(well_containers.children[:8],[50]*8, [0,1,2,3,4,5,6,7])) - # # asyncio.run(handler.dispense(well_containers.children[:8],[50]*8,[0,1,2,3,4,5,6,7])) - # # asyncio.run(handler.drop_tips(tip_rack.children[8:16],[0,1,2,3,4,5,6,7])) - # # asyncio.run(handler.discard_tips()) - # # asyncio.run(handler.mix(well_containers.children[:8 - # # ], mix_time=3, mix_vol=50, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) - # #print(json.dumps(handler._unilabos_backend.steps_todo_list, indent=2)) # Print matrix info - # asyncio.run(handler.add_liquid( - # asp_vols=[100]*16, - # dis_vols=[100]*16, - # reagent_sources=well_containers.children[-16:], - # targets=well_containers.children[:16], - # use_channels=[0, 1, 2, 3, 4, 5, 6, 7], - # flow_rates=[None] * 32, - # offsets=[Coordinate(0, 0, 0)] * 32, - # liquid_height=[None] * 16, - # blow_out_air_volume=[None] * 16, - # delays=None, - # mix_time=3, - # mix_vol=50, - # spread="wide", - # )) - - # # asyncio.run(handler.remove_liquid( - # # vols=[100]*16, - # # sources=well_containers.children[-16:], - # # waste_liquid=well_containers.children[:16], # 这个有些奇怪,但是好像也只能这么写 - # # use_channels=[0, 1, 2, 3, 4, 5, 6, 7], - # # flow_rates=[None] * 32, - # # offsets=[Coordinate(0, 0, 0)] * 32, - # # liquid_height=[None] * 32, - # # blow_out_air_volume=[None] * 32, - # # spread="wide", - # # )) - # # asyncio.run(handler.transfer_liquid( - # # asp_vols=[100]*16, - # # dis_vols=[100]*16, - # # tip_racks=[tip_rack], - # # sources=well_containers.children[-16:], - # # targets=well_containers.children[:16], - # # use_channels=[0, 1, 2, 3, 4, 5, 6, 7], - # # offsets=[Coordinate(0, 0, 0)] * 32, - # # asp_flow_rates=[None] * 16, - # # dis_flow_rates=[None] * 16, - # # liquid_height=[None] * 32, - # # blow_out_air_volume=[None] * 32, - # # mix_times=3, - # # mix_vol=50, - # # spread="wide", - # # )) - # print(json.dumps(handler._unilabos_backend.steps_todo_list, indent=2)) # Print matrix info - # # input("pick_up_tips add step") - # #asyncio.run(handler.run_protocol()) # Run the protocol - # # input("Running protocol...") - # # input("Press Enter to continue...") # Wait for user input before proceeding - # # print("PRCXI9300Handler initialized with deck and host settings.") - - # Example usage - # 1. 用导出的json,给每个T1 T2板子设定相应的物料,如果是孔板和枪头盒,要对应区分 - # 2. 设计一个单点动作流程,可以跑 - # 3. deck = PRCXI9300Deck(name="PRCXI_Deck", size_x=100, size_y=100, size_z=100) - from pylabrobot.resources.opentrons.tip_racks import tipone_96_tiprack_200ul,opentrons_96_tiprack_10ul + from pylabrobot.resources.opentrons.tip_racks import opentrons_96_tiprack_300ul,opentrons_96_tiprack_10ul from pylabrobot.resources.opentrons.plates import corning_96_wellplate_360ul_flat, nest_96_wellplate_2ml_deep def get_well_container(name: str) -> PRCXI9300Container: @@ -1137,7 +990,7 @@ if __name__ == "__main__": return new_plate def get_tip_rack(name: str) -> PRCXI9300Container: - tip_racks = opentrons_96_tiprack_10ul("name").serialize() + tip_racks = opentrons_96_tiprack_300ul("name").serialize() tip_rack = PRCXI9300Container(name=name, size_x=50, size_y=50, size_z=10, category="tip_rack", ordering=collections.OrderedDict()) tip_rack_serialized = tip_rack.serialize() @@ -1146,204 +999,114 @@ if __name__ == "__main__": new_tip_rack: PRCXI9300Container = PRCXI9300Container.deserialize(tip_racks) return new_tip_rack - plate1 = get_well_container("HPLCPlateT1") + plate1 = get_tip_rack("RackT1") plate1.load_state({ "Material": { - "uuid": "548bbc3df0d4447586f2c19d2c0c0c55", - "Code": "HPLC01", - "Name": "HPLC料盘" + "uuid": "076250742950465b9d6ea29a225dfb00", + "Code": "ZX-001-300", + "Name": "300μL Tip头" } }) + plate2 = get_well_container("PlateT2") plate2.load_state({ "Material": { - "uuid": "04211a2dc93547fe9bf6121eac533650", + "uuid": "57b1e4711e9e4a32b529f3132fc5931f", + "Code": "ZX-019-2.2", + "Name": "96深孔板" } }) - plate3 = get_well_container("PlateT3") + + + plate3 = PRCXI9300Trash("trash", size_x=50, size_y=100, size_z=10, category="trash") plate3.load_state({ - "Material": { - "uuid": "04211a2dc93547fe9bf6121eac533650", - } - }) - trash = PRCXI9300Trash(name="trash", size_x=50, size_y=50, size_z=10, category="trash") - trash.load_state({ "Material": { "uuid": "730067cf07ae43849ddf4034299030e9" } }) + + plate4 = get_tip_rack("RackT4") + plate4.load_state({ + "Material": { + "uuid": "076250742950465b9d6ea29a225dfb00", + "Code": "ZX-001-300", + "Name": "300μL Tip头" + } + }) + plate5 = get_well_container("PlateT5") plate5.load_state({ "Material": { - "uuid": "04211a2dc93547fe9bf6121eac533650", + "uuid": "57b1e4711e9e4a32b529f3132fc5931f", + "Code": "ZX-019-2.2", + "Name": "96深孔板" } }) plate6 = get_well_container("PlateT6") plate6.load_state({ - "Material": { - "uuid": "04211a2dc93547fe9bf6121eac533650" - } - }) - plate7 = PRCXI9300Container(name="plateT7", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) - plate7.load_state({ - "Material": { - "uuid": "04211a2dc93547fe9bf6121eac533650" - } - }) - plate8 = get_tip_rack("RackT8") - plate8.load_state({ - "Material": { - "uuid": "068b3815e36b4a72a59bae017011b29f", - "Code": "ZX-001-10+", - "Name": "10μL加长 Tip头" - } - }) - plate9 = get_well_container("PlateT9") - plate9.load_state({ - "Material": { - "uuid": "04211a2dc93547fe9bf6121eac533650" - } - }) - plate10 = get_well_container("PlateT10") - plate10.load_state({ - "Material": { - "uuid": "04211a2dc93547fe9bf6121eac533650" - } - }) - plate11 = get_well_container("PlateT11") - plate11.load_state({ "Material": { "uuid": "57b1e4711e9e4a32b529f3132fc5931f", + "Code": "ZX-019-2.2", + "Name": "96深孔板" } }) - plate12 = get_well_container("PlateT12") - plate12.load_state({ - "Material": { - "uuid": "04211a2dc93547fe9bf6121eac533650" - } - }) - plate13 = get_well_container("PlateT13") - plate13.load_state({ - "Material": { - "uuid": "04211a2dc93547fe9bf6121eac533650" - } - }) - - # container_for_nothing = PRCXI9300Container(name="container_for_nothing", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) deck.assign_child_resource(plate1, location=Coordinate(0, 0, 0)) - deck.assign_child_resource(PRCXI9300Container(name="container_for_nothing1", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()), location=Coordinate(0, 0, 0)) - deck.assign_child_resource(PRCXI9300Container(name="container_for_nothing2", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()), location=Coordinate(0, 0, 0)) - deck.assign_child_resource(trash, location=Coordinate(0, 0, 0)) - deck.assign_child_resource(PRCXI9300Container(name="container_for_nothing3", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()), location=Coordinate(0, 0, 0)) - deck.assign_child_resource(PRCXI9300Container(name="container_for_nothing", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()), location=Coordinate(0, 0, 0)) - deck.assign_child_resource(PRCXI9300Container(name="container_for_nothing4", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()), location=Coordinate(0, 0, 0)) - deck.assign_child_resource(plate8, location=Coordinate(0, 0, 0)) - deck.assign_child_resource(PRCXI9300Container(name="container_for_nothing5", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()), location=Coordinate(0, 0, 0)) - deck.assign_child_resource(PRCXI9300Container(name="container_for_nothing6", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()), location=Coordinate(0, 0, 0)) - deck.assign_child_resource(plate11, location=Coordinate(0, 0, 0)) - deck.assign_child_resource(PRCXI9300Container(name="container_for_nothing7", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()), location=Coordinate(0, 0, 0)) - deck.assign_child_resource(PRCXI9300Container(name="container_for_nothing8", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()), location=Coordinate(0, 0, 0)) + deck.assign_child_resource(plate2, location=Coordinate(0, 0, 0)) + deck.assign_child_resource(plate3, location=Coordinate(0, 0, 0)) + deck.assign_child_resource(plate4, location=Coordinate(0, 0, 0)) + deck.assign_child_resource(plate5, location=Coordinate(0, 0, 0)) + deck.assign_child_resource(plate6, location=Coordinate(0, 0, 0)) - handler = PRCXI9300Handler(deck=deck, host="10.181.102.13", port=9999, + # print(plate2) + plate_2_liquids = [[('water', 500)]]*96 + plate2.set_well_liquids(plate_2_liquids) + + handler = PRCXI9300Handler(deck=deck, host="10.181.214.132", port=9999, timeout=10.0, setup=False, debug=False, - matrix_id="fd383e6d-2d0e-40b5-9c01-1b2870b1f1b1", - channel_num=1, axis="Right") # Initialize the handler with the deck and host settings + matrix_id="71593", + channel_num=8, axis="Left") # Initialize the handler with the deck and host settings - handler.set_tiprack([plate8]) # Set the tip rack for the handler + + handler.set_tiprack([plate1]) + asyncio.run(handler.setup()) # Initialize the handler and setup the connection from pylabrobot.resources import set_volume_tracking # from pylabrobot.resources import set_tip_tracking set_volume_tracking(enabled=True) - - plate11.set_well_liquids([("Water", 100) if (i % 8 == 0 and i // 8 < 6) else (None, 100) for i in range(96)]) # Set liquids for every 8 wells in plate8 - from unilabos.resources.graphio import * - A = tree_to_list([resource_plr_to_ulab(deck)]) - with open("deck.json", "w", encoding="utf-8") as f: - json.dump(A, f, indent=4, ensure_ascii=False) - - print(plate11.get_well(0).tracker.get_used_volume()) asyncio.run(handler.create_protocol(protocol_name="Test Protocol")) # Initialize the backend and setup the connection + # asyncio.run(handler.pick_up_tips(plate1.children[:8],[0,1,2,3,4,5,6,7])) - # asyncio.run(handler.pick_up_tips([plate8.children[8]],[0])) - # print(plate8.children[8]) - # # asyncio.run(handler.run_protocol()) - # asyncio.run(handler.aspirate([plate11.children[0]],[10], [0])) - # print(plate11.children[0]) - # # asyncio.run(handler.run_protocol()) - # asyncio.run(handler.dispense([plate1.children[0]],[10],[0])) - # print(plate1.children[0]) - # # asyncio.run(handler.run_protocol()) - # asyncio.run(handler.mix([plate1.children[0]], mix_time=3, mix_vol=5, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) - # print(plate1.children[0]) + # asyncio.run(handler.aspirate(plate2.children[:8],[50]*8, [0,1,2,3,4,5,6,7])) + # asyncio.run(handler.dispense(plate5.children[:8],[50]*8,[0,1,2,3,4,5,6,7])) + # # # asyncio.run(handler.drop_tips(tip_rack.children[8:16],[0,1,2,3,4,5,6,7])) # asyncio.run(handler.discard_tips()) - print('1111'*500) - print(plate11.children[-2:]) - asyncio.run(handler.add_liquid( - asp_vols=[10]*2, - dis_vols=[10]*2, - reagent_sources=[plate11.children[0]], - targets=plate11.children[-2:], - use_channels=[0], - flow_rates=[None] * 4, - offsets=[Coordinate(0, 0, 0)] * 4, - liquid_height=[None] * 2, - blow_out_air_volume=[None] * 2, - delays=None, - mix_time=3, - mix_vol=5, - spread="wide", -)) -# asyncio.run(handler.transfer_liquid( -# asp_vols=[10]*2, -# dis_vols=[10]*2, -# sources=plate11.children[:2], -# targets=plate11.children[-2:], -# use_channels=[0], -# offsets=[Coordinate(0, 0, 0)] * 4, -# liquid_height=[None] * 2, -# blow_out_air_volume=[None] * 2, -# delays=None, -# mix_times=3, -# mix_vol=5, -# spread="wide", -# tip_racks=[plate8] -# )) - -# asyncio.run(handler.remove_liquid( -# vols=[10]*2, -# sources=plate11.children[:2], -# waste_liquid=plate11.children[43], -# use_channels=[0], -# offsets=[Coordinate(0, 0, 0)] * 4, -# liquid_height=[None] * 2, -# blow_out_air_volume=[None] * 2, -# delays=None, -# spread="wide" -# )) - - - - - - - - - asyncio.run(handler.run_protocol()) - - # asyncio.run(handler.discard_tips()) # asyncio.run(handler.mix(well_containers.children[:8 # ], mix_time=3, mix_vol=50, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) - #print(json.dumps(handler._unilabos_backend.steps_todo_list, indent=2)) # Print matrix info - + # #print(json.dumps(handler._unilabos_backend.steps_todo_list, indent=2)) # Print matrix info + # asyncio.run(handler.add_liquid( + # asp_vols=[100]*16, + # dis_vols=[100]*16, + # reagent_sources=plate2.children[:16], + # targets=plate5.children[:16], + # use_channels=[0, 1, 2, 3, 4, 5, 6, 7], + # flow_rates=[None] * 32, + # offsets=[Coordinate(0, 0, 0)] * 32, + # liquid_height=[None] * 16, + # blow_out_air_volume=[None] * 16, + # delays=None, + # mix_time=3, + # mix_vol=50, + # spread="wide", + # )) # asyncio.run(handler.remove_liquid( # vols=[100]*16, - # sources=well_containers.children[-16:], - # waste_liquid=well_containers.children[:16], # 这个有些奇怪,但是好像也只能这么写 + # sources=plate2.children[-16:], + # waste_liquid=plate5.children[:16], # 这个有些奇怪,但是好像也只能这么写 # use_channels=[0, 1, 2, 3, 4, 5, 6, 7], # flow_rates=[None] * 32, # offsets=[Coordinate(0, 0, 0)] * 32, @@ -1351,26 +1114,290 @@ if __name__ == "__main__": # blow_out_air_volume=[None] * 32, # spread="wide", # )) - # asyncio.run(handler.transfer_liquid( - # asp_vols=[100]*16, - # dis_vols=[100]*16, - # tip_racks=[tip_rack], - # sources=well_containers.children[-16:], - # targets=well_containers.children[:16], - # use_channels=[0, 1, 2, 3, 4, 5, 6, 7], - # offsets=[Coordinate(0, 0, 0)] * 32, - # asp_flow_rates=[None] * 16, - # dis_flow_rates=[None] * 16, - # liquid_height=[None] * 32, - # blow_out_air_volume=[None] * 32, - # mix_times=3, - # mix_vol=50, - # spread="wide", - # )) + asyncio.run(handler.transfer_liquid( + asp_vols=[100]*16, + dis_vols=[100]*16, + tip_racks=[plate1], + sources=plate2.children[-16:], + targets=plate5.children[:16], + use_channels=[0, 1, 2, 3, 4, 5, 6, 7], + offsets=[Coordinate(0, 0, 0)] * 32, + asp_flow_rates=[None] * 16, + dis_flow_rates=[None] * 16, + liquid_height=[None] * 32, + blow_out_air_volume=[None] * 32, + mix_times=3, + mix_vol=50, + spread="wide", + )) print(json.dumps(handler._unilabos_backend.steps_todo_list, indent=2)) # Print matrix info - # input("pick_up_tips add step") - #asyncio.run(handler.run_protocol()) # Run the protocol - # input("Running protocol...") - # input("Press Enter to continue...") # Wait for user input before proceeding - # print("PRCXI9300Handler initialized with deck and host settings.") + # # input("pick_up_tips add step") + asyncio.run(handler.run_protocol()) # Run the protocol + # # input("Running protocol...") + # # input("Press Enter to continue...") # Wait for user input before proceeding + # # print("PRCXI9300Handler initialized with deck and host settings.") + + # Example usage + # 1. 用导出的json,给每个T1 T2板子设定相应的物料,如果是孔板和枪头盒,要对应区分 + # 2. 设计一个单点动作流程,可以跑 + # 3. + + + + + + + + +# deck = PRCXI9300Deck(name="PRCXI_Deck", size_x=100, size_y=100, size_z=100) + +# from pylabrobot.resources.opentrons.tip_racks import tipone_96_tiprack_200ul,opentrons_96_tiprack_10ul +# from pylabrobot.resources.opentrons.plates import corning_96_wellplate_360ul_flat, nest_96_wellplate_2ml_deep + +# def get_well_container(name: str) -> PRCXI9300Container: +# well_containers = corning_96_wellplate_360ul_flat(name).serialize() +# plate = PRCXI9300Container(name=name, size_x=50, size_y=50, size_z=10, category="plate", +# ordering=collections.OrderedDict()) +# plate_serialized = plate.serialize() +# plate_serialized["parent_name"] = deck.name +# well_containers.update({k: v for k, v in plate_serialized.items() if k not in ["children"]}) +# new_plate: PRCXI9300Container = PRCXI9300Container.deserialize(well_containers) +# return new_plate + +# def get_tip_rack(name: str) -> PRCXI9300Container: +# tip_racks = opentrons_96_tiprack_10ul("name").serialize() +# tip_rack = PRCXI9300Container(name=name, size_x=50, size_y=50, size_z=10, category="tip_rack", +# ordering=collections.OrderedDict()) +# tip_rack_serialized = tip_rack.serialize() +# tip_rack_serialized["parent_name"] = deck.name +# tip_racks.update({k: v for k, v in tip_rack_serialized.items() if k not in ["children"]}) +# new_tip_rack: PRCXI9300Container = PRCXI9300Container.deserialize(tip_racks) +# return new_tip_rack + +# plate1 = get_well_container("HPLCPlateT1") +# plate1.load_state({ +# "Material": { +# "uuid": "548bbc3df0d4447586f2c19d2c0c0c55", +# "Code": "HPLC01", +# "Name": "HPLC料盘" +# } +# }) +# plate2 = get_well_container("PlateT2") +# plate2.load_state({ +# "Material": { +# "uuid": "04211a2dc93547fe9bf6121eac533650", +# } +# }) +# plate3 = get_well_container("PlateT3") +# plate3.load_state({ +# "Material": { +# "uuid": "04211a2dc93547fe9bf6121eac533650", +# } +# }) +# trash = PRCXI9300Trash(name="trash", size_x=50, size_y=50, size_z=10, category="trash") +# trash.load_state({ +# "Material": { +# "uuid": "730067cf07ae43849ddf4034299030e9" +# } +# }) +# plate5 = get_well_container("PlateT5") +# plate5.load_state({ +# "Material": { +# "uuid": "04211a2dc93547fe9bf6121eac533650", +# } +# }) +# plate6 = get_well_container("PlateT6") +# plate6.load_state({ +# "Material": { +# "uuid": "04211a2dc93547fe9bf6121eac533650" +# } +# }) +# plate7 = PRCXI9300Container(name="plateT7", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) +# plate7.load_state({ +# "Material": { +# "uuid": "04211a2dc93547fe9bf6121eac533650" +# } +# }) +# plate8 = get_tip_rack("RackT8") +# plate8.load_state({ +# "Material": { +# "uuid": "068b3815e36b4a72a59bae017011b29f", +# "Code": "ZX-001-10+", +# "Name": "10μL加长 Tip头" +# } +# }) +# plate9 = get_well_container("PlateT9") +# plate9.load_state({ +# "Material": { +# "uuid": "04211a2dc93547fe9bf6121eac533650" +# } +# }) +# plate10 = get_well_container("PlateT10") +# plate10.load_state({ +# "Material": { +# "uuid": "04211a2dc93547fe9bf6121eac533650" +# } +# }) +# plate11 = get_well_container("PlateT11") +# plate11.load_state({ +# "Material": { +# "uuid": "57b1e4711e9e4a32b529f3132fc5931f", +# } +# }) +# plate12 = get_well_container("PlateT12") +# plate12.load_state({ +# "Material": { +# "uuid": "04211a2dc93547fe9bf6121eac533650" +# } +# }) +# plate13 = get_well_container("PlateT13") +# plate13.load_state({ +# "Material": { +# "uuid": "04211a2dc93547fe9bf6121eac533650" +# } +# }) + +# # container_for_nothing = PRCXI9300Container(name="container_for_nothing", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()) + +# deck.assign_child_resource(plate1, location=Coordinate(0, 0, 0)) +# deck.assign_child_resource(PRCXI9300Container(name="container_for_nothing1", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()), location=Coordinate(0, 0, 0)) +# deck.assign_child_resource(PRCXI9300Container(name="container_for_nothing2", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()), location=Coordinate(0, 0, 0)) +# deck.assign_child_resource(trash, location=Coordinate(0, 0, 0)) +# deck.assign_child_resource(PRCXI9300Container(name="container_for_nothing3", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()), location=Coordinate(0, 0, 0)) +# deck.assign_child_resource(PRCXI9300Container(name="container_for_nothing", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()), location=Coordinate(0, 0, 0)) +# deck.assign_child_resource(PRCXI9300Container(name="container_for_nothing4", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()), location=Coordinate(0, 0, 0)) +# deck.assign_child_resource(plate8, location=Coordinate(0, 0, 0)) +# deck.assign_child_resource(PRCXI9300Container(name="container_for_nothing5", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()), location=Coordinate(0, 0, 0)) +# deck.assign_child_resource(PRCXI9300Container(name="container_for_nothing6", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()), location=Coordinate(0, 0, 0)) +# deck.assign_child_resource(plate11, location=Coordinate(0, 0, 0)) +# deck.assign_child_resource(PRCXI9300Container(name="container_for_nothing7", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()), location=Coordinate(0, 0, 0)) +# deck.assign_child_resource(PRCXI9300Container(name="container_for_nothing8", size_x=50, size_y=50, size_z=10, category="plate", ordering=collections.OrderedDict()), location=Coordinate(0, 0, 0)) + +# handler = PRCXI9300Handler(deck=deck, host="10.181.102.13", port=9999, +# timeout=10.0, setup=False, debug=False, +# matrix_id="fd383e6d-2d0e-40b5-9c01-1b2870b1f1b1", +# channel_num=1, axis="Right") # Initialize the handler with the deck and host settings + +# handler.set_tiprack([plate8]) # Set the tip rack for the handler +# asyncio.run(handler.setup()) # Initialize the handler and setup the connection +# from pylabrobot.resources import set_volume_tracking +# # from pylabrobot.resources import set_tip_tracking +# set_volume_tracking(enabled=True) + +# plate11.set_well_liquids([("Water", 100) if (i % 8 == 0 and i // 8 < 6) else (None, 100) for i in range(96)]) # Set liquids for every 8 wells in plate8 + +# from unilabos.resources.graphio import * + +# A = tree_to_list([resource_plr_to_ulab(deck)]) +# with open("deck.json", "w", encoding="utf-8") as f: +# json.dump(A, f, indent=4, ensure_ascii=False) + +# print(plate11.get_well(0).tracker.get_used_volume()) +# asyncio.run(handler.create_protocol(protocol_name="Test Protocol")) # Initialize the backend and setup the connection + +# # asyncio.run(handler.pick_up_tips([plate8.children[8]],[0])) +# # print(plate8.children[8]) +# # # asyncio.run(handler.run_protocol()) +# # asyncio.run(handler.aspirate([plate11.children[0]],[10], [0])) +# # print(plate11.children[0]) +# # # asyncio.run(handler.run_protocol()) +# # asyncio.run(handler.dispense([plate1.children[0]],[10],[0])) +# # print(plate1.children[0]) +# # # asyncio.run(handler.run_protocol()) +# # asyncio.run(handler.mix([plate1.children[0]], mix_time=3, mix_vol=5, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) +# # print(plate1.children[0]) +# # asyncio.run(handler.discard_tips()) + +# asyncio.run(handler.add_liquid( +# asp_vols=[10]*7, +# dis_vols=[10]*7, +# reagent_sources=[plate11.children[0]], +# targets=plate1.children[2:9], +# use_channels=[0], +# flow_rates=[None] * 4, +# offsets=[Coordinate(0, 0, 0)] * 4, +# liquid_height=[None] * 2, +# blow_out_air_volume=[None] * 2, +# delays=None, +# mix_time=3, +# mix_vol=5, +# spread="wide", +# )) + +# # asyncio.run(handler.transfer_liquid( +# # asp_vols=[10]*2, +# # dis_vols=[10]*2, +# # sources=plate11.children[:2], +# # targets=plate11.children[-2:], +# # use_channels=[0], +# # offsets=[Coordinate(0, 0, 0)] * 4, +# # liquid_height=[None] * 2, +# # blow_out_air_volume=[None] * 2, +# # delays=None, +# # mix_times=3, +# # mix_vol=5, +# # spread="wide", +# # tip_racks=[plate8] +# # )) + +# # asyncio.run(handler.remove_liquid( +# # vols=[10]*2, +# # sources=plate11.children[:2], +# # waste_liquid=plate11.children[43], +# # use_channels=[0], +# # offsets=[Coordinate(0, 0, 0)] * 4, +# # liquid_height=[None] * 2, +# # blow_out_air_volume=[None] * 2, +# # delays=None, +# # spread="wide" +# # )) + + + + + + + + +# asyncio.run(handler.run_protocol()) + +# # asyncio.run(handler.discard_tips()) +# # asyncio.run(handler.mix(well_containers.children[:8 +# # ], mix_time=3, mix_vol=50, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) +# #print(json.dumps(handler._unilabos_backend.steps_todo_list, indent=2)) # Print matrix info + + +# # asyncio.run(handler.remove_liquid( +# # vols=[100]*16, +# # sources=well_containers.children[-16:], +# # waste_liquid=well_containers.children[:16], # 这个有些奇怪,但是好像也只能这么写 +# # use_channels=[0, 1, 2, 3, 4, 5, 6, 7], +# # flow_rates=[None] * 32, +# # offsets=[Coordinate(0, 0, 0)] * 32, +# # liquid_height=[None] * 32, +# # blow_out_air_volume=[None] * 32, +# # spread="wide", +# # )) +# # asyncio.run(handler.transfer_liquid( +# # asp_vols=[100]*16, +# # dis_vols=[100]*16, +# # tip_racks=[tip_rack], +# # sources=well_containers.children[-16:], +# # targets=well_containers.children[:16], +# # use_channels=[0, 1, 2, 3, 4, 5, 6, 7], +# # offsets=[Coordinate(0, 0, 0)] * 32, +# # asp_flow_rates=[None] * 16, +# # dis_flow_rates=[None] * 16, +# # liquid_height=[None] * 32, +# # blow_out_air_volume=[None] * 32, +# # mix_times=3, +# # mix_vol=50, +# # spread="wide", +# # )) +# print(json.dumps(handler._unilabos_backend.steps_todo_list, indent=2)) # Print matrix info +# # input("pick_up_tips add step") +# #asyncio.run(handler.run_protocol()) # Run the protocol +# # input("Running protocol...") +# # input("Press Enter to continue...") # Wait for user input before proceeding +# # print("PRCXI9300Handler initialized with deck and host settings.")