初めて書いたコード

厳密に言うと「1+1」だってコードではあるのだろうけど、何か意図を持って書いたものということで。
2021年の春に変数とかの超基本概念だけは社内の有識者から習って、せっかくなので勉強がてら何か書いてみようと思った。
思いついたのは、化学構造(molファイル)を絵(pngファイル)にするものだった。
このコード自体にあまり意味はなくて、化学構造を描画する市販のソフトを使って保存形式を画像で選択すればよいだけです。


【化学構造ファイルが複数入ったフォルダから、それを読み込んで画像化して新規フォルダに保存するコード】

めちゃくちゃ恥ずかしいけど、まずはそのまんま載せてみる。

import glob
import os
import os.path
from rdkit import Chem
from rdkit.Chem import AllChem, Draw

dir= ' ./picture/'
if not os.path.exists(dir):
    os.mkdir(dir)

for b in glob.glob('./structure/*.mol'):
    a = open(b)
    temp= a.read()
    a.close()
    c = os.path.basename(b)
    mols = Chem.MolFromMolBlock(temp)
    Draw.MolToFile(mols, dir + c.replace(".mol",".png"))


今見ると自分でも突っ込みどころがあって、上のコードなら「import os.path」なくてもいいし、aとかbとかやる気ない変数は一体なんなんだ。
業務の合間を使ったとはいえ、これに1週間以上かかっていた記憶がある。
何が一番躓いたかというと最後の行。まず Draw.MolToFile()の中に何を入れれば良いのかさっぱりわからなかった。
色々参考サイトを巡ったり、適当に書いて実行してみては理解できないエラーメッセージにイラついていた。

せっかくなので今回こうして記事にするにあたり、この場で直してみた。
(所要時間:約5分)

import glob , os
from rdkit import Chem
from rdkit.Chem import AllChem, Draw
from natsort import natsorted

def Mol_to_Png(file):
    basename = os.path.basename(file).split(".")[0]
    MOL = Chem.MolFromMolFile(file)     #MOLオブジェクトに変換
    Draw.MolToFile(MOL, f'./{png_folda}/{basename}.png')

"""設定と実行"""
mol_folda = "structure"
png_folda = "picture"
#フォルダの作成
os.makedirs(f'./{png_folda}/', exist_ok = True)
#ファイルの収集
files = glob.glob(f'./{mol_folda}/*.mol')
#ループ処理で一つずつ画像へ変換
for file in natsorted(files):
    Mol_to_Png(file)


少しは、スッキリ、、、、、したかな?


正直、完全なネット独学なので皆と同じように書けているのか不安が残っている。
この程度なら関数で書く意味もあまりないかもしれない。ただ、当時は関数も知らなかったということで(汗


それで、上記であまり意味はないと書いたものの、計算化学や機械学習をやっていると、大量の化合物データを取り扱うことがよくある。
色々結果を解析する時に、「あれ、これって構造は何だっけ?」となる時がよく合って、
そんな時にこのように画像化したものがあると確認が非常に楽なんですよね。
もちろんmolファイルを直接描画ソフトで開くのでも良いのですが、最近の描画ソフトはどれも立ち上がりが遅いし。(←いいパソコン使え
今でも時々使っているから無駄にはなっていない、、、はず。


最後に、今回は中身はそこまで触れませんが、「RDKIT」というモジュールは、化学系で計算化学や機械学習をやる上では欠かせないツールです。
私は表面的にしか使えない人なので、以下のサイトなんかを非常に参考にさせてもらっています。
ご参考までに

future-chem.com