关于 alterlab-rowan
alterlab-rowan 是使用 Python API 提交量子化学工作流的技能,面向需要运行分子计算和蛋白质-配体任务的研究者。任务在云端执行,涵盖性质预测、构象搜索、几何优化、对接和蛋白质共折叠。
主要功能
- 01预测 pKa、氧化还原电位等性质
- 02执行构象搜索与几何优化
- 03进行蛋白质-配体分子对接
- 04使用 AI 模型进行蛋白质共折叠
- 05通过 Python 管理和批量提交工作流
适用场景
- 01批量预测候选分子的性质
- 02筛选配体与目标蛋白的结合
- 03生成分子构象并优化几何结构
- 04整理药物发现项目的计算任务
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ alterlab-ieu/ alterlab-academic-skills --skill alterlab-rowan安装后在 Claude Code 中输入/alterlab-rowan确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
evals/evals.jsonreferences/api_reference.mdmolecule_handling.mdproteins_and_organization.mdresults_interpretation.mdworkflow_types.md详细介绍
Rowan:基于云的量子化学平台
概述
Rowan 是一个基于云的计算化学平台,可通过 Python API 以编程方式访问量子化学工作流。它能够自动执行复杂的分子模拟,无需本地计算资源,也不必精通多个量子化学软件包。
主要功能:
- 分子性质预测(pKa、氧化还原电位、溶解度、ADMET-Tox)
- 几何优化和构象搜索
- 使用 AutoDock Vina 进行蛋白质-配体对接
- 使用 Chai-1 和 Boltz 模型进行 AI 蛋白质协同折叠
- 使用 DFT、半经验和神经网络势方法
- 云端计算并自动分配资源
选择 Rowan 的理由:
- 无需本地计算集群
- 通过统一 API 使用数十种计算方法
- 可在 labs.rowansci.com 的 Web 界面中查看结果
- 自动扩展资源
何时使用此技能
在用户希望执行以下操作时使用此技能:
- 无需本地 QM 软件即可预测 pKa / 宏观 pKa、氧化还原电位、溶解度或其他性质
- 在云端使用 NNP(AIMNet2、Egret)、xTB 或 DFT 运行几何优化、构象搜索或单点计算
- 通过托管云端作业进行配体对接(Vina/GNINA)或蛋白质-配体复合物协同折叠(Boltz、Chai-1、OpenFold3)
- 从 Python(
rowan-python)编写脚本并批量运行这些作业,并在文件夹中整理作业、设置额度上限
不适用的场景
| 场景 | 请改用 |
|---|---|
| 运行并分析本地 OpenMM MD 轨迹(RMSD/RMSF、接触) | alterlab-molecular-dynamics |
| 使用 DiffDock 进行开源、本地扩散对接(无需云端账户) | alterlab-diffdock |
| 在自己的 GPU 上本地运行 Boltz-2 或 Chai-1 | alterlab-boltz 或 alterlab-chai |
| 本地构象、描述符或 RDKit 力场最小化 | alterlab-rdkit |
安装与身份验证
安装
需要 Python >= 3.12。此技能面向 rowan-python 3.x(截至 2026-09 的当前版本为 3.2.0;v2 的结果 API 不同)。
uv pip install "rowan-python>=3.2"
安装 rowan-python 时也会安装 stjames(分子/结果模型)和 rdkit。
身份验证
在 labs.rowansci.com/account/api-keys 生成 API 密钥。
选项 1:直接赋值
import rowan
rowan.api_key = "your_api_key_here"
选项 2:环境变量(推荐)
export ROWAN_API_KEY="your_api_key_here"
模块导入时会自动从 ROWAN_API_KEY 读取 API 密钥。
验证设置
import rowan
# Check authentication
user = rowan.whoami()
print(f"Logged in as: {user.username}")
print(f"Credits available: {user.credits}")
结果模式(请先阅读)
每个 submit_*_workflow 都会返回一个 Workflow。不要手动读取 workflow.data[...],也不要调用已弃用的 wait_for_result()。v3 的惯用写法只需一次调用:
mol = rowan.Molecule.from_smiles("c1ccccc1O") # 3D structure for the default 3D method
workflow = rowan.submit_pka_workflow(mol, name="phenol pKa")
result = workflow.result() # blocks until done, returns a typed WorkflowResult
print(result.strongest_acid) # typed attribute access, not a dict key
要点:
workflow.result(wait=True, poll_interval=5)会阻塞等待、获取结果;如果工作流失败或已停止,则会抛出rowan.WorkflowError。使用wait=False可在不阻塞的情况下获取当前已就绪的内容。workflow.status是stjames.Status的整数枚举(QUEUED=0, RUNNING=1, COMPLETED_OK=2, FAILED=3, STOPPED=4, AWAITING_QUEUE=5, DRAFT=6, PREEMPTED=7),不是字符串。请使用workflow.done()/workflow.is_finished(),不要与"completed"进行比较。- 基于几何结构的工作流现在不接受不带坐标的 SMILES 字符串。 从 rowan-python 3.x 起,
submit_basic_calculation_workflow、submit_docking_workflow以及任何 3D pKa/构象方法调用都会执行require_coordinates;如果 SMILES 没有坐标,就会引发ValueError。请先构建 3D 分子:mol = rowan.Molecule.from_smiles("CCO")(或stjames.Molecule.from_smiles(...),它会自动生成坐标),然后传入mol。基于 SMILES 的方法仍接受 SMILES 字符串(submit_macropka_workflow,以及method="starling"/"chemprop_nevolianis2025"时的 pKa)。Molecule.from_smiles(smiles)只接受 SMILES(不接受charge=/multiplicity=关键字参数)。
核心工作流
1. pKa 预测
预测微观 pKa/酸解离常数:
import rowan
# The default pKa method is now a 3D method, so build a molecule (bare SMILES is rejected).
workflow = rowan.submit_pka_workflow(
rowan.Molecule.from_smiles("c1ccccc1O"), # Phenol
name="phenol pKa calculation",
pka_range=(2, 12), # default
method="gxtb_wagen2026", # default (g-xTB); "aimnet2_wagen2024" also 3D.
# "starling" / "chemprop_nevolianis2025" take a SMILES string.
)
result = workflow.result()
print(f"Strongest acid pKa: {result.strongest_acid}")
print(f"Strongest base pKa: {result.strongest_base}")
如需计算宏观 pKa、微观状态随 pH 变化的分布、等电点,以及 logD/溶解度随 pH 的变化,请使用 rowan.submit_macropka_workflow(...),并读取 result.pka_values、result.microstates 和 result.isoelectric_point。
2. 构象搜索
生成并排序构象集合:
import rowan
workflow = rowan.submit_conformer_search_workflow(
"CCCC", # Butane
name="butane conformer search",
final_method="aimnet2_wb97md3", # NNP; default
)
result = workflow.result()
print(f"Found {result.num_conformers} conformers")
for energy in result.get_energies(): # relative energies, kcal/mol
print(f" ΔE = {energy:.2f} kcal/mol")
lowest = result.get_conformer(0) # stjames.Molecule of the lowest-energy conformer
3. 几何优化
submit_basic_calculation_workflow 由任务驱动:传入 tasks(例如 ["optimize"]、["energy"]、["optimize", "frequencies"]),而不是 workflow_type 字符串。
import rowan
workflow = rowan.submit_basic_calculation_workflow(
rowan.Molecule.from_smiles("CC(=O)O"), # Acetic acid (needs 3D coords; SMILES is rejected)
tasks=["optimize"],
preset="organic_nnp", # quick NNP preset; or set method=/basis_set= explicitly
name="acetic acid optimization",
)
result = workflow.result()
print(f"Final energy: {result.energy} Hartree")
optimized_mol = result.molecule # stjames.Molecule with optimized coordinates
4. 蛋白质-配体对接
将小分子对接到蛋白质靶点。口袋的格式为以埃为单位的 [[center_x, center_y, center_z], [size_x, size_y, size_z]] —— 一个包含两个 3 维向量的列表,而不是字典。
import rowan
# Create protein from a PDB ID (fetched from RCSB)
protein = rowan.create_protein_from_pdb_id(name="EGFR kinase", code="1M17")
protein.sanitize() # strip waters/ions, fix residues
pocket = [[10.0, 20.0, 30.0], # center (Å)
[20.0, 20.0, 20.0]] # box size (Å)
workflow = rowan.submit_docking_workflow(
protein=protein, # Protein object or its .uuid
pocket=pocket,
# 3D input required — a bare SMILES string raises ValueError
initial_molecule=rowan.Molecule.from_smiles("Cc1ccc(NC(=O)c2ccc(CN3CCN(C)CC3)cc2)cc1"),
# engine options go in docking_settings; the loose scoring_function=/exhaustiveness=
# kwargs are deprecated (rowan.GninaSettings selects GNINA instead of Vina)
docking_settings=rowan.VinaSettings(scoring_function="vinardo"), # or "vina"
name="EGFR docking",
)
result = workflow.result()
best = result.scores[0] # DockingScore, sorted best-first
print(f"Best docking score: {best.score} kcal/mol")
best_pose = result.best_pose # stjames.Molecule of the top pose
5. 蛋白质协同折叠(AI 结构预测)
使用 AI 模型预测蛋白质-配体复合物结构:
import rowan
protein_seq = "MENFQKVEKIGEGTYGVVYKARNKLTGEVVALKKIRLDTETEGVPSTAIREISLLKELNHPNIVKLLDVIHTENKLYLVFEFLHQDLKKFMDASALTGIPLPLIKSYLFQLLQGLAFCHSHRVLHRDLKPQNLLINTEGAIKLADFGLARAFGVPVRTYTHEVVTLWYRAPEILLGCKYYSTAVDIWSLGCIFAEMVTRRALFPGDSEIDQLFRIFRTLGTPDEVVWPGVTSMPDYKPSFPKWARQDFSKVVPPLDEDGRSLLSQMLHYDPNKRISAKAALAHPFFQDVTKPVPHLRL"
ligand = "CCC(C)CN=C1NCC2(CCCOC2)CN1"
workflow = rowan.submit_protein_cofolding_workflow(
initial_protein_sequences=[protein_seq],
initial_smiles_list=[ligand],
name="kinase-ligand cofolding",
model="chai_1r", # default is "boltz_2"; see note below for the full list
)
result = workflow.result()
top = result.predictions[0] # first CofoldingResult sample
print(f"pTM: {top.scores.ptm}") # predicted TM score (0-1)
print(f"interface pTM: {top.scores.iptm}")
注意:在 rowan-python 3.2 中,协同折叠模型字符串为
chai_1r、boltz_1、boltz_2(默认值)、boltz_2_1、openfold_3和decaf_boltz(不存在boltz_1x)。置信度位于result.scores/每个预测的.scores中,属性为.ptm和.iptm。
工作流管理
列出和查询工作流
# List recent workflows (page is 0-indexed; default size=10)
workflows = rowan.list_workflows(size=10)
for wf in workflows:
print(f"{wf.name}: {wf.status.name}") # status is an int enum
# Filter by type / name substring / folder
pka_runs = rowan.list_workflows(workflow_type="pka", name_contains="phenol")
folder_runs = rowan.list_workflows(parent_uuid=folder.uuid)
# Retrieve specific workflow
workflow = rowan.retrieve_workflow("workflow-uuid")
批量操作
# Submit many workflows of one type at once. This is a thin loop over the generic
# submit_workflow: it skips the per-type input checks the submit_*_workflow helpers do,
# so pass workflow_data= for non-default settings.
workflows = rowan.batch_submit_workflow(
workflow_type="pka",
initial_smileses=["CCO", "CC(=O)O", "c1ccccc1O"],
)
# Non-blocking status poll: returns {uuid: status_int} (stjames.Status values)
statuses = rowan.batch_poll_status([wf.uuid for wf in workflows])
文件夹整理
# Create folder for project
folder = rowan.create_folder(name="Drug Discovery Project")
# Submit workflow to folder
workflow = rowan.submit_pka_workflow(
rowan.Molecule.from_smiles("CCO"),
name="compound pKa",
folder=folder, # or folder_uuid=folder.uuid (not both)
)
# List workflows in folder
folder_workflows = rowan.list_workflows(parent_uuid=folder.uuid)
计算方法
Rowan 支持多个理论层级:
神经网络势:
- AIMNet2 (ωB97M-D3) - 快速且准确
- Egret - Rowan 的专有模型
半经验方法:
- GFN1-xTB、GFN2-xTB - 适用于大型分子,速度快
DFT:
- B3LYP、PBE、ωB97X 变体
- 提供多种基组
系统会根据工作流类型自动选择方法,也可在工作流参数中显式指定。
参考文档
如需详细的 API 文档,请参阅以下参考文件:
references/api_reference.md:Workflow 类、提交函数、检索方法和结果模式references/workflow_types.md:完整的工作流类型及其参数——pKa、对接、协同折叠等references/molecule_handling.md:stjames.Molecule 类——从 SMILES、XYZ、RDKit 创建分子references/proteins_and_organization.md:蛋白质上传、文件夹管理、项目整理references/results_interpretation.md:理解工作流输出、置信度分数和验证
常见模式
模式 1:性质预测流程
先提交所有任务,再收集结果——提交操作不会阻塞,result() 会阻塞等待。
import rowan
smiles_list = ["CCO", "c1ccccc1O", "CC(=O)O"]
# Submit all pKa calculations (default 3D method -> build molecules from the SMILES)
workflows = [
rowan.submit_pka_workflow(rowan.Molecule.from_smiles(smi), name=f"pKa: {smi}")
for smi in smiles_list
]
# Collect results
for wf in workflows:
result = wf.result()
print(f"{wf.name}: pKa = {result.strongest_acid}")
模式 2:虚拟筛选
针对一个靶点筛选分子库时,优先使用专用的批量对接工作流,而不是使用 Python 循环。
import rowan
protein = rowan.upload_protein(name="Drug Target", file_path="target.pdb")
protein.sanitize()
pocket = [[x, y, z], [20.0, 20.0, 20.0]] # center, size (Å)
workflow = rowan.submit_batch_docking_workflow(
smiles_list=compound_library,
protein=protein,
pocket=pocket,
name="library screen",
)
result = workflow.result()
模式 3:基于构象的分析
import rowan
conf_wf = rowan.submit_conformer_search_workflow(
"C1CCCCC1", # any SMILES
name="conformer search",
)
result = conf_wf.result()
energies = result.get_energies() # relative energies, kcal/mol, ascending
print(f"Found {result.num_conformers} conformers")
print(f"Energy range: {energies[0]:.2f} to {energies[-1]:.2f} kcal/mol")
最佳实践
- 通过环境变量设置 API 密钥,更安全、更方便
- 使用文件夹整理相关工作流
- 使用
workflow.result()——它会等待、获取结果,并在一次调用中处理失败情况 - 对大量相似任务使用批量函数(
batch_submit_workflow、submit_batch_docking_workflow) - 通过任意提交函数中的
max_credits=限制开销,并检查rowan.whoami().credits
错误处理
如果工作流失败或已停止,workflow.result() 会引发 rowan.WorkflowError,因此请使用以下方式进行处理:
import rowan
workflow = rowan.submit_pka_workflow(
rowan.Molecule.from_smiles("c1ccccc1O"), name="calculation", max_credits=10
) # input problems (e.g. a bare SMILES for a 3D method) raise ValueError at submit time
try:
result = workflow.result() # blocks until done; raises on failure
print(result.strongest_acid)
except rowan.WorkflowError as e:
# workflow failed/stopped — inspect workflow.logfile for details
print(f"Workflow failed: {e}")
print(workflow.logfile)
workflow.status 是 int 枚举 stjames.Status;可使用 workflow.done() 进行非阻塞的完成状态检查。
更多资源
属于 AlterLab Academic Skills 套件。