rdkitでSMILESから構造式を返すdiscord botを作りたいという願望(1)


0. は?願望?

確かに動いてるんですよ、だから書いてるんです。しかしながら、どうも無理やり感が半端なく、問題をたくさんはらんでいるので、ひとまずこんな名前になってるわけです。後の期待を込めて(1)とか書いてますが、後続があるかさえわかりません。ひとまず動きました。そういうことです。

要するに、
あんまり再現性とか期待しないでね!
ということです。

いや、この記事意味あるんか...

1. で、何がしたいの?

タイトルのままです。discordでSMILESを投げたらpngで構造式返してくれるアレがやりたいわけです。私は手書きで綺麗なベンゼン環が書けないので、CPUにやらせてサボりたいわけです。でも同時に、いちいちノーパソ開いて無料なのがとてもありがたい某ソフトを起動させたりするのもまためんどくさいわけです。どうにかして「スマートフォンの画面にsmiles打ち込むだけで...あら不思議!」をやりたいわけです!!!

ここで一つ疑問がわいてきます。

「そういうbotとかサービスって、既にあるよね...?」

確かにあります。ありますとも。でも私には自分で作らなばならないやんごとなき理由があったのです。それは、
どうしても自分でやってみたかった
ということです。これなら仕方ないですね。

以上、モチベでした。

2 じゃあ、どうやるの?

そういえば、rdkitっていう、便利なやつがありましたね。あれ、使いましょう。discord botのdiscord側の設定に関しては、ネットで調べればたくさん出てくると思うので、割愛します。まずは適当にdiscord.pyを入れておきます。Windowsならば、以下を叩きます(他のOSの場合は、リンクに飛んで確認してください)。

discord.pyを入れる
py -3 -m pip install -U discord.py

よし、できました。次はrdkitを使いたいわけですが、悲報があるそうです。

RDKIT IS NOT AVAILABLE ON PYPI!!!

これは、辛いですね。で、見てみると、Anacondaを使えと書いてあります。では有難く使わせてもらいましょう。conda入ってない人はここから適当に入れて下さい。おそらくスムーズに入ると思います。
次に、下のコマンドを打てって言っているので、素直に打ちます。

rdkitを入れる
conda create -c rdkit -n my-rdkit-env rdkit

入りました。はい。

これで実行時に以下のコマンドを叩けば、rdkitがimportできるはずです。

仮想環境のactivate
conda activate my-rdkit-env

または以下でもいいと思います。

仮想環境のactivate
call activate.batのパス
call activate my-rdkit-env

やったね!下準備完了です。さぁコードを書いていきましょう。discord.pyの公式ページ等を参考にしました。

ChemConverter.py
#必要なライブラリ
import discord
from rdkit import Chem
from rdkit.Chem import Draw

client = discord.Client()


@client.event
async def on_ready():
    print('Successfully Connected')

@client.event
async def on_message(message):
    if message.author == client.user:
        return
    if botとして機能する何らかの条件(あるチャンネルに発言があったなど):
        str=message.content
        mol=Chem.MolFromSmiles(str)
        if mol is None:
            await message.channel.send('Oops! There is something wrong with SMILES!')
        else:
            Draw.MolToFile(mol, 'mol.png')
            await message.channel.send(file=discord.File('mol.png'))

client.run('ここにAccessTokenを入れます。Secretじゃないので注意!')

これで動きます。いやぁ、めでたしめでたし。

ただこれ、少しめんどくささが残ります。というのも、いちいち仮想環境をactivateして実行までしなきゃいけないのです。これ嫌ですね。なぜならそのためにノーパソを開かなきゃいけないからです!(だったら例のソフトでいいやん...)

そこで、下のようなbatを書いておきます。callにしないとactivateしたときにそのまま次のコマンドを実行してくれないっぽいです。

ChemConverter.bat
call activate.batのパス
call activate my-rdkit-env
cd ChemConverter.pyのあるディレクトリのパス
python ChemConverter.py

これでChemConverter.batを動かすだけで一発でbotが起動するようになりました。最後に、このbatをタイムスケジューラでスタートアップ時に実行するようにしておけば、勝手にバックグラウンドで立ち上がってくれます。便利ですね。よかった、よかった。

3. ん?問題なんてあった?

そんなものはなかった、と言いたいところですが、お気づきの通り、山ほどあります。
まず、
1. でかい化合物だと構造式がつぶれます。
見るのが早いです。これです。

つぎに、
2.ノーパソを起動していないと動きません。
だって、ノーパソ上で動いてるんだもん。そりゃそうだ。

いや、一応打開しようとはしましたよ?herokuとかPythonAnywhereとかで動かせないかな~と思っていろいろやってみました。というか、どちらにせよ、condaがないとrdkitが入れにくすぎるんじゃー!!!いやー、世の中でこういうbotつくってるひとはすごいなー(遠い目)

4. え、これで終わり?

はい、終わりです。

ということで、こんな感じにやれれば、ダサいうえにPCを私たちが起きている時間ずっと稼働させておくための電気代という犠牲を伴いますが、何とか動かせました。

進展があったら書こうかと思います。
次があったときは、またよろしくお願いします。
ここまで読んでいただいた方、ありがとうございました。
何かのお役に立てれば光栄です。

環境とか

Windows 10
Python 3.6.2