ご注文はリード化合物ですか?〜医薬化学録にわ〜

自分の勉強や備忘録などを兼ねて好き勝手なことを書いていくブログです。

小ネタ:塩を除去する関数

化合物データを機械学習に用いるとき、前処理で塩を除去する操作を行います。
例えば、酢酸ナトリウム塩のナトリウムを除いて、酢酸にする、といった具合です。
RDKit には Chem.SaltRemover という関数があるのですが、個人的にこれは使いにくいと思っています。
理由としては、
・前もって除きたい塩の種類を指定しておく必要があり、漏れが生じる可能性が高い。
有機分子塩(マレイン酸塩など)が上手く除けない。
・入力の記法が独特でエラーを起こしやすい。
といった理由が挙げられます。

ここで、塩の SMILES 表記は . で区切られる(酢酸ナトリウムだったら CC(=O)[O-].[Na+])ことに着目し、自作の塩除去関数を作成してみました。

import numpy as np
import pandas as pd
from rdkit import Chem
from rdkit.Chem.Draw import IPythonConsole

def salt_remover(smiles):
    split_smiles = smiles.split(".")
    sel_idx = np.argmax([len(string) for string in split_smiles])
    return split_smiles[sel_idx]

smiles = "CC(=O)[O-].[Na+]"
salt_remover(smiles)

この関数は SMILES の文字列(str 型)を split で分割して文字列リストにし、一番長い SMILES を取得するして戻り値としています。
SDF で読み込んだ化合物の場合は SMILES に変換する必要があるため、立体配座などの情報は失われることに注意する必要がありますが、塩の指定をしなくて良いため、漏れは少なくなると思います。