ビリ病み中

最近ビリヤニを結構な頻度で作っていることは以前書いたとおりですが、近頃はkohinoorのバスマティライスが売ってないし、売っててもかなり高いんですよね。困った困ったと、色々違うブランドのバスマティライスを買ったんだけどイマイチなんですよね。

イマイチといえば先週炊飯器カオマンガイをバスマティライスで作ってみたんだけど二重の意味でいまいちでした。まずバスマティライスがパラパラしすぎ、あと炊飯器で鶏肉炊いちゃうと固くなりすぎてなんか違う感が強いです。

というわけで、色々食材を探し始めていまして

  • バスマティライス(美味しいやつ)
  • ジャスミンライス(タイ米)
  • ラム肉(ビリヤニ用)
  • ぬか漬け(自分で手入れするか悩み中)

ぬか漬けは近所に漬物屋さんを発見したのでそこで調達することにしました。水なす美味かったです。 バスマティライスはLal Qillaを大量に買っておいてkgあたりの値段を抑えるか、、 ラム肉は見つけられていない。

ジャスミンライスを探していたらアジア食材店を発見したので早速行ってきました。店内に入ると、「東南アジアの市場の香りだー」ってなります。あれ一体何由来なんでしょうねぇ。ジャスミンライスと、タイカレーとシニガンスープ素をいくつか買いました。尚、帰ってきてからチャトラムー(タイティー)の茶葉買うの忘れていたことに気がついた。

カオマンガイも「沸騰した鍋に鶏もも肉を放り込んで放置するのを二回繰り返す」んだから、低温調理で良かろうと調べてみたらその方向性であっていたのだけど、炊いたスープでコメを炊くプロセスどうすんのかなぁとさらに調べたら鶏ガラスープのもとでよいっぽいので次回はそれで試してみる予定。

となるとカオマンガイ用の皿が欲しくなるわけで、物欲が止まることはない(泣)

PIEDA Analysis of the Bromodomain in Complex with the Acetylindole Compound UZH47 (PDB ID: 6FGL)

Two things made me really happy. First, these articles(1,2) showed me how to preprocess PDB files for FMO calculations in a straightforward way. Second, thanks to faster CPUs these days, I found that FMO calculations on my MacBookAir with about 300 residues can now finish in just one day. That’s pretty amazing—20 years ago, it would have taken nearly a week using around 20 cluster machines!

An example is here

6fgl_1

6fgl_2

6fgl_3

信楽作家市に行ってきました

GWは9日間の休みだったのですが、ほとんど引きこもってコードを書いてました。そのおかげで、FMOkitも大分まともに動くようになってもうすぐプロダクションレベルになりそうです。

この休みで唯一遠出したのは信楽の作家市と陶器市でカレー用のプレートとボウルを一つづつ揃えました。

今の部屋のキッチンがショボく自炊する気はサラサラなかったため、食器もダイソーのプラスチックの雑な器を使っていたのだけど、ライスクッカーでビリヤニが作れることを知ったりとか、近所にいい感じのスパイスショップがあるという情報を仕入れた結果、 「いい食器買って、ちゃんとした食事を作らなあかんやん」となり、ちょうど火祭りあるじゃんとなって信楽にGoした次第。

というわけで、この休みの間はほぼ自炊してました。そして、スパイスがやたらと増えましたw

一度皿を買うと物欲が止まらなくなりますね。カレー用に青い皿とか、やちむんのラーメンボウルとか萩の器とか揃えたい感が高まりまくっている。

Doing FMO Calculations on My MacBook Air: It Works!

After repeatedly rewriting input generators for FMO calculations each time I changed jobs, I decided to develop and maintain them as open-source software — and that’s how FMOkit was born.

To successfully carry out FMO calculations, we must overcome three major challenges:

  • Compiling GAMESS
  • Preparing PDB files (adding hydrogen atoms and assigning charges)
  • Generating FMO input files

In the following sections, we’ll examine each of these in detail.

Compiling GAMESS

Precompiled binaries are available for Windows and Intel-based Mac. On Linux, compilation is required, but the process is relatively straightforward. For Macs with Apple Silicon (M1–M3 chips), modifications to the source code are necessary. Please refer to the following Japanese article for detailed instructions.

Preparing PDB files (adding hydrogen atoms and assigning charges)

FMO (Fragment Molecular Orbital) calculations are a type of quantum chemical simulation, and thus require that hydrogen atoms and fragment charges be explicitly included in the molecular system. However, standard structural formats such as PDB files typically lack this information, so it must be added during preprocessing.

While commercial molecular modeling tools like Maestro or MOE are often used in pharmaceutical companies and academic labs, I opted for an open-source solution. After evaluating various options, I chose OpenMM, a molecular dynamics toolkit, as a backend for preprocessing.

You can use the script mmcifutil.py located in the utils directory to add hydrogen atoms and assign partial charges to all atoms:

python mmcifutil.py input_file output_file

For details about how the code works, please refer to this article.

Generating FMO input files

Aside from securing computational resources, generating input files for FMO calculations is arguably the most complex and unintuitive part of the entire workflow. Creating these inputs manually is not only extremely difficult, but also arguably inhumane in terms of workload and error-proneness.

Motivated by the desire to automate FMO input generation from structural data in the mmCIF format (with planned support for mol2 in the future), I began developing FMOkit.

If you prefer a graphical interface for preparing input files, I recommend using Facio, a GUI tool specifically designed for FMO workflows.

The code is shown below, using chignolin, one of the smallest known proteins, as an example.

>>> from FMOkit import System
>>> s = System(nodes=1, cores=8, memory=12000, basissets="6-31G")
>>> s.read_file("tests/5awl-addH.cif")
>>> s.prepare_fragments()
>>> with open("5awl-fmokit.inp", "w") as f:
...     f.write(s.print_fmoinput())

Although command-line interface (CLI) support is planned in the future, the code was executed from the Python console for verification purposes in this example.

The FMO calculation (RHF/MP2, 6-31G basis sets) for this 10-residue protein completed in approximately 40 minutes on my MacBook Air (Apple M3, 2024, with 16 GB of memory).

% time ~/gamess/rungms 5awl-fmokit.inp >& t5awl-fmokit.out
~/gamess/rungms 5awl-fmokit.inp >&5awl-fmokit.out  2351.21s user 142.53s system 99% cpu 41:44.37 total

ビリヤニを炊飯器で炊けると知って

まずはこれを見てほしい

一人暮らしする前のビリヤニ作りは、カレーを作ってから蒸しかけのバスマティライスを投入するというちょっとだけめんどくさい工程を踏んでいたのだけど、最近このレシピを知ってから、この一週間で既に3度ビリヤニを作ってしまった。カレーだと玉ねぎ炒める間、キッチンに立ってないといけないのだけど、炊飯器ビリヤニだとその工程を省けるので他のことができて良いですね。

ただ、もともと自炊する気がなかったので、炊飯器がしょぼい。胸肉を低温調理するだけのお仕事しかさせてなかった5000円くらいで買った低温調理機能付き炊飯器(三合炊き)に、急遽バスマティライスを炊くという炊飯器としての本来あるべき役割が与えられたのですが(尚、日本米は買ってない)。三合炊きはビリヤニ一合しかつくれないんで、レシピは半分の量でやっています。

さらに、もう少し手抜きで作りたいということで、

で、ブログ書いたり洗濯したりの合間でビリヤニができていくのでタイムパフォーマンスも良いです。

最近のワタシ

昨日長文を書いていたらうっかり消してしまった。

先週木曜日は、チームの人達に歓迎会を開いていただき楽しく飲みました。ちょっと立ち位置がわからなくて手探りな状態ですが、皆さんの人となりを少し理解したかなと思います。一次会のお店も良かったですが、二次会で行った梅田のハイボールが美味しくてオッ!となっていました。

金曜日は、昔から知り合いの方々とディープな焼き鳥屋での歓迎会でした。ワタシ好みのお店で食べ物が大変美味しかったです。また、メンバーもほとんど20年近く付き合いのある方々で今の会社に所属している人もいれば、他社の人もいたりしたんだけどいろいろなことを気兼ねなく話せてこういう関係性は大切なんだなぁと改めて感じました。ちなみに参加者の中にうどん屋に一緒に行った方がいたのでその話をふってみたけど覚えてなかったw。

土曜日は、いつもの立ち飲み屋に刺し身目当てに行ったのですが、ひょんなことからスパイスの話になり(ちょうど今もビリヤニを作っている)おすすめのスパイスショップを教えてもらって、帰ってから地図を確認したらまさかのうどん屋の隣であることがわかり、これは行かねばとなりました。

というわけで日曜日は自転車の点検をしてもらいつつ、うどん屋とスパイス屋に行ったのだけどまさかのスパイス屋がおやすみでした。うどん屋さんは堪能したのだけど、近いうちにもう一度行かないといけないことが決定しました。次はキーマカレーうどんを食べる!

Creating mmCIF file with hydrogen atom and partial charge appended

To create an input file for FMO calculations, we need both the structural information of the protein with hydrogen atoms included and the charge information for each fragment. However, since PDB files do not contain hydrogen atoms by default, we must add them using an external tool. Additionally, because the PDB format does not provide a field for storing partial charges, we repurposed the temperature factor field for this purpose.

Since the mmCIF format allows partial charge attributes to be added without unnecessary hacks, I wrote the code in openMM and gemmi.

from openmm.app import *
from openmm import *
from openmm.unit import *
from sys import stdout
import gemmi

pdb = PDBFile("1AKI.pdb")
forcefield = ForceField('amber14-all.xml', 'amber14/tip3pfb.xml')
modeller = Modeller(pdb.topology, pdb.positions)
residues=modeller.addHydrogens(forcefield)
system = forcefield.createSystem(
    modeller.topology, 
    nonbondedMethod=PME, 
    nonbondedCutoff=1.0*nanometer, 
    constraints=HBonds)

partial_charges = []
for force in system.getForces():
    if isinstance(force, openmm.NonbondedForce):
        for atom_index in range(force.getNumParticles()):
            charge, sigma, epsilon = force.getParticleParameters(atom_index)
            partial_charges.append(str(charge)[:-2])

with open('tmp.cif', 'w') as f:
    PDBxFile.writeFile(modeller.topology, modeller.positions, f)

doc = gemmi.cif.read('tmp.cif')
block = doc.sole_block()
loop = block.find_loop('_atom_site.type_symbol').get_loop()
loop.add_columns(['_atom_site.partial_charge'], value='?')
pcs = block.find_values('_atom_site.partial_charge')
for n, x in enumerate(pcs):
    pcs[n] = partial_charges[n]
doc.write_file('output.cif')

I’m getting tired of writing FMO input generators every time I change jobs, so I’ve decided to upload them to GitHub as open-source software.

久しぶりに走った

ジョギングしようと思っていたのだけど先延ばしにしていたが、やっと走ってきました。ただ今回のルートは結構気を使う感じだったので次はないかな。

走る気が起きなかった理由は

  • 快適に走れるルートがわからなかった、川沿いとか公園とかが近くになかった
  • 自転車強すぎ、歩道は右も左も走るし、車道も右側激走するロードとかママチャリがいて恐怖

みたいな感じで、自転車でジョギングに適した公園に行って走るのがよいんじゃないかと思っているけど、そのような場所が見つかっていない。

もう少しウロウロしながらランナーの挙動を追いかけよう。

コミュニティよもやま話

私は市場とか好きすぎて日本でも海外でも市場巡りをするんですが、元豊中在住者に豊南市場情報を教えてもらっていたら、実は昔豊中のうどん屋で地域Rコミュニティの懇親会やったぞっていう補足情報をいただいて、急激に当時のことを思い出しました。

そういえばShiga.Rやったなー、しかも15年前にw。Blog書いておくとこういうときに記憶の補完になるので大変役立ちますね。

で、一個思い出したのは懇親会に参加していた立命の講師の方との会話で、

「ケモインフォとかIBISとかNeurIPSとかキャッチアップしといてケミストリーに転用すればいいから楽っちゃ楽ですよねー」

的なことを言ったら

「それってサイエンスティストとしていいんですかねーオリジナリティを出さないサイエンス楽しいですか?」

みたいな返しをされて、確かにそうだよなーと思い、なんとなく企業研究者だろうがオリジナリティの追求、SOTAを超える姿勢みたいなのを強く打ち出すようになった気がします。あとは前職の計算科学チームのレベルの高さにも恵まれてお互いプッシュし合って高みを目指すことも良かったように思います。

もう一点思い出したのは、「あの頃Rの地域コミュニティたくさんあったなー」ってことで始まりはTsukuba.Rだよなーと調べたら2008年くらいの話でした。Japan.Rも2010から続いているし、息が長いなぁと感心していました。

先週上司と1on1していて、「強いチームを作るためにどういうことをしていましたか?」って聞かれて

  • ストレッチした目標
  • オリジナリティの追求、SOTAを超える姿勢をもってもらう

ぐらいしか思い浮かばなかったのだけど、よい社外コミュニティで意見をぶつけ合うっていうのもそうなんかなぁと重た次第なのでメモっておきます。

アパート暮らしを快適にするために

20年以上ぶりに一人暮らしをしていますが、快適に過ごすためにやったことをメモ

ロボット掃除機

amazonのセールで買ったeufyを使ってます。さらに奴が存分に働けるようにあまりフロアにものを置かないようにしています。スマホで掃除の指示ができるしちょっと買い物に行っている間に掃除ができるので便利というか必須。

人感センサー付きの電球

トイレとか玄関とか自分でスイッチのオンオフをする必要のない場所はこれに変えました。というか自宅がそうなっていて引っ越したときにトイレの電気の消し忘れが多発したので。しかもかなり安くなってた。

スマートバスマット

要は体重計ですがシャワーの際に必ず乗りますし、メーターが無いのがかなりよいです(体重の確認はスマホで)。体重の記録の確実な習慣化ができますしストレスフリーなので、体重計として考えるとちょっと高い買い物でしたが満足しています。

キッチン周りをどうするかが今後の課題