DatabricksでOpen Babelを使う

Open Babelはケモインフォマティクスでよく利用されるツールボックスとのことです。

https://open-babel.readthedocs.io/en/latest/index.html

https://qiita.com/MasafumiTsuyuki/items/73af68e94b14447a3d74

Databricksへのインストールに関しては、こちらを参考にさせていただきました。

https://kivantium.hateblo.jp/entry/2018/05/23/131135

# クラスターの設定

## initスクリプトの作成

最初にOpen Babel本体がクラスターにインストールされるようにする必要があります。このため、Open Babelのインストールを行うinitスクリプトを作成します。

ノートブックで以下のコマンドを実行し、[DBFS](https://qiita.com/taka_yayoi/items/897264c486e179d72247)の`/databricks/scripts/taka-openbabel-install.sh`にinitスクリプトを作成します。パス、ファイル名は適宜変更してください。

```py:Python
dbutils.fs.put("/databricks/scripts/taka-openbabel-install.sh","""
#!/bin/bash
apt -y install swig
apt -y install build-essentials cmake python3-dev libeigen3-dev wget
wget https://github.com/openbabel/openbabel/archive/openbabel-3-0-0.tar.gz
tar xf openbabel-3-0-0.tar.gz
cd openbabel-openbabel-3-0-0/
mkdir build; cd $_

# GUIを無効化、スレッド並列化を有効化するオプション
cmake ..  -DENABLE_OPENMP=ON -DBUILD_GUI=OFF

# 4並列でコンパイル。並列数は計算機のCPUに合わせて変更してください
make -j4

# インストールの実行
make install
""", True)
```

クラスターにinitスクリプトを設定します。

1. クラスターの詳細画面を開きます。
1. **編集**をクリックします。
1. **高度なオプション**を展開します。
1. **initスクリプト**タブをクリックします。
1. 送信先をDBFS、initスクリプトのパスに`dbfs:/databricks/scripts/taka-openbabel-install.sh`を指定し、**追加**をクリックします。
![Screen Shot 2022-07-15 at 8.49.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b91f3fa2-ddaf-ecf4-02f5-817fff84b3c7.png)
1. 以下のようになっていることを確認します。
![Screen Shot 2022-07-15 at 9.25.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/92ca9dbd-e4f5-953b-f305-2ebbdaac8769.png)

## 環境変数の設定

Open BabelをPythonから使用する際には環境変数`LD_LIBRARY_PATH`を設定する必要があります。

1. クラスターの詳細画面を開きます。
1. **編集**をクリックします。
1. **高度なオプション**を展開します。
1. **Spark**タブをクリックします。
1. **環境変数**に`LD_LIBRARY_PATH=/usr/local/lib`と入力します。
![Screen Shot 2022-07-16 at 11.37.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0980d32c-0fd3-4a9f-76d0-6125a759a861.png)


initスクリプトと環境変数を設定し、クラスターが起動中の場合にはクラスターを再起動します。そうで無い場合には、クラスターを起動します。

# Pythonバインディングのインストール

PythonからOpen Babelを呼び出せるようにするために、pipで`openbabel`をインストールします。上の設定を行なったクラスターにノートブックをアタッチして、以下を実行します。[クラスターライブラリ](https://qiita.com/taka_yayoi/items/9407356caadea3dfb47c)としてインストールすることもできます。

```
%pip install openbabel
```

# ライブラリのインポート

Pythonノートブックで以下のコマンドを実行します。エラーが出なければ無事にインストールできています。

```py:Python
from openbabel import openbabel
```

以下のコードを実行して動作を確認します。

```py:Python
mol = openbabel.OBMol()
print('Should print 0 (atoms)')
print(mol.NumAtoms())

a = mol.NewAtom()
a.SetAtomicNum(6)   # carbon atom
a.SetVector(0.0, 1.0, 2.0) # coordinates

b = mol.NewAtom()
mol.AddBond(1, 2, 1)   # atoms indexed from 1
print('Should print 2 (atoms)')
print(mol.NumAtoms())
print('Should print 1 (bond)')
print(mol.NumBonds())

mol.Clear();
```
![Screen Shot 2022-07-16 at 11.51.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4c8dcdca-ec77-468b-8571-9fd82427dcb2.png)

# コマンドラインツールの実行

マジックコマンド`%sh`を使うことで、直接`obabel`を呼び出すこともできます。

```
%sh
obabel -:'CC(=O)Oc1ccccc1C(=O)O' -oascii
```

![Screen Shot 2022-07-16 at 11.53.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d427a79d-fa8c-538c-1c20-10cae893121a.png)


### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)