自前のパソコン/サーバーでHHPredによるタンパク質ホモロジーモデリングを行う方法

## Introduction
タンパク質の構造情報は、創薬や研究の計画を練る上で現代ではとても重要になってきています。アミノ酸配列が決定されているタンパク質は、2018年12月現在およそ1億くらいあるそうですが（Genbank参照）、それに対してタンパク質構造が決定されているものはおよそ145,000個程度です（重複含む、Protein Data Bank参照）。

いくつかの創薬ターゲットとして有名なタンパク質もまだまだ構造が未決定のものは多いため、これらに対しどうやって阻害剤を探索するかということは1つの困難な課題となっています。

[**HHPred**](https://toolkit.tuebingen.mpg.de/#/tools/hhpred)は、上記のような構造未決定タンパク質のうち、すでに配列や構造上の特徴が似ているということがわかっているタンパク質の場合にとても有効なホモロジーモデリング手法として、とても重宝しています。これはウェブサーバーでも公開されているのですが（参考：http://blog.livedoor.jp/ag_plusplus/archives/68581830.html ←今は画面表示が変わってしまいましたが、やっていることは同じです）、この分野にちょっとだけ専門になってくると、もっと細かな調整を行いながらモデリングをいろいろやってみたいという要望も出てきます。また、このウェブサーバーは世界中からアクセスが多いため、結果が出るまでに少々時間がかかりますので、大量に条件検討してみたい時にはあまり向きません。

そこで、ここでは、HHPredを自分のマシンで完全に動作させるためのセットアップ方法を述べてみます。ここでは、ちょっとMac/Linuxのコマンドライン操作やターミナルの知識が必要となってくるので、こういった操作に慣れていない方には難しいかもしれませんが、一応わかりやすく書いてみようと思います。

## 環境
### マシン環境
以下の環境を想定しています。

  - macOS High Sierra以降またはLinux OS, CentOS 7.4以降
  - **100GB以上のディスク容量を持つストレージ**。SSDであればさらに動作が早い。
  - [類縁配列検索ソフトウェアHH-Suiteのインストール](https://qiita.com/Ag_smith/items/401291c22fca19d61af9)をしてある
  - [Modellerをインストール](https://bi.biopapyrus.jp/protein/modeling/modeller/)してある

HHPredを動作させるためには、これに加えて以下のデータベースのダウンロードが必須です。

### データベースのダウンロードとセットアップ
HHPredのために、以下のデータベースをダウンロードしておきます。1つはPDB70のデータベースです。こちらは
[ここ](http://wwwuser.gwdg.de/~compbiol/data/hhsuite/databases/hhsuite_dbs/)から`pdb70_from_mmcif_latest.tar.gz`を選んでダウンロードします。これは1週間に1度更新されるようで、Protein Data Bankのタンパク質構造の更新に合わせてこちらもアップデートしているようです。

もう1つは[ここ](http://gwdu111.gwdg.de/~compbiol/uniclust/2018_08/)にある`uniclust30_2018_08_hhsuite.tar.gz`のファイルです。こちらは

> Archive containing Uniclust multiple sequence alignments for all clusters in a3m format, generated with Clustal Omega, and additional support files for use with legacy HH-suite version 2 and current version 3.

とあるように、uniclustによって30％で冗長性をカットしたデータファイル、さらにHH-suite（HHPredもこのプログラムスートからの派生）向けにちょっと改変したデータベースになっているそうです。

HHPredプログラムはこの2つのデータベースを参照しながら計算することになるので、必ずこれら2つのファイルのダウンロードが必要です。しかし、この2つはドイツにデータサーバーがある上に、ミラーサーバーが日本にはあまりないようなので、ダウンロードするだけでも丸1日くらい時間がかかります。がんばってダウンロードしましょう。

ダウンロードが終わったら、マシン内の適当な場所にこの2つのデータベースを解凍して置いておきます。ここでは、`/Users/Agsmith/database/hhsuite`というディレクトリを作って、ここに解凍した`pdb70_latest (最新のファイルなので、この記事の時点ではpdb70_20181125とします)`と`uniclust30_2018_08`というディレクトリを作り、解凍した中身を入れておきます。ダウンロードしてきたtar.gzファイルの解凍のコマンドは`tar zxvf uniclust30_2018_08_hhsuite.tar.gz`のような形で、pdb70もuniclust30_2018_08の方も行えるはずです。

ディレクトリ`/Users/Agsmith/database/hhsuite/uniclust30_2018_08`の中身はそれぞれこんな感じ。

```
lrwxrwxrwx 1 root   root          29 Oct 18 18:01 uniclust30_2018_08_hhm_db -> uniclust30_2018_08_hhm.ffdata
lrwxrwxrwx 1 root   root          29 Oct 18 18:01 uniclust30_2018_08_a3m_db -> uniclust30_2018_08_a3m.ffdata
-rw-r--r-- 1 root   root         767 Oct 12 07:13 uniclust30_2018_08_md5sum
-rw-r--r-- 1 root   root     9427452 Oct 12 07:10 uniclust30_2018_08_hhm_db.index
-rw-r--r-- 1 root   root   436453157 Oct 12 07:10 uniclust30_2018_08_a3m_db.index
-rw-r--r-- 1 root   root  4044015407 Oct 12 07:09 uniclust30_2018_08.cs219
-rw-r--r-- 1 root   root          19 Oct 12 07:09 uniclust30_2018_08.cs219.sizes
-rw-r--r-- 1 root   root     8167108 Oct 12 07:06 uniclust30_2018_08_hhm.ffindex
-rw-r--r-- 1 root   root 14171782777 Oct 12 07:06 uniclust30_2018_08_hhm.ffdata
-rw-r--r-- 1 root   root   375805833 Oct 12 07:05 uniclust30_2018_08_a3m.ffindex
-rw-r--r-- 1 root   root 69490273138 Oct 12 07:05 uniclust30_2018_08_a3m.ffdata
-rw-r--r-- 1 root   root   356545673 Oct 12 07:02 uniclust30_2018_08_cs219.ffindex
-rw-r--r-- 1 root   root  3860466139 Oct 12 07:02 uniclust30_2018_08_cs219.ffdata
```

と`/Users/Agsmith/database/hhsuite/pdb70_20181125`の方は

```
lrwxrwxrwx 1 root   root          16 Nov 26 00:39 pdb70_a3m_db -> pdb70_a3m.ffdata
lrwxrwxrwx 1 root   root          16 Nov 26 00:39 pdb70_hhm_db -> pdb70_hhm.ffdata
-rw-r--r-- 1 root   root 15199373148 Nov 22 03:03 pdb70_from_mmcif_latest.tar.gz
-rw-r--r-- 1 root   root         614 Nov 22 02:58 md5sum
-rw-r--r-- 1 root   root     1658050 Nov 22 02:54 pdb70_hhm_db.index
-rw-r--r-- 1 root   root    16623622 Nov 22 02:54 pdb70.cs219
-rw-r--r-- 1 root   root          14 Nov 22 02:54 pdb70.cs219.sizes
-rw-r--r-- 1 root   root     1783338 Nov 22 02:54 pdb70_a3m_db.index
-rw-r--r-- 1 root   root  2503656590 Nov 22 02:54 pdb70_hhm.ffdata
-rw-r--r-- 1 root   root     1413782 Nov 22 02:54 pdb70_hhm.ffindex
-rw-r--r-- 1 root   root     1539070 Nov 22 02:54 pdb70_a3m.ffindex
-rw-r--r-- 1 root   root 39682186995 Nov 22 02:54 pdb70_a3m.ffdata
-rw-r--r-- 1 root   root    16005165 Nov 22 02:40 pdb70_cs219.ffdata
-rw-r--r-- 1 root   root     1168208 Nov 22 02:40 pdb70_cs219.ffindex
-rw-r--r-- 1 root   root     6844342 Nov 21 10:33 pdb70_clu.tsv
-rw-r--r-- 1 root   root    17932168 Nov 21 10:33 pdb_filter.dat
```

こんな感じになるはず。時刻の部分はともかく、ファイルが過不足なく存在することと、ファイルパーミッションが全部`-rw-r--r--`とか`lrwxrwxrwx`となっていることも確認しておきましょう。

## 自前マシンでのHHPredを使ったホモロジーモデリング
### Step.1 HH-suiteを使ったテンプレートタンパク質構造の検索
HH-suiteのインストールとModellerのインストールは、上の環境のところでリンクを張ってインストール方法を紹介していますので、ここでは省略します。

以上のセットアップが揃ったら、これでHHPredの実行をマシン上で行うことができるようになっています。早速やってみましょう。

例として以下のような`querytest.fa`のFASTA形式ファイルを用意してみます。

    >hogehoge
    PRGSHMASMTGGMIEVPPFWCPLPIAIHPAADQAEKDARAWAERYGVRLRIAD
    QVQPGRLGAYWAPHGTYEGMLAVGCWNFWAFAFDDHLDEPLPLDVPVTTSLVQQAVDIPSPPITDDPW
    AAGAQAVFNMFRDLATPTQVRYCADNHRRWLHGACWRHSNHVNRRLPPLAEYIPLRMQDAAAQATCLI
    AVLIGSDISVPEQEMDSPRVRALLETASWTATIDSDLHSFQLEDTQRPVSQHIVSVLMHERGIGVDEA
    LRQSVALRDRFMTRFLHLQQECARTGSSELARFAHTLGYVISGYLQWAVDTSRYGQTEATFSFTDTPR
    DDTPEPPPGIPSVEWLWTL

次に以下のコマンドを入力します。

```bash
hhblits -cpu 12 -i querytest.fa \
        -d /Users/Agsmith/database/hhsuite/uniclust30_2018_08/uniclust30_2018_08 \
        -oa3m query.a3m \
        -n 3 -e 0.001 -loc -norealign \
        -cov 20 -qid 0
```

`-i`にはインプットとなるクエリファイル、`-d`には参照するデータベース、`-oa3m`には結果のマルチプルシーケンスアライメントをアウトプットさせるa3mフォーマット形式ファイル名(write result MSA with significant matches in a3m format)、`-cpu`は計算させるコア数、`-n`にはiteration回数(1-8)の指定です。最高のパフォーマンスのためには`-cpu`にそのマシンの最大CPU数を与えていることが良いでしょう。

続いて、`hhsearch`コマンドを用いて、上述のアウトプットのa3mファイルをインプットとして、PDB70データベースからそれに合致するタンパク質構造を取ってきます。

```bash
export HHLIB="/Users/Agsmith/apps/hh-suite/3.0b3"
# add Secondary structure information into query.a3m
${HHLIB}/scripts/addss.pl query.a3m
hhsearch -cpu 12 -i query.a3m -o results.hhr -oa3m results.a3m \
         -d /Users/Agsmith/database/hhsuite/pdb70_20181125/pdb70 \
         -p 20 -Z 250 -loc -z 1 -b 1 -B 250 -ssm 2 -sc 1 \
         -seq 1 -dbstrlen 10000 -norealign -maxres 32000 \
         -contxt ${HHLIB}/data/context_data.crf \
         -cov 20 -qid 0
```

`${HHLIB}`の部分はHH-suiteがインストールされているディレクトリになります。これにより得られた`results.hhr`に、すでに構造が解かれているタンパク質構造と類縁関係にあると思われるPDB
IDのリストが表示されます。

得られた`results.hhr`結果は以下の通り(2018年7月30日時点のもの)。

    Query         hogehoge
    Match_columns 344
    No_of_seqs    155 out of 1362
    Neff          10.4876
    Searched_HMMs 59613
    Date          Mon Jul 30 21:54:30 2018
    Command       hhsearch -cpu 12 -i query.a3m -o results.hhr -oa3m results.a3m -d /Users/Agsmith/database/hhsuite/pdb70_latest/pdb70 -p 20 -Z 250 -loc -z 1 -b 1 -B 250 -ssm 2 -sc 1 -seq 1 -dbstrlen 10000 -norealign -maxres 32000 -contxt /Users/Agsmith/apps/hh-suite/3.0b3/data/context_data.crf -cov 20 -qid 0

     No Hit                             Prob E-value P-value  Score    SS Cols Query HMM  Template HMM
      1 4OKZ_C Terpene synthase metal- 100.0 5.5E-49 9.2E-54  354.0  36.2  332   11-344     2-347 (365)
      2 4OKZ_A Terpene synthase metal- 100.0 5.5E-49 9.2E-54  354.0  36.2  332   11-344     2-347 (365)
      3 4MC3_A Putative sesquiterpene  100.0 2.8E-44 4.8E-49  321.4  33.2  317   12-331     2-336 (346)
      4 4MC8_A Putative sesquiterpene  100.0 2.8E-44 4.8E-49  321.4  33.2  317   12-331     2-336 (346)
      5 5I1U_B Germacradien-4-ol synth 100.0   3E-44   5E-49  319.9  30.9  308    4-314    11-335 (335)
      6 5I1U_A Germacradien-4-ol synth 100.0   3E-44   5E-49  319.9  30.9  308    4-314    11-335 (335)
      7 5DZ2_B Germacradienol/geosmin  100.0 8.3E-44 1.4E-48  317.5  30.9  306    9-317     1-332 (338)
    （以下省略）

ここには`hhblits`や`hhsearch`コマンドによって、`querytest.fa`に入力していたタンパク質に近いと判定された構造既知のタンパク質のリストが現れます。`4OKZ_C`とか`4MC3_A`とかの名前が現れていますが、これはPDB IDと、チェインIDが続いた表記になっています。つまり、PDB: 4OKZのCチェインということです。

ここで、続くmodellerを使ったホモロジーモデリングに向けて、PDB\_chain名前のモデル番号を控えておきます。ここでは例として1, 3, 5を使用するとします。上の例のように、E-valueのとても小さいものがヒットしている場合は1つだけでもOKです。
### Step.2 Modellerを使ったホモロジーモデリング
HHPredによって構造既知の類縁タンパク質を推定した後は、Modellerの機能を使って、そのアミノ酸配列を使ってアライメントを取り、モデリングを行います。

`startmodeller.sh`は自作のModeller用前処理＆モデリング実行の汎用スクリプトです。下記のシェルスクリプトをコピーしてこの名前のスクリプトを作成した後、`chmod +x startmodeller.sh`を実行しておきます（一度やれば以降は不要）。

``` bash
#!/bin/sh

# 各自のHH-SuiteへのPATHを指定する
export HHLIB="/Users/Agsmith/apps/hh-suite/3.0b3"

PROGNAME=$(basename $0)
VERSION="1.0"
HELP_MSG="'$PROGNAME -h'と指定することでヘルプを見ることができます"

red=31
green=32
yellow=33
blue=34

function cecho {
    color=$1
    shift
    echo -e "\033[${color}m$@\033[m"
}

# ヘルプメッセージ
usage() {
  echo "Usage: $PROGNAME -i input.hhr -p output.pir [-d arg] param"
  echo
  echo "Options:"
  echo "  -h, --help"
  echo "      --version"
  echo "  -i, --inputhhr <ARG>     <必須>"
  echo "  -p, --pir   <ARG>     <必須>"
  echo "  -d, --direcotry <string>  [任意] *オプション指定時は引数を設定"
  echo "  -m, --model   テンプレートにするモデル番号の選択 e.g.\"-m 1 3\" <必須>"
  echo "  -n, --num     作成するモデルの個数。default is 1."
  echo
  exit 1
}

ARG_D="template"
ARG_N=1

# オプション解析
for OPT in "$@"
do
  case "$OPT" in
    # ヘルプメッセージ
    '-h'|'--help' )
      usage
      exit 1
      ;;
    # バージョンメッセージ
    '--version' )
      echo $VERSION
      exit 1
      ;;
    # オプション-i、--inputhhr, HHRファイルの指定
    '-i'|'--inputhhr' )
      FLG_I=1
      # オプションに引数がなかった場合（必須）
      if [[ -z "$2" ]] || [[ "$2" =~ ^-+ ]]; then
        cecho $red "$PROGNAME:「$1」オプションにはhhrファイルの引数が必要です。" 1>&2
        exit 1
      fi
      ARG_I="$2"
      shift 2
    ;;
    # オプション-p, --pir, PIRファイルの指定
    '-p'|'--pir' )
      FLG_P=1
      # オプションに引数がなかった場合（必須）
      if [[ -z "$2" ]] || [[ "$2" =~ ^-+ ]]; then
        cecho $red "$PROGNAME:「$1」オプションにはPIRファイルの引数が必要です。" 1>&2
        exit 1
      fi
      ARG_P="$2"
      shift 2
    ;;
    # オプション-d, --directory, direcotryの指定
    '-d'|'--directory' )
      FLG_D=1
      # オプションに引数がなかった場合
      if [[ -z "$2" ]] || [[ "$2" =~ ^-+ ]]; then
    shift 1
      else
        # オプションの引数設定
        ARG_D="$2"
        shift 2
      fi
    ;;
    # オプション-m
    '-m'|'--model' )
      # 配列型を引数にとる(-m 1 3 のような感じ)。
      FLG_M=1
      # オプションに引数がなかった場合（必須）
      if [[ -z "$2" ]] || [[ "$2" =~ ^-+ ]]; then
        cecho $red "$PROGNAME:「$1」オプションにはhhrファイルの引数が必要です。" 1>&2
        exit 1
      fi
      ARG_M="$2"
      shift 2
      ;;
    # オプション-n, --num, modellerのモデル作成個数の指定
    '-n'|'--num' )
      FLG_N=1
      # オプションに引数がなかった場合
      if [[ -z "$2" ]] || [[ "$2" =~ ^-+ ]]; then
    shift 1
      else
        # オプションの引数設定
        ARG_N="$2"
        shift 2
      fi
    ;;
    '--'|'-' )
      # 「-」か「--」だけ打った時
      shift 1
      param+=( "$@" )
      break
      ;;
    -*)
      cecho $red "$PROGNAME: 「$(echo $1 | sed 's/^-*//')」オプションは存在しません。'$PROGNAME -h'で確認してください" 1>&2
      exit 1
      ;;
    *)
      # コマンド引数（オプション以外のパラメータ）
      if [[ ! -z "$1" ]] && [[ ! "$1" =~ ^-+ ]]; then
        param+=( "$1" )
        shift 1
      fi
      ;;
  esac
done

# 「-i」のオプション指定がない場合
if [ -z $FLG_I ]; then
  cecho $red "$PROGNAME:「-i」オプションは必須です。正しいオプションを指定してください" 1>&2
  echo $HELP_MSG 1>&2
  exit 1
fi
# 「-p」のオプション指定がない場合
if [ -z $FLG_P ]; then
  cecho $red "$PROGNAME:「-p」オプションは必須です。正しいオプションを指定してください" 1>&2
  echo $HELP_MSG 1>&2
  exit 1
fi
# 「-m」のオプション指定がない場合
if [ -z $FLG_M ]; then
  cecho $red "$PROGNAME:「-m」オプションは必須です。正しいオプションを指定してください" 1>&2
  echo $HELP_MSG 1>&2
  exit 1
fi

# copy template mmCIF files
preparepdb() {
    mkdir -p ${ARG_D}
    modelarray=(${ARG_M})
    PDBID_dict=()
    for i in ${modelarray[@]};do
    uprange=`grep "No Hit" ${ARG_I} -n | sed -e "s/:.*//g"`
    line=`sed -n $((${uprange}+${i}))p ${ARG_I}`
    echo "Using: ${line}"
    PDBID=`echo $line | awk '{print $2}' | cut -c 1-4 | tr '[A-Z]' '[a-z]'`
    divided=`echo $PDBID | cut -c 2-3`
    curl --silent ftp://ftp.pdbj.org/pub/pdb/data/structures/divided/mmCIF/${divided}/${PDBID}.cif.gz ./${ARG_D}/
    gzip -df ./${ARG_D}/${PDBID}.cif.gz
    PDBID=`echo $PDBID | tr '[a-z]' '[A-Z]'`
    PDBID_dict+=(${PDBID})
    done
}


makealignpy() {
    knowns=""
    for i in ${PDBID_dict[@]};do
    knowns+="'${i}', "
    done
    cat <<EOF > align.py || exit 1
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from modeller import *
from modeller.automodel import *    # Load the automodel class

log.verbose()
env = environ()

# directories for input atom files
env.io.atom_files_directory = ['.', './template']

a = automodel(env,
              alnfile  = '${ARG_P}', # alignment filename
              knowns   = (${knowns}),     # codes of the templates
              sequence = 'UKNP')               # code of the target

a.starting_model= 1                 # index of the first model
a.ending_model  = ${ARG_N}          # index of the last model
a.make()                            # do the actual comparative modeling

EOF
}


preparepdb
${HHLIB}/scripts/hhmakemodel.py ${ARG_I} ${ARG_D}/ ${ARG_P} ./ -m ${ARG_M}
makealignpy
mod9.19 align.py
```

この`startmodeller.sh`の処理の流れとしては、

1. `preparepdb`の関数定義で、PDBファイルをmmcif形式でダウンロードし、templateディレクトリに解凍する
2. `${HHLIB}/scripts/hhmakemodel.py`を使って`uknp.pir`ファイルに配列アライメントを取る。環境変数${HHLIB}が正しく設定されていることを確認
3. `makealignpy`の関数定義で、Modeller用実行スクリプトを`align.py`ファイルに書き出す
4. Modeller実行コマンド`mod9.19`で、上記`align.py`を読み込んでモデリングを行う。`mod9.19`の部分はバージョンによって名前が異なるので、自身が使っているコマンド名に書き換えてください。

となっています。
とりあえずここでは、`align.py`で作り出す実行スクリプトはお決まりのものになっていますが、Modellerの使い方に熟知していれば、ここで**モデリングをする時に2点の原子間に距離拘束を入れた**条件を付与できたり、モデルをたくさん作り出したりすることができるようになります。HHPredのウェブサーバー版ではこの機能にはついておらず、またモデル数も1に限定されているはずです。これが、自前でHHPredを用いるメリットの1つと言えるでしょう。

`uknp.pir`は配列アライメントのファイルとなっています。Modellerはこれを読んで、中にあるそれぞれのテンプレート構造を利用してモデルを作成しようと試みます。

こうして作った`startmodeller.sh`と`results.hhr`と同じディレクトリに置いたら、ホモロジーモデリングをするためのスクリプト`modeller.sh`を実行します。同様に下記のスクリプトをコピペして作成後、`chmod +x modeller.sh`を実行しておきます（一度やれば以降は不要）。

``` bash
#!/bin/sh

test $hhr || hhr="results.hhr"
test $pir || pir="uknp.pir"
test $num || num=1

# startmodeller.sh -i results.hhr -p uknp.pir -m "1 3 5" -n 2
bash startmodeller.sh -i ${hhr} -p ${pir} -m "${model}" -n ${num}
```

これを作成し、`model="1 3 5" num=3 ./modeller.sh`として実行します。`num=`の値を変えると生成されるモデルの数が変化します。

Modellerで動かした後のログファイル`align.log`の最後の方には、作り出したモデル構造のスコア値が記載されています。

    >> Summary of successfully produced models:
    Filename                          molpdf
    ----------------------------------------
    UKNP.B99990001.pdb            9450.61133
    UKNP.B99990002.pdb            9513.01562
    UKNP.B99990003.pdb            9432.22168

**このmolpdfの値が小さいほど、よいモデリングであるとされているようです**。この値はモデルのテンプレートの選び方で大きく変わってきますし、距離拘束などをうまく取り入れることで変化します。また、Modellerには少し構造を緩和させるような処理なども追加で加えることもできるので（この辺はModellerのマニュアルやチュートリアルなり他のウェブサイトなりを見てください）、それらをうまく使ってより良い値になるようなモデルが引けるまでいろいろ試してみると良いでしょう。

## おわりに
自前マシンでHHPredを使ったホモロジーモデリングの方法を紹介してみました。
これは実際ウェブサーバー版だけで作り出したモデル構造でも（**とても近い類縁配列がある場合には**）かなり強力で、これひとつで十分に考察することが可能です。
しかし、ホモロジーが存在しないものについては結構無力なこともあるので、ケースバイケースです。
次回の記事では、そういったホモロジー構造がないものでも、強力にタンパク質モデリングをしてくれる方法を紹介したいと思います。