mirror of
https://github.com/dptech-corp/Uni-Lab-OS.git
synced 2026-02-04 13:25:13 +00:00
* 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>
102 lines
3.2 KiB
Python
102 lines
3.2 KiB
Python
from typing import List, Dict, Any
|
||
import networkx as nx
|
||
|
||
def generate_run_column_protocol(
|
||
G: nx.DiGraph,
|
||
from_vessel: str,
|
||
to_vessel: str,
|
||
column: str
|
||
) -> List[Dict[str, Any]]:
|
||
"""
|
||
生成柱层析分离的协议序列
|
||
|
||
Args:
|
||
G: 有向图,节点为设备和容器
|
||
from_vessel: 源容器的名称,即样品起始所在的容器
|
||
to_vessel: 目标容器的名称,分离后的样品要到达的容器
|
||
column: 所使用的柱子的名称
|
||
|
||
Returns:
|
||
List[Dict[str, Any]]: 柱层析分离操作的动作序列
|
||
|
||
Raises:
|
||
ValueError: 当找不到必要的设备时抛出异常
|
||
|
||
Examples:
|
||
run_column_protocol = generate_run_column_protocol(G, "reactor", "collection_flask", "silica_column")
|
||
"""
|
||
action_sequence = []
|
||
|
||
# 验证容器是否存在
|
||
if from_vessel not in G.nodes():
|
||
raise ValueError(f"源容器 {from_vessel} 不存在于图中")
|
||
|
||
if to_vessel not in G.nodes():
|
||
raise ValueError(f"目标容器 {to_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]
|
||
|
||
# 查找柱层析设备
|
||
column_nodes = [node for node in G.nodes()
|
||
if G.nodes[node].get('class') == 'virtual_column']
|
||
|
||
if not column_nodes:
|
||
raise ValueError("没有找到可用的柱层析设备")
|
||
|
||
column_id = column_nodes[0]
|
||
|
||
# 步骤1:将样品从源容器转移到柱子上
|
||
action_sequence.append({
|
||
"device_id": pump_id,
|
||
"action_name": "transfer",
|
||
"action_kwargs": {
|
||
"from_vessel": from_vessel,
|
||
"to_vessel": column_id, # 将样品转移到柱子设备
|
||
"volume": 0.0, # 转移所有液体,体积由系统确定
|
||
"amount": f"样品上柱 - 使用 {column}",
|
||
"time": 0.0,
|
||
"viscous": False,
|
||
"rinsing_solvent": "",
|
||
"rinsing_volume": 0.0,
|
||
"rinsing_repeats": 0,
|
||
"solid": False
|
||
}
|
||
})
|
||
|
||
# 步骤2:运行柱层析分离
|
||
action_sequence.append({
|
||
"device_id": column_id,
|
||
"action_name": "run_column",
|
||
"action_kwargs": {
|
||
"from_vessel": from_vessel,
|
||
"to_vessel": to_vessel,
|
||
"column": column
|
||
}
|
||
})
|
||
|
||
# 步骤3:将分离后的产物从柱子转移到目标容器
|
||
action_sequence.append({
|
||
"device_id": pump_id,
|
||
"action_name": "transfer",
|
||
"action_kwargs": {
|
||
"from_vessel": column_id, # 从柱子设备转移
|
||
"to_vessel": to_vessel,
|
||
"volume": 0.0, # 转移所有液体,体积由系统确定
|
||
"amount": f"收集分离产物 - 来自 {column}",
|
||
"time": 0.0,
|
||
"viscous": False,
|
||
"rinsing_solvent": "",
|
||
"rinsing_volume": 0.0,
|
||
"rinsing_repeats": 0,
|
||
"solid": False
|
||
}
|
||
})
|
||
|
||
return action_sequence |