SMILES記法の化合物のMACCS keysを求める


覚えておくためのメモ

以下はMochimasa氏のQiitaエントリ化合物をベクトルにして比較しプロットするを参考にしました
np.zeros()の使い方は0を要素とする配列を生成するnumpy.zerosの使い方を参考にしました

モジュールはRDkitとNumpyを使う

#モジュールの読み込み
from rdkit import Chem
from rdkit.Chem import MACCSkeys
from rdkit import DataStructs
import numpy as np

化合物をSMILES形式で読み込む(ChEMBLで取得)
MACCS Keysの計算

mol = Chem.MolFromSmiles('CS(=O)(=O)NCCC1CCN(CC1)c2ncnc3cc(sc23)C(=O)N')
fps = MACCSkeys.GenMACCSKeys(mol)

fpsにMACCS keyが入っているはずなのでprintしてみよう

print(fps)
<rdkit.DataStructs.cDataStructs.ExplicitBitVect object at 0x10aef65d0>

BitVector?なのでそのままでは数値や文字としては表示できない

Tanimoto係数などSimilalityはBitVectorのまま比較すればよい

fp_bits = tuple(fps.GetOnBits())
print(fp_bits)
(32, 33, 36, 38, 51, 55, 58, 60, 61, 62, 65, 67, 69, 73, 75, 77, 80, 81, 82, 83, 84, 85, 86, 88, 91, 92, 93, 94, 96, 98, 100, 101, 102, 104, 105, 106, 108, 110, 111, 112, 116, 117, 118, 120, 121, 122, 124, 125, 128, 129, 130, 131, 133, 135, 136, 137, 138, 142, 145, 146, 147, 148, 151, 153, 154, 155, 156, 158, 159, 160, 161, 162, 163, 164, 165)

MACCS KeysのどのbitがOn,つまり"1"になっているかを示す

これをnumpyで1 or 0のベクトルとして表すと

fp_arr = np.zeros((1,))
DataStructs.ConvertToNumpyArray(fps,fp_arr)
print(np.array(fp_arr))
[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.
  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  1.  1.  0.  0.
  1.  0.  1.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  1.  0.  0.
  0.  1.  0.  0.  1.  0.  1.  1.  1.  0.  0.  1.  0.  1.  0.  1.  0.  0.
  0.  1.  0.  1.  0.  1.  0.  0.  1.  1.  1.  1.  1.  1.  1.  0.  1.  0.
  0.  1.  1.  1.  1.  0.  1.  0.  1.  0.  1.  1.  1.  0.  1.  1.  1.  0.
  1.  0.  1.  1.  1.  0.  0.  0.  1.  1.  1.  0.  1.  1.  1.  0.  1.  1.
  0.  0.  1.  1.  1.  1.  0.  1.  0.  1.  1.  1.  1.  0.  0.  0.  1.  0.
  0.  1.  1.  1.  1.  0.  0.  1.  0.  1.  1.  1.  1.  0.  1.  1.  1.  1.
  1.  1.  1.  1.  0.]

np.zeros((3,4)) で3x4の行列, つまりnp.zeros((1,)) では1行だけの,0が並んだベクトル

これをひとつひとつの化合物に適用して積み重ねた行列を作れば、PCAができる...!