RDKit: フラグメントからFingerprintの生成

By | 2015年3月27日


今回は、フラグメントからFingerprintの生成を行ってみます。
まずは、以下のモジュールと分子を2つ読み込みます。

> python
>>> from rdkit import Chem
>>> from rdkit.Chem import FragmentCatalog
>>> import os
>>> ms = [m for m in Chem.SDMolSupplier('input.sdf')]

Pharma2D_input

官能基情報の読み込み

官能基の定義は、FunctionalGroups.txtに記載されています。
例えば、methyl amideは以下のようにSMARTSで定義されています。

-NC(=O)CH3 *-[N;D2]-[C;D3](=O)-[C;D1;H3]

>>> fName = os.path.join(Chem.RDConfig.RDDataDir,'FunctionalGroups.txt')
>>> fparams = FragmentCatalog.FragCatParams(1,4,fName)
>>> print "Number of functional groups: ",fparams.GetNumFuncGroups()
Number of functional groups:  39

フラグメントの生成

入力した2つの分子からフラグメントを生成します。

>>> fcat = FragmentCatalog.FragCatalog(fparams)
>>> fcgen = FragmentCatalog.FragCatGenerator()
>>> for m in ms:
...     fcgen.AddFragsFromMol(m,fcat)
>>> n = fcat.GetNumEntries()
>>> print "Number of fragments: ",n
Number of fragments:  203
>>> for i in range(n):
...     print fcat.GetEntryDescription(i)
CN
C<=O>N
cN
.

フラグメントからFingerprintの生成

フラグメントからFingerprintの生成は、FragFPGeneratorを用いて行います。

>>> fpgen = FragmentCatalog.FragFPGenerator()
>>> fps = [fpgen.GetFPForMol(m,fcat) for m in ms]

共通のビットを算出し、それが表すフラグメントを確認してみます。

>>> fp_common = fps[0]&fps[1]
>>> onbit = list(fp_common.GetOnBits())
>>> for i in onbit:
...     print "Common fragment:",fcat.GetEntryDescription(i)
Common fragment: CN
Common fragment: C<=O>N
.

最後にTanimoto係数を算出してみます。

>>> a = float(fps[0].GetNumOnBits())
>>> b = float(fps[1].GetNumOnBits())
>>> c = float((fps[0]&fps[1]).GetNumOnBits())
>>> tc = c/(a+b-c)
>>> print tc
0.285714285714

今回は、2つの分子からフラグメントを生成しましたが、通常は、複数の分子からフラグメントを生成し、Fingerprintを生成することが多いと思います。


利用したソフトウェア:
RDKit_2014_09_2

APIの詳細:
FragCatParams
FragCatalog
FragCatGenerator
AddFragsFromMol
FragFPGenerator
GetEntryDescription