Google Colaboratoryで化学構造式を使う
脱線が好きなので、いろいろ飛びますがご容赦を。
RDKitを使うと化学構造式をPythonで使うことができる。
Google Colaboratory(以下、Google Colab)を使うとそれなりに化学構造式を書くことができたので少し書いてみます。
Google Colabでpipを使うときには先頭に「!」を付ける必要があります。
!pip install rdkit-pypi !pip install py3Dmol |
エラーが表示されずに実行が終わったら、ベースの環境設定は終わりです。
Mol形式のデータを構造式にしてみます。
Google Colabの「セッションストレージにアップロード」を使ってMolファイルをアップロードします。
from rdkit import Chem
m = Chem.MolFromMolFile('/content/caffeine.mol') |
Colaboratoryのファイルのパスの指定には、次の方法を使うと便利です。
パスを取得したいファイルの上にマウスカーソルを移動すると、右側に縦3つの点が妙寺されるので、このメニューから「パスをコピー」して貼り付けます
from rdkit.Chem import Draw
img = Draw.MolToImage(m) img |
これは画像なので、どこでもコピー&ペーストできます。
少し意地悪して、立体はどうなるか、とC36フラーレンのMolファイルを入れてみると次のようになりました。
やはり少し厳しいか。
MolToImage()には次の属性があるので、触ってみます。
kekulize: 構造式のケクレ化のオン/オフ。デフォルトはオン
size: 画像ぞサイズ(ピクセル)。デフォルトは300px x 300px
wedgeBonds: Wedgeボンド(立体ボンド [楔形のボンド])のオン/オフ。デフォルトはオン
highlightAtoms: ハイライトする原子のリスト。デフォルトは
highlightBonds: ハイライトするボンドのリスト。デフォルトは
highlightColor: タプルとしてRGB指定。デフォルト(1, 0, 0)。0~1の範囲で指定
【kekulize】
わかりやすいようにベンゼンを使います。
m = Chem.MolFromMolFile('/content/benzene.mol') |
まずはデフォルトの状態を確認します。
img = Draw.MolToImage(m, kekulize=True) img |
で次にオフにしてみます。
img = Draw.MolToImage(m, kekulize=False) img |
【size】
img = Draw.MolToImage(m, size=(100, 100)) img |
とすると100px x 100pxになり画像が小さくなります。
【wedgeBonds】
wedgeBondsは、例えば、L-乳酸でやってみると、wedgeBondsがTrueの時(デフォルト)は次。
Falseにすると次のようになります。
【highlightAtoms】
img = Draw.MolToImage(m, highlightAtoms=[1]) img |
すると、インデックス「1」の原子がハイライトされます。
インデックスは次の方法で表示することができます(RDKit Cookbook参照)。
原子ごとにIDを取得して(getAtoms())、そのIDを原子にマップします(SetAtomMapNum(atom.GetIdx()))。
def mol_with_atom_index(mol): for atom in mol.GetAtoms(): atom.SetAtomMapNum(atom.GetIdx()) return mol |
この関数を読んで、構造式の画像を生成すると次のようになります。
mol_with_atom_index(m) img = Draw.MolToImage(m) img |
これで何番かわかりますね。併せて表示してみると次のようになります。
mol_with_atom_index(m) img = Draw.MolToImage(m, highlightAtoms=[1]) img |
【highlightBonds】
今度はイブプロフェンのMolファイルを使ってやってみましょう。
1と5のボンドをハイライトするように指定してみます。
img = Draw.MolToImage(m, highlightBonds=[1, 5]) img |
【highlightColor】
highlightBondsのようなハイライトの色を変更します。
img = Draw.MolToImage(m, highlightBonds=[1, 5], highlightColor=(0.6, 0.8, 0.2)) img |
次のように色が変わります。
とりあえず今回はここまで。
構造式を書くだけであれば他のソフトを使ったほうが手っ取り早いです。
Pythonを使うのは、分析やフローを作るとき、という感じでしょうか。