Finding activity cliffs in ChEMBL

Activity cliffs are pairs of structurally similar compounds with large differences in activity, like inhibitory potency. I searched them in ChEMBL database with pychembldb.

I haven't maintained it for a long time but It works well even in Python3.7 :-)

My strategy for finding them is filtering assay data by whether it has confidence_score 9 (Direct single protein target assigned) and has enough data points(>=10 and <100) and then generating SMILES and Activity file from each of assay data for processing Matched Molecular Pairs Analysis (MMPs) by mmpdb

from pychembldb import *

for assay in chembldb.query(Assay).filter(Assay.confidence_score > 8).all():
    smiles_file = "{}.smi".format(assay.chembl_id)
    act_file = "{}.tsv".format(assay.chembl_id)
    act_list = [a for a in assay.activities if a.standard_value is not None and  and a.standard_units == "nM"]
    if len(act_list) > 9 and len(act_list) < 100::
        with open(smiles_file, "w") as sf:
            with open(act_file, "w") as af:
                af.write("ID\tVal\n")
                for activity in assay.activities:
                    if activity.standard_value is not None and \
                    activity.compound.molecule.structure is not None:
                        sf.write("{} {}\n".format(
                            activity.compound.molecule.structure.canonical_smiles,
                            activity.compound.molecule.chembl_id))
                        af.write("{}\t{}\n".format(
                            activity.compound.molecule.chembl_id,
                            activity.standard_value
                        ))

It took a few hours, but finally, I got around 55000 assay data.

I used mmpdb for generating MMP, and prepared a script for batch processing.

from glob import glob
import subprocess

def make_mmpdb(chembl_id):
    smiles_file = "{}.smi".format(chembl_id)
    act_file = "{}.tsv".format(chembl_id)
    fragments_file = "{}.fragments".format(chembl_id)
    sqlite_file = "{}.mmpdb".format(chembl_id)

    subprocess.run([
        "mmpdb",
        "fragment",
        smiles_file,
        "-o",
        fragments_file])

    subprocess.run([
        "mmpdb",
        "index",
        fragments_file,
        "-o",
        sqlite_file,
        "--properties",
        act_file])

if __name__ == "__main__":
    for fn in glob("*.smi"):
        chembl_id = fn.split(".")[0]
        make_mmpdb(chembl_id)

Finally, I extracted the pairs whose activity difference is more than 2 by pIC50.

import os
from sqlalchemy import *
from sqlalchemy.orm import create_session, relationship
from sqlalchemy.ext.declarative import declarative_base
from math import log10
from glob import glob

def search_ac(mmpdb_name):
    uri = 'sqlite:///{}'.format(mmpdb_name)

    Base = declarative_base()
    engine = create_engine(uri)
    metadata = MetaData(bind=engine)

    class Dataset(Base):
        __table__ = Table('dataset', metadata, autoload=True)

    class Compound(Base):
        __table__ = Table('compound', metadata, autoload=True)

    class PropertyName(Base):
        __table__ = Table('property_name', metadata, autoload=True)

    class CompoundProperty(Base):
        __table__ = Table('compound_property', metadata, autoload=True)
        compound = relationship('Compound', backref='compound_properties')
        property_name = relationship('PropertyName', backref='compound_properties')

    class RuleEnvironment(Base):
        __table__ = Table('rule_environment', metadata, autoload=True)

    class EnvironmentFingerprint(Base):
        __table__ = Table('environment_fingerprint', metadata, autoload=True)

    class ConstantSmiles(Base):
        __table__ = Table('constant_smiles', metadata, autoload=True)

    class Pair(Base):
        __table__ = Table('pair', metadata, autoload=True)
        constant_smiles = relationship('ConstantSmiles', backref='pair')
        rule_environment = relationship('RuleEnvironment', backref='pair')

    class RuleEnvironmentStatics(Base):
        __table__ = Table('rule_environment_statistics', metadata, autoload=True)

    sa = create_session(bind=engine)
    pIC50_dict = {}
    public_id = {}

    for cp in sa.query(CompoundProperty).filter_by(property_name_id=0).all():
        #print(cp.value)
        pIC50_dict[cp.compound_id] = 9.0 - log10(cp.value)
        public_id[cp.compound_id] = cp.compound.public_id

    pairs = []
    for pair in sa.query(Pair).all():
        if (pair.compound1_id, pair.compound2_id) not in pairs:
            pairs.append((pair.compound1_id, pair.compound2_id))
            diff = abs(pIC50_dict[pair.compound1_id] - pIC50_dict[pair.compound2_id])
            if diff >= 2.0:
                print("{}: ({}, {}) {}".format(
                    mmpdb_name.split(".")[0],
                    public_id[pair.compound1_id],
                    public_id[pair.compound2_id],
                    diff))

if __name__ == "__main__":
    for fn in glob("*.mmpdb"):
        search_ac(fn)

After this calculation I realized that I needed to eliminate cell based assays that caused AC noises.

ミームを信じるか否か

ちょっと最近思うことがあったので記しておく。

私に大きな影響を与えたサイトの一つとしてjoyrideがある。まぁその当時はしょっちゅう見ていた。ちなみに更新日を見てもらうとわかるけど20年以上前のサイトだ。そのうちhigh gearになってなんか心境変わったのかなーと思っていたのだけど、byebyeのページをちょっと待っていれば理由がわかります。

この出来事は自分に結構大きな影響を与えたと思う。心残りはちゃんとゲストブックに記入しなかったことかな。

「どこでも誰とでも働ける」を読んだ

台湾に行く飛行機の中で読んだのですが、これは大変良かったです。いまならPrimeReadingで無料で読めるのでサクッとチェックしておくとよいかと思います。

自分がもつ知識はできる限りオープンにしたほうが得をする

これは昔から実践していて、効果を実感している。

  • 壁をつくって知識を隠すことのメリットはどんどんなくなっています。
  • 自分の持つ知識をオープンにすると「旗を立てる」という効果もあります。

プロとしてやっていくならアカウンタビリティが必須になる

自分の仕事を自分の言葉でクライアントに説明できないといけない

  • アカウンタブルかどうかを決めるのは自分ではなく、あくまで受け手

18 会議術

会議はなかなか難しい

  • 会議の意図をメモする、共有する

会社を辞めるつもりはなくても転職活動は毎年する

いつでもやめる覚悟を持って、会社を良くしようとするから貢献できるし評価されるというのはそのとおりだと思う。最初から会社にしがみつくのが目的の人がよい貢献をするというのはちょっと考えられないかな。

  • 会社と個人はあくまでフラット
  • 会社にしがみついている人には、本気で会社を帰ることはできません

サイモン・シネックが出てたw

38 ハッカーのように課題を発見し解決を楽しむ思考法

  • 何が世の中の問題となっているのか、解決すべき課題が何かを発見する能力が重要

はじめてのエビシュウマイ

王味で食べたえびシューマイが最高だったので、家でもエビシュウマイを作ってみることにしました。エビだけだとあれなのではんぺんを買ってきてフードプロセッサーに投入してみた。

1559731763 1559731760

肉のようなずっしり感がなくてフワフワしてるので包みにくかった。できたものも柔らかいんだけどもっとエビが詰まっていて欲しかった。

1559731758 1559731755

王味のエビシュウマイの中には何が入っているのだろうかという疑問が強まったのであった。

京都の大学出身なのに東大で同窓会してきた

久しぶりに東京をぶらぶらした。@menshuronをたまたまチェックしたら昼営業中だったので飛び込む。

1559731166 1559731151

次はちゃんと夜に来て日本酒飲みたい。

日本酒やでちょっとだけ。

1559731163 1559731141

サニーレタスの漬物どうなんだろう?と思ったけど美味しかった。

1559731144 1559731147

同窓会は東大近くの根津駅すぐの車屋ってとこで。20年ぶりに会う人がほとんどだったので、どんなに記憶をたどっても思い出せないヒトが多かった気がする。っていうか、そもそも授業に出席してなかったわw

1559731160 1559731157

色々とすごい話が聞けてよかった。

王味

ちょっと前に沼津の王味に行ってきました。本当はリパブリューでビールを飲む予定だったのだけど予約できなかった。

よだれどりが美味しすぎた。

1559650905 1559650891

前菜のチャーハン(?)とハチノス。ハチノス最高!

1559650894 1559650896

エビシュウマイも美味しかった。それから豚肉の水煮というか旨煮。

1559650902 1559650899

楽しかったですね。mishima.sykの懇親会でも使いたいところ。

二泊三日の台北旅行

突然思い立って二泊三日の台北旅行に行ってきました。今回は

  • 前泊を省略したいので成田からvanila airを使ってみた(前回は羽田前泊からTiger air)
  • 予めネットで行くべきお店を決めておいた(観光地化してなさそうな店を攻めた)

って感じ

台北行くまで

まず6時くらいの富士発東京行きの高速バスで東京まで出て、THEアクセス成田で成田空港第三ターミナルまで。高速バスでも1時間くらいで着くし第三ターミナルの前で降ろしてくれるので楽ちんだった。ただし東京行きの高速バスは朝の渋滞で1時間くらい遅れて到着したのでだるかった(もっと論文を積んでおくべきだった)。フライトは13:00初の台北時間の16:00着だけどMRT経由でホテルに着いたのが18:30だったので、移動に半日を費やした。

それから第三ターミナルの出国後は時間を潰せるところがあまりないので注意かな。早めに行く必要はないかも。 むしろ、中国系の方のための爆買いゾーンになっているのかな?

Re:ゼロがいて秋葉原系の名前ついた店で多くの中国系の方々で賑わっていました。

1559568499

桃園から台北行きのMRTで適当に撮った。この時点で1800だったので「お腹すいたいわん」とかつぶやいていたはず。

1559568509

ホテルに着いたらまずは軽くビールを飲んだ。

1559568598

近所の美味しそうな店に入ります。ここは前回も入ったので冒険ではないのだけど、日本語が通じなくて、赤肉なんとか湯をくれと言ったら、売り切れ的なことを言われて、「じゃぁ代わりのなんかスープ頂戴(英語と手話併用)」で入れてもらったのが右。だからどういう名前かはしらないがやたらと美味しかった(今思うと香菇排骨だろう)。魯肉飯は定番の旨さ。

1559568557 1559568501

その後、寧夏観光夜市をぶらっとしたのだけど、これといったものがあったので、双連鵝家荘というガチョウの店。豆知識的には我鳥がガチョウで甲鳥がアヒルだそうです。そしてたいていどちらかしかおいてないらしい。今回ガチョウしか食べなかったけどアヒルもいずれ。

台北はお酒の飲めるお店が少ないのですが、ガチョウ、アヒルはビールが飲めるらしいです。

1559568542 1559568631

蜆をすすめられたのだけど、魯肉飯でちょっとお腹いっぱいだったのでお断り(次の日行ったw) ガチョウ旨し、青菜も旨し。

1559568626 1559568514

今回の旅で食べたものの中ではこのガチョウが一番高かったのではなかろうか?といっても300NTD(1200円くらい?) 量もあったのでちょっと食べ疲れた。

基本的には台北は飲むとこない(知らない?)ので、コンビニでアルコールを調達してホテルで飲みます。 青島ビールと謎の酸っぱいリキュールっぽいものを飲んで寝た。

1559568559 1559568570

2日目

どうしても粥が食べたくて、赤嶺街の肉粥の店に向かったのだけど、週末は休みで平日も早く閉めるらしいと後から知った。だめじゃん、、、、

というわけで、世紀豆漿大王で豆漿をすすった。30NTDくらいだった、お安い。前回も行ったから知ってたけど他のメニューは読めないのでこれしか頼まない。

1559568529 1559568562

ちなみに食べ終わって出るときに日本人のおばさん7人の観光客がバラバラでないと座れないと言われたらしく、バラで座るか会議中だった。7人席など普通ないぞw

豆漿をすすったら、阿川蚵仔麺線に移動して蚵仔麺線をいただく。ほんと美味しい。

1559568564

今回の目的の一つ、富覇王豬脚極品餐庁へ向かう。

中山まで地下道をブラブラしつつ名探偵ピカチュウの中国語版広告を見つけて「皮なのか!」とw

1559568547

富覇王豬脚極品餐庁には11時過ぎに着いたけど、すでに行列ができてた。ちなみにお店の中は大変キレイなのと 料理はすぐ来るので回転はよさそう

1559568506 1559568567

とろとろ豚足でした。豆腐もうまかった。

1559568504 1559568585

満足の一杯。

1559568572

そして龍山時までぶらぶらしにいって、ほんとぶらぶらしただけだったけど、線香が長かったのと、お参りの作法が違ったのでなるほどとか思った。胡椒餅も美味しかった。

1559568496 1559568532

1559568549 1559568588

その後カルフールでもぶらぶらして、四神湯飲んでないわってことで。このスープが大変よろしい。 今回は一度しか飲まなかったけど。

1559568619 1559568524

ホテルに戻ってビールを飲みながら夜のルートを決めた。結果、蚵仔煎->魯肉飯->臭豆腐->蜆のルートに決定。

1559568578

寧夏観光夜市の通りにある蚵仔煎。美味しい。

1559568601 1559568575

魯肉飯は三元っていうところ。もうちょっと北の龍縁に行くつもりだったのを 記憶障害により間違って入ってしまった。

1559568494

まぁまぁ。フカヒレスープは甘かった。

1559568519 1559568611

臭豆腐は初体験で、今回のタスクに入れていた。実際に食べてみると臭い厚揚げって感じで、味は厚揚げそのものだった。厚揚げの味をしっているとあまり感動がないのかも。

1559568544 1559568606

蜆の醤油漬けが気になっていたので最後に双連鵝家荘に寄って筍のマヨネーズかけと蜆をつまみながらビール飲んで帰ってきた。ガチョウ進められたけど前の日に食べたし、お腹も一杯だったので断った。

1559568609 1559568622

夜市の終わりの辺りで噴水があってキレイだった。

1559568537

3日目

朝はホテルで麺を食べる。しかし粥のほうが美味しかった。

1559568489

チェックアウト後、台北駅に移動してコインロッカーに荷物を入れる。淡水信義線(中山駅から行く方)のほうがコインロッカーが多いが北門より(桃園行きの台北駅の西側)のほうが空いてるし、荷物を引き取りやすいのでそっちのほうがおすすめかも。

今日の目的は三重地区にある今大魯肉飯です。最寄り駅はMRT中和新蘆線の菜寮駅なんですが、ずっと三重駅で降りると勘違いしていて、桃園台北線の三重駅で降りた。ちなみに三重駅は台北の次の駅なんですが、Expressは停まらないのでCommuter trainに乗りましょう。そして、台北駅ではプラットフォームが別なので注意してください。僕はExpressのプラットフォームで待っていて、いつまでたっても乗れない罠に引っかかりましたw。

これが(通らなくてよい)三重の通りです。10分ほど歩くと中和新蘆線の菜寮駅に着きます。そして着いたときに最寄り駅を間違っていたことに気づきました。

1559568517

五差路みたいなところの横断の仕方がわかりにくくて初回は苦労します。公園みたいなところに鳥居もどきが立っていました。

1559568539 1559568604

今大魯肉飯は大仁街にあるそうです。

1559568616

お店は、地元の人で行列ができていました。お昼時だったので20分弱は待っていたような気がします。

1559568554 1559568590

グツグツ感満載の鍋からドシャードシャーと持っていました。魯肉飯と煮玉子&豆腐、香菇排骨を注文したのだけど、香菇排骨の読みがわからなくて注文に苦労したので、食べたい料理の発音くらいはきちんとしておかないと困る。

1559568534

魯肉飯+煮玉子&豆腐。なにも言うことない。

1559568593 1559568635

香菇排骨が美味しすぎた、幸せ。

1559568552

ちょっと遠いけど行く価値のあるお店でした。

さて、察しのいい皆様であれば「なんで牛肉麺いかんのや?」と思われるでしょうが、理由は単純で、一杯の量が多くてそれなりに値段(観光地価格)がするので、一杯食べると他のものが食べられなくなるので避けていたということです。しかし、全てのタスクをこなした今、食べない理由が特にないwということで。北門と西門の中間にある富宏牛肉麺に行ってみました。

1559568640

もちろん日本語は通じないので、あらかじめ仕込んでおいた「シャォワン」で乗り切ります。これで牛肉麺(小)が出てきます。小でも量が多いわ、、、

1559568624

これで食欲が消え去ったので、中正記念堂にポケモン(サニーゴ)でもとりに行きました。西門から乗って2駅くらいだしね。

サニーゴは取れなかったけど、マグネットルアーが炊かれていたので、ジバコイルとひげモアイの進化ができました。 ちなみに右の記念堂の階段は89段あって、蒋介石の寿命にあわせているそうです。後はwhite sun in the blue skyだっけな、台湾の国旗を考慮したデザインになっているそうです。

1559568583 1559568512

中正記念堂でダラダラしていたら1800くらい。あと5時間どう過ごそうかなと悩んでいたら、「ま、ビールでも飲むか」って事になって北門を上がって5分強のところにあるミッケラー台北店へ。佇まいは小洒落ています。中もキレイです。

1559568491 1559568644

ビール一杯の値段も日本と変わらず250NTD(1000円位、8魯肉飯)です。美味しいクラフトビアが飲めるので問題なし。

1559568527 1559568637

お店を出たのが2000くらいで、小腹も空いたことだし、昨日行き間違えた龍縁でも行くかと。そのまま東へ。

1559568629

全くもって美味しいですな。完全に満足。

1559568580 1559568642

この時点で2100前で、帰りの飛行機のチェックイン開始が2350だったので、2300くらいまで台北に滞在したかったんだけど、お店もなくて、2200のExpressで桃園に移動してチェックインまでダラダラしてた。2100以降何をして過ごすかはちょっと決めておかないといけなかったっぽい。

出国審査後の廊下にホワイトウォーカーがいました。最新話が気になる。

1559568614

0600くらいに成田に到着して、0725の高速バスで帰ってきて、帰りは新幹線で帰宅。楽しかった。

今回気になったこと

持ち込み荷物が7kg制限と10kg制限は全然違う。7kgは普通に詰めるとすぐに到達するのでお土産を入れる余裕がない。何か買うなら10kgまでいけるLCCが必須。

今回15000円も使ってなかったので両替もそれほど必要なかった。

熊本に行ってきました

熊本に行ってきました。新幹線で行ったのだけど、乗り継ぎのタイミングがシビアでお昼がとれなかった。

というわけで夕方遅めのラーメン@天外天。にんにくすごかった。

1558518546

夜はむつ五郎。右はなんとかぐるぐる

1558518536 1558518539

馬刺しの寿司とくまもん(焼酎名)

1558518532 1558518561

馬肉

1558518555 1558518575

からし蓮根も忘れなかった

1558518567

次の日は用事を終えたら、太平燕を食べた。あっさりしていて美味しかった。

1558518541 1558518570

帰りは真の「さくら」に乗れた。よい

1558518550 1558518552

和風のシートで日本酒をいただきながら帰った。

1558518573 1558518558

12月に熊本に行くことが決まっているので、今度は熊本城とか行きたい。

肉まん

連休の最終日に肉まんを作った。本当はsiopaoを作ってみたかったんだけど、味がわからんので今度フィリピンで食べたらトライしてみようと思う。

1558258413 1558258409

1558258411

粉物だったらとりあえずこれを買っておけば十分楽しめる

ProductName ウー・ウェンの北京小麦粉料理
ウー・ウェン
高橋書店 / 1728円 ( 2001-11-30 )


curry

子供がチャーハンを所望したのだけど、僕はカレーが作りたい気分だったので両方作った。

今回ちょっと水を足しすぎてしまった。ヨーグルトを入れなかったので分量を見誤ったかも。

1557218087

自分の分だけジャスミンライスも炊いた。

1557218085

子どもたちは隣でチャーハンを食べてたw

たくあんのみじん切りをチャーハンに加えると美味しいという事実から、普通に大根のみじん切りを入れても良いのでは?とう発想に至り、実践した結果食感が良くなったのでこれはアリだという結論になった。

でも、チャーハンにひき肉入れたのは微妙だった。ちゃんと塩漬け肉は常備するべきだなと。