文章目錄
一、分子指紋計(jì)算
二、相似性搜索
三掠哥、自定義搜索函數(shù)
一、分子指紋計(jì)算
本文介紹在windows環(huán)境下腮介,使用rdkit函數(shù)在postgresql數(shù)據(jù)庫(kù)中進(jìn)行相似性搜索。環(huán)境搭建端衰、數(shù)據(jù)表準(zhǔn)備不再贅述叠洗,可以參考這篇文章甘改。在上述工作基礎(chǔ)上,繼續(xù)進(jìn)行指紋計(jì)算灭抑、建立索引十艾。操作之前先看看在postgresql中支持的指紋函數(shù):
- layered_fp(mol):另一種rdkit原創(chuàng)指紋,官方文檔的解釋是它一種子結(jié)構(gòu)指紋名挥,與rdkit拓?fù)渥訄D的生成步驟一致疟羹,但根據(jù)子圖生成指紋向量的過(guò)程有所不同。在子結(jié)構(gòu)指紋類別中禀倔,layered指紋的表現(xiàn)不如pattern指紋榄融,因此不像其他指紋這么被人所熟知。
- torsionbv_fp(mol):對(duì)分子計(jì)算topological-torsion的bfp(bit fingerprint)型指紋
- torsion_fp(mol):計(jì)算topological-torsion的sfp(sparse fingerprint)型指紋
- morganbv_fp(mol, int default 2):計(jì)算指定半徑(默認(rèn)為2)的morgan型bfp指紋
- morgan_fp(mol, int default 2):計(jì)算morgan的sfp指紋
- featmorganbv_fp(mol, int default 2):計(jì)算morgan FCFP(用官能團(tuán)歸類)的bfp指紋
- featmorgan_fp(mol, int default 2):計(jì)算morgan FCFP的sfp指紋
- atompairbv_fp(mol):atompair的bfp指紋
- atompair_fp(mol):atompair的sfp指紋
- rdkit_fp(mol):rdkit的拓?fù)渲讣y
- maccs_fp(mol):預(yù)定義的MACCS指紋
接下來(lái)在postgresql中計(jì)算分子指紋
- 根據(jù)rdk.mols中的m列(存放分子的mol對(duì)象)救湖,計(jì)算torsion愧杯、morgan ECFP、morgan FCFP指紋鞋既,分別命名為torsionbv力九、mfp2、ffp2邑闺,并放入到rdk.fps表中
select id, torsionbv_fp(m) as torsionbv, morganbv_fp(m) as mfp2, featmorganbv_fp(m) as ffp2 into rdk.fps from rdk.mols;
- 分別對(duì)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);
二陡舅、相似性搜索
進(jìn)行相似性比對(duì)和搜索需要用到相似性搜索相關(guān)的操作符:
百分號(hào)"%":使用tanimoto相似性作為標(biāo)準(zhǔn)進(jìn)行相似性搜索抵乓,返回的結(jié)果是給定分子與庫(kù)中分子的相似性是否超過(guò)閾值(通過(guò)rdkit.tanimoto_threshold設(shè)置),用在where條件后靶衍,可以得到達(dá)到一定相似性的分子
井號(hào)"#"灾炭,與上面的操作符類似,使用dice相似性颅眶,閾值可通過(guò)rdkit.dice_threshold進(jìn)行設(shè)置蜈出。
帶尖括號(hào)的百分號(hào)"<%>":使用tanimoto最近鄰搜索
帶尖括號(hào)的井號(hào)"<%>":使用dice最近鄰搜索。
接下來(lái)使用tanimoto系數(shù)作為篩選標(biāo)準(zhǔn)涛酗,對(duì)新輸入分子進(jìn)行相似性搜索
select count(*) from rdk.fps where mfp2%morganbv_fp('O=C1CN=C(c2ccccn2)c2ccccc2N1');
- 通過(guò)設(shè)置相似性的閾值铡原,來(lái)對(duì)結(jié)果進(jìn)行限制
set rdkit.tanimoto_threshold=0.3;
- <%>的使用
select id, mfp2<%>morganbv_fp('O=C1CN=C(c2ccccn2)c2ccccc2N1') knn from rdk.fps order by knn asc limit 10;
三、自定義搜索函數(shù)
如果自帶的函數(shù)無(wú)法滿足需求煤杀,還可以通過(guò)create or replace function來(lái)創(chuàng)建一個(gè)新的函數(shù)眷蜈。用下面的自定義函數(shù)為例進(jìn)行介紹:
- 自定義函數(shù)的名稱為get_mfp2_neighbors,該函數(shù)可以接收一個(gè)text類型的參數(shù)smiles
- 自定義函數(shù)的返回值為一個(gè)table沈自,包含了int類型的id,mol類型的m辜妓,雙精浮點(diǎn)類型的similarity
- 該函數(shù)結(jié)果是由兩個(gè)表按id連接形成枯途,第一個(gè)表來(lái)自rdk.fps忌怎,該表中包含了id,m酪夷,similarity榴啸,其中similarity是給定分子與庫(kù)中分子morgan指紋的tanimoto相似性系數(shù)。第二個(gè)表來(lái)自rdk.mols
- 兩個(gè)表合并后晚岭,做一步篩選鸥印,只有與給定分子的相似性到達(dá)閾值才能被展示。最后再排個(gè)序返回
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;
- 測(cè)試一下自定義函數(shù)
select * from get_mfp2_neighbors('O=C1CN=C(c2ccccn2)c2ccccc2N1') limit 10;
- 因?yàn)樽远x函數(shù)中用到了tanimoto系數(shù)坦报,同樣可以調(diào)整閾值來(lái)限制結(jié)果库说,感興趣的可以自己嘗試
本文參考自rdkit官方文檔。