Mishima.syk #17 やります

6/12にMishima.syk #17をやります。

今回もオンラインですが、次回は久々にオフラインでできるとよいですね。

私の発表タイトルは「量子の化学は万能です/Quantum chemistry is omnipotent」にしました。予習はこちらからどうぞ。

内容は

  • GCNとかDLのケモインフォマティクスって期待されてたほど上手くいってるの?盛ってない?
  • そこ畳み込みんじゃうの?まじで?
  • 化学構造をグラフで表現するの抽象化しすぎじゃないの?
  • 今更量子化学になにを期待してるの?
  • Psikit作ってたはずなのに何故GAMESSに回帰したの?

みたいな話をするつもりにしていますが聖女次第です。

ProductName 蜘蛛ですが、なにか? (カドカワBOOKS)
KADOKAWA / ¥1,188 (2015-12-10)

LLPS and DDS

先週はCBIの「液-液相分離(LLPS)と創薬」というセミナーを聞いてました。

感想としては「創薬との距離感相当ありますなぁ」という感じでした。完全に'Key and Lock'のコンセプトから外れてるし、天然変性タンパク質にこのコンセプトで干渉しようとするのもかなりハードル高そうに感じました。

どちらかというと、DDSの手法を用いて治療コンセプトを証明していくような方が自然なのかなぁと。オルガネラターゲティングとかの細胞内の局在コントロールみたいな。

ProductName 相分離生物学
東京化学同人 / ¥3,520 (2019-08-02)

なんとなくこれから求められていく治療コンセプトが、もっと上手に生体をハックしていく方向にシフトしていくのかなぁと。そうなってくると、分子生物学の知識がますます求められていくのだけど、それを理解するためには物理化学、化学も精通してないといけないという(LLPSなんて化学だしねぇ、でも解いているのは生物の問題という)。

ハードモードに突入するんでしょうかね?

肉じゃがとモダリティと私

いつもの産直詣でをしたところ、ちょうど出始めの新じゃがいもが手に入ったので肉じゃがを作ってみた。

作り方は至って簡単で、

新じゃがと豚バラを塊のまま蒸し器に放り込んで1時間以上放置。その後適当にザクザク切って片栗粉でとろみをつけただし醤油餡を回しかける

この肉じゃがの作り方の気に入っているところはオーソドックスな煮るタイプの肉じゃがと異なり、蒸していることつまり単に具材でなく調理プロセスという枠組みを再解釈しているところだ。

で、モダリティの話。

昨今のモダリティの議論は低分子から高分子といった具材に限定しているように思う。要するに「牛肉を豚肉に変えてみた」とか「砂糖の代わりにスプライトを入れてみました(これはこれで美味いw)」とか。

本当のモダリティとか、イノベーションっていうのはやっぱり枠組みを再考することでしか生まれないんじゃないかなぁと思いつつ肉じゃがを頂いたのであった。

ProductName 小山裕久の日本料理で晩ごはん
朝日新聞社 / ¥51 (2001-10T)

pygamessがTD-DFTとNMR計算をサポートしました

なんとなくこの本の15章をやりたくなったので、朝からゴニョゴニョしてた。色々できたのでバージョン上げておいた。

TD-DFT

データはおなじみのPubchemQCからダウンロードしてきてopenbabelでmolファイルにコンバートしたものを利用。

>>> from pygamess import Gamess
>>> from rdkit import Chem
>>> m = Chem.MolFromMolFile("examples/methyl_yellow.mol", removeHs=False)
>>> g = Gamess()
>>> g.dft_type("b3lyp", tddft=True)
>>> g.basis_sets("6-31G*")
>>> r = g.run(m)
>>> r.uv_spectra # (exitation ev, oscillator strength)

NMR spectra

これは時間がかかった(2020 MBAで30分以上)

>>> from pygamess import Gamess
>>> from rdkit import Chem
>>> m = Chem.MolFromMolFile("examples/C=CCBr.mol", removeHs=False)
>>> g = Gamess(num_cores=1) # PARALLEL EXECUTION IS NOT ENABLED.
>>> g.basis_sets("6-31G*") 
>>> g.run_type("nmr")
>>> r = g.run(m)
>>> r.isotropic_shielding

独習量子化学計算について

わかりやすくて良い本だった。ケミストだったら本書に沿って一通り手を動かしておけば、後々役に立つのではないかと思った。

こっちはいわゆるクックブックみたいな感じ

Free Ligand 1D NMR Conformational Signatures To Enhance Structure Based Drug Design

This was a very interesting paper.

The correlation of kon with free ligand preorganization implies 1D NMR signatures can augment structure−kinetic relationships; when kon is optimized by highly populated bioactive states, potency will be driven by koff.

Storing GAMESS calculation results in RDKit Chem object

Japan is under a state of emergency for the third time, which forced me to do self-quarantine. After all, my five days of GW holidays were spent developing the pygamess library.

This is an example of storing GAMESS calculation results into RDKit's Chem object. I will calculate the two molecules, ethane, and ethanol, to export as an SDF file later.

>>> from pygamess import Gamess
>>> from pygamess.utils import rdkit_optimize
>>> from rdkit import Chem
>>> ethane = rdkit_optimize("CC")
>>> ethanol = rdkit_optimize("CCO")
>>> g = Gamess()
>>> g.run_type("optimize")
>>> ethane_result = g.run(ethane)
>>> optimized_ethane = ethane_result.mol
>>> ethanol_result = g.run(ethanol)
>>> optimized_ethanol = ethanol_result.mol

Orbital energies and dipole moments including HOMO and LUMO energies are stored in the object. Each atom is also assigned a mulliken charge/lowdin charge.

>>> optimized_ethane.GetProp("HOMO")
'-0.46029999999999999'
>>> optimized_ethane.GetProp("LUMO")
'0.65559999999999996'
>>> optimized_ethane.GetProp("dipole_moment")
'1.9999999999999999e-06'
>>> optimized_ethane.GetProp("orbital_energies")
'-11.0355 -11.0352 -0.981 -0.8121 -0.572 -0.572 -0.4717 -0.4603 -0.4603 0.6556 0.6556 0.687 0.737 0.7814 0.7893 0.7893'
>>> for a in optimized_ethane.GetAtoms():
...   print("{}:\t{:.4f}".format(a.GetSymbol(), float(a.GetProp("mulliken_charge"))))
... 
C:  -0.1748
C:  -0.1748
H:  0.0583
H:  0.0583
H:  0.0583
H:  0.0583
H:  0.0583
H:  0.0583

Finally, I'll export the object to SDF.

>>> optimized_mols = [optimized_ethane, optimized_ethanol]
>>> w = Chem.SDWriter('test.sdf')
>>> for m in optimized_mols:
...   w.write(m)
... 
>>> w.close()

Looking at the exported SDF, we can see these results are persisted.

$ cat test.sdf
     RDKit          3D

  8  7  0  0  0  0  0  0  0  0999 V2000
   -0.7687    0.0082   -0.0152 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.7687   -0.0082    0.0152 C   0  0  0  0  0  0  0  0  0  0  0  0
   -1.1742   -0.1016    0.9863 H   0  0  0  0  0  0  0  0  0  0  0  0
   -1.1352    0.9432   -0.4285 H   0  0  0  0  0  0  0  0  0  0  0  0
   -1.1499   -0.8048   -0.6260 H   0  0  0  0  0  0  0  0  0  0  0  0
    1.1499    0.8048    0.6260 H   0  0  0  0  0  0  0  0  0  0  0  0
    1.1742    0.1016   -0.9863 H   0  0  0  0  0  0  0  0  0  0  0  0
    1.1352   -0.9432    0.4285 H   0  0  0  0  0  0  0  0  0  0  0  0
  1  2  1  0
  1  3  1  0
  1  4  1  0
  1  5  1  0
  2  6  1  0
  2  7  1  0
  2  8  1  0
M  END
>  <total_energy>  (1) 
-78.306179626800002

>  <HOMO>  (1) 
-0.46029999999999999

>  <LUMO>  (1) 
0.65559999999999996

>  <nHOMO>  (1) 
-0.46029999999999999

>  <nLUMO>  (1) 
0.65559999999999996

>  <dipole_moment>  (1) 
1.9999999999999999e-06

>  <dx>  (1) 
-0

>  <dy>  (1) 
-1.9999999999999999e-06

>  <dz>  (1) 
0

>  <orbital_energies>  (1) 
-11.0355 -11.0352 -0.981 -0.8121 -0.572 -0.572 -0.4717 -0.4603 -0.4603 0.6556 0.6556 0.687 0.737 0.7814 0.7893 0.7893

>  <atom.dprop.mulliken_charge>  (1) 
-0.174764 -0.174764 0.058255000000000001 0.058255000000000001 0.058254 0.058255000000000001 0.058255000000000001 0.058255000000000001

TODO: Add GAMESS calculation conditions as attributes, like "HF/6-31G**".

就職Hacks (製薬企業のDryポスト)

製薬企業でDryのポストを狙っている学生の方々は、おそらくバイオインフォマティクスやケモインフォマティクスの研究室に在籍しているか、ウェットの研究室の担当でDry解析も掛け持ちしているとかだと思います。なので、NGS解析用の既存のコードをモディファイするなり、研究室でメンテされているコードをちょいちょい書き換えたりして、研究成果を出しているのだと思います。就職活動で製薬企業でDryのポストを得るためには研究成果以外にも解析能力やコーディング能力をアピールできると良いと思いますので、損にはならない(と私が思っている)方法を2つほど紹介したいと思います。

GitHubは使えるようにしておこう

書いてあるとおりそのままです。アカウントがなくて成果物がアップロードされていないとしても、PRやイシューを送ったことがあるかといった経験はあったほうが良いかなと思います。

競技プログラミングにもちょっと手を出しておこう

プログラミングを楽しめるということもDryでやっていく研究者として重要な資質かなと思います。インフォマティクス系のポジションを狙っている場合、もしかしたらアルゴリズムに関して質問されるかもしれません。そういった場合にある程度基本的なアルゴリズムやデザインパターンなどに関する知識があったほうが良いかなと思います。

競技プログラミングは色さえついていれば良いと思います。無色透明よりは断然マシでしょう。あんまり聞かれることはないと思いますが、もし私が面接官をやれと言われたら間違いなくする質問だと思います。TOEICのスコアと同じくらいにわかりやすい参考値だしね。

「Kaggleで勝つデータ分析の技術」を読んだ

データ分割の考え方とか特徴量作りのコツみたいなのが丁寧に書いてあって大変参考になった。

ある程度Pythonで機械学習をやっている人向けの本ですね。

ProductName Kaggleで勝つデータ分析の技術
技術評論社 / ¥3,428 (2019-10-09)

いつもはランダムフォレストでいいやーって感じなんだけど、ハイパーパラメータのチューニングめんどくさいしXGBoostかLightGBMに改宗したほうがよいのだろうか。

Looking Back 2020

去年の振り返りはこちら。今年は色々あった気がする。特に後半は常にいいことと悪いことがセットでやってきて トータルちょっといい みたいな感じがデフォルトになってしまったので、まぁそういうもんかなと思うことにした。

仕事関連

組織とチームが大きく変わった。今まではcomputer chemistryのチームとして合成部門の中で適当に成果を追求していれば良かった、つまり、メディシナルケミストとしてプロジェクトにどう関わっていけばいいかを考えていれば良かったのだけど、上司も変わって、bioinformaticsのチームもマージされて幅広くマネジメントしなければいけなくなり苦労した。特に、Lead FindingとかLead Optimizationだけでなく5RでいうところのRight Target, Right Patientも担当範囲になったのでなかなか大変な一年であった。とはいえ、computer chemistryチームはプロアクティブに動けるメンバーばかりだったので相当助かった。新しく一緒に働くことになったbioinformaticsのチームはモチベーション高いし、薬理学の知識は十分あるので方向だけ揃えればとりあえずうまく成果がでそうなので良かったが、来年はもう少しBioinformaticsのコード書くスキルを上げていってなにか新しいことをやりたい。コンピューターサイエンティストはコードに自分の新しいアイデア込めてなんぼやしね。

それから、夏前にcomputer chemistryのチームに日本語をほとんど話せないインド人の方がジョインした関係でチームの共用語が英語に切り替わった。企業年金とかコンプライアンス教育とか賃金制度とかそういった日本語の文書を英語で説明しないといけなくて、どうすんのこれ?と思ったけど意外と慣れたw。それから彼はアカデミアからの転職なので色々刺激を受けているし彼のpaperworkにかける思いは非常に強くて「やっぱ論文書かないとなー」という気分にさせられる。

ちなみに、英語で表現できなくてもどかしい思いをするのはなぜかと考えた場合に、一番大きいのは使えるverbが少ないなーとかいうことかなと思ったので使えるverbを増やすようにしている。グラマーもっとちゃんと勉強しないとあかんなという気持ちになるのも良かったけどもSとOはなんとなく表現できるしな。以下の本は役に立った。

ProductName 外資系1年目のための英語の教科書
KADOKAWA / ¥2,079 (2020-03-14)

今年は低分子以外のモダリティに関してもSBDDで成果を出したし、X線結晶構造やクライオ電顕によらないSBDDにもチャレンジしたし、来年も引き続きSBDD力を高めていきたい。そしてcomputer chemistryとbioinformaticsのチームにもう少し人を増やしたいと思っている。

仕事以外

前述したようにうちのチームにジョインしたインド人の方が南インドの出身なので、そのあたりの食べ物に関してネホリンハホリンしたため南インド力(食)が向上した。それから色々本場のスパイスミックスを頂いたので新しい料理や調理法などを色々覚えた。コロナが落ち着いたらインドに舌の修行にでかけたいところ。

それから在宅勤務がデフォルトになったおかげで毎日ぬか床をかき混ぜる余裕を持てて、今年はぬか床と年を越せたのは嬉しい。来年はもう少しいい感じに漬けられるように精進したい。

他にはホームメードベーカリーのコネ機能を使えばラーメンの手打ちが簡単にできることに気づいて、パスタマシンを併用してラーメン作りが本格化したことか。加えてリパブリューの店長にラーメン指南を受けているし、静岡のエンジニアはカレーとラーメン作れてなんぼっていう風潮が出来上がっているっぽいのでこちらも精進必須ですな。というより、静岡のエンジニア界隈はいつも仲良くやれていて良いですね、素晴らしい。

悲しみとしてはmacのOSをアップグレードしたらTraktor Kontrol S4が動かんようになってしまったことでmk3買うかどうか本当に悩んでいる。

今年はコードを書く暇が殆どなかったのも振り返ってみると大変残念なことであったので、来年はもう少し書けるように工夫するというか書く。書かないといいアイデアも浮かばないし、ネタとして発表も出来なくて悲しい。

海外に遊びに行けなかったのは辛かった。かろうじてホーチミンに行けてラッキーだったがその後に予定していた台湾、バンコク、モントリオール、スペインは無理であった。

多分来年も似たような感じだろうから、沖縄にいってやちむん爆買したい。

生成モデルを使って何するの?

生成モデルを使ってより良い化合物提案を効率的に行うアプローチが今年もいくつも提案されています(新しいかどうかは別にして)。

最近だと、2017年に提案されたREINVENTのスコア関数を工夫し、ここにファーマコアを使うというものが出ています。

REINVENTは強化学習で方策をかえるやつだから、スコア関数だけ工夫をすれば色々出来て楽しいけど、実際のプロジェクトで成果を出そうと思うとセンスを問われますね。それから、せっかくファーマコフォアを使っているのだから多様なスキャフォールドを提案してきてほしいけど、REINVENTだとなかなか難しそうに感じるのだけどそのあたりどうなんでしょう?単に化合物ライブラリをファーマコフォアでヴァーチャルスクリーニングかけるほうが良い結果を得られるような気がします。

自分がこの手法に期待するとすれば、 市販化合物に存在せず、かつ合成可能であり、ファーマコフォアを満たす新規な化合物の提案 ということになるのかなと。

もう一つちょっと前にpublishされたのがVAEを使ったもので、ドッキングシミュレーションのスコア関数をたよりに潜在空間を探索するもの(多分、アブストしか読んでない)

ちなみにREINVENTのスコアにドッキングスコアを放り込む方法が既に提案されています。

ただ、ドッキングスコア自体がかなり荒い評価関数なのと、ドッキングポーズの推定がそもそもあまり精度が高くないのでまずはドッキングシミュレーションの精度を上げるほうが先に成すべきことなんではなかろうかと思ってしまいます。

個人的にはLead Optimizationのような骨格を決めてその周辺を探っていくようなフェーズではREINVENT使ってプロジェクトにあわせてスコア関数を工夫すればいいと思っているけど、それよりも前のフェーズで構造に多様性を求めたいフェーズでは潜在空間探索させるのがよいかなーと思っているのでVAE+SELFIESの組み合わせはかなり興味があります。こっちも工夫のしがいが沢山ありますしね。