alterlab-rowan について
alterlab-rowanは、Python APIで量子化学ワークフローを実行するスキルです。分子計算やタンパク質・リガンド解析を行う研究者向けに、物性予測、配座探索、構造最適化、ドッキング、タンパク質共フォールディングをクラウドで実行します。
主な機能
- 01pKaや酸化還元電位などの予測
- 02配座探索と構造最適化
- 03タンパク質への低分子ドッキング
- 04AIモデルによるタンパク質共フォールディング
- 05Pythonによるワークフロー管理と一括登録
活用シーン
- 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 のウェブインターフェースで確認できます
- リソースが自動的にスケーリングされます
このスキルを使う場面
次のような場合にこのスキルを使用します。
- ローカルの 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 |
| Boltz-2 または Chai-1 を自分の GPU でローカル実行する | 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 もインストールされます。
認証
API キーを生成してください。
オプション 1:直接割り当て
import rowan
rowan.api_key = "your_api_key_here"
オプション 2:環境変数(推奨)
export ROWAN_API_KEY="your_api_key_here"
API キーは、モジュールのインポート時に ROWAN_API_KEY から自動的に読み込まれます。
セットアップの確認
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)。"completed"と比較するのではなく、workflow.done()/workflow.is_finished()を使用してください。- 構造ベースのワークフローは、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 ベースのメソッド(submit_macropka_workflow、およびmethod="starling"/"chemprop_nevolianis2025"を指定した pKa)では、引き続き SMILES 文字列を使用できます。Molecule.from_smiles(smiles)が受け取るのは SMILES のみです(charge=/multiplicity=キーワード引数は指定できません)。
コアワークフロー
1. pKa 予測
micro-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 はタスク駆動型です。workflow_type 文字列ではなく、tasks(例:["optimize"]、["energy"]、["optimize", "frequencies"])を渡してください。
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]] です。2 つの 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:ワークフロークラス、送信関数、取得メソッド、結果のパターン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:バーチャルスクリーニング
1 つの標的に対してライブラリをスクリーニングする場合は、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()を使用します — 待機、取得、失敗時の例外送出を 1 回の呼び出しで行います- 多数の類似ジョブにはバッチ関数(
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() をチェックしてください。
追加リソース
- ウェブインターフェース:https://labs.rowansci.com
- ドキュメント:https://docs.rowansci.com
- チュートリアル:https://docs.rowansci.com/tutorials
AlterLab Academic Skills スイートの一部です。