mirror of
https://github.com/deepmodeling/Uni-Lab-OS
synced 2026-05-24 23:09:58 +00:00
feat: RNA add Bioyond siRNA station resources and Experiment 1 submission
- Add siRNA station runtime, decorator metadata, and lazy init - Implement Experiment 1 submit, start, and reset flows - Add siRNA deck and numeric warehouse stack resources - Move siRNA example config to temp_benyao
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,7 @@
|
|||||||
from os import name
|
from os import name
|
||||||
from pylabrobot.resources import Deck, Coordinate, Rotation
|
from pylabrobot.resources import Deck, Coordinate, Rotation
|
||||||
|
|
||||||
|
from unilabos.registry.decorators import resource
|
||||||
from unilabos.resources.bioyond.YB_warehouses import (
|
from unilabos.resources.bioyond.YB_warehouses import (
|
||||||
bioyond_warehouse_1x4x4,
|
bioyond_warehouse_1x4x4,
|
||||||
bioyond_warehouse_1x4x4_right, # 新增:右侧仓库 (A05~D08)
|
bioyond_warehouse_1x4x4_right, # 新增:右侧仓库 (A05~D08)
|
||||||
@@ -23,6 +24,9 @@ from unilabos.resources.bioyond.YB_warehouses import (
|
|||||||
from unilabos.resources.bioyond.warehouses import (
|
from unilabos.resources.bioyond.warehouses import (
|
||||||
bioyond_warehouse_tipbox_storage_left, # 新增:Tip盒堆栈(左)
|
bioyond_warehouse_tipbox_storage_left, # 新增:Tip盒堆栈(左)
|
||||||
bioyond_warehouse_tipbox_storage_right, # 新增:Tip盒堆栈(右)
|
bioyond_warehouse_tipbox_storage_right, # 新增:Tip盒堆栈(右)
|
||||||
|
bioyond_warehouse_sirna_automation_stack,
|
||||||
|
bioyond_warehouse_sirna_centrifuge_balance_plate_stack,
|
||||||
|
bioyond_warehouse_sirna_g3_liquid_handler,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -101,6 +105,50 @@ class BIOYOND_PolymerPreparationStation_Deck(Deck):
|
|||||||
for warehouse_name, warehouse in self.warehouses.items():
|
for warehouse_name, warehouse in self.warehouses.items():
|
||||||
self.assign_child_resource(warehouse, location=self.warehouse_locations[warehouse_name])
|
self.assign_child_resource(warehouse, location=self.warehouse_locations[warehouse_name])
|
||||||
|
|
||||||
|
@resource(
|
||||||
|
id="BIOYOND_SirnaStation_Deck",
|
||||||
|
category=["deck"],
|
||||||
|
description="BIOYOND 小核酸工作站 Deck",
|
||||||
|
icon="配液站.webp",
|
||||||
|
)
|
||||||
|
class BIOYOND_SirnaStation_Deck(Deck):
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
name: str = "SirnaStation_Deck",
|
||||||
|
size_x: float = 2700.0,
|
||||||
|
size_y: float = 1080.0,
|
||||||
|
size_z: float = 1500.0,
|
||||||
|
category: str = "deck",
|
||||||
|
setup: bool = False
|
||||||
|
) -> None:
|
||||||
|
super().__init__(name=name, size_x=size_x, size_y=size_y, size_z=size_z)
|
||||||
|
if setup:
|
||||||
|
self.setup()
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def deserialize(cls, data: dict, allow_marshal: bool = False):
|
||||||
|
if data.get("children") and data.get("setup") is True:
|
||||||
|
data = data.copy()
|
||||||
|
data["setup"] = False
|
||||||
|
return super().deserialize(data, allow_marshal=allow_marshal)
|
||||||
|
|
||||||
|
def setup(self) -> None:
|
||||||
|
# Sirna 读接口 /api/storage/location/locations-by-type 返回完整固定堆栈清单。
|
||||||
|
# LIMS 在库物料接口仍使用相同的 自动化堆栈 名称和数字库位编码。
|
||||||
|
self.warehouses = {
|
||||||
|
"G3移液站": bioyond_warehouse_sirna_g3_liquid_handler(),
|
||||||
|
"自动化堆栈": bioyond_warehouse_sirna_automation_stack(),
|
||||||
|
"离心机配平板堆栈": bioyond_warehouse_sirna_centrifuge_balance_plate_stack(),
|
||||||
|
}
|
||||||
|
self.warehouse_locations = {
|
||||||
|
"G3移液站": Coordinate(0.0, 0.0, 0.0),
|
||||||
|
"自动化堆栈": Coordinate(0.0, 180.0, 0.0),
|
||||||
|
"离心机配平板堆栈": Coordinate(0.0, 1300.0, 0.0),
|
||||||
|
}
|
||||||
|
|
||||||
|
for warehouse_name, warehouse in self.warehouses.items():
|
||||||
|
self.assign_child_resource(warehouse, location=self.warehouse_locations[warehouse_name])
|
||||||
|
|
||||||
class BIOYOND_YB_Deck(Deck):
|
class BIOYOND_YB_Deck(Deck):
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
@@ -154,8 +202,3 @@ def YB_Deck(name: str) -> Deck:
|
|||||||
by=BIOYOND_YB_Deck(name=name)
|
by=BIOYOND_YB_Deck(name=name)
|
||||||
by.setup()
|
by.setup()
|
||||||
return by
|
return by
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,69 @@
|
|||||||
|
from pylabrobot.resources import Coordinate
|
||||||
|
from pylabrobot.resources.carrier import ResourceHolder, create_homogeneous_resources
|
||||||
|
|
||||||
from unilabos.resources.warehouse import WareHouse, warehouse_factory
|
from unilabos.resources.warehouse import WareHouse, warehouse_factory
|
||||||
|
|
||||||
|
|
||||||
|
def bioyond_warehouse_numeric_stack(name: str, rows: int = 10, columns: int = 17) -> WareHouse:
|
||||||
|
"""创建 Bioyond 数字库位堆栈,库位名使用服务端返回的 行-列 格式。"""
|
||||||
|
num_items_x = columns
|
||||||
|
num_items_y = rows
|
||||||
|
num_items_z = 1
|
||||||
|
dx = 10.0
|
||||||
|
dy = 10.0
|
||||||
|
dz = 10.0
|
||||||
|
item_dx = 147.0
|
||||||
|
item_dy = 106.0
|
||||||
|
item_dz = 130.0
|
||||||
|
locations = [
|
||||||
|
Coordinate(dx + col * item_dx, dy + row * item_dy, dz)
|
||||||
|
for row in range(num_items_y)
|
||||||
|
for col in range(num_items_x)
|
||||||
|
]
|
||||||
|
holders = create_homogeneous_resources(
|
||||||
|
klass=ResourceHolder,
|
||||||
|
locations=locations,
|
||||||
|
resource_size_x=127.0,
|
||||||
|
resource_size_y=86.0,
|
||||||
|
resource_size_z=25.0,
|
||||||
|
name_prefix=name,
|
||||||
|
)
|
||||||
|
keys = [
|
||||||
|
f"{row + 1}-{col + 1}"
|
||||||
|
for row in range(num_items_y)
|
||||||
|
for col in range(num_items_x)
|
||||||
|
]
|
||||||
|
return WareHouse(
|
||||||
|
name=name,
|
||||||
|
size_x=dx + item_dx * num_items_x,
|
||||||
|
size_y=dy + item_dy * num_items_y,
|
||||||
|
size_z=dz + item_dz * num_items_z,
|
||||||
|
num_items_x=num_items_x,
|
||||||
|
num_items_y=num_items_y,
|
||||||
|
num_items_z=num_items_z,
|
||||||
|
ordering_layout="row-major",
|
||||||
|
sites={key: holder for key, holder in zip(keys, holders.values())},
|
||||||
|
category="warehouse",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# ================ 小核酸工作站相关堆栈 ================
|
||||||
|
|
||||||
|
def bioyond_warehouse_sirna_g3_liquid_handler(name: str = "G3移液站") -> WareHouse:
|
||||||
|
"""创建小核酸 G3 移液站库位堆栈:1 行 x 14 列。"""
|
||||||
|
return bioyond_warehouse_numeric_stack(name, rows=1, columns=14)
|
||||||
|
|
||||||
|
|
||||||
|
def bioyond_warehouse_sirna_automation_stack(name: str = "自动化堆栈") -> WareHouse:
|
||||||
|
"""创建小核酸自动化堆栈:10 行 x 17 列。"""
|
||||||
|
return bioyond_warehouse_numeric_stack(name, rows=10, columns=17)
|
||||||
|
|
||||||
|
|
||||||
|
def bioyond_warehouse_sirna_centrifuge_balance_plate_stack(name: str = "离心机配平板堆栈") -> WareHouse:
|
||||||
|
"""创建小核酸离心机配平板堆栈:2 行 x 1 列。"""
|
||||||
|
return bioyond_warehouse_numeric_stack(name, rows=2, columns=1)
|
||||||
|
|
||||||
|
|
||||||
# ================ 反应站相关堆栈 ================
|
# ================ 反应站相关堆栈 ================
|
||||||
|
|
||||||
def bioyond_warehouse_1x4x4(name: str) -> WareHouse:
|
def bioyond_warehouse_1x4x4(name: str) -> WareHouse:
|
||||||
|
|||||||
Reference in New Issue
Block a user