STEPS建模(API_2 / steps.interface)
STEPS在三维几何中模拟随机反应扩散。自v3.6起,惯用接口是API_2(steps.interface)——一种Python风格的上下文管理器风格。所有新模型都应使用它编写。此技能编码了手册约定(https://steps.sourceforge.net/manual)以及常让AI代理犯错的问题。
阅读reference.md获取完整速查表(求解器表、单位、EField/复合物/并行、ResultSelector配方、来自管道的网格注意事项)。从模板开始并适配。以下规则是你绝不能搞错的。
核心规则
-
导入顺序。 首先
import steps.interface,然后星号导入子模块。切勿在一个脚本中混用API_1和API_2。import steps.interface from steps.model import * from steps.geom import * from steps.rng import * from steps.sim import * from steps.saving import * -
对象从赋值语句中获取名称。
cyt = Compartment.Create(...)通过读取源代码行将对象命名为'cyt'。之后在模拟路径中你可以通过sim.cyt.Ca.Count访问它。所以左侧变量名就是模拟名称——选择你将使用的名称,并且它们必须是有效的Python标识符。 -
.Create()需要真实的name = X.Create(...)源代码行。 它在循环、列表推导式、多行调用、python -c或任何没有源代码的REPL中失败(“与自动赋值的预期格式不匹配”)。要以编程方式创建对象(例如在循环中为每个区域创建一个ROI),改用带name=的构造函数:ROI(triList, name=regionName)。 -
反应在
with块中,并使用ReactionManagerr。r = ReactionManager() with vsys: A + B <r['bind']> C # 可逆反应 r['bind'].K = 1e6, 0.7 # (kf, kb);不可逆反应 '>r[..]>' 只取一个K表面反应用位置标记每个物种:
.i内部隔室,.o外部隔室,.s为补丁表面。所有体积反应物必须位于同一隔室中。泵:Ca.i + P.s >r['pump']> Ca.o + P.s。 -
补丁内部隔室在前:
Patch.Create(tris, inner, outer, ssys)。对于外部无物的边界膜,使用outer=None。 -
一切都是SI单位,但
Conc是摩尔浓度。 扩散常数m²/s,长度m,Count是整数分子数,Conc是mol/L(摩尔浓度)。TetMesh.LoadGmsh(path, scale=...)将网格坐标乘以米——纳米网格需要scale=1e-9。 -
使用ResultSelector记录,而非临时读取。
rs = ResultSelector(sim) caConc = rs.cyt.Ca.Conc # 构建选择器 sim.toSave(caConc, dt=0.01) # 在运行前注册 ... caConc.data[run, timeIdx, col]; caConc.time[run]; caConc.labels分组访问:
.ALL()、.LIST(A, B)、.MATCH(regex)、.SUM(...),对于网格元素使用sim.TET(t)/TETS(list)、sim.TRI(t)/TRIS(list)。sim.MATCH('regex')在整个模拟中选择所有名称匹配的隔室/补丁/ROI——这是同时处理多个命名区域的简洁方法。 -
运行循环:
sim.newRun()重置状态;在它之后设置初始条件;然后sim.run(endTime)。将多次运行包装在for循环中以获取统计信息。 -
保留名称。 单个大写字母(
A=面积,V=体积,D、I等)和功能词(Ves等)是保留的——物种/对象名称必须是描述性的多字母标识符(Ca、IP3、mitoMemb)。
典型骨架(空间型,Tetexact)
参见 templates/spatial_tetexact.py 获取可运行版本;templates/well_mixed.py 用于充分混合情况。
import steps.interface
from steps.model import *
from steps.geom import *
from steps.rng import *
from steps.sim import *
from steps.saving import *
mdl = Model()
r = ReactionManager()
with mdl:
Ca, P = Species.Create()
vsys = VolumeSystem.Create()
with vsys:
Diffusion(Ca, 1e-12)
ssys = SurfaceSystem.Create()
with ssys:
Ca.i + P.s >r['pump']> Ca.o + P.s
r['pump'].K = 2e8
mesh = TetMesh.LoadGmsh('model.msh', scale=1e-9) # 网格坐标nm -> m
with mesh:
cyt = Compartment.Create(mesh.tetGroups[(0, 'cytosol')], vsys)
er = Compartment.Create(mesh.tetGroups[(0, 'ER')], vsys)
memb = Patch.Create(mesh.triGroups[(0, 'ER_surface')], er, cyt, ssys)
rng = RNG('mt19937', 512, 1234)
sim = Simulation('Tetexact', mdl, mesh, rng)
rs = ResultSelector(sim)
caConc = rs.cyt.Ca.Conc
sim.toSave(caConc, dt=0.01)
sim.newRun()
sim.cyt.Ca.Conc = 1e-6 # 摩尔浓度
sim.memb.P.Count = 100
sim.run(1.0)
print(caConc.data[0, -1], 'at t =', caConc.time[0, -1])
验证脚本
在运行STEPS脚本之前,请针对上述陷阱进行lint检查——无需执行,也不需要STEPS:
python validate_steps_script.py model.py
它会报告每个问题并附上具体的修复建议:导入顺序/API_1↔API_2混用、.Create()误用(循环、无赋值)、保留物种名称、单位和生物尺度(Conc是摩尔浓度,扩散系数单位m²/s,网格scale=)、newRun/toSave/run的顺序,以及声明但未设置的反应速率。存在ERROR时退出码非零(因此适合预运行/CI门禁);--selftest用于检查检查器本身。
维护此技能
当你遇到AI技能未能阻止的STEPS脚本错误时,在同一更改中扩展它:向validate_steps_script.py添加检查(附带自测用例),并将陷阱记录到上述核心规则、reference.md的常见错误表以及下面的调试检查表中。保持验证器和文档同步——验证器应能捕获所有文档记录的陷阱。
调试检查表
Assertion Fail: i < 4在求解器初始化时出现 → 某个表面三角形作为一个四面体面的两个元素出现(重复的界面面片)。每个面片只需要一个三角形元素;去重网格。(参见reference.md → “来自管道的网格”。)- “does not match the expected format for automatic assignment” → 一个
.Create()不在独立的name = ...Create(...)行上;改用带name=的构造函数(规则3)。 - “name is reserved” → 重命名物种/对象(规则9)。
- “Outer compartment not defined for this patch” → 表面反应在
outer=None创建的边界补丁上使用了.o;该补丁只能承载.i/.s物种。 - 运行后计数全部为零 → 反应常数
K太小,或表面处体积反应物密度接近0;增大K或Count,或检查单位(Conc是摩尔浓度)。