OpenMMとpdbfixerをcondaを用いずに手動インストールする

[OpenMM](https://github.com/openmm/openmm)と[pdbfixer](https://github.com/openmm/pdbfixer)は公式ページでもcondaを使ったインストールがおすすめされているが、サードパーティのcondaは邪道と思う方のために、python3公式のvenvを使った方法で管理したい場合は以下のようにする。

## 仮想環境の作成

Python 3.12で仮想環境venvを起動した状態にする。3.12でなくても良いが、この記事を書いている時点では3.9以上が望ましいだろう。

```bash
python3.12 -m venv .venv
source .venv/bin/activate # Python仮想環境の起動を確認する。
```

`which python3.12`としてみて、`/path/to/your/.venv/bin/python3.12`が表示されれば仮想環境が起動している状態である（`/path/to/your`の部分は自身のディレクトリに読み替えてください）。

## OpenMMのインストール

OpenMMはもともとC++で書かれており、cmakeでビルドすることができる。これに加えてPython APIを追加でインストールすることができる。[公式マニュアルのインストール方法](http://docs.openmm.org/latest/userguide/library/02_compiling.html)では、**Python APIをインストールする時にsetuptoolsとCythonが要求されることが書かれていない**ので、これを先に入れておく必要がある。

```bash
python3.12 -m pip install Cython setuptools
```

次にOpenMMをインストールする。OpenMMのリリースページから最新のバージョンをダウンロードし、解凍する。解凍したディレクトリに移動し、以下のコマンドを実行する。ここではver. 8.1.1をインストールする。

```bash
wget https://github.com/openmm/openmm/archive/refs/tags/8.1.1.tar.gz
tar zxvf 8.1.1.tar.gz
cd openmm-8.1.1
mkdir build
cd build
# 先程の/path/to/your/.venv/bin/python3.12を使う
# NVIDIA GPUを使う場合は-DCUDAToolkit_NVCC_EXECUTABLE=/path/to/cuda/bin/nvccを追加すると良いかもしれない。または自動で検出してくれるかもしれない（未確認）
cmake .. -DCMAKE_INSTALL_PREFIX="${HOME}/apps/openmm/8.1.1" -DPYTHON_EXECUTABLE="/path/to/your/.venv/bin/python3.12"
make -j8 install

# インストール開始
# -- Installing: /path/to/your/openmm/8.1.1/examples/NMakefile
# -- Installing: /path/to/your/openmm/8.1.1/examples/MakefileNotes.txt
# -- Installing: /path/to/your/openmm/8.1.1/examples/Empty.cpp
# -- Installing: /path/to/your/openmm/8.1.1/lib/libOpenMM.8.1.dylib
# -- Installing: /path/to/your/openmm/8.1.1/lib/libOpenMM.dylib
# で終了
```

これでOpenMMのコマンドが使えるようになる。続いて、Python APIをインストールする。

```bash
make PythonInstall

# インストール開始
# no previously-included directories found matching 'src/swig_doxygen/doxygen/html'
# no previously-included directories found matching 'src/swig_doxygen/doxygen/xml'
# warning: no previously-included files matching 'CMakeLists.txt' found anywhere in distribution
# writing manifest file 'OpenMM.egg-info/SOURCES.txt'
# Copying OpenMM.egg-info to /path/to/your/.venv/lib/python3.12/site-packages/OpenMM-8.1.1-py3.12.egg-info
# running install_scripts
# [100%] Built target PythonInstall
# で終了
```

これでOpenMMのPython APIが使えるようになる。以下のコマンドで確認する。

```bash
$ python3.12 -m openmm.testInstallation

OpenMM Version: 8.1.1
Git Revision: Unknown

There are 3 Platforms available:

1 Reference - Successfully computed forces
2 CPU - Successfully computed forces
3 OpenCL - Successfully computed forces

Median difference in forces between platforms:

Reference vs. CPU: 6.28658e-06
Reference vs. OpenCL: 6.72889e-06
CPU vs. OpenCL: 7.22461e-07

All differences are within tolerance.
```

これが表示されればOpenMMが指定した仮想環境のPythonから使えるようになっている。

## pdbfixerのインストール

pdbfixerを使うにはOpenMMが必要なので先にそれをインストールしておく。その後は以下のコマンドでpdbfixerをインストールする。ここではver. 1.9をインストールする。

```bash
wget https://github.com/openmm/pdbfixer/archive/refs/tags/1.9.tar.gz
tar zxvf 1.9.tar.gz
cd pdbfixer-1.9
python3.12 -m pip install .
```

こちらはこんな感じですぐにインストールが終わるはず。

```
Processing /path/to/your/pdbfixer-1.9
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Installing backend dependencies ... done
  Preparing metadata (pyproject.toml) ... done
Requirement already satisfied: numpy in /path/to/your/.venv/lib/python3.12/site-packages (from pdbfixer==1.9.0) (1.26.4)
Requirement already satisfied: openmm>=7.1 in /path/to/your/.venv/lib/python3.12/site-packages (from pdbfixer==1.9.0) (8.1.1)
Building wheels for collected packages: pdbfixer
  Building wheel for pdbfixer (pyproject.toml) ... done
  Created wheel for pdbfixer: filename=pdbfixer-1.9.0-py3-none-any.whl size=689353 sha256=05c01479b06bb249d493b3d069611c76ea28f245eb93d47d36d57ecf8a51d2f2
  Stored in directory: /Users/YoshitakaM/Library/Caches/pip/wheels/e2/9b/9a/7a797016b4b4f9ed14b871e7af6b62fd76c1024ca2e0a45e20
Successfully built pdbfixer
Installing collected packages: pdbfixer
Successfully installed pdbfixer-1.9.0
```

これでpdbfixerが使えるようになる。ターミナルから使える`pdbfixer`コマンドと、Pythonから使える`pdbfixer`モジュールがインストールされているか確認する。

```bash
# ターミナルから使えるか確認
$ which pdbfixer
/path/to/your/.venv/bin/pdbfixer

# Pythonから使えるか確認
$ python3.12 -c "import pdbfixer"
# 何も表示されなければOK
```

以上でOpenMMとpdbfixerのインストールが完了した。マニュアルは[こちら](https://htmlpreview.github.io/?https://github.com/openmm/pdbfixer/blob/master/Manual.html)を参照すると良いだろう。