ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

AI力场二次开发教程(11):对接 Schrödinger——Python API 脚本接口

AI力场二次开发教程(11):对接 Schrödinger——Python API 脚本接口 对接SchrödingerSchrödinger Python API脚本接口版本声明Schrödinger为商业软件本文所有关于schrodinger.*模块、pythonrun与launchapi的描述均为接口层面示意为作者根据官方文档与公开手册整理。实际可用的函数名、参数、返回对象与其依赖的 License 版本相关请一律以官方文档与本地安装版本为准。文中片段不保证在无 License 环境下执行仅供理解接口组织方式使用。一句话结论Schrödinger 的脚本化能力以pythonrun启动、以schrodinger.maestro.maestro.command(keyword, *operands, **options)驱动 Maestro 命令行、以schrodinger.job.launchapi管理作业生命周期三者组合即可把 AI 力场参数化结果挂接进商业结构预处理与优化流水线。〇、认知问题Schrödinger 的 Python 脚本一般采用什么入口方式在 Maestro 中运行它和普通命令行有什么关系在脚本里向 Maestro GUI 发送命令用的是哪个模块的哪个函数免交互地提交一个长期作业如对接、结构修饰通常应该使用哪个模块来管理为什么不建议在脚本中直接与 Maestro 内部对象结构耦合而是优先使用 command/keyword 方式在没有图形界面的服务器上Schrödinger 的脚本还有哪些可行的运行与组织方式一、机制解析Schrödinger 提供了一套完整、自洽的 Python 接口封装了旗下 Maestro、Glide、Prime、MacroModel 等模块。作为商业软件其 API 的公开文档Schrödinger Python API 手册与 Schrödinger Cookbook给出了官方用法范例。把这套接口接入我们教程系列的 AI 力场二次开发工作流最常见的诉求是把已用 espaloma 或 OpenMM 参数化好的结构送回 Maestro 进行商业级的结构准备、最小化、构象搜索或对接。其核心机制可分为三层第一层脚本入口pythonrun。Maestro 自带 Python 交互器。在客户端的命令栏或脚本里运行一个函数样式为对script.func的调用如pythonrun mymodule.myfunc。这相当于把用户代码挂到 Maestro 的 Python 进程里能够访问结构与 GUI 状态。值得注意的是pythonrun并不需要你手动打开 Maestro GUI——它也能在 Schrödinger 的$SCHRODINGER/run包装脚本下以非交互模式启动只不过那时你无法访问maestro.command的 GUI 指令而只能做纯结构操作与作业提交。这个区别很重要有无 GUI 决定你能不能用 command 桥。第二层Maestro 命令桥schrodinger.maestro.maestro。模块内的maestro.command(keyword, *operands, **options)是最常用的键盘宏映射函数。它把用户写好的、与 Maestro 命令行宏一致的指令keyword连同操作数与选项一起发给宿主 Maestro等价于你在命令行敲了一条 Maestro 指令。因为是基于 keyword 的桥所以相对稳健不依赖内部对象布局。第三层作业控制schrodinger.job。launchapi提供面向任务提交launch、staging的更高层接口用于把任务打包、提交到本地或分布式队列、跟踪状态、回收结果。它有launch_job、JobFuture、JobMonitor等概念。这一层解决脚本里发起一个几十分钟的对接/优化任务而不阻塞 GUI的问题。下表给出这三层的分工一个常被忽视的细节是文件格式才是两侧真正的协议。Schrödinger 侧拥有丰富的结构文件类型从.mae/.maegzMaestro 原生格式适合保真往返到.sdf、.pdb适合与外部生态交换。AI 力场侧要把 espaloma/OpenMM 的结果接进来最稳妥的路线是把自己算好的坐标与键序导出为.sdf或.pdb再在 Maestro 里通过maestro.command(import, file...)读入反过来Maestro 处理完的结果则宜导出为.mae或.sdf由下游脚本消费。这样做的好处是两侧各自保持只认格式、不认内部对象更换版本或替换某一侧实现时中间层的 SDF/PDB 桥不会失效。此外面向批量与排队的任务Schrödinger 还常以.maegz或-input参数承载流水线入参具体用法同样以官方文档与本地 License 为准。理解格式即契约这一点对接才算真正牢固。层主要对象/函数职责AI力场侧对接口点脚本入口pythonrun script.func启动用户代码从命令行把 espaloma 中间结果送进来命令桥schrodinger.maestro.maestro.command(...)驱动 Maestro keyword执行结构预处理宏作业控制schrodinger.job.launchapi提交/追踪任务把 OpenMM 输出打包整体提交结构对象schrodinger.structure.Structure内存中的分子表示读写我们输出的 SDF/PDB一个清晰的架构决策是AI 力场侧专注做结构 力场 坐标Schrödinger 侧专注做商业级准备与打分。两侧通过标准格式Maestro.mae、SDF、PDB与 keyword 命令对接而不是在脚本里硬编码对手方内部对象。这就是下节接口骨架的用意。二、完整代码与逐行剖析下面给出运行在 Maestro 自带 Python 环境中的接口骨架示范。再次强调这些 API 来自官方文档运行依赖 Schrödinger 的 License 与安装环境这里仅示意其调用方式不保证在无 License 环境执行。片段一结构对象读写与命令行准备宏接口骨架# 接口骨架示范仅示意调用方式运行依赖 Schrödinger License# 在 Maestro 命令行运行pythonrun my_target_prep.mainimportschrodinger.structureassch# Schrödinger 结构对象封装importschrodinger.maestro.maestroasmaestro# Maestro 命令桥fromschrodingerimportstructureasstdefprepare_structure_from_pdb(pdb_path:str,out_mae:str)-None:读取 PDB,在 Maestro 中做加氢/补键/最小化的宏级预处理。 注:此处经 maestro.command 以 keyword 驱动,接口示意,参数名以官方文档为准。# 1) 读取 PDB 到 maestro 画布(接口示意)maestro.command(import,filepdb_path)# keywordimport, 操作数pdb_path# 2) 补氢/质子化(接口示意:Schrödinger 实际用 prep 相关宏)maestro.command(addhydrogens)# 3) 收束到能量最小化(接口示意)maestro.command(minimize)# 4) 写出 maegz/maemaestro.command(export,fileout_mae,formatmae)print(f预处理完成,已写出{out_mae})if__name____main__:# 在你的环境里换成真实路径prepare_structure_from_pdb(/path/to/input.pdb,/path/to/out.mae)逐行说明import schrodinger.structure提供内存中的分子对象Structureschrodinger.maestro.maestro提供command()这一键盘宏通道maestro.command(import, file...)的语义是把命令字与命名参数发送给宿主 Maestro。由于这里用的是 keyword 通道而非内部对象即便 Maestro 换版本只要 keyword 名稳定脚本也较稳。注意真实的结构准备补环、质子化态、水分模型在 Schrödinger 中有专门的 GUI 与宏如 PrepWizard 相关本文只示意接口骨架具体宏名请查官方文档。片段二用 launchapi 免交互提交作业接口骨架# 接口骨架示范仅示意,运行依赖 Schrödinger Licensefromschrodinger.jobimportlaunchapi# 作业控制/任务提交(接口示意)defsubmit_prep_job(input_mae:str,host:strlocalhost)-None:用 launchapi 思路把结构预处理提交为独立作业,返回并跟踪状态。 注:launchapi 的精确签名随版本变化,以官方文档与本地 License 为准。# 1) 构造作业选项(接口示意)job_opts{input:input_mae,maxeditions:True,# 使结果可恢复(接口示意字段)host:host,jobname:ai_ff_prep,}# 2) 提交并拿到句柄(接口示意)futurelaunchapi.launch_job(# 接口示意,真实拼写以官方文档为准modulestructure_prep,optsjob_opts,maxeditionsTrue,)# 3) 等待结束(接口示意)future.wait()print(f作业{future.name}已结束)forresultinfuture.results():print(结果文件:,result.path)if__name____main__:submit_prep_job(/path/to/prepared.mae)逐行说明from schrodinger.job import launchapi把提交逻辑与 GUI 解耦launch_job接收模块 选项返回一个未来对象future线程可继续做别的事future.wait()阻塞等待future.results()回收输出。这样 AI 力场侧可以先在外部比如 espaloma算好一个 SDF再到这里把 SDF 一带进来整体提交流程就形成了一条从专用力场到商业打分的闭环。片段三把 OpenFF 坐标导出成 Maestro 可读文件生态衔接这是把本系列前面对接锚点 A、C与 Schrödinger 打通的关键拼图AI 力场侧只负责导出标准文件Schrödinger 侧用 keyword 导入。# 说明:本片段属于我们系列的可运行生态层,不依赖 Schrödinger。# 它把 espaloma/OpenMM 参数化后的坐标写成 SDF,供 Maestro import。fromrdkitimportChemfromrdkit.ChemimportAllChemdefexport_sdf_for_maestro(smiles:str,out_sdf:str)-None:把一张小分子 SMILES 生成构象并写成 SDF,供 Maestro import 使用。molChem.MolFromSmiles(smiles)# 解析 SMILESmolChem.AddHs(mol)# 显式加氢AllChem.EmbedMolecule(mol,randomSeed0xF00D)# 生成三维坐标wChem.SDWriter(out_sdf)w.write(mol)w.close()print(f已写出{out_sdf})if__name____main__:export_sdf_for_maestro(CN1CNC2C1C(O)N(C(O)N2C)C,# 咖啡因,本系列锚点 A 的同一分子/path/to/caffeine.sdf)这句的作用值得单独强调AI 力场与其商业对手方之间唯一需要约定的是格式而不是对象。只要把坐标、键级、电荷写进 SDFSchrödinger 侧maestro.command(import, filecaffeine.sdf)就能接收接口因此松耦合、可维护。三、常见报错与排查ImportError: No module named schrodinger说明当前 Python 不是 Maestro 自带解释器。用你的系统 Python 跑必现。排查改从 Maestro 命令行用pythonrun运行或$SCHRODINGER/run包装脚本启动。FlowError/ command 无响应keyword 名拼错或该宏在当前版本不存在。排查用maestro.command(help)或官方 keyword 表核名优先用文档中的示例宏。LicenseError或 feature 缺失所用模块如结构准备、对接未授权。排查见schrodinger.host/licadmin与本地 License未授权的 feature 返回许可错误属正常。launchapi 提交后一直 pending队列或 host 配置问题。排查检查host名与队列多用本地localhost小样验证。结果文件为 0 字节任务在提交阶段就失败或输入格式错误。排查先在--local小样跑通再上队列。四、动手练习练习一阅读 Cookbook 实操指引阅读官方 Schrödinger Cookbook网址见参考资料找到在 Maestro 中执行结构预处理的章节。目标写一个结构预处理宏功能为 (1) 用pythonrun启动(2) import 一个 PDB(3) 加氢(4) 写出_prep.mae。方法指引在 Maestro 启动菜单里找到命令栏输入pythonrun myscript.main并把myscript.py放到可搜索的路径。逐条把练习一里片段一的maestro.command换成 Cookbook 中真实存在的宏名。用任意一个公开 PDB如咖啡因类似物做输入在本地单机、短耗时小样验证后再提交队列。练习二对照阅读把片段二的 launchapi 骨架与 Cookbook 中基于schrodinger.job的官方示例逐行对照修订版本相关的参数名并在你的 License 环境试运行一次只做加氢的最小化任务。五、小结与下一篇预告本篇给出 Schrödinger Python API 的三层接入骨架pythonrun启动、schrodinger.maestro.maestro.command驱动、schrodinger.job.launchapi管理作业并用 SDF 作为与 AI 力场侧松耦合的文件桥。掌握了这套接口你就能把 espaloma/OpenMM 参数化结果接到商业级结构准备与打分流程里。这些接口以官方文档与本地 License 为准务必在真实环境验证。下一篇《一键运行包装层设计》将不再纠缠于单个引擎而是把这些对接全部收进一个AutoFF类做成小分子/多肽/RNA 都能一键分派、失败可重试、结果写 JSON 报告的多体系流水线。本篇认知问题回显FAQQ1Schrödinger Python 脚本在 Maestro 中通常用哪个命令作为入口A1通常用pythonrun script.func作为入口例如pythonrun mymodule.myfunc它把代码挂进 Maestro 自带 Python 进程。具体用法以你本地 Schrödinger 官方文档为准。Q2在脚本中向 Maestro 发送命令使用哪个模块的哪个函数A2使用schrodinger.maestro.maestro模块的command(keyword, *operands, **options)它以键盘宏方式把指令发给宿主 Maestro。函数签名随版本变化以官方文档为准。Q3免交互提交长期作业应使用哪个 Schrödinger 模块A3应使用schrodinger.job.launchapi它提供面向提交的 launch/future/结果追踪概念从而把长时间任务与 GUI 解耦。精确签名请查官方文档与本地 License。Q4为什么推荐用 keyword 命令而非直接耦合 Maestro 内部对象A4keyword 命令走maestro.command桥稳定且不依赖内部对象布局换版本更安全。直接操作内部对象易在版本升级时损坏脚本。Q5无图形界面服务器上 Schrödinger 脚本还能如何运行与组织A5可使用$SCHRODINGER/run包装脚本启动、用 launchapi 提交到队列或把名字相同的 macro 组织进script.func统一入口与本地 License 与官方文档对应的方式保持一致。关联概念词表Schrödinger 商业软件接口、Maestro、pythonrun、schrodinger.maestro.maestro.command、schrodinger.job.launchapi、job control、scripting、schrodinger.structure、SDF 松耦合。
返回列表