はじめに
molファイルやsmilesの中に複数の化合物(フラグメント)が含まれていると、その後の記述子計算などに支障がでるため、一般的には前処理においてこれらを除去し、1つの化合物のみにすることが行われる。今回、これをやってみようと思う。
環境
- Python3.6
- RDKit 2019.03.3.0
塩を除去する
まず、よくあるパターンとして"Cl"や"Br"等の塩が含まれている場合の除外方法について述べる。
コード例は以下のとおりである。
from rdkit import Chem
from rdkit.Chem.SaltRemover import SaltRemover
smis = ("CN(C)C.Cl", "CN(Br)Cl.Cl", "CC(=O)O.[Na]", "CN(C)C.Cl.Br")
#-------------------------------------------------------
# 脱塩処理
#-------------------------------------------------------
remover = SaltRemover(defnData="[Cl,Br]")
for smi in smis:
mol = Chem.MolFromSmiles(smi)
mol2 = remover.StripMol(mol)
smi2 = Chem.MolToSmiles(mol2)
print(smi + "->" + smi2)
結果は以下のとおりである。
Before: CN(C)C.Cl -> After: CN(C)C
Before: CN(Br)Cl.Cl -> After: CN(Cl)Br
Before: CC(=O)O.[Na] -> After: CC(=O)O.[Na]
Before: CN(C)C.Cl.Br -> After: CN(C)C
3番目以外は正しく除去されている。3番目の化合物では、"Na"が除去されていないが、これはSalt RemoverのdefnDataのところでNaを定義していなかったためである。ここを"Na"も指定すると正しく除去される。
一番大きなフラグメントを残して他を除去する
次に、塩以外にも複数の化合物が含まれているmolファイルやsmilesがある場合について述べる。この場合、一番大きいサイズのフラグメントのみを残すという処理がよく行われる。
コード例は以下のとおりである。
from rdkit import Chem
from rdkit.Chem import MolStandardize
lfc = MolStandardize.fragment.LargestFragmentChooser()
smis = ("CN(C)C.Cl", "CN(Br)Cl.Cl", "CC(=O)O.[Na]", "CN(C)C.Cl.Br", "CCC.CCCC")
for smi in smis:
mol = Chem.MolFromSmiles(smi)
mol2 = lfc.choose(mol)
smi2 = Chem.MolToSmiles(mol2)
print("Before: " + smi + "-> After: " + smi2)
結果は以下のとおりである。5番目は塩でないが、小さいフラグメント(CCC)が除去されていることが分かる。
Before: CN(C)C.Cl -> After: CN(C)C
Before: CN(Br)Cl.Cl -> After: CN(Cl)Br
Before: CC(=O)O.[Na] -> After: CC(=O)O
Before: CN(C)C.Cl.Br -> After: CN(C)C
Before: CCC.CCCC -> After: CCCC
おわりに
一般的な手法や、RDKitの仕様を調べるのに時間をかかってしまった。次は電荷の処理について書いてみたい。