LoginSignup
0
0

More than 1 year has passed since last update.

Streamlitでmolファイルの分子構造の描画

Posted at

はじめに

有機分子の構造を記述したファイルとして、MOL形式(拡張子.mol)があります。これらは分子内の原子の座標を記録したものであり、行列表記法とも呼ばれます。
PythonのケミカルインフォマティクスライブラリーのRDKitを用いることでMOLファイルを読み込んで、描画することができます。また、SMILESやInChIといった線形表記法に変換することができます。
今回、Streamlit Cloudを用いて、Molファイルをアップロードすることで、構造を表示するWebアプリを作成しました。

mol_app01.png

こちらのGithubリポジトリに最終的なコードがあります。
https://github.com/s-yagyu/mol-draw

これまでRDkitはcondaでしかインストールできませんでしたが、pipでもインストールすることができるようになりました。

作成プログラム

from pathlib import Path
from tempfile import NamedTemporaryFile

import streamlit as st
import matplotlib.pyplot as plt
from rdkit import Chem
from rdkit.Chem import inchi
from rdkit.Chem import Draw

st.title('Mol Drawing')

# Fileの拡張子をチェックしてくれる
uploaded_file = st.file_uploader("Mol file upload", type='mol')


if uploaded_file is not None:
    file_name = uploaded_file.name

    
    with NamedTemporaryFile(delete=False) as f:
        fp = Path(f.name)
        fp.write_bytes(uploaded_file.getvalue())
    
        m_ = Chem.MolFromMolFile(f'{f.name}')
        m_img = Draw.MolToImage(m_,)
        m_smiles = Chem.MolToSmiles(m_)
        m_inchi = inchi.MolToInchi(m_, options='', logLevel=None, treatWarningAsError=False)
        m_inchikey = Chem.MolToInchiKey(m_)
    
    # ファイルを削除  
    fp.unlink()
    
    fig = plt.figure(figsize=(5,5))
    ax = fig.add_subplot(111)
    ax.set_title(f"InchiKey : {m_inchikey}")
    ax.imshow(m_img)
    ax.set_xticks([])
    ax.set_yticks([])    
    fig.suptitle(f'{file_name}')
    plt.tight_layout()

    st.pyplot(fig)

rdkit側では、ファイルのパスを指定しないと読み込むことができないため、
tmpfile.NamedTemporaryFileを利用して、
アップロードしたファイルを一時ファイルとして保存しています。

こちらの記事が参考になりました。
streamlist-file-uploader-example

Streamlit Cloudでデプロイ

Streamlit cloudにログインして、Streamlitで書かれたpythonファイルを指定してデプロイします。
その際に、同じ階層にrequirements.txt、packages.txtを用意します。

requirements.txt

requirements.txtを作成して、その中に、今回使うモジュールを記載します。
記載モジュール
numpy
matplotlib
streamlit
Pillow
scikit_learn
rdkit-pypi

packages.txt

Matplotlibの描画でエラーになるようなので
packages.txtに
libxrender1
と記載します。

こちらの記事が参考になりました。
hemoinfo のアプリをStreamlitを使ってDeployする #streamlit #RDKit #souyakuAC2020
chem_streamlit Github

試してうまくいかなかったこと

・最初Condaのenvironment.ymlを用意してトライ
-> うまくいかなかった。例も少なかったのでpip環境を利用。
・conda環境はあきらめてpip環境でトライ
必要モジュールをrequirements.txtに記載。
-> from rdkit.Chem import Drawのインポートエラー
・packages.txtを追加
-> インポートエラーが解消。(Matplotlibを使う場合はこれを追加する必要があるようです。)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0