py4chemoinformaticsを書きました

この記事は、創薬 (dry) Advent Calendar 2019 の4日目の記事です。

分生に来ていますが図書コーナーのbono関連図書のモテ期襲来が圧巻でした。

ProductName 生命科学者のためのDr.Bonoデータ解析実践道場
坊農秀雅
メディカルサイエンスインターナショナル / 3300円 ( 2019-09-27 )


ProductName 次世代シークエンサーDRY解析教本 改訂第2版
清水厚志
学研メディカル秀潤社 / 6160円 ( 2019-12-14 )


chemoinformaticsなみなさんもこれを期に購入してbioinformaticsも勉強しましょう。これからは両方できてなんぼですよ。

ところで、標題の通り我々(@iwatobipenと私)はpy4chemoinformaticsを書きました。そのきっかけがちょうど去年の分生で、ある出版社の方につないでもらいchemoinformaticsの書籍を検討してもらう機会をいただいたのですがボツになってしまいました。その際に目次を書いて提出したのですが、まぁ折角章立てしたんだしGitHubに残そうぜってことになった次第です。

私としてはMishima.sykとしてなんとなく何かを残しておきたかったのと謝辞を書きたかったというのが主なモチベーションですが、そのために共著になってくれた@iwatobipenをはじめ表紙を飾ってくれた@souyakuchan、誤字脱字の訂正を丁寧にしていただいた@antiplastics, @bonohu, @ReLuTropy, @ski_nanko, @torusengoku, @yamasaKit_には大変感謝しております。もちろん、学会などでお会いしたときに直接フィードバットしていただいた方のコメントもとてもありがたく感じています。

ちなみに、GitHubで本を書くのは結構簡単です。知らないといけないのは基本的なGitHubの使い方とasciidocの記法だけです。なぜmarkdownでなくasciidocを使うのかは、こっちのほうが、注釈つけたりするや表を書くのが簡単だからです。HTMLのレンダリングはGitHubのほうでよろしくやってくれますし、pdf化もasciidoctor-pdfでサクッとできます。もし、章には入ってないけどこれが入っていたら初学者は喜ぶだろうなとか、もうちょい高度な内容を章として追加したいなと思ったら気軽にPRしてください。わたしも、そろそろなんか追加しようかなと考えています。

今回表紙が創薬ちゃんなので、急遽駄文をアドベントカレンダーにねじ込むことにしてみましたが、私からのtakeawayは 「自分の属するコミュニティを大切にしよう、そしてそれ以外のコミュニティも同じくらいリスペクトしよう」 です。弱い紐帯の強さは異分野をリスペクトしてこそです。特にDryでやる人は自分の活躍分野を広げるためには現在関与している分野に精通する一方で新たな応用分野を探索する必要があります。そして自分の知らないWetの分野はブルーオーシャンになある可能性があるということは忘れないようにするといいと思います。

それでは今日も食の祭典「分生」を楽しみマッスル。

分生一日目

食の祭典「分生」に来ています。

前泊の夜はshinshinでラーメン。あまり調子が良くなかったので、そのまま就寝

1575371871

朝は軽く粥をいただく。ほんと朝は毎日粥でいいわってくらい粥が好き。間違いない。

1575371856 1575371863

ランチョン並ぶのも嫌なので、タマゴの孵化も兼ねて、呉服町駅近くの「みやけうどん」まで歩く。 博多のうどんってやわやわなのね。なんか初めての体験。

1575371880 1575371878

ポスターをがっつりと見疲れて、休んでいたら@oec014と遭遇。水炊き気になるんだけどお一人さんはなぁみたいな話になり、じゃぁ行くかと。結果的に必然w

とり田に行ってみた。

お通しの半熟卵に肉味噌が敷いてあるやつ。すこぶる美味いのでビールではなく最初から日本酒頼んでおけばよかった。

1575371853 1575371851

白濁したスープが運ばれてきて、まずはネギしゃぶから。肉は「骨付き」「むね」「もも」の三種類

1575371866 1575371868

ゴマサバの味噌がけ。これも日本酒だったな

1575371875

続いてつみれ鍋にしてもらいます。これを食べているとかしわ天が運ばれてきた。

1575371861 1575371858

最後に雑炊にしてもらった。

1575371873

あとはデザートにプリンだけどicloudの同期がまだなのでそのうちアップする。

CBI2019に参加しました

参加された皆様お疲れさまでした。去年よりも参加者が100人以上増えたそうで、ポスターも展示できるほぼギリギリだったようです。そのせいで去年あった電源付きテーブルが撤去されてバッテリー難民がちらほら出たようですがw

私はツイッターでしかやり取りしたことのない人の何人かにお会いできて満足しました。あとは色々とディスカッションしていただいて大変刺激をうけましたので、酒ばっかり飲んでないでもっと色々頑張らなあかんなと思いました。

特にバイオインフォ頑張らねば。来年はバイオインフォのチームからもポスターくらい出せるようにしたいですね(煽っとく)。

個人的には強烈なアハ体験があったので非常に有意義でした。あとポケモン図鑑も一つ埋まって大変よかった。

アブダクション

会場ついて早々に、「このまえ薦めてた本めっちゃ良かったでー」って言われたので薦めてよかったです。名著なのでサイエンティストの皆さんは購入して読みましょう。

py4chemoinformatics

これもマテリアルとしては良いと褒められて嬉しかったです。もともと医学系の出版社に持ち込んでみたけど、販売網の違いで採用されなかったものの、まぁ書いとくかって感じで書きあげたものなので皆さんのお役に経ってよかったです。 あと、この界隈では著名な@yamasaKit_の丁寧な修正が入っているのでクオリティも担保されていると思います。

そろそろ章の追加をしようかなと思っているので、みなさんもケモインフォに対する熱い思いをぶつけてみたいなら新しく章を作ってPRお願いします。

Psikit

Psikitはなかなかイケてると思うし、面白そうという意見を頂いたのだけど、これといった成果が出ていなくてもうちょっとちゃんとやらないといけないなーと思っています。自分では何をやれば成果が出るかはわかっているんだけど、量子化学に寄りすぎていて、具体的な事例を見せないとイメージできないだろうなと。

12月の構造活性シンポジウムでこのあたりの話をしようと思っています。

Kinme

創薬のひろばでKnimeを広めたいって書いたと思うんだけど、実際にシェアして再利用する仕組みをインハウスに作っています。でこの前のMishima.sykでそのあたりの話をしたら、そういうの欲しいって言われたので再実装したものを公開しました。

ちなみにkinmeはknimeのアナグラムで@bonohu考案で、金目鯛は@t_kahiに釣ってもらいました。

悶える?モダリティ

ちょっと前までは低分子の分子設計ばっかりやっていて、その当時は出口戦略重要だよねそのための差別化はやっぱDMPKだよなってことで、PBPKとかPK-PDとかが重要になるんやろねと思っていた。

最近は創薬モダリティの流れで色々な分子設計やり始めていて、よい設計のためには分子生物学理解してないと駄目だよなぁと思うようになってきてる。

モダリティの四面体によると、創薬においては

ProductName 料理の四面体 (中公文庫)
玉村豊男
中央公論新社 / ?円 ( 2017-06-30 )


  • 干渉剤の大きさ(いわゆるモダリティ)
  • 干渉対象 (MoA)
  • 測定系

の組み合わせが重要で、我々が分子設計するためにはモダリティは基本的になんでも扱えるけど、MoAを意識したデザインをするためには分子生物学を理解していないと、よいデザインはできないように思う。特にプロテアソーム系とかエピジェネまわりに触ったりするやつとかそれなりに確度高く設計できると嬉しいよなーとか。

というわけで細胞の分子生物学でも読み直すかという気分になっている。

ProductName 細胞の分子生物学 第6版
ALBERTS
ニュートンプレス / 24530円 ( 2017-09-15 )


新しいモダリティいじるの楽しいけど、それぞれ考え方変えていかないといけないのが手探りですよね

Does Hype Hurt Science Community or Pharma?

最初は長文のエントリを書いてみたのだけど生々しくなりすぎたので全部消し、結局2時間ぐらいを無駄した。

  • 会社: 東京皇国
  • hype: 焔ビト
  • データサイエンティスト: 消防隊
  • hypeの訂正: 鎮魂
  • 転職: ラートム

ちなみにこういう実装できそうにない抽象的なポンチ絵を書き始めると人々は焔ビト化するという設定になってる。

1570350993

炎ハ魂の息吹……黒煙ハ魂ノ解放……灰ハ灰トシテ……其ノ魂ヨ……炎炎ノ炎ニ帰セ ラートム

Mishima.syk #14やりました

参加者のみなさまお疲れさまでした。

一次会はリパブリューでクラフトビール飲みまくり。ついでに創薬ちゃんもいた。

1569135040 1569135043

二次会はうさぎの木でワインと肉

1569135048 1569135046

私の発表はKNIMEの学習環境を構築するっていう話とPyConMYに行ってきたという話でした。PyConは楽しいのでみなさんも参加されるといいと思います。

それから阪医python会の人達にCWLのステッカー配ってきました。IIBMP2019でもう少しもらっておけばよかったかなーと。

今回はKNIMEやCWL、airflowといったワークフロー関連の話が多かったので、KNIMEユーザーの方々の参加が多かったかなと思います。

私のKNIME社内コミュニティーをどう醸成していくかっっていう演題の質疑で、「社外コミュニティーどうするつもりなの?」っていう質問がきて、「うちでイニシアチブとれたらいいんじゃないかな?」って返しといたけど、懇親会で改めてKNIME日本ユーザーのコミュニティも欲しいよねーという話題が出ていたのでそのうちできるんじゃないのかなと思います。GitHubとGitHub Pages使えばサイトなんて簡単に作れるしね。

KNIMEはオープンソースだからそういうコミュニティがまずあって、そこにインフォコムとかのKNIME使って商売している会社がなんらかのサポートするっていうスタイルのほうが健全だし、ユーザーももっと増える気がします。

Greatな岡山の学会に行ってGreatな焼き鳥を味わった

great岡山の学会に参加してきた。

夜は大井町の鳥たかというお店に通った。うますぎ天国。

1568212594 1568212601

晩杯屋はうるさくなければいいけど、酔っぱらい学生とか来たら出る感じ。

1568212599

お昼はラーメン。

1568212597

CWLに入信したの図

1568212604

たまごかけ大学行くのはYAPC以来やなぁとか言っていたけどそのあとIBISで参加していたことを後に思い出した。

ま、どうでもいい。

ワークフロー型プログラミングツールで能力ブーストは良いのか悪いのか?

プログラミングまたは機械学習の高速道路は学習の高速道路に関しての話ですが、ライブラリとかツールキットでブースト問題ってのもあります。

大体どの言語でもライブラリが充実していて、エコシステムを形成していて生産性が上がるんですが行き過ぎたプログラミング環境はどうなんかなーと思っていました。

つまりノンプログラマーのためのプログラミング環境(Pipeline Pilot/KNIME)とかRobot Process Automation(RPA)ってやつです。

ある程度の処理がコンポーネントという単位にまとめられていて、ユーザーはブロックを組み合わせる感覚でプログラミングができて、しかも処理が視覚的にわかりやすいというメリットがあります。さらに学習の初期コストが低いのでプログラミングの素養がなくてもすぐにある程度のことはできるようになります。

が、ちょっと複雑なことをしようとするととたんに複雑怪奇なワークフローになるのと、やりたいことをするためのコンポーネントがないと詰みます。

  • 前者は 結局コード書いてないだけでプログラミングはしているので、解決パターンを知らないと回り道することになる。デザインパターンを知らないプログラマーが陥るのと似た感じ
  • 後者はTensorflowのチュートリアル楽勝だけど実際自分の問題解こうとするとまったくわからんってことになるのと一緒

というわけで、ワークフローツールはどうなんかなーって思っていたのだけど、逆にノンプログラマーが利用して効率的に仕事をするのにはとてもよい選択肢だなと改めて思いました。

じゃぁなんワークフローツールをあんなに嫌っていたんだ?

よくよく考えてたら、ツールに技術がロックされることに嫌悪感を抱いていたのでした。Pipeline Pilot年間使用料がそれなりに大きいのと、すごく使いやすくてこれでしか仕事ができないケモインフォマティストが増えてしまったという製薬業界の語られない闇があります。維持費だけでも馬鹿にならないし、転職先がPP使ってないとキャリアが生きないというねw それってキャリアブルスキルなのか?っていう。一方でPPができたから良いとこに転職できたという事例もないことはないので、それがいいことなのか悪いかは一概にいえないけどね。

で、RPAツールはまさにこのサービスロックを狙っている気がします。そもそもクラス3ちらみせしてRPAのクラス1のツールに年間何百万も払わせるなんてあれなんじゃないのかな。

話がそれたけど、ノンプラグラマーなのにバイオインフォにアサインされた人間のみで構成されているうちのチームはとりあえずKNIMEブーストかけておけばいいだろうっってことでそのための学習道路の整備を急遽していますが、これはこれで色々楽しいですね。既存のKNIMEノード組み合わせてもできない処理は僕がNode作ってやればいいだけだからね。

尚、昨日始めてKNIMEデビューしました。どんだけワークフローツール嫌っていたんだ?って話w

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.

QSP

医薬品研究開発における Modeling and Simulation(M & S)手法の紹介という大変に面白い総説を教えてもらって読んでいる。

これは、事前にTrkAがpainのターゲットであることを知っているからこういう結論に出来たのか、そういう事前知識なしに自然に導かれたのか興味あるところではある。モデルからターゲット候補が出てくるなんて素敵。

QSP モデルによって,今までのモデル解析ではできなかった予測を行った事例を以下に 2 例紹介する.1 つ目は,MID3 白書に取り上げられている神経成長因子(NGF)パスウェイに対する QSP 解析 により,疼痛治療の新規の創薬ターゲットを検討した事例(Example 3)である.この事例では,すで に報告されていた NGF パスウェイを ODE で記述される数理モデル(Model 1)に変換し,さらにその パスウェイモデルを関連因子の神経細胞内外での挙動を反映させたモデルに連結して生理学的に拡張し たモデル(Model 2)を作成して NGF パスウェイの下流での創薬ターゲット候補の探索を行っている. 効果測定の指標として NGF 刺激の結果として観察され,疼痛発現につながると考えられる Diphosphorylated extracellular signal-regulated kinase(dppERK)の蓄積量を用い,モデルの妥当性検討は すでに報告されている NGF 阻害抗体で得られている結果と比較することにより行った.こうして構築 されたモデル内に含まれる因子を,in silico で仮想的に様々な阻害強度で阻害する感度分析により, Tropomyosin receptor kinase A(TrkA)が薬物治療のターゲット候補となる可能性が予測された.

尚、MoAと書くと現状はBabymetalがおすすめされるようです。

ProductName 「LEGEND - S - BAPTISM XX - 」 (LIVE AT HIROSHIMA GREEN ARENA) [Blu-ray]

トイズファクトリー / 6471円 ( 2018-08-01 )


PK-SimってOSSになったの?