资讯动态

生物大分子批量仿真开发教程(3):MOE 的 SVL 与 moebatch——无界面跑起来,以及 AmberEHT 默认力场的坑

发布时间:2026/9/15 9:27:24 来源:尧图企业网站定制
生物大分子批量仿真开发教程3MOE 的 SVL 与 moebatch——无界面跑起来以及 AmberEHT 默认力场的坑版本声明块工具/软件MOE 2024.06Chemical Computing Group简称 CCG默认力场自本版起为 AmberEHT语言/环境SVLScientific Vector Language、tcsh / bash、Python 3.10 外层驱动本文目标把 MOE 从必须有人坐在界面前的软件变成可被外层程序投递与回收的执行器一句话结论MOE 的无界面执行只有两个入口——moebatch -script x.svl和moebatch -exec …而moebatch的模型是加载脚本 调用函数所以 SVL 文件里必须定义可调用函数这是 moebatch 报找不到函数的头号原因数据 I/O 全部围绕数据库对象db_Open(name.mdb)/db_Close面板级函数请以安装版内 Help 为准工程上更稳的做法是外层用 Python 生成 SVL、投递moebatch、再回收.mdb结果——但自 MOE 2024.06 起默认力场已改成 AmberEHT任何脚本都必须显式声明力场否则新旧结果不可比铁律 2。〇、本篇要解决的认知问题SVL 是什么语言MOE 为什么不用 Python而 CCG 要自研一门科学向量语言Scientific Vector Languagemoebatch -script x.svl与moebatch -exec …的语义差别是什么各适合什么场景MOE 的数据库对象db_Open/db_Close在批量流程里承担什么角色和 Schrödinger 用.mae文件流有什么本质不同什么时候该老老实实写 SVL什么时候该把 MOE 只当执行器、逻辑全交给 PythonMOE 2024.06 把默认力场改成 AmberEHT对我已经写好或打算抄来的脚本有哪些具体影响一、机制解析1.1 MOE 的扩展模型一个内核、一门语言、一个数据库中枢MOEMolecular Operating Environment官方把可编程性归在Customization能力族下Integrated Programming EnvironmentSVL、Custom Applications、Web Services / API、HTTP Listener for Remote Control以及 Laptop–Cluster–Cloud 的部署梯度。也就是说CCG 给的路是用 SVL 写逻辑、用 moebatch 无界面执行、用 HTTP Listener 做远程控制Python 并不是 MOE 的一等 scripting 语言。┌──────────────────────────────┐ 交互式人 ──▶ │ moeGUI │ │ ├─ Amber / Alpha / Amber │ │ └─ AMBER 24 / CUDA 12 … │ └──────────────┬───────────────┘ │ 同一套 SVL 内核 ┌──────────────▼───────────────┐ 无界面脚本──▶ │ moebatch │ │ -script file.svl │ │ -exec Func(args) │ └──────────────┬───────────────┘ │ 读写 ┌──────────────▼───────────────┐ 数据中枢 │ *.mdb 数据库对象 │ │ db_Open(...) / db_Close │ └──────────────────────────────┘为什么这对你重要理解数据库是中枢就不会再拿管理结构文件的习惯去管 MOE 批量任务。Schrödinger 那条路是文件流 项目表第 02 篇MOE 这条路是一个.mdb装下记录、字段、坐标、计算结果因此批量并发的隔离单位应该是每作业一个.mdb最后再汇总而不是让多个moebatch抢同一库。1.2moebatch的执行契约加载脚本然后调用函数入口语义典型用法moebatch -script x.svl加载并执行脚本中的顶层语句要跑逻辑必须有可调用函数长逻辑、多函数、需要调试的批处理moebatch -exec …直接执行一条 SVL 语句/函数调用一行式任务、外层程序动态拼接社区协议里最常见的形态就是tcsh 脚本调用moebatchSVL 里定义函数-exec或-script触发。虚拟筛选协议页给出的读库写法形如db_Open[$vendor…]收尾用db_Close——这两支函数是 MOE 批处理里少数被一手文献/社区协议明确写出的接口因此本篇 SVL 部分只以此为准其余面板级函数一律标注以安装版内 Help 为准。反直觉之处一个已经正确加载的 SVL 文件如果里面没有以function/procedure定义的 callablemoebatch依然报找不到函数。很多人以为是路径问题其实是模型理解错了moebatch不打算顺序执行你的脚本。为什么这对你重要这一条决定你第一次跑moebatch是 5 分钟成功还是 5 小时怀疑人生。把MOE 侧脚本 一组函数当成接口契约来设计你的批量层才可能有统一的调用形式。1.3 写 SVL 还是用 Python 驱动 MOE判据选 SVL在 MOE 内做选 Python 驱动把 MOE 当执行器需要 MOE 独有能力Protein Patches / Patch 2D Maps、High-Throughput Antibody Modeling、Pro:Pro Dock、Loop/Linker 采样—需要复杂控制流重试、分支、幂等、断点续跑SVL 写起来啰嗦且难以测试Python 优势明显需要与外部生态拼接pandas、MDAnalysis、ANARCI、Slurm几乎不可能天然合适结果落地必须进.mdb.mdb→ 导出 CSV/Parquet → 中央结果表团队可维护性只有 MOE 专家能改一般后端工程师也能接手工程上的推荐形态是三层Python 编排层配置、幂等、重试、失败落库→SVL 执行层只做这一条记录该做的 MOE 操作短、无状态→.mdb数据层一 job 一库。这也是本系列第 16、20 篇要固化的骨架。1.4 铁律 2 的 MOE 侧AmberEHT 不是多了个选项是数值基准变了MOE 2024.06 的变更里对脚本影响最大的四条变更机制对你脚本的后果默认力场force field改为AmberEHT基于 MOE 2024 新 EHT 角度/二面角参数化 Amber19 CMAP官方明确 Amber10:EHT 的能量项与 2022.02 及更早可能不同新旧版本的能量、最小化结果不可直接比较跨版本对照实验会得出看起来是方法改进、其实是力场换了的结论新增AmberEHTo采用 OpenFF 2.1 Sage 二面角同一分子在 AmberEHT / AmberEHTo / AMBER10:EHT 下分数不同脚本必须把力场名写进元数据重训练 pKa 模型protomer质子化异构体枚举可能与 2022 不同质化步骤的输出残基种类/电荷会变下游对接与 MD 的拓扑准备随之变化铁律 4OpenMOPAC 22.1.1 取代 MOPAC 7半经验引擎换实现老脚本里写死的 MOPAC 方法名/关键字可能失效同期还有两个对批量很有价值的变更Pro:Pro Dock——含注释的抗体-抗原复合物做 Protein-Protein Docking 时会自动选抗体为配体、抗原为受体并支持$CDR_H3自动注释DBV Compute 菜单新增 Protein Patches 与 Protein Patch 2D Maps保存格式新增 mmCIF/XYZ/MDB、支持多模型 PDB 写出与 5 字母残基名往返。为什么这对你重要$CDR_H3自动注释这条等于 CCG 亲口告诉你抗体编号与 CDR 注释是自动化的前置条件。不先把编号体系固定好下一篇你在 MOE 侧就享受不到这批新能力。二、完整代码与逐行剖析2.1 SVL 批处理脚本骨架读库 → 处理 → 回写先明确本节的运行边界下表之外的 SVL 函数名与参数请你在安装版 MOE 的 Help 中核实后再替换。本骨架里的内容依据db_Open(….mdb)/db_Close社区协议一手写法Rizzo Lab 虚拟筛选协议必须定义 callable 供moebatch调用社区协议明确的 moebatch 约束function/database类型 /printf等语句级写法SVL 通用语法习惯细节含打开模式取值、判空写法以安装版内 Help 为准处理函数MoeStep()内部占位以 MOE 内 Help 为准/* file: minim_job.svl —— MOE 侧只做一条记录的工作控制流交给外层 Python */ /* 调用方式 moebatch -exec RunJob(\jobs/ab0001.mdb\) 或 moebatch -script minim_job.svl再用 -exec 触发 RunJob */ function RunJob(string mdbpath) { database in, out /* 1) 打开输入库db_Open 是社区协议里明确核实过的接口。 这里刻意只读输入 另写输出绝不在原库上就地改写 因为批量流水线要保证重跑幂等铁律 5。 */ in db_Open(mdbpath, r) if (in null) { /* 打不开就显式退出并留下非零信号 外层 Python 靠它把这条记录标成 failed而不是静默跳过铁律 10 */ printf(DBOPEN_FAIL %s\n, mdbpath) return } /* 2) 数据库遍历 MOE 计算读记录、跑最小化/质化、写回字段。 —— 以下每一步涉及的 SVL 面板函数名与参数本教程不臆造 请以安装版内 Help菜单 Window Help MOE Help为准逐行替换。 需要落实的三件事按顺序是 a. 质化 / 互变异构对应 MOE 的质子化工具Protonate 3D 语境铁律 4 b. 力场显式指定本版本默认已是 AmberEHT 脚本必须写清用 AmberEHT 还是 AmberEHTo / AMBER10:EHT铁律 2 c. 结果字段名固定把能量、ΔG、补丁面积等写进同名数据库字段 这样汇总阶段才能机械导出 */ MoeStep(in, out) /* 3) 关闭不 db_Close 的话 .mdb 可能处于未落盘状态 批量作业里表现为日志说成功了、结果打不开 */ db_Close(out) db_Close(in) printf(DONE %s\n, mdbpath) } function MoeStep(database in, database out) { /* TODO(Help)这里放且只放 MOE 侧操作保持无状态、不读配置、不重试 */ }要点MoeStep()单独切出来是为了把MOE 专有知识隔离在一个函数里——升级版本时你只需要审计这一处控制流重试、跳过、汇总永远不用改。这是商业软件二次开发里对抗版本漂移最有效的写法。2.2 tcsh 包装站点上最常见的一层#!/bin/tcsh # run_batch.tcsh —— 遍历 job 目录下的 .mdb逐个丢给 moebatch退出码落 TSV set DBDIR $1 # 由外层 Python 传入避免在 tcsh 里做路径决策 set LEDGER $2 # 结果账本铁律 10 要求每条都有行成功也要写 foreach f ( $DBDIR/*.mdb ) # 一 job 一库天然避免并发写同一 .mdb set tag echo $f:t:r # 取文件名主干作为记录标识回填账本用 echo $tag $f # 便于人眼看日志定位 # -exec 传参注意引号层级外层双引号给 shell内层转义双引号给 SVL 字符串 moebatch -exec RunJob(\$f\) log/$tag.log set rc $status # tcsh 里退出码是 $status不是 $? # 账本字段固定tag、输入库、退出码、日志路径重跑时按 tag 去重即可 printf %s\t%s\t%s\t%s\n $tag $f $rc log/$tag.log $LEDGER endshell退出码字符串引号说明tcsh$status…\x\…CCG 社区协议里最常见站点脚本多为 tcshbash$?…更省心外层用 bash/Python 时优先单引号包住整条-exec2.3 Python 编排层把 MOE 变成可投递、可回收的执行器#!/usr/bin/env python3moe_driver.py —— 外层只做三件事幂等目录、投递 moebatch、失败落库Python 3.10importcsv,hashlib,os,subprocess,sysfrompathlibimportPath# 铁律 2版本与力场写进代码而不是人脑。MOE 2024.06 起默认力场是 AmberEHT# 显式声明 强制自己在 MoeStep() 里落实它避免继承默认值这种隐式假设MOE_REQUIRED2024.06FORCE_FIELDAmberEHTdefjob_dir(workdir:str,payload:dict)-Path:铁律 5job 目录名 输入内容哈希重跑天然只补缺blobrepr(sorted(payload.items())).encode(utf-8)pPath(workdir)/hashlib.sha1(blob).hexdigest()[:12]p.mkdir(parentsTrue,exist_okTrue)returnpdefsvl_call(mdb:Path)-str:# 生成交给 moebatch 的一条 SVL 语句路径里的反斜杠要转义SVL 字符串按双引号解析returnRunJob(str(mdb).replace(\\,/))defmain(csv_in:str,work_root:str)-int:rowslist(csv.DictReader(open(csv_in,encodingutf-8-sig)))Path(work_root).mkdir(parentsTrue,exist_okTrue)# 首轮运行时 work_root 还不存在ledger_pathPath(work_root)/ledger.tsv# 断点续跑先把已成功的 tag 读出来本轮直接跳过幂等的另一半doneset()ifledger_path.exists():withledger_path.open(encodingutf-8)asold:done{r[tag]forrincsv.DictReader(old,delimiter\t)ifr.get(rc)0}withledger_path.open(a,newline,encodingutf-8)asfh:wcsv.writer(fh,delimiter\t)ifnotledger_path.stat().st_size:w.writerow([tag,mdb,rc,log,force_field,moe_version])fori,recinenumerate(rows,1):tagrec.get(tag)orfrec{i:05d}iftagindone:print(skip,tag);continuepayload{seq:rec.get(seq,),scheme:rec.get(numbering,)}jdjob_dir(os.path.join(work_root,jobs),payload)mdbjd/f{tag}.mdb# 每 job 一个库并发写隔离logjd/f{tag}.logcmd[moebatch,-exec,svl_call(mdb)]# 无界面入口只有这两个形态try:cpsubprocess.run(cmd,capture_outputTrue,textTrue,timeout3600)rccp.returncode(jd/stdout.txt).write_text(cp.stdoutcp.stderr,encodingutf-8)exceptsubprocess.TimeoutExpired:rc-1# 超时也要落一行缺记录的批次不得出报告w.writerow([tag,mdb,rc,log,FORCE_FIELD,MOE_REQUIRED])fh.flush()# 边跑边刷盘进程被 kill 也不丢已完成记录print(f{tag}rc{rc})badsum(1forrincsv.DictReader(open(ledger_path,encodingutf-8),delimiter\t)ifr[rc]!0)print(ftotal{len(rows)}nonzero_rc{bad})return0ifbad0else1# 让调度器据退出码决定是否重试整批if__name____main__:sys.exit(main(sys.argv[1],sys.argv[2]))三个设计决策值得单独说决策为什么cmd用列表形式传给subprocess.run绕开 shell 引号嵌套SVL 字符串里的双引号不会被 tcsh/bash 吃掉账本里冗余记force_field与moe_version半年后回看能立刻判断某批结果是不是 AmberEHT 之前的不可比数据timeoutrc-1MOE 侧偶发卡死大库、缺参数无超时的批量作业会把整个阵列挂住三、常见报错与排查moebatch报找不到要执行的函数根因SVL 文件里没有 callable即使-script已成功加载或-exec里的函数名与定义大小写不一致。解法把逻辑写成function RunJob(...)再用moebatch -exec RunJob(\a.mdb\)调试期先写一个只printf的空函数确认通道通了。-exec在 tcsh 下报语法错误 / 参数被截断根因引号层级冲突外层 shell 把内层引号先吃掉。解法外层双引号 内层转义双引号见 2.2或改用…/ 列表参数见 2.3或退一步用-script传文件路径、把参数写进脚本。打不开 / 写坏.mdb根因多个moebatch并发写同一库或收尾没db_Close。解法一 job 一库 只读输入另写输出 汇总阶段再合并。能量、最小化结果和上个月对不上根因MOE 2024.06 起默认力场改为 AmberEHT其能量项与 2022.02 及更早可能不同。解法脚本里显式声明力场并写入结果表2.3 的force_field列跨版本对照实验必须重跑基线不能混用。同一条序列质化结果与去年不一样根因2024.06 重训练了 pKa 模型protomer 枚举可能与 2022 不同。解法把质化参数与版本一起固定并入库铁律 4发现差异时以结构合理性复核 His/Cys 状态与二硫键而不是简单回滚版本。老脚本里的 MOPAC 关键字失效根因OpenMOPAC 22.1.1 取代 MOPAC 7。解法以安装版内 Help 为准更新方法名并把该依赖在账本里标注版本区间。四、动手练习通道自检写一个只打印字符串的function Hello()分别用moebatch -script与moebatch -exec Hello()触发。判定标准两种方式终端都有你的打印且echo $statustcsh/echo $?bash为 0再删掉function定义重复一次必须复现找不到函数。幂等验证用 2.3 对同一份 CSV 连跑两次。判定标准第二次日志全为skipledger.tsv中rc0的行数不变且 job 目录数等于去重后的tag数不是 2 倍。力场审计在你站点上打开任意抗体复合物记录当前 MOE 版本号与工具面板里的默认力场名并把它填进ledger.tsv的force_field列。判定标准任意两次运行的账本中moe_version与force_field组合完全一致不一致则你的编排层必须报错而不是继续。五、小结与下一篇预告MOE 的批量路线是SVL 写执行单元、moebatch提供无界面入口、.mdb承担数据中枢其中唯一必须刻进肌肉记忆的两条契约是moebatch只会调用函数、db_Open/db_Close决定你的结果是否真的落盘而工程上更稳的结构是Python 在外、SVL 在内、每 job 一库。同时请记住 MOE 2024.06 的 AmberEHT 默认力场与 pKa 模型重训练——不显式声明版本与力场的脚本数值上没有可比性。抗体这条链上还有一件事必须先做完$CDR_H3自动注释、PIPER 打分、CDR 移植人源化都建立在编号之上。下一篇我们打这块地基VH/VL、CDR-H1/2/3、Fc 与 Asn297 糖基化以及 Kabat、Chothia、IMGT、Martin、AHo 五套编号体系怎么用 ANARCI 批量统一。本篇认知问题回显FAQQ1MOE 的 SVL 是什么语言为什么不用 PythonASVLScientific Vector Language是 Chemical Computing Group 自研的科学向量语言官方归入 MOE 的 Customization 能力Integrated Programming Environment / SVL IDE、Custom Applications、HTTP Listener for Remote Control。它是 MOE 内核的脚本层能直接访问分子、数据库与工具面板Python 不是 MOE 的一等脚本语言通常作为外层编排通过moebatch调用 SVL。Q2moebatch 的 -script 和 -exec 有什么区别Amoebatch -script x.svl加载并执行脚本moebatch -exec Func(args)直接执行一条 SVL 语句。两者共同契约是加载脚本 调用函数SVL 文件必须定义可调用函数否则即使已加载也报找不到函数。长逻辑放-script外层程序动态拼接的单步操作用-exec。Q3MOE 批处理里 db_Open 和 db_Close 是做什么的A它们读写 MOE 数据库对象.mdb如db_Open(name.mdb)、收尾db_Close。MOE 的批量流程以数据库为中枢记录、字段、坐标、计算结果都在.mdb内不db_Close会出现日志成功但结果打不开。工程建议一 job 一库、只读输入另写输出、汇总时合并。Q4什么时候写 SVL什么时候用 Python 驱动 MOEA需要在 MOE 内部完成的操作Protein Patches、High-Throughput Antibody Modeling、Pro:Pro Dock、Loop/Linker 采样写 SVL控制流重试、幂等、断点续跑、与 pandas/MDAnalysis/ANARCI/Slurm 拼接、结果导出全部交给 Python。推荐三层Python 编排层 → SVL 执行层短、无状态→.mdb数据层。Q5MOE 2024.06 默认力场改成 AmberEHT 对抗体脚本有什么影响AAmberEHT 基于 MOE 2024 新 EHT 角度/二面角参数化 Amber19 CMAP官方明确 Amber10:EHT 的能量项与 2022.02 及更早可能不同故跨版本能量与最小化结果不可比另有 AmberEHToOpenFF 2.1 Sage 二面角可选重训练 pKa 模型会使 protomer 枚举与 2022 不同OpenMOPAC 22.1.1 取代 MOPAC 7。对策是脚本显式声明力场与版本并写入结果表。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价