文章目錄
- 一、分子指紋計算
- 二、相似性搜尋
- 三、自定義搜尋函數
一、分子指紋計算
本文介紹在windows環境下,使用rdkit函數在postgresql資料庫中進行相似性搜尋。環境搭建、資料表準備不再贅述,可以參考這篇文章。在上述工作基礎上,繼續進行指紋計算、建立索引。操作之前先看看在postgresql中支援的指紋函數:
- layered_fp(mol):另一種rdkit原創指紋,官方文檔的解釋是它一種子結構指紋,與rdkit拓撲子圖的生成步驟一緻,但根據子圖生成指紋向量的過程有所不同。在子結構指紋類别中,layered指紋的表現不如pattern指紋,是以不像其他指紋這麼被人所熟知。
- torsionbv_fp(mol):對分子計算topological-torsion的bfp(bit fingerprint)型指紋
- torsion_fp(mol):計算topological-torsion的sfp(sparse fingerprint)型指紋
- morganbv_fp(mol, int default 2):計算指定半徑(預設為2)的morgan型bfp指紋
- morgan_fp(mol, int default 2):計算morgan的sfp指紋
- featmorganbv_fp(mol, int default 2):計算morgan FCFP(用官能團歸類)的bfp指紋
- featmorgan_fp(mol, int default 2):計算morgan FCFP的sfp指紋
- atompairbv_fp(mol):atompair的bfp指紋
- atompair_fp(mol):atompair的sfp指紋
- rdkit_fp(mol):rdkit的拓撲指紋
- maccs_fp(mol):預定義的MACCS指紋
接下來在postgresql中計算分子指紋
- 根據rdk.mols中的m列(存放分子的mol對象),計算torsion、morgan ECFP、morgan FCFP指紋,分别命名為torsionbv、mfp2、ffp2,并放入到rdk.fps表中
- 分别對torsionbv、mfp2、ffp2建立索引
create index fps_ttbv_idx on rdk.fps using gist(torsionbv);
create index fps_mfp2_idx on rdk.fps using gist(mfp2);
create index fps_ffp2_idx on rdk.fps using gist(ffp2);
二、相似性搜尋
進行相似性比對和搜尋需要用到相似性搜尋相關的操作符:
- 百分号"%":使用tanimoto相似性作為标準進行相似性搜尋,傳回的結果是給定分子與庫中分子的相似性是否超過門檻值(通過rdkit.tanimoto_threshold設定),用在where條件後,可以得到達到一定相似性的分子
- 井号"#",與上面的操作符類似,使用dice相似性,門檻值可通過rdkit.dice_threshold進行設定。
- 帶尖括号的百分号"<%>":使用tanimoto最近鄰搜尋
- 帶尖括号的井号"<%>":使用dice最近鄰搜尋。
- 接下來使用tanimoto系數作為篩選标準,對新輸入分子進行相似性搜尋
- 通過設定相似性的門檻值,來對結果進行限制
- <%>的使用
三、自定義搜尋函數
如果自帶的函數無法滿足需求,還可以通過create or replace function來建立一個新的函數。用下面的自定義函數為例進行介紹:
- 自定義函數的名稱為get_mfp2_neighbors,該函數可以接收一個text類型的參數smiles
- 自定義函數的傳回值為一個table,包含了int類型的id,mol類型的m,雙精浮點類型的similarity
- 該函數結果是由兩個表按id連接配接形成,第一個表來自rdk.fps,該表中包含了id,m,similarity,其中similarity是給定分子與庫中分子morgan指紋的tanimoto相似性系數。第二個表來自rdk.mols
- 兩個表合并後,做一步篩選,隻有與給定分子的相似性到達門檻值才能被展示。最後再排個序傳回
create or replace function get_mfp2_neighbors(smiles text)
returns table(id int, m mol, similarity double precision) as
$$
select id, m, tanimoto_sml(morganbv_fp(mol_from_smiles($1::cstring)), mfp2) as similarity from rdk.fps join rdk.mols using (id)
where morganbv_fp(mol_from_smiles($1::cstring))%mfp2
order by morganbv_fp(mol_from_smiles($1::cstring))<%>mfp2;
$$ language sql stable;
- 測試一下自定義函數
- 因為自定義函數中用到了tanimoto系數,同樣可以調整門檻值來限制結果,感興趣的可以自己嘗試
本文參考自rdkit官方文檔。