ColabFoldのローカル版"LocalColabFold"を使ったタンパク質の構造サンプリング

2021年に登場したAlphaFold2をGoogle Colaboratoryで動かす"ColabFold"を使って、コンフォメーション変化をするタイプのタンパク質構造のサンプリングを行う方法を紹介します。

## Introduction

**[ColabFold](https://colab.research.google.com/github/sokrypton/ColabFold/blob/main/AlphaFold2.ipynb)** はGoogle Colaboratoryのサービス上で動く[AlphaFold2](https://www.nature.com/articles/s41586-021-03819-2)とその複合体版[AlphaFold-Multimer](https://www.biorxiv.org/content/10.1101/2021.10.04.463034v2)です。2022年5月30日に[ColabFoldの論文](https://www.nature.com/articles/s41592-022-01488-1)が出ました。この記事の著者である私も3番めに名前がクレジットされています。ColabFoldを使って論文を書いた場合にはぜひ引用してください。

ColabFoldはオリジナルのAlphaFold2の構造推論処理を解析し、Google Colab上で動くようにしただけでなく、それ自体に高速化と高機能化のためのテクニックが含まれています。また、Google ColabはGoogleアカウントがあれば基本的には無料で使用可能なものの、計算の連続使用は90分までに制限されており、さらにその上で1日に何度も使っていると最大12時間ほど利用停止させられてしまうという難点があります。また、無料版Colabで割り当ててもらえるGPUは安物のためにVRAMの値が小さく、アミノ酸で800〜900残基長以上のものは計算できません（それでも十分な場合が多いですが）。そこで、自前でNVIDIA製GPU付きコンピュータを持っている方やスパコンが利用できる方がColabFoldを快適に利用できるために、このlocalcolabfold（というColabFoldのインストーラー）を作成しました。

ここでは、localcolabfoldを使ってその1つであるタンパク質の構造変化のコンフォメーションサンプリングについて説明します。

## インストール方法

localColabFoldのインストール方法は[ここ](https://github.com/YoshitakaMo/localcolabfold/blob/main/README_ja.md)にまとめて書いてあります。Windows10/11（ただし[WSL2](https://www.kagoya.jp/howto/it-glossary/develop/wsl2_linux/)の環境上での動作）, macOS, Linuxのいずれでも動作しますが、NVIDIA製のグラフィックボード、いわゆるNVIDIA製GPUが取り付けられていないPCの場合は動作がとても遅くなります。特にmacOSは今やNVIDIAとの提携を切って久しいため、高速化の恩恵を受けることができません。高速な計算をしたい方はWSL2かLinuxを利用してください。

インストールスクリプトを実行すると`colabfold_batch`という名前のディレクトリが生成されます。
（※ 2023年2月中旬のColabFold 1.5.0のリリースに合わせて`colabfold_batch`コマンド（メインの実行コマンド）の位置が変わりました）

```shell
# Linux用のディレクトリ構成
localcolabfold
│
├── colabfold
│   └── params #Linuxのみ。初回動作時にAlphaFold2のパラメータをこのディレクトリ中にダウンロードしてくる。
├── colabfold-conda # colabfold_batch用のconda環境。lib以下に重要なパッケージがインストールされる。
│   ├── bin
│   |   └── colabfold_batch # メインの実行スクリプト。
│   ├── compiler_compat
│   ├── conda-meta
│   ├── data
│   ├── etc
│   ├── include
│   ├── lib
│   ├── ...
├── conda # colabfold_batch用のminiconda環境。
└── update_linux.sh # colabfold_batchのアップデート用スクリプト。
```

実行のためには`localcolabfold/bin/colabfold-conda/bin`に対して環境変数PATHを追加しておくと良いでしょう。

```bash
export PATH="/path/to/localcolabfold/colabfold-conda/bin:$PATH"
```

これを実行し、`which colabfold_batch`でlocalcolabfoldへインストール先のPATHが表示されれば成功。この表示は各マシン環境で異なります。

```bash
$ which colabfold_batch
/home/moriwaki/Desktop/localcolabfold/colabfold-conda/bin/colabfold_batch
```

## アップデートのやり方

[ColabFold](https://github.com/sokrypton/ColabFold)はいまだ開発途中であるため、最新の機能を利用するためにはこのlocalcolabfoldも頻繁にアップデートする必要があります。

アップデートは`colabfold_batch`ディレクトリの中にある`update_linux.sh`などのファイルを使って以下のように入力するだけです（最後の`.`を忘れないでください）。

```bash
# Linux/WSL2利用の場合
./update_linux.sh .
# Intel Macを使っている方
./update_intelmac.sh .
# M1 Macを使っている方
./update_M1mac.sh .
```

## localcolabfoldの基本的な使い方

### コマンド

`colabfold_batch --help`で使い方を確認します。

```bash
usage: colabfold_batch [-h] [--stop-at-score STOP_AT_SCORE]
                       [--stop-at-score-below STOP_AT_SCORE_BELOW]
                       [--num-recycle NUM_RECYCLE]
                       [--num-ensemble NUM_ENSEMBLE]
                       [--random-seed RANDOM_SEED] [--num-models {1,2,3,4,5}]
                       [--recompile-padding RECOMPILE_PADDING]
                       ....
                       [--max-msa {512:5120,512:1024,256:512,128:256,64:128,32:64}]
                       [--zip] [--use-gpu-relax]
                       [--overwrite-existing-results]
                       input results

positional arguments:
  input                 Can be one of the following: Directory with fasta/a3m
                        files, a csv/tsv file, a fasta file or an a3m file
  results               Directory to write the results to
```

使い方は`colabfold_batch <options> input results`で、`input`, `results`に当たる部分のpositional引数は指定必須です。
`input`にはAlphaFold2でおなじみの`.fasta`形式ファイルだけでなく、`.a3m`のMSAファイルを指定することで任意のa3mファイルフォーマットを指定可能で、IDと配列をセットにした`.csv`ファイルや、fasta・a3mファイルを含むディレクトリ名を指定することも可能です。

**Windows上でWSL2を利用している方のみ**以下の環境変数を指定していると計算がうまくいく可能性があります。

```bash
export TF_FORCE_UNIFIED_MEMORY="1"
export XLA_PYTHON_CLIENT_MEM_FRACTION="4.0"
export XLA_PYTHON_CLIENT_ALLOCATOR="platform"
export TF_FORCE_GPU_ALLOW_GROWTH="true"
```

さてcolabfoldの実行コマンドの例は以下の通りです。

```bash
$ colabfold_batch \
    --amber \
    --templates \
    --use-gpu-relax \
    --num-recycle 3 \
    P61823.fasta RNase_monomer
```

これは`P61823.fasta`というFASTAフォーマットのファイルを入力として`RNase_monomer`ディレクトリに結果を出力します。

重要なオプションをいくつか紹介します。

- `--amber`をつけると構造最適化を行います。いつもつけておくことが推奨されますが、大量に構造を計算したいときや、後ほどAMBERやGromacsなどで別途構造最適化する方法をユーザーが持っている場合にはこのオプションを付けないというのも手です。
- `--use-gpu-relax`をつけると`--amber`が有効化されているときにGPUを用いて構造最適化を行います。**GPUが存在するマシン上での動作ではこのオプションの利用を強く推奨します**。
- `--num-recycle <int>`でrecycling回数を指定できます（※詳細はAlphaFold2の論文や仕様書を参照）。AlphaFold2のデフォルト値は`3`で固定されており、この数字でも十分な精度が出ますが、場合によってはこの数字を20くらいまで大きくすると精度が上がることがあります。ただしその分計算に時間がかかります。
- `--templates`でPDB上に存在する実験構造をテンプレートとして利用します。ただし、colabfoldが参照するPDBデータベースが常に更新されているわけではないため、リリースされたばかりの構造が常に利用できるというわけではありません。その場合、後述の`--custom-template-path <directory>`を利用することで解決できることがあります。また、現状ではインプットファイルにA3M形式を指定した場合にはテンプレートを考慮した構造推論を利用できないみたいです。
- `--rank {auto,plddt,ptmscore}`は構造のランキングの順番をplDDTスコアかpTMscoreかに変更できます。おそらく単量体のときはplDDTを、複合体のときはpTMscoreが自動的に選ばれます。
- `--custom-template-path <directory name>`を使うと、そのディレクトリ内に含まれる**mmCIFフォーマット**(※pdbフォーマットは不可)の構造ファイルのみをテンプレート候補として利用できます。これはコンフォメーション変化をするタイプのタンパク質の構造について、狙ったコンフォメーションをとっている類縁タンパク質がPDBに存在している場合、それに近づけるために利用することがあります。また、AlphaFoldの仕様上model 1,2のみしかテンプレート構造を考慮しないので、これらしか使わないように指定した方が計算時間を節約できます。
- `--training`をつけると時間がかかる代わりに、Dropoutが適用されて出力結果が変化する……そうです。
- `--random-seed <int>`は構造推論時の乱数値を変更します。デフォルトは`0`で固定されているため、これと入力のMSAが変更されていない限り同じ計算結果が出力されます。
- `--max-msa {512:5120,512:1024,256:512,128:256,64:128,32:64}`は構造推論時に利用するMSAの本数を制御します。`:`の前がAlphaFoldの`max_msa_clusters`パラメータで、後者が`max_extra_msa`パラメータです。詳しくはAlphaFold論文のSuppl.
- `--overwrite-existing-results`をつけると既存の出力結果を上書きします。

### 入力ファイルフォーマット

#### fastaファイル

これは通常のfasta形式と同じです。`>`で始まる1行目のヘッダーのIDがそのまま出力ファイルのprefixになるため、この行は短い内容にしておくことを推奨します。`>`以降の配列部分は改行を挟んでもOKです。

```:P61823.fasta
>sp|P61823
MALKSLVLLSLLVLVLLLVRVQPSLGKETAAAKFERQHMDSSTSAASSSNYCNQMMKSRN
LTKDRCKPVNTFVHESLADVQAVCSQKNVACKNGQTNCYQSYSTMSITDCRETGSSKYPN
CAYKTTQANKHIIVACEGNPYVPVHFDASV
```

**複合体を予測したい場合は、AlphaFold2と違って`:`記号で区切りを入れます**

```
>P61823_dimer
MALKSLVLLSLLVLVLLLVRVQPSLGKETAAAKFERQHMDSSTSAASSSNYCNQMMKSRN
LTKDRCKPVNTFVHESLADVQAVCSQKNVACKNGQTNCYQSYSTMSITDCRETGSSKYPN
CAYKTTQANKHIIVACEGNPYVPVHFDASV:
MALKSLVLLSLLVLVLLLVRVQPSLGKETAAAKFERQHMDSSTSAASSSNYCNQMMKSRN
LTKDRCKPVNTFVHESLADVQAVCSQKNVACKNGQTNCYQSYSTMSITDCRETGSSKYPN
CAYKTTQANKHIIVACEGNPYVPVHFDASV
```
とすればOKです。他のホモ多量体やヘテロ多量体でも入力形式は同じく`:`で挟むだけです。

また、複数の`>`のヘッダーと配列情報を1つのfastaファイルに含めて実行することも可能です。

#### csvファイル

csv形式のフォーマットの例は以下の通りです。`id`と`sequence`をそれぞれ`,`区切りにします。

```:test.csv
id,sequence
5AWL_1,YYDPETGTWY
3G5O_A_3G5O_B,MRILPISTIKGKLNEFVDAVSSTQDQITITKNGAPAAVLVGADEWESLQETLYWLAQPGIRESIAEADADIASGRTYGEDEIRAEFGVPRRPH:MPYTVRFTTTARRDLHKLPPRILAAVVEFAFGDLSREPLRVGKPLRRELAGTFSARRGTYRLLYRIDDEHTTVVILRVDHRADIYRR
```

やっていることは上のfastaファイルとほぼ同じです。

#### a3mファイル

すでにcolabfoldやAlphaFoldの計算でa3mフォーマットのMSAファイルを持っている場合は、これを指定することができます。
## 構造サンプリング

本題の構造サンプリングの方法です。例として、[ヒトAcyl-coenzyme A synthetase ACSM2A](https://www.uniprot.org/uniprotkb/Q08AH3/entry)の構造サンプリングを行ってみます。これは残基数577で、1つのタンパク質内でアデニル化反応のときとチオエステル化反応のときにコンフォメーションを変化させ、この2つの反応を触媒します。PDBでは2WD9と3C5Eのときにそれぞれのコンフォメーションが見られます。

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224327/8665f630-5d74-3804-de22-68e8c9f98446.gif)

この画像で橙色がアデニル化反応時のコンフォメーション（PDB: 3C5E）、緑色がチオエステル化反応時のコンフォメーション（PDB: 2WD9）です。黒色で構造のmorphingを行っています。使っている配列は以下の`Q08AH3.fasta`です。

```:Q08AH3.fasta
>sp|Q08AH3
MHWLRKVQGLCTLWGTQMSSRTLYINSRQLVSLQWGHQEVPAKFNFASDVLDHWADMEKA
GKRLPSPALWWVNGKGKELMWNFRELSENSQQAANVLSGACGLQRGDRVAVVLPRVPEWW
LVILGCIRAGLIFMPGTIQMKSTDILYRLQMSKAKAIVAGDEVIQEVDTVASECPSLRIK
LLVSEKSCDGWLNFKKLLNEASTTHHCVETGSQEASAIYFTSGTSGLPKMAEHSYSSLGL
KAKMDAGWTGLQASDIMWTISDTGWILNILCSLMEPWALGACTFVHLLPKFDPLVILKTL
SSYPIKSMMGAPIVYRMLLQQDLSSYKFPHLQNCVTVGESLLPETLENWRAQTGLDIRES
YGQTETGLTCMVSKTMKIKPGYMGTAASCYDVQIIDDKGNVLPPGTEGDIGIRVKPIRPI
GIFSGYVDNPDKTAANIRGDFWLLGDRGIKDEDGYFQFMGRANDIINSSGYRIGPSEVEN
ALMEHPAVVETAVISSPDPVRGEVVKAFVVLASQFLSHDPEQLTKELQQHVKSVTAPYKY
PRKIEFVLNLPKTVTGKIQRAKLRDKEWKMSGKARAQ
```

この構造サンプリングをcolabfoldの`--random-seed`と`--max-msa`を組み合わせて実行してみます。実行の仕方はターミナルのbash, zshであれば

```bash
#!/bin/bash

INPUTFILE="Q08AH3.fasta"
OUTPUTDIR="ACSM2A"

for RANDOMSEED in `seq 0 9`; do
  if test ${RANDOMSEED} -ne 0 ;then
    mkdir -p ${OUTPUTDIR}/${RANDOMSEED}
    cp -rp 0/*_env ${RANDOMSEED}
  fi
  colabfold_batch \
    --num-recycle 3 \
    --num-models 5 \
    --model-order 1,2,3,4,5 \
    --max-msa 32:64 \
    --random-seed ${RANDOMSEED} \
    ${INPUTFILE} \
    ${OUTPUTDIR}/${RANDOMSEED}
done
```

のようにforループさせて実行すればてっとり早いでしょう。これで順番に`--random-seed`を変化させながら構造推論が実行されます。

ポイントは`--max-msa 32:64`で利用するMSAの量を制限しているところです。前者は「取得したMSAについて、配列クラスタリングを行うときの中心点とするアミノ酸配列の本数」で後者は「先の配列クラスタリングで使われなかったMSA配列からランダムに追加取得するアミノ酸配列の本数」で、AlphaFold2のデフォルトはそれぞれ512, 5120と設定されています。一般に利用可能なMSAの本数が多いほど構造推論の精度は上がりますが、場合によっては本数が多いとMSAから予測される各残基間の距離予測による補正が強くなりすぎてしまい、1つのコンフォメーションしか生成されなくなります。そこで、これらの値をわざと小さくすることで、この残基関の距離の補正を小さくしています。同じ発想は各種GPCRやtransporterタンパク質についても適用することができ、これらについてもコンフォメーションサンプリングを行うことができます。ただし、適切な`--max-msa`の値はタンパク質によってまちまちのようで、MSAの数を小さくするとうまく構造が推論できなくなってしまうこととトレードオフの関係になっています。詳しくは[これと同じ手法でGPCR, transporterについてベンチマークを取った論文](https://elifesciences.org/articles/75751)がありますので、そちらを御覧ください。

これによって、ディレクトリ`0`から`19`までが生成されて、その中にそれぞれ5つの予測構造が出力されます。終わったら、これらの構造を結合してムービーにしてみます。構造のまとめ方は色々ありますが、ここでは[AmberTools22](https://qiita.com/Ag_smith/items/9526142858f8ea5248c1)の`cpptraj`を使って出力されたPDBファイルの残基番号50-460（下半分ドメイン）を重ね合わせて`out.pdb`という名前で出力してみます。そのために

```:trajconcat.in
parm 0/2WD9A_unrelaxed_rank_1_model_2.pdb
trajin ?/2WD9A_unrelaxed_rank_?_model_?.pdb
trajin 1?/2WD9A_unrelaxed_rank_?_model_?.pdb

reference 0/2WD9A_unrelaxed_rank_1_model_2.pdb
autoimage
center :50-460@CA mass origin
rms :50-460@CA
trajout out.pdb
run
```

という`trajconcat.in`ファイルを用意します。`parm 2WD9A_unrelaxed_rank_1_model_2.pdb`の部分は基準とする任意の予測出力構造としています。model_の後の番号はその時によって変化しますので適当に各自の予測結果のファイル名に合わせて修正してください。`trajin`ですべての予測結果pdbファイルを入力とします。

終わったらAmberTools22にPATHが通っている状態で`cpptraj -i trajconcat.in`を実行し、`out.pdb`ファイルを得ます。PyMOLで見てみると

![output2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224327/5cdbbb96-d488-fa8c-1e22-108e0ac3ca1d.gif)

このように、AlphaFoldでは一方のコンフォメーションしか得られなかった構造も、ColabFoldのこの方法でなら複数の安定コンフォメーションをサンプリングする事ができました。あとは適切なところでPyMOLのStateを止めて、その構造をpdb形式で保存すれば1枚1枚に分解できます。

他の例で、ヒトLAT1トランスポーター（PDB: 6IRS_B (open state), 7DSQ_B (closed state) ）についても

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224327/ea54e322-183a-ecf5-97b8-30e324f5f6c1.png)
のように、完全にopen状態には至っていませんが、構造サンプリングができています（白色がColabFoldの結果です）。これは[先程の論文](https://elifesciences.org/articles/75751)のFigure 3Aの再現実験です。



## References

- Mirdita M, Schütze K, Moriwaki Y, Heo L, Ovchinnikov S and Steinegger M. ColabFold - Making protein folding accessible to all.
  *Nature Methods* (2022) doi: [10.1038/s41592-022-01488-1](https://www.nature.com/articles/s41592-022-01488-1)
- If you’re using **AlphaFold**, please also cite:
  Jumper et al. "Highly accurate protein structure prediction with AlphaFold."
  *Nature* (2021) doi: [10.1038/s41586-021-03819-2](https://doi.org/10.1038/s41586-021-03819-2)
- If you’re using **AlphaFold-multimer**, please also cite:
  Evans et al. "Protein complex prediction with AlphaFold-Multimer."
  *BioRxiv* (2021) doi: [10.1101/2021.10.04.463034v1](https://www.biorxiv.org/content/10.1101/2021.10.04.463034v1)