見出し画像

化合物の特徴量抽出 RDkitを用いたフィンガープリントについて

はじめに

駆け出しのデータサイエンティストが書くため、間違いがあると思いますが、大目に見てください。

初学者おすすめ書籍↓


フィンガープリントについて


化合物の構造情報について扱う際に、多くの構造記述子が発表されています。その中にフィンガープリントという手法があります。フィンガープリントは指紋という意味ですが、ここでのフィンガープリントは構造情報からビットベクターといわれる1と0が並んだ情報に変換することを指します。では、実際にどんなものか説明する前に、Rdkit(https://github.com/rdkit/rdkit )と呼ばれるPythonでも使えるライブラリーについて説明します。

#Rdkitについて
Rdkitについての詳しい説明は以下の記事に書かれてあります。
https://qiita.com/Mochimasa/items/4e34ceb8eb9519513a94

Rdkitとは化合物情報を扱うケモインフォマティクス分野で用いられる代表的なオープンソースのライブラリです
このライブラリーを使えば、基本的なフィンガープリントが実装できます。
pythonでの実装方法は以下URLを参照ください。
https://www.rdkit.org/docs/Install.html

今回は様々なフィンガープリントの中の一つである、ECFPを実装してみます。

ECFPとは


ECFP(Extended Connectivity FingerPrint)はCirculer型フィンガープリントと呼ばれており、手順は簡単に説明すると

①化合物に含まれるそれぞれの原子について、そこから(円を描くイメージ)半径radius=1,2....の部分構造をすべて取り出し、ハッシュ関数によってハッシュ化する。
②①で得た全ての部分構造についてのハッシュ値をアドレスとし、規定のビット数に対して得られたアドレスのビットを1にする。
となります。


ECFPを出力してみる


ECFPはRdkitで実装する上で、ややこしいところはECFPと名のついた関数がないことです。ECFPを用いる時はmorganfingerprintの関数を用います。

AllChem.GetMorganFingerprintAsBitVect(mol,2,nBits=2048)

下記の内容はrdkitのドキュメント
(https://www.rdkit.org/docs/GettingStartedInPython.html)
ですが、morganフィンガープリントが直径4(radius=2)の時、ECFP4と同等と書かれています。

>When comparing the ECFP/FCFP fingerprints and the Morgan >fingerprints generated by the RDKit, remember that the 4 in >ECFP4 corresponds to the diameter of the atom environments >considered, while the Morgan fingerprints take a radius >parameter. So the examples above, with radius=2, are roughly
>equivalent to ECFP4 and FCFP4.

それでは実装してみます。

import pandas as pd
import numpy as np
from rdkit import Chem
from rdkit.Chem import AllChem

bitv1=np.zeros(0) #sdfファイルの呼び出し 
mols = [ mol for mol in Chem.SDMolSupplier( "cdk2.sdf", removeHs=False ) ]
j=0 #ecfp  generate
for mol in mols:
   morganfp =  AllChem.GetMorganFingerprintAsBitVect(mol,2,nBits=2048) #フィンガープリントを手に入れる 
   for i in range(2048):
       if morganfp.GetBit(i) == True:
           bitv1=np.append(bitv1,1)
       elif morganfp.GetBit(i) == False:
           bitv1=np.append(bitv1,0)
   bit1 = np.array([bitv1])
   bitv1 = np.zeros(0)
   if j==0:
       bit2 = bit1
   if j==1:
       bit2 = np.append(bit2,bit1,axis=0)
   j=1
df=pd.DataFrame(bit2)
df.to_csv("result_ecfp4.csv",mode='a',index=False,header=False)

今回はsdfという化合物の極座標データや分子量などが入っているデータを用いました。
詳細は(https://www.chem-station.com/blog/2012/04/sdf.html)

このように簡単にフィンガープリントを実装できます。

最新論文の紹介


フィンガープリントは今でも尚研究されています。その中のいくつかを簡単に紹介します。

E3FP(Extended 3 dimensional FingerPrint)
簡単な手順
①化合物のxyz座標情報から固定長ベクトルを算出。
②半径を決める。
③化合物の部分グラフを取り出し、部分グラフごとに新しい固定長ベクトルを生成。
④ハッシュ関数を用いてアドレスを算出。


参考文献
・A Simple Representation of Three-Dimensional Molecular Structure
https://pubs.acs.org/doi/10.1021/acs.jmedchem.7b00696

Githubはこちら
(https://github.com/keiserlab/e3fp/blob/master/doc/source/usage/pipeline.rst)

MHFP(Minimum Hash FingerPrint)
最小ハッシュ関数を用いて算出する手法。

参考文献
・A Probabilistic Molecular Fingerprint for Big Data Settings
https://chemrxiv.org/articles/A_Probabilistic_Molecular_Fingerprint_for_Big_Data_Settings/7176350

Githubはこちら
(https://github.com/reymond-group/mhfp)


以上です!


この記事が気に入ったらサポートをしてみませんか?