05 01 2018 chemoinformatics Tweet
例えば
でフッ素原子が文字列の最後尾に来るようなSMILESを得たいとする。
RDKitにはRenumberAtomsというメソッドが用意されているので、原子のインデックスを変更してからSMILESに出力すればうまくいくんじゃないかと思いついたのでやってみた。
from rdkit import Chem mol = Chem.MolFromSmiles("Fc1ccc(Nc2[nH]cnc3ncnc23)cc1") l = list(range(mol.GetNumAtoms())) max = l.pop() l.insert(0, max) new_mol = Chem.RenumberAtoms(mol, l) print Chem.MolToSmiles(new_mol, canonical=False)
出力結果
c1c(F)ccc(Nc2[nH]cnc3ncnc2-3)c1
うまくいかない
今回の場合はアルゴリズムの空気感を読んでリバースすれば上手くいった。
from rdkit import Chem mol = Chem.MolFromSmiles("Fc1ccc(Nc2[nH]cnc3ncnc23)cc1") l = list(range(mol.GetNumAtoms())) #max = l.pop() #l.insert(0, max) l.reverse() new_mol = Chem.RenumberAtoms(mol, l) print Chem.MolToSmiles(new_mol, canonical=False)
結果
c1cc(Nc2c3ncnc-3nc[nH]2)ccc1F
やっぱりランダムにSMILESを生成してみて、お目当てのSMILESが出るまでトライする方法しかないんだろうかね