重新规定了版位推荐的入参

This commit is contained in:
Guangxin Zhang
2025-09-18 15:27:22 +01:00
parent 573c724a5c
commit e5006285df

View File

@@ -4,7 +4,7 @@ import contextlib
import json import json
import socket import socket
import time import time
from typing import Any, List, Dict, Optional, TypedDict, Union, Sequence, Iterator, Literal from typing import Any, List, Dict, Optional, Tuple, TypedDict, Union, Sequence, Iterator, Literal
from pylabrobot.liquid_handling import ( from pylabrobot.liquid_handling import (
LiquidHandlerBackend, LiquidHandlerBackend,
@@ -1030,24 +1030,26 @@ class DefaultLayout:
def add_lab_resource(self, material_info): def add_lab_resource(self, material_info):
self.labresource = material_info self.labresource = material_info
def recommend_layout(self, needs: Dict[str, int]) -> Dict[str, Any]: def recommend_layout(self, needs: List[Tuple[str, str, int]]) -> Dict[str, Any]:
"""根据 needs 推荐布局""" layout_list = []
for k, v in needs.items(): for reagent_name, material_name, count in needs:
if k not in self.labresource:
raise ValueError(f"Material {k} not found in lab resources.") if material_name not in self.labresource:
raise ValueError(f"Material {reagent_name} not found in lab resources.")
# 预留位置12和16不动
# 预留位置12和16不动
reserved_positions = {12, 16} reserved_positions = {12, 16}
available_positions = [i for i in range(1, 17) if i not in reserved_positions] available_positions = [i for i in range(1, 17) if i not in reserved_positions]
# 计算总需求 # 计算总需求
total_needed = sum(needs.values()) total_needed = sum(count for _, _, count in needs)
if total_needed > len(available_positions): if total_needed > len(available_positions):
raise ValueError(f"需要 {total_needed} 个位置,但只有 {len(available_positions)} 个可用位置排除位置12和16") raise ValueError(f"需要 {total_needed} 个位置,但只有 {len(available_positions)} 个可用位置排除位置12和16")
# 依次分配位置 # 依次分配位置
current_pos = 0 current_pos = 0
for material_name, count in needs.items(): for reagent_name, material_name, count in needs:
material_uuid = self.labresource[material_name]['uuid'] material_uuid = self.labresource[material_name]['uuid']
material_enum = self.labresource[material_name]['materialEnum'] material_enum = self.labresource[material_name]['materialEnum']
@@ -1061,11 +1063,10 @@ class DefaultLayout:
if tablet['Number'] == position: if tablet['Number'] == position:
tablet['Material']['uuid'] = material_uuid tablet['Material']['uuid'] = material_uuid
tablet['Material']['materialEnum'] = material_enum tablet['Material']['materialEnum'] = material_enum
layout_list.append(dict(reagent_name=reagent_name, material_name=material_name, positions=position))
break break
current_pos += 1 current_pos += 1
return self.default_layout, layout_list
return self.default_layout
@@ -1388,7 +1389,7 @@ if __name__ == "__main__":
timeout=10.0, setup=False, debug=True, timeout=10.0, setup=False, debug=True,
matrix_id="c1d0d5dc-40f2-4f24-97ac-9cc49c68496c", matrix_id="c1d0d5dc-40f2-4f24-97ac-9cc49c68496c",
channel_num=1, axis="Left",simulator=True) # Initialize the handler with the deck and host settings channel_num=1, axis="Left",simulator=True) # Initialize the handler with the deck and host settings
handler.set_tiprack([plate8]) # 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 asyncio.run(handler.setup()) # Initialize the handler and setup the connection
from pylabrobot.resources import set_volume_tracking from pylabrobot.resources import set_volume_tracking
@@ -1530,17 +1531,17 @@ if __name__ == "__main__":
layout = DefaultLayout("PRCXI9320") layout = DefaultLayout("PRCXI9320")
layout.add_lab_resource(material_info) layout.add_lab_resource(material_info)
MatrixLayout_1 = layout.recommend_layout({ MatrixLayout_1, dict_1 = layout.recommend_layout([
"96 细胞培养皿": 3, ("reagent_1", "96 细胞培养皿", 3),
"12道储液槽": 1, ("reagent_2", "12道储液槽", 1),
"200μL Tip头": 1, ("reagent_3", "200μL Tip头", 7),
"10μL加长 Tip头": 1, ("reagent_4", "10μL加长 Tip头", 1),
}) ])
print(MatrixLayout_1) print(dict_1)
MatrixLayout_2 = layout.recommend_layout({ MatrixLayout_2, dict_2 = layout.recommend_layout([
"96深孔板": 4, ("reagent_1", "96深孔板", 4),
"12道储液槽": 1, ("reagent_2", "12道储液槽", 1),
"200μL Tip头": 1, ("reagent_3", "200μL Tip头", 1),
"10μL加长 Tip头": 1, ("reagent_4", "10μL加长 Tip头", 1),
}) ])