RDKit|在PostgreSQL中進(jìn)行分子相似性搜索

文章目錄

一、分子指紋計(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;
1

三、自定義搜索函數(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;
2
  • 因?yàn)樽远x函數(shù)中用到了tanimoto系數(shù)坦报,同樣可以調(diào)整閾值來(lái)限制結(jié)果库说,感興趣的可以自己嘗試

本文參考自rdkit官方文檔

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末片择,一起剝皮案震驚了整個(gè)濱河市潜的,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌字管,老刑警劉巖啰挪,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異嘲叔,居然都是意外死亡亡呵,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門硫戈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)锰什,“玉大人,你說(shuō)我怎么就攤上這事掏愁⌒桑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵果港,是天一觀的道長(zhǎng)沦泌。 經(jīng)常有香客問(wèn)我,道長(zhǎng)辛掠,這世上最難降的妖魔是什么谢谦? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮萝衩,結(jié)果婚禮上回挽,老公的妹妹穿的比我還像新娘。我一直安慰自己猩谊,他們只是感情好千劈,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著牌捷,像睡著了一般墙牌。 火紅的嫁衣襯著肌膚如雪涡驮。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天喜滨,我揣著相機(jī)與錄音捉捅,去河邊找鬼。 笑死虽风,一個(gè)胖子當(dāng)著我的面吹牛棒口,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辜膝,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼无牵,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了内舟?” 一聲冷哼從身側(cè)響起合敦,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎验游,沒(méi)想到半個(gè)月后充岛,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡耕蝉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年崔梗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片垒在。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蒜魄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出场躯,到底是詐尸還是另有隱情谈为,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布踢关,位于F島的核電站伞鲫,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏签舞。R本人自食惡果不足惜秕脓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望儒搭。 院中可真熱鬧吠架,春花似錦、人聲如沸搂鲫。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至怔檩,卻和暖如春褪秀,著一層夾襖步出監(jiān)牢的瞬間蓄诽,已是汗流浹背薛训。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仑氛,地道東北人乙埃。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像锯岖,于是被迫代替她去往敵國(guó)和親介袜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345