AlphaFold3とalphafold3_toolsで様々なタンパク質-基質複合体予測を行うチュートリアル

AlphaFold3とalphafold3_toolsで様々なタンパク質-基質複合体予測を行うチュートリアル

GitHubに[alphafold3_tools](https://github.com/cddlab/alphafold3_tools)というツールを作成したので、その宣伝をかねて、これを使ってリガンド情報を追加したAlphaFold3の構造予測を行う方法を紹介します。

## Requirements

- AlphaFold3をインストールしてある
- Python3.10以降が動作できる環境（macOSだとHomebrew, Linuxだと最初から入っていると思う）

## 題材

題材として*Mycobacterium tuberculosis*（結核菌）由来のタンパク質[UniProt ID: P9WIC5](https://www.uniprot.org/uniprotkb/P9WIC5/entry)のChorismate pyruvate-lyaseの酵素基質複合体を予測してみます。

![scshot 2025-03-25 0.12.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224327/0f57babe-bf49-4b30-b910-3d4a621f6b29.png)

この反応を触媒する酵素です。現時点で結晶構造は決定されていません。

![ScreenShot 2025-03-25 16.46.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224327/a7ca6f11-7d95-4877-994c-0e9ed3dca4f6.png)

アミノ酸配列は同ページのSequenceのところから取得することができますので、これをAlphaFold3への予測対象配列とします。

![ScreenShot 2025-03-25 16.47.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224327/e96e822d-7478-47d1-909b-e11ff4529722.png)


```shell:P9WIC5.fasta
>P9WIC5
MTECFLSDQEIRKLNRDLRILIAANGTLTRVLNIVADDEVIVQIVKQRIHDVSPKLSEF
EQLGQVGVGRVLQRYIILKGRNSEHLFVAAESLIAIDRLPAAIITRLTQTNDPLGEVMA
ASHIETFKEEAKVWVGDLPGWLALHGYQNSRKRAVARRYRVISGGQPIMVVTEHFLRSV
FRDAPHEEPDRWQFSNAITLAR
```

リガンド（基質）は[chorismate](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%AA%E3%82%B9%E3%83%9F%E9%85%B8) (コリスミ酸)とします。

## MSAを取得する

AlphaFold3は、AlphaFold2時代と同じく、まず予測したいアミノ酸配列の類縁配列であるMultiple Sequence Alignment (MSA)を取得する処理を行ってから、これに潜む情報を加工して、続く構造予測処理へと入っていきます。前半のMSA取得はCPUオンリーの処理であり、後半の構造予測はGPUを使う処理で、原理的には分離して計算させることが可能です。構造予測処理部分は、短い配列（200〜300）のもので1分程度、長い配列（3000〜4000）のもので30〜50分程度です。
MSA取得処理についてはいくつかやり方があるので、それぞれ紹介します。

### 1. AlphaFold3にそのままお任せする

AlphaFold3はHMMERを使ったMSA取得の機能が備わっているので、これを使うことがstraightforwardです。[以前のAlphaFold3インストール記事のテストラン](https://qiita.com/Ag_smith/items/3bb110fe576292bbf0ea#%E3%83%86%E3%82%B9%E3%83%88%E3%83%A9%E3%83%B3)のところで、予測配列対象を上記のアミノ酸配列に変えて予測させれば、それだけで自動的にMSAの取得と構造予測が続けて実行されます。

```json:P9WIC5_pred.json
{
    "name": "P9WIC5_pred",
    "modelSeeds": [1],
    "sequences": [
        {
            "protein": {
                "id": ["A"],
                "sequence": "MTECFLSDQEIRKLNRDLRILIAANGTLTRVLNIVADDEVIVQIVKQRIHDVSPKLSEFEQLGQVGVGRVLQRYIILKGRNSEHLFVAAESLIAIDRLPAAIITRLTQTNDPLGEVMAASHIETFKEEAKVWVGDLPGWLALHGYQNSRKRAVARRYRVISGGQPIMVVTEHFLRSVFRDAPHEEPDRWQFSNAITLAR"
            }
        },
        {
            "ligand": {
              "id": ["B"],
              "smiles": "O[C@@H]1C=CC(=C[C@H]1OC(=C)C([O-])=O)C([O-])=O"
            }
        }
    ],
    "dialect": "alphafold3",
    "version": 1
}
```

`"smiles": "O[C@@H]1C=CC(=C[C@H]1OC(=C)C([O-])=O)C([O-])=O"`は予測したいリガンド・コリスミ酸のSMILES表記です（後述）

構造予測が終わると、アウトプットディレクトリに`*_data.json`というファイルが生成されています。このJSONファイルはMSAの情報を含んでおり、再利用することも可能なので、これを改変すれば（例：リガンド部分だけの情報を書き換えるなど）、再度短時間で複合体予測を実行することができます。

しかし、**HMMERを使ったMSA取得は一般に10〜20分以上時間がかかるため**スループット性はそこまで高くありません。
なので、ここではそんな当たり前な方法ではなく、もっと大量に高速にMSAを取得したい場合も含めて別の方法を紹介します。

### 2. ColabFoldを使う

AlphaFold2についてのColabFoldは、構造予測の中でMSAを超高速に取得する処理を含んでいます。これを使うことで、MSAを取得することができます。
以下の画像はColabFoldのスクリーンショットです。"sequence"のところにFASTA形式のファイルを入力して、「ランタイム」メニューから「すべてのセルを実行」を選択すると、構造予測を行うと同時に、MSAのファイルも取得できます。

![scshot 2025-03-22 18.09.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224327/0db837c4-e5e6-468d-ab3e-adf1852d6b44.png)

![scshot 2025-03-22 18.14.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224327/07d24867-b6fe-46a7-83a8-38fa37d078fa.png)

上記画像の赤枠で示された、a3m形式の`P9WIC5_548bc.a3m`がMSAのファイルとなっています。赤枠の右にあるケバブボタン（︙← こんなボタン）を押すとダウンロードメニューが現れるので、これを押してこちらを手元のPCにダウンロードすればOKです。

::::note
`_548bc`というのは、ColabFoldの実行時に自動生成されるランダムな文字列（ハッシュ値の先頭の文字）です。この文字列は実行ごとに異なります。意味は特にないので気にしなくてOKです。
::::

または、LocalColabFoldでも同様のことができます。その場合は`--msa-only`というオプションをつけて実行することで、MSAのファイルだけを取得することができます。

```shell
colabfold_batch --msa-only P9WIC5.fasta outdir
```

このコマンドで、`outdir`ディレクトリにMSAのファイル`P9WIC5.a3m`が生成されます。これを後のインプットにします。こちらはハッシュ値はついていません。

```shell
outdir
├── P9WIC5.a3m
├── P9WIC5.pickle
├── P9WIC5_coverage.png
├── P9WIC5_env
│   ├── bfd.mgnify30.metaeuk30.smag30.a3m
│   ├── msa.sh
│   ├── out.tar.gz
│   ├── pdb70.m8
│   └── uniref.a3m
├── cite.bibtex
├── config.json
└── log.txt
```

### 3. colabfold_searchを使う

LocalColabFoldの`colabfold_search`を使うことで、MSAのファイルを取得することができます。これはColabFoldのMSA取得サーバーとほぼ同じものをローカルで実行するため、**最高速度の1配列あたり1分でMSAをを取得**できるようにするためにはRAM 768GB以上のマシンが必要となります。詳細は私の以前の記事["LocalColabFoldを完全ローカル環境で動作させる"](https://qiita.com/Ag_smith/items/bfcf94e701f1e6a2aa90)を参照してください。

名古屋大学のスパコン不老Type-IIIとTSUBAME 4.0にはこの動作のためのデータベースは導入されています。

## AlphaFold3のためのJSONファイルの生成

### alphafold3_toolsのインストール

GitHubから[alphafold3_tools](https://github.com/cddlab/alphafold3_tools/)をインストールします。これは私が作成したソフトウェアで、AlphaFold3のinput JSONファイル作成支援と、アウトプットの可視化を行うことができます。

必要なソフトウェア

- Python 3.10以降

macOSではHomebrewをインストールしておくと`brew install python@3.12`でpython3.12をインストールすることができます。最新はpython3.13です。

::::note
python3.12以降を使う場合は、まず仮想環境venvを作成してからactivateすることが必須となりました。
`/path/to/workingdirectory`は作業ディレクトリです。

```shell
mkdir -p /path/to/workingdirectory ; cd /path/to/workingdirectory
python3.12 -m venv .venv
source .venv/bin/activate
```

::::

```shell
# Ubuntu 22.04ではデフォルトでpython3.10が使われます。
# GitHubからインストール
python3 -m pip install git+https://github.com/cddlab/alphafold3_tools.git
# upgrade
python3 -m pip uninstall alphafold3_tools -y && python3 -m pip install --upgrade git+https://github.com/cddlab/alphafold3_tools.git
```

こののち、ターミナルで`msatojson -h`と入力してみてヘルプメッセージが表示されれば成功です。

### a3mファイルをJSONファイルに変換

得られたMSAのファイルの中身をAlphaFold3のinput JSONファイル形式に変換します。これには[alphafold3_tools](https://github.com/cddlab/alphafold3_tools/)の`msatojson`というコマンドを使います。

```shell
msatojson -i P9WIC5_548bc.a3m -o P9WIC5.json
```

このインプット`-i`に与えられるa3mファイルは先程のColabFoldの出力ファイルです。`-o`には出力ファイル名を指定します。

`msatojson`は複数のa3mファイルを含むディレクトリを指定することもできます。この場合、`-o`には出力ディレクトリを指定します。

```shell
msatojson -i /path/to/a3m_containing/directory -o /path/to/output/directory
```

::::note warn
現在、テンプレート構造情報のインクルードはサポートされていません。
::::

ここで、`P9WIC5.json`が生成されます。このファイルを用いて、次にリガンド情報を追加します。

### 予測したいリガンド分子の情報をJSONファイルに追加する

リガンド分子の入力は、1つにChemical Component Dictionary (CCD)で規定されているIDを使うものがあります。CCDとはProtein Data Bank (PDB)に登録されている化合物の情報をまとめたデータベースです。こちらは
3文字
最大5文字で入力する化合物のIDのことで、例えば"ATP"であったりheme-c分子である"HEM"などがあります。CCDに登録されている化合物の情報検索は、[Chemical Components in the PDB](https://www.ebi.ac.uk/pdbe-srv/pdbechem/)や[RCSB PDB](https://www.rcsb.org/)で行うことができます。ここに登録されている化合物があれば、AlphaFold3のinput JSONにCCDを指定することでそのリガンドとの複合体予測をさせることが簡単に行えます。

::::note
2024年頃に、従来の3文字表記でのCCD IDは文字パターンを使い切ってしまったため、現在は5文字の化合物IDが発行されるようになりました。例：A1A06 https://www.rcsb.org/ligand/A1A06
なお、AlphaFold3の実行時にCCDとして参照可能なリガンド情報は、各AlphaFold3が利用している仮想環境pythonの中の`python3.xx/site-packages/share/libcifpp/components.cif`というファイルにまとめて書かれています。
::::

しかし、当然ですがすべての化合物がCCDとして登録されているわけではありません。その場合はどうすればよいでしょうか？
2つ方法があり、1つは**SMILES形式で指定する方法**、もう1つは**User-provided CCDを作成してそれを指定させる方法**です。特に、タンパク質に対して共有結合性のリガンドを予測させたい場合はSMILESではなく(User-provided) CCDでなければ指定不可であることに気をつけてください。

ここではUniProt ID: P9WIC5のChorismate pyruvate-lyaseの酵素基質複合体を予測するために、リガンドとしてChorismate（コリスミ酸）の情報を追加する方法を紹介します。

![scshot 2025-03-25 0.12.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224327/0f57babe-bf49-4b30-b910-3d4a621f6b29.png)

#### 1. SMILES形式で指定する

化合物のSMILES形式で入力する方法が最も簡便です。SMILES形式は化合物を文字列で表現するものです。任意の化合物のSMILES形式の表現を見つけたい場合は、[ChEBI](https://www.ebi.ac.uk/chebi/init.do)または[PubChem](https://pubchem.ncbi.nlm.nih.gov/)などの化合物データベースを使うと簡単に見つけることができます。または、ChemDrawなどを持っている場合は、その機能の中に存在しています。

ChEBIの検索窓に"Chorismate"と入力すると、SMILES形式は`O[C@@H]1C=CC(=C[C@H]1OC(=C)C([O-])=O)C([O-])=O`となっていることがわかります。

![smiles.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224327/36aeb6f8-0fc0-4de8-b31a-8792db55e0a7.png)

SMILESの文字列がわかったら、`modjson`コマンドを使ってJSONファイルにリガンド情報を追加します。

```shell
modjson -i P9WIC5.json -o P9WIC5_chorismate_smiles.json -a smiles "O[C@@H]1C=CC(=C[C@H]1OC(=C)C([O-])=O)C([O-])=O" 1 -n P9WIC5_chorismate_smiles
```

`-a`には追加するリガンドの情報を指定します。ここでは`smiles`を指定しています。`-a`は3つ組の指定を要求しており、1番目は`smiles`または`ccdCodes`のどちらかの文字列を、2番目はSMILES文字列、またはccdのコード文字列を入れます。3番目にはいくつの分子を導入したいかを整数値で指定します。`-a smiles "CCC" 1`とすると、SMILES形式の"CCC"を1分子追加することになります。SMILESの文字列はダブルクォーテーションで囲む必要があります。

`-i`には入力JSONファイル名を指定します。`-o`には出力JSONファイル名を指定します。`-n`には、この後のAlphaFold3の構造予測時に出力されてほしいディレクトリ名を指定します。

このコマンドを実行することで、`P9WIC5_chorismate_smiles.json`が生成されます。これを用いてAlphaFold3を実行します。

#### 2. User-provided CCDを作成して予測に用いる

User-provided CCDを作成するうえで満たす項目については[AlphaFold3 input documentation](https://github.com/google-deepmind/alphafold3/blob/main/docs/input.md#user-provided-ccd-format)を読んでいただきたいのですが、理想的な座標が含めることが必須となります。理想座標を作るのはめんどくさいですが、もし化合物の情報がPubChemに存在する場合、理想座標をSDF形式でダウンロードすることが可能です。

先程のUniProtのCatalytic activityの画像で赤矢印で示しているリンクを押すとChEBIに飛びますが、そこでさらにAutomatic Xrefsのタブを開きます。

![chebi_xrefs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224327/3dc07c53-e593-4b8a-9c8f-7c4b5443f2ff.png)

こちらのCIDを押すことでPubChemのページに飛び、3D conformerのDownload CoordinatesからSDF形式のファイルをダウンロードすることができます。

![scshot 2025-03-25 0.20.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224327/972905b8-eb73-4dad-85b1-defa4b727e73.png)

こちらのファイルをダウンロードしたら、`sdftoccd`コマンドを使ってCCD形式に変換します。

```shell
sdftoccd -i Conformer3D_COMPOUND_CID_5460312.sdf -n CHO -o chorismate.ccd
```

`-i`にはダウンロードしたSDFファイルを指定します。`-n`にはCCDの名前を指定します。`-o`には出力ファイル名を指定します。

::::note warn
`-n`でのCCDCodeの指定は6文字以内の大文字英字で指定してください（3文字が推奨）。なお、ここではchorismateの頭文字を取って`CHO`としましたが、これはすでにCCDに[Glycochenodeoxycholic acid](https://www.ebi.ac.uk/pdbe-srv/pdbechem/chemicalCompound/show/CHO)として登録されています。しかし、User-provided CCDを使用した場合はそちらが優先される仕様となっているため、これを用いたAlphaFold3の予測構造の中ではchorismateとして扱われます。
::::

このccdファイルを用いて、再び`modjson`コマンドを用いてJSONファイルにリガンド情報を追加します。

```shell
modjson -i P9WIC5.json -o P9WIC5_chorismate_ccd.json -n P9WIC5_chorismate_ccd -a ccdCodes CHO 1 -u chorismate.ccd
```

`-i`は入力JSONファイル名、`-o`は出力JSONファイル名、`-n`は出力ディレクトリ名を指定します。`-a`は追加するリガンドの情報を指定します。ここでは`ccdCodes`を指定しています。`-a`は3つ組の指定を要求しており、1番目は`smiles`または`ccdCodes`のどちらかの文字列を、2番目はSMILES文字列、またはccdのコード文字列を入れます。3番目にはいくつの分子を導入したいかを整数値で指定します。`-a ccdCodes CHO 1`とすると、CCD形式の"CHO"を1分子追加することになります。`-u`には、先程作成したUser-provided CCDファイル名を指定します。

先述の通り、この"CHO"はUser-providedで指定したchorismateのものになります。これを用いてAlphaFold3を実行します。

## AlphaFold3で構造予測を実行

こうして出力されたJSONファイルを用いてAlphaFold3を実行します。AlphaFold3のインストールと実行コマンドについては[以前の記事](https://qiita.com/Ag_smith/items/3bb110fe576292bbf0ea)を参照してください。

alphafold3実行コマンドの`python3.11 ${ALPHAFOLD3DIR}/run_alphafold.py`に与える引数`--json_path`に、先程作成したJSONファイルを指定します。また、`--run_data_pipeline=False`を指定することで、MSA取得処理をスキップし、構造予測処理部分だけを実行させることができます。

```shell
# ALPHAFOLD3DIRなどディレクトリ変数名などの定義は省略しています
# Qiita記事の方を参照してください
python3.11 ${ALPHAFOLD3DIR}/run_alphafold.py \
  --run_data_pipeline=False \
  --jackhmmer_binary_path="${HMMER3_BINDIR}/jackhmmer" \
  --nhmmer_binary_path="${HMMER3_BINDIR}/nhmmer" \
  --hmmalign_binary_path="${HMMER3_BINDIR}/hmmalign" \
  --hmmsearch_binary_path="${HMMER3_BINDIR}/hmmsearch" \
  --hmmbuild_binary_path="${HMMER3_BINDIR}/hmmbuild" \
  --db_dir="${ALPHAFOLD_DB_DIR}" \
  --json_path="P9WIC5_chorismate_ccd.json" \
  --model_dir="${MODEL_DIR}" \
  --output_dir="${OUTDIR}"
```

これで構造予測を実行させます。結果は`OUTDIR`ディレクトリに保存され、`modjson`のときの`-n`で指定した名前のサブディレクトリに保存されます。（なお、サブディレクトリ名はAlphaFold3のコードによって自動的に小文字に変換されています）。

```shell
p9wic5_chorismate_ccd
├── p9wic5_chorismate_ccd_confidences.json
├── p9wic5_chorismate_ccd_data.json
├── p9wic5_chorismate_ccd_model.cif
├── p9wic5_chorismate_ccd_summary_confidences.json
├── ranking_scores.csv
├── seed-1_sample-0
│   ├── confidences.json
│   ├── model.cif
│   └── summary_confidences.json
├── seed-1_sample-1
│   ├── confidences.json
│   ├── model.cif
│   └── summary_confidences.json
├── seed-1_sample-2
│   ├── confidences.json
│   ├── model.cif
│   └── summary_confidences.json
├── seed-1_sample-3
│   ├── confidences.json
│   ├── model.cif
│   └── summary_confidences.json
├── seed-1_sample-4
│   ├── confidences.json
│   ├── model.cif
│   └── summary_confidences.json
└── TERMS_OF_USE.md
```

## 予測結果の確認

[以前の記事](https://qiita.com/Ag_smith/items/3bb110fe576292bbf0ea)にて、pLDDTをPyMOLやChimera上で色分けして表示する方法を紹介しました。alphafold3_toolsはこれに加えて、`paeplot`というコマンドを使うことで、Predicted Aligned Error (PAE)を画像として出力することもできます。

```shell
# /path/to/p9wic5_chorismate_ccd は先程AlphaFold3でアウトプットされたディレクトリへのパス
paeplot -i /path/to/p9wic5_chorismate_ccd [-c Greens_r] [--dpi 200] [-n foo] [-a]
```

`-i`には出力ディレクトリ内のサブディレクトリ`p9wic5_chorismate_ccd`へのパスを指定してください。`[]`の中は任意のオプションです。やっていることは、これの中身の`*_confidences.json`ファイルを読み取り、その中のPAEの値を画像にしています。`-c`でカラーマップを指定できます。デフォルトは`bwr`です。`--dpi`で解像度を指定できます。`-n`で出力ファイル名を指定できます。`-a`をつけると、すべての`seed-*-sample-*`の図を出力します。

PAE画像はインプットディレクトリ`/path/to/p9wic5_chorismate_ccd`の中に`p9wic5_chorismate_ccd_af3pae.png`として出力されます。

![p9wic5_chorismate_ccd_af3pae.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224327/08e75807-7fb5-4f1c-a01e-931801fe7d6c.png)

また、すべての出力mmCIFファイルを重ね合わせて1つのmodel.cifファイルに出力するコマンド`superpose_ciffiles`もあります。同様に、`-i`には出力ディレクトリ内のサブディレクトリ`p9wic5_chorismate_ccd`へのパスを指定してください。

```shell
superpose_ciffiles -i /path/to/p9wic5_chorismate
```

重ね合わせた結果は`-i`で指定したディレクトリ内に`**_superposed.cif`というファイル名で出力されます。これをPyMOLで開いてみると、すべてのモデルが重ね合わされていることが確認できます。

![ScreenShot 2025-03-25 16.17.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224327/cd137c96-5ddc-4358-bf08-ca83cfd54916.png)

これの何が嬉しいかというと、AlphaFold3はデフォルトで5つのモデルを出すのですが、キラリティを持つ化合物の場合の構造予測は、確率で入力通りになっていないことが多々あります。そのうちベストの構造が`p9wic5_chorismate_ccd_model.cif`として提示されるのですが、実際にはそのキラリティが間違っており、各サブディレクトリ`seed-*-sample-*`のモデルのどれかに正しいキラリティを持つものが予測されていることがあります。そんなとき、これを使ってまとめた構造をPyMOLで見ることで、正しいリガンドの構造を持つものだけを選択することができるようになります。