オープンソースの統合構造と親和性予測:Boltz-2とChai-1でAlphaFold3を超える
2024年5月にAlphaFold3がリリースされ、構造生物学の分野に再び革命をもたらしました。しかし、実際の研究室や創薬チームがAlphaFold3をローカルで実行するには、2つの課題を克服する必要があります。それは、テラバイト規模のゲノムデータベースと、学術利用限定のライセンスです。2024年11月、MIT/GenentechはBoltz-1を完全にオープンソース(MITライセンス)としてリリースし、2025年にはBoltz-2が結合親和性予測を統合し、ハイスループット創薬スクリーニングのための実用的なツールとなり、Free Energy Perturbation (FEP+)よりも1000倍高速に動作するようになりました。本記事では、このオープンソースツールの組み合わせを使用して、本格的な創薬パイプラインを構築する方法を説明します。
📚 推奨される前提知識(強く推奨)
本記事は、AI × Bioの本格的な高度学習シリーズの集大成です。以下のDryBench教材を事前に確認することを強くお勧めします。
- DryBench ai-native #3: Transformers and Embeddings
- DryBench ai-native #12: PyTorch Basics
- DryBench ai-native #14: Claude Code and Cursor
- DryBench ai-native #15: Bio-AI Integration
前提知識を確認せずに本記事を読むと、3D座標処理のためのトランスフォーマーアーキテクチャ、PyTorchにおける大規模モデルのロードとGPU管理、Claude Codeを使用したパイプラインの自動化、およびBio-AIの一般的な理解という前提知識が求められるため、実践的なコードを理解するのが難しくなります。
DryBenchコースで学んだこと
DryBench ai-native #3では、トランスフォーマーは、シーケンスだけでなく、3D座標やグラフなどの任意の構造化データも処理できるように拡張できることを学びました。#12では、PyTorchが大規模モデルのパラメータをGPUメモリにロードし、混合精度やフラッシュアテンションなどの最適化を利用する方法を学びました。#14では、Claude Codeは、反復的なパイプラインスクリプトを合理化するための実用的なツールであることを学びました。そして、#15では、構造予測が、より広範なBio-AI統合の文脈の中でどのように位置づけられるかを学びました。
次に、実際の創薬チームにとって、「単にAlphaFold3を持っている」だけでは不十分である理由を見てみましょう。構造予測だけでは、リガンドがどれだけ強く結合するか(親和性)はわかりません。従来、この答えは、1つのリガンドあたり数日から数週間かかるFEP(Free Energy Perturbation)計算によって得られます。Boltz-2は、これら2つの側面(構造+親和性)を1つのニューラルネットワークのフォワードパスに統合し、ミリ秒単位の結果を生成します。これは、創薬スクリーニングが劇的に変化するポイントであり、本記事ではその実践的な実装を提供します。
本格的な問題定義
創薬スクリーニングの実際的な要件
特定のターゲットタンパク質(例:特定のキナーゼ)について、1000以上の候補となる低分子化合物をスクリーニングして、効果的なヒットを特定する必要があります。従来のアプローチ:
- ドッキング(AutoDock Vina、Glide): 1つのリガンドあたり数秒から数分かかります。ただし、ポーズは概ね正しいものの、親和性の精度は低い(相関係数r~0.4~0.5)。
- FEP+(Schrödinger): 1つのリガンドあたり数日かかります。高い精度(r~0.8+)。ただし、商用であり、ライセンスは非常に高価です。
- AlphaFold3: 優れた複合構造を提供しますが、直接親和性を出力するものではありません。別途スコアリングが必要です。
- Boltz-2: 構造+親和性(log10 IC50の近似値)を出力します。FEP+に近い精度。1つのリガンドあたりミリ秒から数秒かかります。
本記事で取り上げるパイプラインの目標は次のとおりです。
- ターゲットタンパク質の配列+1000個の候補リガンドのSMILES → 24時間以内にスクリーニングを完了します。
- 上位20件の親和性の高い候補を自動的にランク付けし、自動PyMOL視覚化を生成します。
- 複数のコンフォメーションに対応: 各リガンドに対して複数のポーズをサンプリングし、アンサンブルスコアリングを実行します。
- 再現性を確保: すべての実行は、タグ追跡のために1つのYAML構成ファイルで定義されます。
なぜBoltz-2とChai-1で、AlphaFold3ではないのか?
- ライセンス: AlphaFold3は、学術的な非商用利用の承認が必要であり、商用利用には別途交渉が必要です。Boltz-1/2とChai-1はオープンソースです(BoltzはMIT [1]、Chaiは研究目的で無料、商用利用は別途[2])。
- インフラストラクチャの負担: AlphaFold3は、UniRef、MGnify、PDBなどのテラバイト規模のデータベースをローカルで同期する必要があります。Boltz-2は、代わりにMMseqs2リモートAPIを使用できます[1]。
- 親和性の統合: AF3は構造のみを予測します。Boltz-2は構造+親和性予測を統合します[1]。
- 速度: Boltz-2は、FEP+よりも1000倍高速です(公開された結果に基づく[3])。
- 商用利用の自由: MITライセンスには、商用利用に対する制限はありません。Chai-1は有料の商用APIを提供します。
ツールセットとインフラストラクチャ要件
| ツール | 役割 | ライセンス |
|---|---|---|
Boltz (v2, pip install boltz) | 構造と親和性予測の統合 | MIT |
Chai-1 (chai_lab) | 別の予測モデル/アンサンブルパートナー | 研究目的であれば無料、商用利用は別途 |
| MMseqs2 リモート API (BioLM 無料版) | MSA(多配列アライメント)の構築(ローカルデータベースは不要) | GPL v3(MMseqs2自体)、APIはBioLMのポリシーに従う |
| RDKit | SMILES形式の解析、リガンドの処理 | BSD-3-Clause |
| PyMOL (オープンソース版) | 3D構造の可視化 | LGPL |
| Biopython | PDBファイルのポストプロセス | Biopython License |
| PyTorch, CUDA | ニューラルネットワークのバックエンド | BSD |
インフラストラクチャ要件:
- 実用的な最小要件: 24GB VRAMのデータセンターGPU、または高性能なコンシューマーGPU(RTX 4090 24GB)x 1。Boltz-2はfp16で約15GB VRAMを消費し、より大きな複合体では20GB以上が必要になる場合があります。
- CPUフォールバック: 非常に遅く(1回の予測に30分以上かかる)、実質的に使用できません。
- RAM: 32GB以上。
- ディスク: Boltzのモデルサイズは約2〜5GB、Chai-1は約5GB、MSAキャッシュは数GBです。
- ネットワーク: MMseqs2リモートAPIの呼び出しには、ターゲットごとに数MBの通信が必要です。
学習者向けの概算費用: ローカルGPUがない場合は、クラウドのオンデマンドGPUインスタンスの1時間あたりの料金を参照してください(例:24GB VRAM)。1000個のリガンドをスクリーニングするには、約2〜4時間のGPU時間が必要です(Boltz-2の論文におけるベンチマークに基づく[3])。
実用的なパイプラインの実装
全体的な流れ:
ステップ1:ターゲットタンパク質のMSAリモート構築
MMseqs2をローカルにインストールし、UniRefをダウンロードする代わりに、リモートAPIを使用します。Boltzは複数のリモートMSAサーバーをサポートします[4]。
from pathlib import Pathfrom dataclasses import dataclass
import requests
@dataclassclass MSAResult: """複数の配列アライメントの結果。""" query_id: str a3m_content: str # a3m形式のMSA depth: int # MSAの深さ(配列の数)
def build_msa_remote( query_sequence: str, query_id: str = "target", api_base: str = "https://api.colabfold.com", max_depth: int = 5000,) -> MSAResult: """ColabFold MSAサーバー(MMseqs2バックエンド)を使用してリモートMSAを構築します。
Boltzの公式ドキュメントでは、ColabFoldまたはBioLM APIが推奨されています[4]。 """ # 実際のAPI呼び出し(例:ColabFold MMseqs2 API) payload = {"query": f">{query_id}\n{query_sequence}", "mode": "env"} resp = requests.post(f"{api_base}/ticket/msa", data=payload, timeout=600) resp.raise_for_status() ticket = resp.json()["id"]
# 完了をポーリングし、待機します import time while True: status = requests.get(f"{api_base}/ticket/{ticket}", timeout=30).json() if status["status"] == "COMPLETE": break elif status["status"] == "ERROR": raise RuntimeError(f"MSAの構築に失敗しました:{status}") time.sleep(5)
# a3m結果をダウンロードします a3m_resp = requests.get(f"{api_base}/result/download/{ticket}", timeout=60) a3m_resp.raise_for_status() a3m_content = a3m_resp.text depth = a3m_content.count("\n>")
return MSAResult(query_id=query_id, a3m_content=a3m_content, depth=depth)
def save_a3m(msa: MSAResult, output_dir: Path) -> Path: """a3mファイルを保存します。""" output_dir.mkdir(parents=True, exist_ok=True) path = output_dir / f"{msa.query_id}.a3m" path.write_text(msa.a3m_content) return pathステップ2:リガンドライブラリの標準化
SMILESは同じ分子を複数の方法で表現できるため、標準化が必要です。RDKitが標準です。
from rdkit import Chemfrom rdkit.Chem import AllChem, Descriptors, Lipinskiimport pandas as pd
def canonicalize_smiles(smiles: str) -> str | None: """SMILESの標準形を返します。解析に失敗した場合はNoneを返します。""" mol = Chem.MolFromSmiles(smiles) if mol is None: return None return Chem.MolToSmiles(mol, canonical=True)
def lipinski_filter(smiles: str) -> dict: """リピンスキーの5則が満たされているか確認し、物理化学的特性を計算します。""" mol = Chem.MolFromSmiles(smiles) if mol is None: return {"valid": False} props = { "MW": Descriptors.MolWt(mol), "LogP": Descriptors.MolLogP(mol), "HBA": Lipinski.NumHAcceptors(mol), "HBD": Lipinski.NumHDonors(mol), "RotB": Lipinski.NumRotatableBonds(mol), } violations = sum([ props["MW"] > 500, props["LogP"] > 5, props["HBA"] > 10, props["HBD"] > 5, ]) props["valid"] = True props["lipinski_violations"] = violations props["lipinski_pass"] = violations <= 1 return props
def prepare_ligand_library(smiles_list: list[str]) -> pd.DataFrame: """リガンドライブラリを標準化し、物理化学的フィルタを適用します。""" records = [] for i, raw in enumerate(smiles_list): canon = canonicalize_smiles(raw) if canon is None: continue props = lipinski_filter(canon) records.append({ "ligand_id": f"L{i:04d}", "smiles_raw": raw, "smiles_canonical": canon, **props, }) df = pd.DataFrame(records) return df[df["lipinski_pass"]].reset_index(drop=True)ステップ3:Boltz-2 YAML設定ファイルの生成
Boltzは、タンパク質 + リガンド + MSAを1つのYAMLファイルで指定します[4]。
import yaml
def build_boltz_config( protein_sequence: str, protein_msa_path: Path, ligand_smiles: str, ligand_id: str, output_dir: Path,) -> Path: """Boltz YAML設定ファイルを生成します。タンパク質-リガンドペアごとに1つです。""" config = { "version": 1, "sequences": [ { "protein": { "id": "A", "sequence": protein_sequence, "msa": str(protein_msa_path), } }, { "ligand": { "id": "L", "smiles": ligand_smiles, } }, ], "constraints": [], "properties": [ {"affinity": {"binder": "L"}} # 結合親和性の予測を有効にします(Boltz-2の新機能) ], } output_dir.mkdir(parents=True, exist_ok=True) yaml_path = output_dir / f"{ligand_id}.yaml" with open(yaml_path, "w") as f: yaml.safe_dump(config, f, sort_keys=False) return yaml_pathステップ4:Boltz-2バッチ推論
複数のリガンドを反復処理し、予測を実行します。GPUメモリを考慮したセッション管理を行います。
import subprocessimport json
@dataclassclass BoltzResult: """Boltz-2予測結果。""" ligand_id: str pdb_path: Path # 予測された3D複合構造 plddt_mean: float # 構造の信頼度(0〜100) iptm: float # インターフェースpTM(0〜1) affinity_log_ic50: float # 予測されたlog10(IC50 mol/L)(値が低いほど良い) inference_time_sec: float
def run_boltz_prediction( yaml_path: Path, output_dir: Path, device: str = "cuda", use_msa_server: bool = False,) -> BoltzResult: """Boltz-2 CLIを実行します(実際にはPython APIも使用できます)。""" import time start = time.time()
cmd = [ "boltz", "predict", str(yaml_path), "--out_dir", str(output_dir), "--devices", "1", "--accelerator", "gpu" if device == "cuda" else "cpu", ] if use_msa_server: cmd.append("--use_msa_server")
result = subprocess.run(cmd, capture_output=True, text=True, check=True) elapsed = time.time() - start
# Boltzはoutput_dir/{name}/{name}_model_0.pdb + confidence.jsonを生成します name = yaml_path.stem pdb_path = output_dir / name / f"{name}_model_0.pdb" conf_path = output_dir / name / f"confidence_{name}_model_0.json"
with open(conf_path) as f: conf = json.load(f)
# 結合親和性は別のJSONに格納されます(Boltz-2の新機能) affinity_path = output_dir / name / f"affinity_{name}.json" affinity_data = json.loads(affinity_path.read_text()) if affinity_path.exists() else {}
return BoltzResult( ligand_id=name, pdb_path=pdb_path, plddt_mean=float(conf.get("complex_plddt", 0.0)), iptm=float(conf.get("iptm", 0.0)), affinity_log_ic50=float(affinity_data.get("affinity_pred_value", 0.0)), inference_time_sec=elapsed, )ステップ5:バッチスクリーニングオーケストレーション
すべてのリガンドライブラリを反復処理し、失敗を処理し、進行状況を表示します。
from tqdm import tqdm
def batch_screen( protein_sequence: str, protein_msa: MSAResult, ligand_library: pd.DataFrame, work_dir: Path, device: str = "cuda",) -> pd.DataFrame: """すべてのリガンドライブラリをスクリーニングします。""" msa_path = save_a3m(protein_msa, work_dir / "msa")
results = [] failures = [] for _, row in tqdm(ligand_library.iterrows(), total=len(ligand_library), desc="スクリーニング中"): try: yaml_path = build_boltz_config( protein_sequence=protein_sequence, protein_msa_path=msa_path, ligand_smiles=row["smiles_canonical"], ligand_id=row["ligand_id"], output_dir=work_dir / "configs", ) boltz_result = run_boltz_prediction( yaml_path=yaml_path, output_dir=work_dir / "predictions", device=device, use_msa_server=False, ) results.append({ "ligand_id": boltz_result.ligand_id, "smiles": row["smiles_canonical"], "affinity_log_ic50": boltz_result.affinity_log_ic50, "plddt": boltz_result.plddt_mean, "iptm": boltz_result.iptm, "pdb_path": str(boltz_result.pdb_path), "inference_sec": boltz_result.inference_time_sec, "MW": row.get("MW"), "LogP": row.get("LogP"), }) except Exception as e: failures.append({"ligand_id": row["ligand_id"], "error": str(e)})
df_results = pd.DataFrame(results).sort_values("affinity_log_ic50") df_failures = pd.DataFrame(failures) df_failures.to_csv(work_dir / "failures.csv", index=False) return df_resultsステップ6:上位K PyMOL可視化
上位の候補の結合ポーズを自動的にレンダリングします。
def render_pymol( pdb_path: Path, output_png: Path, ray_trace: bool = True,) -> None: """ヘッドレスPyMOLレンダリング。""" script = f"""load {pdb_path}, complexhide everythingshow cartoon, complex and polymershow sticks, complex and organiccolor grey70, complex and polymercolor yellow, complex and organicbg_color whitezoom complex and organic, 5{"ray 1200, 900" if ray_trace else ""}png {output_png}, dpi=150quit""" script_path = output_png.parent / "render.pml" script_path.write_text(script) subprocess.run(["pymol", "-cq", str(script_path)], check=True)
def render_top_k(results_df: pd.DataFrame, output_dir: Path, k: int = 20) -> None: output_dir.mkdir(parents=True, exist_ok=True) for _, row in results_df.head(k).iterrows(): render_pymol( pdb_path=Path(row["pdb_path"]), output_png=output_dir / f"{row['ligand_id']}.png", )統合パイプライン
def full_screening_pipeline( protein_sequence: str, protein_id: str, smiles_library: list[str], work_dir: Path, device: str = "cuda", top_k: int = 20,) -> pd.DataFrame: """FASTA + SMILESライブラリ -> ランク付けされたDataFrame。""" print(f"[1/6] リモートMSA構築のリクエスト(クエリの長さ={len(protein_sequence)})") msa = build_msa_remote(protein_sequence, query_id=protein_id) print(f" MSAの深さ={msa.depth}")
print(f"[2/6] リガンドライブラリの標準化(生={len(smiles_library)})") library = prepare_ligand_library(smiles_library) print(f" リピンスキーパス={len(library)}")
print(f"[3/6] バッチスクリーニングの開始") results = batch_screen(protein_sequence, msa, library, work_dir, device) results.to_csv(work_dir / "screening_results.csv", index=False)
print(f"[4/6] 上位{top_k} PyMOLレンダリング") render_top_k(results, work_dir / "top_k_renders", k=top_k)
print(f"[5/6] 完了:work_dir={work_dir}") print(f"[6/6] 上位5つのリガンドの概要:") print(results.head(5)[["ligand_id", "affinity_log_ic50", "plddt", "iptm"]].to_string(index=False)) return results
## Chai-1 アンサンブル検証 (オプションの拡張)
Chai-1 は Boltz と同様の最先端のオープンな基盤モデルであるため、上位候補を Chai-1 で再評価することで、誤検出を減らすことができます [2]。
```pythonfrom chai_lab.chai1 import run_inference
def chai_reverification( protein_sequence: str, ligand_smiles: str, output_dir: Path, device: str = "cuda",) -> dict: """Chai-1 を使用して、同じペアを再予測します。Boltz の結果とアンサンブルスコアリングを行います。""" fasta_str = f">protein|name=A\n{protein_sequence}\n>ligand|name=L\n{ligand_smiles}\n" fasta_path = output_dir / "chai_input.fasta" fasta_path.write_text(fasta_str) output_dir.mkdir(parents=True, exist_ok=True) result = run_inference( fasta_file=fasta_path, output_dir=output_dir, num_trunk_recycles=3, num_diffn_timesteps=200, seed=42, device=device, use_esm_embeddings=True, ) return { "pdb_path": result[0], "iptm": float(result[0].iptm), # 例として、実際の API を参照してください。 }
def ensemble_ranking( boltz_score: float, chai_score: float, weight: float = 0.5,) -> float: """2 つのモデルからのスコアの重み付き平均 (値が小さいほど良い)。""" return weight * boltz_score + (1 - weight) * chai_scoreパフォーマンス、コスト、および既知の失敗例
パフォーマンスの参照 (公開ベンチマークの引用)
| アプローチ | ベンチマーク | 構造 RMSD (Å) | 親和性ピアソンの r | ペアあたりの時間 | 参照 |
|---|---|---|---|---|---|
| ドッキング (AutoDock Vina) | PDBbind core | 3.5~5.0 | 0.4~0.5 | 秒 | 従来 |
| Glide XP | PDBbind core | 2.5~3.5 | 0.55~0.65 | 分 | Schrödinger |
| FEP+ (Schrödinger) | 選択されたサブセット | — | 0.75~0.85 | 日 | 商用 |
| AlphaFold3 (構造のみ) | 最新の PDB | 1.5~2.5 | 別途スコアリングが必要 | 秒~分 | Google DeepMind 2024 |
| Chai-1 | ベンチマークのサブセット | ~2.0 | ~0.65 | 秒~分 | Chai Discovery 2024 [2] |
| Boltz-1 | 最新の PDB | 2.0~3.0 | ~0.6 | 秒 | MIT/Genentech 2024 [1] |
| Boltz-2 | PDBbind など | ~2.0 | ~0.80 (FEP+ レベル) | ミリ秒~秒 | Wohlwend et al. 2025 [3] |
学習者向けの推定コスト
- API コスト: 0 (ローカル GPU を使用する場合)。MMseqs2 リモート API の無料プランを利用します。
- GPU 時間: およそ 1 つのターゲット + 1000 個の配位子のスクリーニングに 2〜4 時間 (24GB VRAM GPU を想定)。
- クラウドオンデマンドサービスを使用する場合、時間ベースの料金が適用される場合があります。
- ディスクスペース: Boltz の重みは 2〜5GB、結果の PDB + レンダリングは約 500MB です。
3 つの既知の失敗例 (コミュニティ/論文の収集)
-
大きな複合体 (>2000 残基) での OOM (メモリ不足) 症状: 24GB VRAM でも、大きな多サブユニット複合体がメモリ制限を超える。 原因: Boltz-2 のアテンションメカニズムは、残基数に対して O(N²) のメモリ複雑度を持つ。 緩和策: (a)
--use_flash_attentionオプションを有効にする、(b) fp16 を強制する、(c) 大きな複合体の場合、サブユニットごとに予測し、その後、結果を後処理で結合する、(d) 48GB 以上の VRAM GPU が必要。 参照: Boltz GitHub Issues — "OOM for large complexes" スレッド [5]。 -
不十分な MSA の深さによる有意な精度低下 症状: 新しい孤立配列またはメタゲノム配列の場合、MMseqs2 リモートは MSA の深さ < 32 を返す可能性があり、Boltz-2 の pLDDT と親和性の信頼性が大幅に低下します。 原因: 基盤モデルは依然として共進化のシグナルに依存しています。 緩和策: (a) MSA の深さが 100 未満の場合、結果に警告フラグを追加する、(b)
--msa_serverオプションで複数のサーバーを試す、(c) シングルシーケンスモード (MSA なし) を使用して、信頼性を評価する。 参照: Boltz の公式ドキュメントの「MSA の品質」セクション [6]。 -
配位子の立体化学を無視することによる誤った結合ポーズ 症状: SMILES 文字列で立体化学が指定されていても、予測は異なる立体異性体の中から任意に選択します。 原因: SMILES の正規化ステップでのキラリティタグの損失、または基盤モデルのトレーニングデータの偏り。 緩和策: (a)
Chem.MolFromSmiles(canonical=False)を使用して、元の立体化学を保持する、(b) RDKit のAllChem.EmbedMoleculeで 3D 構造を生成し、SDF として入力する、(c) 予測されたポーズのキラリティを検証する。 参照: RDKit Discussions + Boltz Issues (立体化学に関連する複数のスレッド) [7]。
拡張のアイデア
- フラグメントベースの創薬: 主にフラグメント (< 300 Da) で構成される配位子ライブラリを作成し、Boltz-2 でヒットフラグメントをスクリーニングし、次にリンカーを設計します。
- ターゲットクラスのベンチマーク: 同じ配位子ライブラリを使用して、キナーゼファミリー全体 (例: MAPK) に対してスクリーニングを繰り返し、選択性マップを作成します。
- アクティブラーニングループ: 上位の予測に対して実験アッセイを実行し、結果をフィードバックし、モデルを微調整します (ドメイン固有)。
- タンパク質-タンパク質複合体 + 配位子: Boltz は複数のチェーンをサポートします。抗体-抗原 + 小分子化合物の組み合わせを含むシナリオに拡張します。
- MCP ツールの公開: パート 14 の MCP エージェントが、このパイプラインをツールとして呼び出すようにして、自律的な創薬研究を可能にします。
次のパート
- パート 08
docking-hybrid-diffusion: このパートの上位 k 個の候補のポーズを、DiffDock-Glide ハイブリッドを使用して改良します。 - パート 13
protein-design-multimodal: ESM3 を使用して新しいターゲットタンパク質を設計し、次に Boltz-2 を使用して結合候補をスクリーニングします。 - パート 14
bio-mcp-agent: このパイプラインを MCP ツールとしてラップして、自律的な創薬研究エージェントを作成します。 - パート 15
bio-mcp-server-suite: PDBbind および ChEMBL データにアクセスするためのカスタム MCP サーバー。
参考文献
- Wohlwend J, Corso G, Passaro S, et al. Boltz-1: 構造予測のためのオープンソース基盤モデル。MIT/Genentech 2024。GitHub:
https://github.com/jwohlwend/boltz - Chai Discovery. "Chai-1: 生命の分子間相互作用の解読"。bioRxiv 2024。
https://www.biorxiv.org/content/10.1101/2024.10.10.615955v2/ GitHub:https://github.com/chaidiscovery/chai-lab - Passaro S, Corso G, Wohlwend J, et al. "Boltz-2: 高精度かつ効率的な結合親和性予測へ"。bioRxiv 2025。
https://www.biorxiv.org/content/10.1101/2025.06.14.659707v1 - Boltz 公式ドキュメント (予測の使用法):
https://github.com/jwohlwend/boltz/blob/main/docs/prediction.md - Boltz GitHub Issues (メモリ不足、MSA、立体化学):
https://github.com/jwohlwend/boltz/issues - Boltz 公式ドキュメント MSA セクション:
https://github.com/jwohlwend/boltz/blob/main/docs/msa.md - RDKit ディスカッション (立体化学の標準化):
https://github.com/rdkit/rdkit/discussions - Abramson J, Adler J, Dunger J, et al. "AlphaFold 3による生体分子間相互作用の正確な構造予測"。Nature 2024。
https://www.nature.com/articles/s41586-024-07487-w - Schrödinger FEP+ (商用):
https://www.schrodinger.com/products/fep - PDBbind:
http://www.pdbbind.org.cn/ - MMseqs2:
https://github.com/soedinglab/MMseqs2 - ColabFold MSA サーバー (オープンティア):
https://github.com/sokrypton/ColabFold - BioLM API:
https://biolm.ai/models/ - RDKit:
https://www.rdkit.org/ - PyMOL オープンソース:
https://github.com/schrodinger/pymol-open-source - AutoDock Vina:
https://vina.scripps.edu/ - 最近の PDB ベンチマークセット:
https://www.rcsb.org/