2023年12月24日日曜日

つれづれ思うこと 外国語編 その2

まずは「R」の発音から。

というのは、これが最も日本人泣かせの音と言われてきたためである。しかし、ある発音の本で調べてみたところ、それほど深刻にならなくてもよいようなのである。むしろ「L」の発音の方が難しく、気をつけないといけないらしい。

ここで、少し前置きが必要なので、それを先に下に記しておく。

しばしば「R」は「巻き舌」で発音すると書かれている。筆者は「巻き舌」とは、舌先を上側へ巻き上げる(反り返らせる)ことだと長らく思っていた。しかし、本当はそうではなくて「ルルルル」という連打するような音を出すための舌を意味するそうである。そこで、ここでは、次のように区別して書いていこうと思う。

反り上げ舌:舌先を上側へ巻き上げて(反り返らせて)発音する R。アメリカ英語によく出てくる。

ルルルル舌:「ルルルル」というように舌を震わせて連打する R。イタリア語、ロシア語などによく出てくる。なんと、これが本当の「巻き舌」というらしい。

それで実際に R はどちらで発音すればよいのかといえば、どちらでも良いらしい。英語で「ルルルル舌」なんて使ってもよいのか?と思ってしまうが、昔はそのように発音されていたらしく、間違いではないのだそうだ。さらにフランス語のように喉の奥の方で「ガラガラうがい」の要領で発音する R もある。

もちろん学生の頃は、思い切り舌を反り上げて「これがアメリカ米語の R だ!」という勢いで発音していた。しかし、ヨーロッパに行くと(彼らは英語のネイティブではないが)もっと落ち着いて発音しており、ドイツでは「ガラガラうがい」音を少し弱くしたような音だった。フランス語ほどに「ガラガラ音」にするとあまりきれいな音には聞こえないのであるが、ドイツ人が発音する「微かなガラガラ音」はきれいに聞こえる場合がある。

どこかの本に Erde(earth のドイツ語)の発音について書かれていた。16 世紀に書かれた書物の中に Erden という単語をどう発音するかが書かれていたとか。独和辞典にはカタカナ発音として「エアデ」などと書かれている。最近は R がかなり母音化してしまうのである(つまり r が「ア」音になる)。しかし、この R は G 音に近く「地面」から沸き起こってくる地鳴りのような音になると書かれていたような気がする(記憶があやふや)。Erde = 地面 と意味が重なっている。この発音がフランス語から入ってきたとしばしば書かれているのであるが、そうではなくて、中世ぐらいからすでにそのように発音されていたと書かれていたような気がする(自信がないので、また確かめてみますが、どの本に書かれていたのやら?)。

しかし、これを真似しようとすると出来なかった。レストランで赤ワイン Rotwein と言いたいが、赤 Rot のように単語の頭に R があると特に難しい。ドイツ人の発音でも「ホットワイン(熱いワイン)」か「ゴートワイン(山羊のワイン)」などと聞こえる場合がある。

いくらなんでも後者の「ゴートワイン」のように聞こえるわけはないだろうと思われがちであるが、実はこれは誇張でも何でもない。ドイツ語の話になってしまって申し訳ないが、この「R」の舌の位置は日本語のガ行を発音する時の位置に近いのだそうである。つまり、舌先が下に落ちている。これはガ行を発音する時の舌の位置と同じ。そして、舌の根本をもち上げて、喉の奥を狭くする。極端に狭くすると「G」音になってしまう。その時は「これでは反り上げ舌とは全く逆の舌先の位置ではないか」と思い、たいへん困ってしまった。しかし、また別の本には、これらは舌の奥を持ち上げるという点では共通しているのだとも書かれていた。そうなのかな?

いずれにしても、英語の「R」もガ行と同じ舌使いでやってみようと考えた。そこで、grow, green, grape など、G の直後に R が続く単語の発声を何度も練習した。舌をなるべく動かさないようにして GR の部分を発音するのである。なるほど、GR と音が続いていると、ドイツ人のような R の発音が簡単にできた。しかし、やはり Rotwein のように頭に R が来るとダメだった。

NMR の研究者でスイス人はたくさんいるが、ある有名人はものすごく「ルルルル舌」が目立つ。一度、お父様といっしょに来日されたことがあり、二人で母国語をしゃべっていたのであるが、その時も R の部分は全て「ルルルル舌」であった。まあ当然か。ミュンヘンより北部でそんな「ルルルル舌」を聞いたことがなかったので大変驚いたが、英語で発音する「ルルルル舌」もなかなかカッコ良かった。Related residual cross-correlated relaxation(関連する残余交差相関緩和)なんて、聞いてみるとすごい発音だった。しかし、ちゃんと L は正しい L の発音であり、R と L の音がひっくり返っていることはなかった。

そこで、GR 舌方式をちょっと諦め「ルルルル舌」を試すことにした。昔「(第二ではなく)第一外国語」がロシア語であったため、この「ルルルル舌」はそれほど不得意というわけではない。しかし、R がどこかに出てくるたびに「ルルルル舌」をやっていると大変疲れ、おまけに周りからは「あいつ、アホちゃうか?」という目で見られる始末。そこで、またまた調べてみると、この連打を一回だけにしてもよいとのことである。つまり、「ルルルル舌」を「ル舌」にするという意味。舌を口の上部に瞬間的に当て、一回だけ弾くのである。難しそうに見えるが、実は「カレー」の「レ」、「セロリ」の「ロ」と同じなのだそうだ。ここでびっくり。ずっと R の発音が難しいと思っていたら、なんと日本語の「ラ行」とそれほど変わらない音でも OK とは。これが上記で、R は適当に発音してもよく、むしろ L の方を注意しないといけないと書いた理由です。

もちろん、舌先が口内の上部に一回だけパチンとぶつかるので、英米のネイティブの発音とはかなり違ってくる。発音に厳しい人からすると、それはけしからんとなるのであろうが、書籍によると、昔は R をそのように発音していたのだとか。なので、同じ祖先をもつヨーロッパ言語(イタリア語、ドイツ語、スペイン語、ロシア語など)でも「ルルルル舌」が使われているのだそうである。

これの欠点?「反り上げ舌」でかっこよく見せようと思っていたのに、「ルルルル舌」で馬鹿ではないかと見られることかな。。。。まあ、しかし「ル舌」ぐらいであれば、ちょっと下手なカタカナ英語かなというぐらいの見られ方で終わるでしょう。

書籍「脱・日本語なまり」(神山孝夫著)は名著です。かなり専門的な内容でありながら、素人にも分かるような書き方がなされています。そして、著者はアメリカ発音があまりお好きではないようですので、米式発音が好き!という人は見ない方がよいかもしれません。あるいは敵だと思って読んでみると「目から鱗」になるかも。これを読んでから他の発音の本を見てみると、その多くが米語発音に偏っていることが分かります。

上記で、アメリカでは R に反り上げ舌を使い、イギリスでは無視する(「ア」のように、ほとんど母音化する)ということを書いた。しかし、堀田隆一氏の書籍だったような気がするが、次のような事が書かれていた。アメリカでもニューイングランドや南部では "今の" イギリス英語のような R 音を使う。その理由は、昔、ロンドン周辺でその発音しない R が使われており、そこからの移民が多く住み着いたためだそうである。一方、スコットランドやアイルランドでは「反り上げ舌」が使われており、そこからの移民がアメリカ西部を開拓していった。よって、R 発音の違いは英米の違いというより、もともとのイギリスでの方言の違いに由来しているらしい。その意味では、アメリカ英語はむしろ保守的で、そのため広い国土の割には方言が少ないとのことです。なるほど、アメリカ発音の方がちょっと古式で今もそれを引き継いでおり、一方、イギリス発音はその後の変化も加わって今のような発音になったんだ。。。。

まとめると、「反り上げ舌」はアメリカに残る昔の(スコットランドやアイルランドの)発音で、これが英語のすべてだとは思う必要はない。よって、中学校で英語を習い始めて「反り上げ舌」をひたすら練習し、これができないと英語ダメ人間になるなどと思い煩う必要はない(英語ができない場合の日本人の劣等感は、外国人にはまず想像できない)。難しいようならば、日本語のラ行(「カレー」の「レ」)で OK。NHK のラジオ英語講座などは昔からアメリカ英語の発音を重視しており、少し偏りがある。それが英語だと思っていると、ヨーロッパではびっくりする。むしろ、重要なのは「L」の発音であり、カッコいい英語にしたいならば、こちらを徹底的に練習すべし。

2023年12月9日土曜日

魔法の粉 ATP

今回は「口の中に ATP 試薬とゆで卵を頬張りモグモグしていると、口の中で生卵になるかもしれない?」というお話。

A. Patel, L. Malinovska, S. Saha, J. Wang, S. Alberti, Y. Krishnan, and A. A. Hyman (2017) ATP as a biological hydrotrope. 356, 753-756. DOI: 10.1126/science.aaf6846

ミオシンは ATP を分解して筋収縮を引き起こすが ATP との相互作用の Km 値は 40 μM である。まあ薬が受容体にくっつく時の強さと比べると弱いが、生体内ではこの数十 μM の Kd 値でくっついたり離れたりを繰り返す例がよく見られる(薬とは異なり、くっついたままだと逆に悪い場合もある)。それに対して 10-100 倍モル量の ATP が細胞内(~5 mM)にはある。ATP をエネルギー源として使うのであれば、Kd 値と同じぐらいの濃度があれば、それで機能するのではないかと普通は考える。

この論文では、ATP がハイドロトロープ(Hydrotrope) であると主張されている。Hydrotrope とは、低分子量でありながら、その中に親水性と疎水性の両方の部分をもち、他の疎水的な有機化合物を水溶液中に高濃度に溶解させるような特徴をもつ物質のことである。いわゆる洗剤(界面活性剤 detergent)とは異なり、hydrotrope は疎水性部分が短いので、自発的にミセルを組むようなことはない(高濃度にすると自己会合することはあるが)。しばしば ATP のように、負電荷の親水性部分と芳香環の疎水性部分とからなる(両親媒性)。ちなみに detergent などの脂質は疎水性のしっぽの長さによって、自己集合体の形が違ってくる。界面活性剤 detergent はしっぽが短めなので、集合すると小さい球形のミセルとなる。しかし、しっぽが長くなってくると、集合体の直径も長くなり大きい球形のリポソームなどになってくる。さらに長くなると、球にはなりきれずにバイセルや細胞膜のように平面状になる。これで hydrotrope がミセルのように丸くならない理由がイメージできそうである。

著者らは、ATP が細胞内濃度である 2-8 mM に達すると、アミロイドの生成、卵の熱凝縮、液液相分離(1-25 μM FUS etc. with 8 mM ATP-Mg, APPNP-Mg)などを阻害することを示した。要するに、蛋白質どうしの相互作用を ATP が邪魔するのである。これまでは ATP-dependent な酵素のせいで凝集が解けるのだろうと思われていたが、実は hydrotrope としての機能が関与している可能性が出てきた。

塩濃度は液滴に大きな影響を与えなかった(ここでは)。液滴の中には ATP が4倍ほど濃縮されていた。加齢やミトコンドリアの酸化的リン酸化の劣化により細胞内の ATP 濃度が減ると、それにより細胞内にミスフォールドした蛋白質が凝集し、流動性が制限され、病気を引き起こす可能性がある。アルツハイマー病やパーキンソン病のような多くの神経変性疾患は老齢になってから発病するが、これは歳をとるにつれて ATP 濃度が減少するからなのかもしれない。

ATP が FUS 液滴を溶かす点については、GTP も ATP と同じぐらいの効果を示した。一方、ADP, AMP については、さらに高濃度が必要であった。やはり3リン酸の部分が親水性として機能しているためであろう。ADP, AMP, GTP などの細胞内濃度は 200-800 μM であるので、ATP ほどには大きな影響をもたらさないだろう。また、リン酸部分-Mg のみでも効果はなく、アデニン芳香環の疎水性部分が要ることが分かった。

ANS と混ぜて蛍光のシフトを観てみると、hydrotrope としての効果がわかる。そこで、ATP と古典的なハイドロトロープを比べてみた結果、ATP は疎水性分子のための可溶化微小環境を作るのに、はるかに効率的であることが示された(つまり溶けにくい油性分子の周りに、溶けやすくするための粉がまぶされているような感じ。きな粉がまぶされたワラビ餅?)。

タウリンやトレハロースのようなオスモライト(浸透圧調節物質)も蛋白質の安定性に寄与しているといわれているが、FUS 液滴を溶かす効果まではない。

細胞内の ATP 濃度が必要以上に高い理由として、ATP/ADP モル比が 50 倍ほどないと、ATP をエネルギー物質として利用するための代謝がうまく機能しないからという説がある。確かに ATP から ADP に化学変化するためには、モル比として ATP が圧倒的に多くないといけない。ATP に火を点けようとしても燃えないという事実から分かるように、ATP は特に高エネルギー物質というわけではない。しかし、例えば細胞膜を隔てて高低のモル比をつけて分離してやると、ルシャトリエの法則にみられるように、それだけでエネルギーを出せる物質となる。ならば、別に ATP でなくてもよいではないかと思われるが、実はその通りであろう。そして、分解の結果でてきた PP ピロリン酸は加水分解され、ただのリン酸となって散らばってしまうため、再びルシャトリエの法則によって、ますます ATP が ADP に変化していく。少なくともこの2点により ATP が高エネルギー物質として表彰された。

細胞内には 100 mg/mL 以上の蛋白質があり(別の文献ではもっと多い)、これらが凝集しないように保たれている。しかし、老齢化して ATP が減ると、神経変性疾患などを引き起こすのかもしれない。また、蛋白質複合体が複雑な方向に進化した際、凝集の問題が浮上した。そこで、それを防ぐための物質として、生物は DNA/RNA の一部品でもある ATP を採り入れた。おりしも ATP はエネルギー供給物質としても機能しており、後から hydrotrope として採用された可能性もある。

さて、文頭の「口の中で生卵が復活するか」という話に戻る。熱で固まった卵蛋白質(リゾチームなど)の間には、パーマの後の毛髪のように、ランダムにジスルフィド結合がかかっており、これが固茹でを実現している。よって、この S-S 結合を切るための還元剤が必要であった。ビタミン C ぐらいでは弱すぎてダメだけど、まあ冗談で苺も口に頬張ると生卵になったりして。

2023年12月8日金曜日

大腸菌培養の最少培地 M9 その6

「その5」をアップしたのが 2020 年 1 月ですので、早 4 年近く経つことになる。歳とった。。

その後に、次のような論文が出ていたらしい。

M. Cai, Y. Huang, J. Lloyd, R. Craigie, G.M. Clore (2021) A simple and cost-effective protocol for high-yield expression of deuterated and selectively isoleucine/leucine/valine methyl protonated proteins in Escherichia coli grown in shaker flasks. J. Biomol. NMR 75, 83-87. doi: 10.1007/s10858-021-00357-x

同じ著者で過去にも数報が出ており、いずれも M9 培地での培養の効率を上げる内容となっている。

この論文には、D2O を 1/10 量の 100 mL に減らしながら、これまでの 1 L 培養と同じ量のタンパク質を調製するための方法が書かれている。私も「重水 100 mL 培養は良いよ」とどこかに書いたような気もする。蛋白質を重水素化して methyl-TROSY を測ると、数 μM のような濃度でも観える。したがって、15N, 13C 安定同位体の培地を 1 L 作るのと、2H, methyl 1H/13C の培地を 0.1 L 作るのとでは、コストの面でそれほど大差はなくなってくるのである(とは言え、怖くて厳密に価格を計算していない)。それでいて、分解能は 2H 化の方が圧倒的によい。

重水 M9 培地に LB (D2O) が少しコンタミするそうであるが、3% までは 1H のコンタミの点で大したことはないそうである(本当か?)。著者らは 0.1% でも、むしろ大腸菌の成長にとって十分に効果ありと言っている(ただし、transfer cross saturation 実験に使う場合には、極力 1H の混入を避けた方がよいだろう)。

以下は論文から抜粋しているが、"100 mL" 培地に対してであることに注意

α -ketoisovaleric 32 mg
α -ketobutyric acid 16 mg
[2H]-glucose 1.8 g
[15N]-NH4Cl 0.5 g
LB (D2O) 1/1,000

グルコースの量が非常に多い。我々は 2 g/L ほど入れているが、彼らはそれの 9 倍量を入れていることになる。また、15NH4Cl も、我々は 2 g/L ほど入れるが、彼らはそれの 2.5 倍量を入れていることになる。

さらに硫黄源も多い。我々は MgSO4 の形で 2 mM ほど入れている。しかし、この論文では K2SO4 の形で 7 倍量の 14 mM も入れている。では、MgSO4 を 14 mM も入れても大丈夫なのだろうか?Mg2+ が多過ぎてダメだろうか?しかし、著者らは何故 Mg2+ の量を前回の論文での 10 mM から今回の 1 mM に減らしてしまったのだろう?我々は 2 mM 入れているが、Mg が多いと何かまずいことが起こるのだろうか?来週、学生に試してもらおう(どこかで後述)

これら、グルコース、塩化アンモニウム、硫黄源は、我々の現在の仕様より何倍も多く、これらが大腸菌の増殖に効くのだろう。さらに、微量金属やビタミンミックスもちゃんと?入れている。1/1,000 の LB 混入も効くのだろう(我々は遠心して大腸菌だけを植菌しているが)。

著者らの方法により、IPTG での誘導時の OD600 は 10 に達し、100 mL の重水培地から最終的に 11 mg の精製蛋白質がとれたそうである。確かにグルコースが通常の 10 倍近く入っている。もし、とれる蛋白質量がグルコースの絶対量に比例するならば(きっとそうだろう)、納得のいく数値である。ただし、いくつかの注意点も書かれている。

ひとつは、植え継ぎをこまめにすることである。Pre-culture を main-culture に入れて終わりというのではなく、次に植えた時に 10 倍以上は薄まらないように気をつけている(図2が分かりやすい)。こちらでも、100 mL を 1L に植えると成功するのに、20 mL を 1L に植えてしまい何度も失敗したことがある。なんと何億匹もいるはずの大腸菌が一匹残らず全滅するのである。二個目の注意点はバッフル付きの大きなフラスコを使うことである。培地の量はフラスコ容量の 1/10 以下に抑えている。これはエアレーションをよくするためであろう。ただし、上にも書いたが、実験目的が transfer cross saturation の場合には、培地の攪拌によってあまり多量の 1H 水蒸気を入れたくないので、ここが難しいところである。

著者らの方法により、たったの 100 mL で 1 L 培養と同じ量の蛋白質がとれた。もちろん、グルコースの絶対量は同じであるが、2-ケト酸や重水そのものは少なくてすむ。今、日本で重水を買うと 30 万円/L(= 2,100 USドル)であるので、かなりの節約になるだろう。

2023年11月23日木曜日

つれづれ思うこと 外国語編 その1

Perl 編を 10 編ほど書いてきたが、だんだんと書くことがなくなってきてしまい、次はどうしようかと思った時、ふと同じく「言語」というジャンルで「外国語編」を書きたくなってしまった。

英語を勉強し始めてからもうかれこれ 40 年以上も経っていることに、年齢の引き算をして初めて気づいた。それほど力を抜いた訳でもなく、ちょっとずつながらも努力を続けてきた "つもり" ではあったが、「英語」は、いや「英語」もやはりダメだった。特にリスニング(昔はヒヤリングと言ったが)がダメ。年齢とともに、日本語でも細く高い声が聞き取りにくくなってきた。いつも視るテレビのデフォルト音量もこの 10 年間で確実にアップしている。ましてや、イギリス英語の1万ヘルツを超える音声ともなると、風のささやきのようにしか聞こえない。

それではスピーキングは大丈夫なのかというと、これまた怪しい。日本語でも会話の中で人の名前は7割以上は出てこない。年齢の近い友人どうしでは「あの A さん」で会話を通すことが多い。翌日になっても「A さん」の本名が出てこない。名前に限らず、頭の中にはその物体が浮かんでいるのに、それを表す名詞が出てこない。これが英単語になってくると、もっと酷くなる。

数年前に、通勤の途中で単語集でも暗記しようと奮起したことがある。しかし、前日どこのページまで進んだかすら忘れてしまう始末である。「歳をとっても暗記力は変わらない」という研究結果があるとどこかで読んだことがあるが、それは絶対に嘘である!というより、実験の仕方が悪いと固く信じている。

今、大学生ぐらいの人たちに言っておきたい。スマホを触っている時間があるなら、それを少しでも削って英語を勉強しなさい。若い時の暗記力は 30 年後の 10 倍以上はある。

とは言え、Google 翻訳、DeepL、そして ChatGPT の登場により、果たして英語を勉強する必要はあるのか?と私自身も時々ふと思うようになってしまった。英語にかける莫大な時間と労力を、もっと数学や理科(理系ならば)にかけた方が良いような気がしてきた。ほとんどの人にとって外国語はあくまでツールであり、何かを論理的に考えるための土台とはならない。

もしかすると、30-40 年後は母国語をきっちりと間違いなく書くことが最重要視され(今でもそうなのであるが)、それさえ出来れば、あとは AI を含めて情報科学が確実に正しい諸外国語に翻訳してくれるのかもしれない(逆翻訳もまた然り)。誤訳されたとしたら、それはそもそも母国語が間違えているためだと判断されるほど、自動翻訳技術が発達するかもしれない。いや、きっとそうなるだろう。

すると「英語」は何のために勉強するのか?このような思考が頭の中をぐるぐると回り、この1年間ほど自分の頭の中で結論を出せなかった。

ところで、非難轟々を覚悟でいうが、英語ができる人は恰好よく(かっこよく)見える。頭も良いように見えてしまう(実際、その場合もある)。特に学会などで、日本人がアメリカ発音でべらべらと外国人と質疑応答をしようものなら、「あれは誰だろう?」と振り返ってしまう。一方、これがカタカナ発音のしどろもどろ英語であったりすると、何の感情も起きない。これは何故だろう?同じスピードでしゃべったとしても、アメリカ発音とカタカナ発音とでは、日本人のそれに対する見方に雲泥の差があるように思う。

それでは、米語発音の中のどれが聞いている日本人に一種の羨望のような感情を引き起こさせるのだろうか?筆者は「R」と「T」の音にあるのではないかと思っている。米語では「R」は舌を上に反り返らせて発音する傾向がある。そして「T」はラ行のように発音する。例えば、water は「ワラー(& 舌反り返し)」letter は「レラー(& 舌反り返し)」という具合にである。この二つの音は日本語にはなく異質である。そこに欧米文化へのあこがれや西部劇俳優のかっこよさ等が加わり、結果として英語ペラペラの人がかっこよく見えるのではないだろうか?

かく言う私も大学生の時には、この発音にあこがれ、アクセントを徹底的に調べつつ「R」と「T」を米語式に、そして「TH, F, V, W」を native 発音に近くなるように、まるで何かにとり憑かれたかのように練習した。さらに母音では「A」を「ア」と「エ」の中間音にしたり、「O」を極端に「ア」と発音したり(top は「タップ」に)した。いずれもそれが正しいというか唯一であると思い込み、またそうすることでかっこよく見れらたかったからである。

しかし、この 10 年間ほど、今はこれらの発音を極力しないように、どちらかというとカタカナ発音に近くなるようにむしろ努力している。どちらかというと米語ではなくイギリス英語に近い発音とでも言おうか、しかし、これまたイギリス英語を発音の手本とするのではない。最終目標は、アメリカ英語、イギリス英語のどちらへにも偏らず、それでいて世界中の誰にでも間違いなく伝わるような発音である。

なぜそれを目指すようになったかは続きでおいおい語ることにするが、要は、英語はもはや世界共通語となってしまったので、どこかの国の訛に固執するのも変ではないかと思ったためである。例えば、日本国内でも大阪のテレビニュースで司会者が「ほな次行くで。さっき大阪市で火事あって電車止まってん」などと発話することはまずない。ちゃんとした標準発音でしゃべられる。これは極端な例であるが、英語でも同じように、イギリス、アメリカに特化せずに、しかし英語に共通した発音は守りつつ、しゃべることは出来ないだろうか?と思う。

しかし、もう 40 年間もアメリカ発音こそが英語と思い込んできただけに、今さら water を「ワラー」ではなく「ウォーター」と発音するのは結構しんどい。授業でも最初は標準日本語でしゃべっていても(多くの受講生はそうなっていないと主張するが、私本人はそのつもり)、授業が遅れてくるとつい「そいで電子が葉緑体の膜ん中渡ってく時に、水素イオンがどさくさ紛れで汲み出されるんや」といった調子になってしまう。その方が速くて疲れない。

発音は運動と同じで、毎日少しずつでも練習していないとすぐに口と舌の筋力が落ちてしまい、上手く発音できなくなる(若い人はまだそれほど実感はしないと思うが)。「R」と「L」をひっくり返して発音してしまうことなんてザラである。これからも練習を続けていきたい。

ちなみに、上記の「そいで電子が...」の関西弁、BARD は完全に正確に英訳してしまった。恐るべし。

アメリカ英語では I don't want to ... を「アイダナワナ」などと発音する。この音をローマ字で表記すると「aidanawana」となる。このようにアメリカ発音はローマ字でいうところの「a」音が多いような気がする。一方、関西弁もローマ字で表記すると「a」が多いような気がする。

関東弁「それでは、しないといけないですね。」
関西弁「ほな、やらなあかんやん。」

これをローマ字で表記すると
関東弁「soredewa sinaito ikenai desune」i が多い
関西弁「hona yarana akanyan」a が多い

これは偶然の一致というか、いかに口をパクパクしないで、流れるように話そうとすると、このように a 音が自然に多くなるためではないかという気がしている。よって、西部劇ではタバコを加えたクリントイーストウッドが口をあまり動かさないで「かっこよく」話す。一方、シャーロックホームズがドラマでこれをしようとすると、口からタバコが落ちてしまうだろう。

2023年10月15日日曜日

つれづれ思うこと Perl 編 その9

Mathematica が他のプログラミング言語と異なる点の中で、筆者が面白いと思ったことを紹介します。

x = 3;
y = 4;
ab = {x, y};
ab

と書くと、ab には {3, 4} という具体的な数値が代入されます。後から x や y の値を変えても ab は変わりません。これは、一般的なプログラムと同じです。ところが、

ab = {x, y};
x = 3;
ab

というように、今度は行の順番を変えてみると、一行目で ab には {x, y} という文字式が代入されます。そして、面白いことに、二行目で x や y の文字変数の値を変えると、ab も {3, y} に変わるのです。続けて、

x = 8;
ab

と打つと、なんと ab は {8, y} に変わります。ab の中の x という文字はまだ生きているのです。これは Perl などの一般的なプログラムとは異なる点です。

詳細は Mathematica の「遅延割当」という項目をご覧ください。

これは Mathematica が数値計算だけでなく数式処理もできるためですが、いま大変重宝しています。例えば、ある時は数値計算を、またある時には数式処理をしたいとします。いずれにしても、ab = {x, y} のような公式にあたる箇所を先にプログラミングで組み立てておきます。もし、数式処理をしたければ、これでそのまま数式での答を得ることができます。

一方、数値計算をしたい場合には、ここに具体的な数値(たとえば、x = 8)を代入すれば数値としての答を得ることができます。次に x = 4 の場合を計算したければ、続けて x = 4 を実行するだけです。Mathematica は Jupyter のように使うことができるので、二度も ab = {x, y} を実行する必要はありません。実は、再び ab = {x, y} を実行してしまうと、ab は {8, y} となってしまい、もう x = 4 のケースを計算できなくなってしまいます。

上記のような書き方は数値計算に特化されていないので、実は余計に計算時間がかかってしまうのですが、いろいろな数値を入れて答を比べてみたい時には助かります。

よって、次のような計算もできます。

d = e;
e = f;
f = 8;
d

d を表示させると、8 になっています。
これは、普通のプログラミング言語とは行の順番が真逆です。

ややこしくなりますが、次のような配列を含む演算でも同じことが言えます。

blist = alist; (* 先に変数を結び付けておく *)
alist = {2, 4, 6, 8, 10}; (* そして alist に偶数の配列を代入する *)
alist (* 試しに alist を表示 *)
{2, 4, 6, 8, 10} (* もちろん alist は偶数の配列 *)
blist (* そして blist も表示 *)
{2, 4, 6, 8, 10} (* blist も同じ偶数の配列 *)

alist[[3]] = 100; (* それでは alist の3番目の要素に 100 を代入 *)
alist (* を表示させてみる *)
{2, 4, 100, 8, 10} (* ちゃんと3番目の要素は 100 に変わっている OK *)
blist (* それでは blist は? *)
{2, 4, 100, 8, 10}

先に blist = alist のように公式を組み立てておくと、このような結果になります。

Perl ではこのような行の順番で書くことはできませんので、下記のように上の行から下の行へと水が流れ落ちるように書くことになります。

#!/usr/bin/perl

@alist = (2, 4, 6, 8, 10);
@blist = (1, 3, 5, 7, 9, 11);
@blist = @alist;
$alist[2] = 100;
print "alist = @alist\n"; # 2 4 100 8 10 と表示
print "blist = @blist\n"; # 2, 4, 6, 8, 10 と表示

以上より @blist = @alist という表現では、alist のコピーが blist に複写されているようです。つまり、alist の先頭アドレスが blist に代入されたわけではありません。

しかし、次のように書くと、

#!/usr/bin/perl

@alist = (2, 4, 6, 8, 10);
@blist = (1, 3, 5, 7, 9, 11);
$blist = \@alist;
$alist[2] = 100;
print "alist = @alist\n"; # 2 4 100 8 10 と表示
print "blist = @$blist\n"; # 2 4 100 8 10 と表示
print "blist = @blist\n"; # 1 3 5 7 9 11 と表示

$blist には @alist の先頭アドレス(レファレンス)が入り、それとは別に @blist の配列そのものはちゃんと維持されるようです。

話が急に配列そのもののコピーか、それともアドレス(参照)のコピーかに飛んでしまいましたが、Perl, Python, JavaScript とごちゃまぜに書いていると、いつも分からなくなって困ってしまう点です。どこかに比較対照表のようなものをまとめたブログはないでしょうか?

おそらく Python では次のようになります。

a = [1, 1]
b = a
a[1] = 2
print(b) #[1,2]が表示される

多くの HP には「数値はイミュータブル(変更不可)、一方、リストはミュータブル(変更可能)」などといった説明が載っており、それはそれなりに説得力があるのであるが、Perl と比較しながら理解しようとすると混乱してしまいます。上記の Python は、いわば C 言語でいうところの、配列名はその先頭アドレスを表すという概念と似ています。

Python でリスト(配列)そのものをコピーするには、
b = copy.copy(a) # 浅いコピー
としないといけないようです。二次元以上の配列になってくると、またちょっと複雑。

b = copy.deepcopy(a) # 深いコピー
を使わないといけない。

一方、Perl では
@blist = @alist;
と書くと、配列そのもののコピー(複写)になることに注意しないといけません。

Mathematica でも同じ複写ですが、blist = alist を先に書いてから、後で具体的な数値の配列を alist に入れるという方式をとると、これはアドレス渡しのように振る舞うことになります。

いや~もう疲れた。もう JavaScript まで行きたくない。が、ついでだ!思い切ってやってみよう。もう混乱してきたので、詳細は他の情報源に譲ることにして要点だけ。

JavaScript の配列では参照渡しとなるようです。配列を値渡しに(複写)するには、slice や concat の引数なしを使うようです。

var arr1 = [0, 1, 2, 3, 4];
var arr3 = arr1.slice();

ということは C 言語と似ているということ?

C 言語では、配列名は先頭アドレスを指しますよね。
なので、b = a の後で、a の中身を変えると、b も変わって見える。

C 参照渡し
a[3] = {1, 2, 3};
b = a;

Python 参照渡し
a = [1, 2, 3]
b = a

JavaScript 参照渡し
a = [1, 2, 3];
b = a;

Perl 値渡し
@a = (1, 2, 3);
@b = @a;

ただし、$b = \@a; のように、b をポインタ変数のように使うことも可能。この場合は、それ以降 @$b の形で配列 b を使う。「\」は、C 言語のアドレス演算子「&」と似ている。

Mathematica 1 値渡し
a = {1, 2, 3}
b = a

Mathematica 2 参照渡し
b = a
a = {1, 2, 3}

こうして見てみると、Python は、まあ C と似ているのかも。
Perl や Mathematica がむしろ異端児なのか?

以上は一次元配列での話でしたが、NMR データのように二次元配列の場合、配列のコピーはどのようになるのでしょう?おそらく C 言語では memcpy を使う?

もう限界なので、ここでやめておきます。

2023年9月26日火曜日

つれづれ思うこと Perl 編 その8

では次に、最近少しは慣れてきた Mathematica について書いてみたいと思う。おっとまずい、どんどん Perl の話題から遠ざかっている。両者の間に何か関連はないだろうか?

このソフトは高価なのですが、無料で楽しめる方法が少なくとも2つあります。一つは、Raspberry pi です。これに Mathematica を無料でインストールできるのです。その代わり速度は遅く、10 倍ぐらいの処理時間がかかってしまうかもしれません。Mathematica は購入しても一つの PC にだけしかインストールできない仕組みになっています。そのため、筆者も家では Raspberry pi にのんびりと計算をさせ、翌日に職場の PC で本格的に計算させていました。Raspberry pi の OS には 32-bit と 64-bit があり、Mathematica は前者にだけインストール可能でした。しかし、今 HP を見てみると、2023/May からは 64-bit でも使えるようなことが書かれています。64-bit 版ですと、メモリーを 8 GB などと積めるので、Mathematica の動きも速くなるかもしれません。まだ試したことがないので、時間の空いた時に試してみたいと思います。

もうひとつ無料で楽しめる方法は、Jupyter lab を使う方法です。実は Mathematica という名前が指しているのは GUI 部分(という表現は変ですが)のことで、実際に計算しているコア部分は Wolfram-engine と呼ばれています。その engine 部分が無料で PC にインストールできるようになりました。すると、Windows のコマンドプロンプトなどから、計算を打ち込むことができます。しかし、いくらなんでも、これは使い勝手が悪い。そこで engine を Jupyter lab につなげると、ちょうど Python を Jupyter lab で操作するのと同じように Wolfram-engine を使うことができるようになります。もちろん Mathematica の方がインターフェースとしてはよいのですが、この Jupyter lab は Mathematica とよく似ているので(というより、Mathematica を見本として作られた?)まずまずのことができます。なお、計算能力は全く同じです。Mathematica ではできて、Wolfram-engine & Jupyter lab ではできないということはありません。今、家では Raspberry pi をやめて、この第二の方法を活用しています。Jupyter lab の上では、グラフをマウスで拡大したり回したりはできないのですが、これもコマンドベースで命令すればできますので、まあなんとかなります。PDF に出力させれば、論文用の高分解能の図も作れます。

この Mathematica は Lisp と呼ばれる言語で作られているらしく、いわゆる関数型言語に分類されるそうです。関数型が何かという専門的な部分は、私にはよく分かりません。使い始めてちょっと驚いたのは、例えば次のような IF 文です。

y = If[x < 0, -x, x]

これを普通?の言語で書くと、

if ($x < 0)
{
    $y = -$x;
}
else
{
    $y = $x;
}

となります(むりやり Perl にしてしまった)。。。

これだけだと特に変わった言語のようにも見えないのですが、もし、else 文の中に複数の行があると、次のようになります。「もし x が負の数ならば -x を y に代入する。逆に正の数ならば、x に 3 をかけて平方根をとり、これを y に代入する。」

y = If[x < 0, -x, z=x*3; Sqrt[z]]

よって、"z=x*3; Sqrt[z]" の部分がまとまって、まるで If 文の第三引数であるかのように振る舞うのです。この時の「;」が重要で、これで "z=x*3" と "Sqrt[z]" の二つが繋がって、あたかも一つの引数であるかのように振る舞います。よって、"Sqrt[z]" の後にまで「;」を付けてはいけません。もし付けてしまうと、もう一つ後ろに何らかの表現が続くことになってしまいます。

さらに、If 文が最終的に Sqrt[z] を返してくる、そして、それが y に代入されるという点も興味深いところです。このように If 文そのものが関数となっているわけです。Excel の =If もそうなっていたような気がする。

筆者は、どうも C, Perl などの癖が出てしまい、Mathematica でも以下のように書いてしまいます。各文末の「,」や「;」に気を付けないといけませんが、これですと一般的な手続き型言語に似た構文となります。ここでも Sqrt[z] の後に「;」を付けないように気をつけないといけません。

(* の箇所はコメントとして無視されます。 *)

If
[
    (* if *) x < 0,
        y = -x,
    (* else *)
        z = x*3;
        y = Sqrt[z]
]

このように If も For も全てが関数として作られており、この関数の引数の中に別の、あるいは同じ関数を入れ込むことができます。この「引数の中に関数を書く」という操作をどんどん繰り返していくと、入れ子(ロシアのマトリョーシカ人形)のようになります。そんな構文を何に使うのかというと、漸化式です。Mathematica においても For 文を使わずに、この漸化式(数学的帰納法)のコンセプトで書く方法があるそうですが、私にはとてもできません。筆者の知っている人で OCaml が大好きという方がおり、何故かと尋ねたところ、一つの理由はこの関数型にあるのだそうです。

2023年9月16日土曜日

つれづれ思うこと Perl 編 その7

まだ Python の NumPy の存在に気づかなかった 2000 年代前半の頃、Octave という名の数値計算用ソフトがあることを知り使い始めました。これは便利で、今まで Perl などを使って書いていた面倒な数値計算が、たいへん簡単に行えるようになりました。Octave では「for 文を使ったら負け」という表現がよく出てきます。つまり、行列の計算などをする際に、できるだけライブラリの関数を使うようにせよということです。そうすると高速で演算できるのですが、それを安易にうっかり for 文を使って行と列の要素をひとつずつ繰り返しながら計算しようものなら、たいへん遅くなってしまいますよという意味です。よって、たえず「この計算は行列の演算に置き換えることはできないだろうか?」と考えながらプログラミングする癖がつきます。この考え方は、特に Octave に限らず、NumPy でも Mathematica でも同じですね。

NMR では数値シミュレーションだけでなく、数式処理も時々必要になってきます。3+4=7 のような数値計算ではなく、cos^2(wt)+sin^2(wt) = 1 のような計算が数式処理です。ω や sin, cos などを残したまま計算するのです。これが出来るのは限られた幾つかのソフトだけで、有名なのは Maple と Mathematica です。幸い、前にいた職場にはキャンパスライセンスがあったので、両者とも個人的には研究費を払わずに使うことができました。それで、Maple の HP を見てみると、モミジが描かれており、赤毛のアンを連想させるような雰囲気の中で、メープルシロップのたっぷりかかったモミジ型のお菓子(お土産で有名ですが、これおいしい!)の連想も手伝って、何も迷わずにこれの DVD を取り寄せました。

ちなみに、こうして自分の過去を思い返してみると、書籍の表紙に描かれている動物が可愛いかどうか?あるいは、連想させる食べ物がおいしいかどうか?でその後に使うプログラミング言語を決めてきたようなところがあります。ちゃんと情報教育を受けてきた人は、もっと理論的な考えでもってツールを選ぶものですが、生物という全く異なる分野の教育しか受けたことのない人間は案外、雰囲気というもので重要なことを決めてしまっているのかもしれません。もちろん Raspberry-pi 大好きです。そして Strawberry-Perl を愛用しています。これもフルーツ系の食べ物です。Red-Hat は嫌いで、ペンギンの描かれた Linux 系が好きです。ソフトに限らず、何か製品を開発していく人は、そのような雰囲気や感情で物事を決めていく人間もいるということを知り、ちょっとネーミングや宣伝を工夫してみると大当たりしてしまうかもしれません。もし、Raspberry-pi が Blue-Hat というような名前で、ギャング(やくざ)が青い帽子をかぶったような絵がイメージキャラクターだったとしたら、小中学校で教育用として人気を博すことはまずなかったでしょう。

数年間ほど楽しんで Maple を使っていたのですが、ある時、NMR の HSQC をシミュレーションしようとして動かしたところ、超複雑な答が 100 行ぐらい吐き出されてくるのです。理想的には Ix という二文字で終わりのはずなのですが。。。これは数式処理でしか起こらず、しかも全く同じ計算をしているのに 10 回に 1 回ぐらいしか出現しない。どうして変な答がたまに出るのかが分からず、また半年ほどあれやこれやと悩んだのですが、最終的に分かったことは、exp(i H t) の計算がうまく行っていないということでした。どこかで書いたと思うのですが、この H は行列で (i H t) の固有関数と固有値がピタッと数式処理で出れば exp(i H t) の計算は超簡単になります。しかし、この行列の対角化ができないと判断されれば、テーラー展開に切り替わるのです。しかし、テーラー展開の答はあくまで近似値にすぎません。HSQC の数式シミュレーションでは途中で多数の項が出てきますが、それらは位相回しによって最終的にはほとんどの項が打ち消され簡単な答だけが残るのです。まさに三角関数の加法定理などが式の簡略化に使われます。しかし、近似値どうしでは、この最後のキャンセルが完全な0にならないわけですね。そして、結果として多数の大小変な項が残ってしまうのです。

これを Maple の開発部門に伝えたところ、先方でも再現されバグであると認めてくれました(認められて嬉しいのやら、逆に計算できなくなって悲しいのやら)。それでバグが修正されるのを待っていたのですが、その間に筆者が今の職場に異動してしまいました。ところが残念なことに、ここはキャンパスライセンスがないのです。もしかしたら、もうバグが修正されているかもしれないのですが、25 万円を払って購入し、それを確かめるのも勇気がいり、もしかしたら開発部門から「バグを見つけてくれたので感謝料として、あなたには Maple パックをモミジ型お菓子とともに無料進呈いたします!」みたいな知らせが来ないかな~などと期待していました。しかし、こちらから不躾にそんな要求をするわけにもいかず、泣く泣く Maple を断念しました。それで、なんだか変な狐が描かれた Mathematica を買うことに。今だに Mathematica にはあまり慣れず、Maple が恋しいのですが、キャンパスライセンスがない大学では仕方がありません。頑張って Mathematica に慣れることにしました。

Maple はシンタックスが C 言語とちょっと似ているので、C, Perl, Python などを知っている人にはとっつきやすいと思います。GUI もきれいで、ずっと使い続けたいソフトの一つです。いずれにしても、Mathematica と Maple という二大ソフトが競争してくれるお陰で、ともに開発が進み、価格も(高いとは思いますが)25 万円で済んでいるのでしょう。そして、幸いにもキャンパスライセンスのある大学の人はどんどんこれを利用して、自分を教育すべきです。筆者は高校の時から数学があまり得意ではなく、その所為もあって数学とはもっとも無縁の学科を選びました。しかし、不得意であっても腐らずに勉強していれば、上記のような優秀なソフトが数学の不得意部分を補ってくれます。例えば、上記で exp(i H t) を書きましたが、本当に賢い人は、これを紙と鉛筆だけで対角化して計算し、HSQC などをさっとシミュレートしてしまいます。私にはそれがとても出来そうにないので、ソフトの計算力を借りるわけです。

2023年9月14日木曜日

つれづれ思うこと Perl 編 その6

前回の記事で C 言語について追加で書いたのは、実は Tcl/Tk との関連を書きたかったためです。Tcl/Tk を知ったのは、Perl, Python を知った直後でした。NMR で有名なフーリエ変換ソフト NMRPipe にもこれが使われていました(今も動いています)。Tcl 言語は Perl や Python と同じような(コンパイル不要の)スクリプト言語で、一方の Tk は GUI(グラフィカル・ユーザー・インターフェース)を作るためのツールキットです。それまでは、ちょっとした GUI を作るのも面倒だったのですが、この Tk のおかげでだいぶん楽になりました。その Tk が Tcl と相性がよいので両者が一緒に使われるようになったのだと思います。

Tcl 言語はひとことで言うと、たいへん可愛いに尽きます。Perl や Python がそれぞれ立派なリャマと大蛇だとすると、Tcl はコアラのような感じ。例のシリーズ本では、お猿さんの図が表紙になっていますが、猿のイメージとは大違い。ぱっと見た感じではシェルに見えます。ですので、ちょっとした計算(x = 5+3)でも、set x [expr 5+3] のような面倒な書き方になります。しかし、逆に c-shell も知らない筆者にとっては、これが新鮮で可愛く映ったのでした。

しかし、これだけなら Tcl/Tk を使おうとは思わなったのですが、Tcl にはそれ以上に面白い点がありました。Tcl は C 言語のコードをコンパイルする時に、そこにライブラリーとして含めることができるのです。つまり、以下のようになります。複雑な計算の箇所は高速化が必要ですので C 言語で書いておきます。そして、そのコードの入力と出力のパラメータを Tcl 言語と紐づけします。そして、Tcl ライブラリーを含めてコンパイルします。できあがった実行可能バイナリーファイルですが、入出力を Tcl 言語にすることができるのです。これはたいへん便利。いろいろなパラメータで同じような計算をし、結果をグラフに表して比べたい時、そのパラメータの入出力部分は Tcl でいかようにも変えることができるのです。ですので、二度目、三度目のコンパイルは不要。もし、C 言語だけでそれをしようとすると、「パラメータ a を入力してください」などと画面で促し、それを scanf で取り込むという面倒なことになります。もし、数百種類のパラメータでそれをしないといけないとすると、それでもう終わりです。

25~30 年ほど経った先日、当時のプログラムを使わないといけなくなり、バイナリーを動かそうとしてみましたがダメでした。やはりコンパイルし直さないと。しかし、コンパイル時にかなりの量の warning と error が出てしまいました。仕様がかなり変わっているのですね(引数に int, float などを明記しないとダメなど)。半日ほどかけて修正し、やっとほんの少しの warning を残した状態で make できました。残余双極子相互作用値と PDB から蛋白質分子の磁場配向テンソルを求めるプログラムなのですが、無事に計算できました。C 言語のアメーバを使っているのですが、初期値を5種類つくっての計算は 0.5 秒ぐらいでしょうか?この程度のフィッティングであれば、どのような初期値でスタートしても、いつも同じ最適解に収束します。

もう最近は C 言語から離れてしまったので、Tcl も使わなくなってしまいました。それに(間違えているかもしれませんが)いちどバージョンを上げるのに有料になった時があり、それを機会にやめてしまいました。手元に 2010 年に発刊された書籍「Tcl and the Tk Toolkit, 2nd ed」がありますので、また始めてみてもよいかもしれません。

2023年9月13日水曜日

つれづれ思うこと Perl 編 その5

C 言語についてもう少し。

Perl で exp(i H t) などの計算を試してはみたものの、やはり 1995 年頃は遅くて使い物にはならなかった。そこで科学計算にはやはり C 言語を使っていた。その時に役立った本が「Mumerical Recipes in C」(の翻訳版)。ここにはいろいろな計算のためのコードが載っていて、それをそのまま使ってかなりの数値計算をすることができる。特に重宝したのが最適化(フィッティング)の処理である。データに非線形的にフィッティングするための方法では Levenberg–Marquardt 法が有名であるが、コードを打ち込むのが大変そうだったので、何かもっと簡単な方法はないかな?とこの本で探してみると「アメーバ法」という方法が紹介されていた。正式には Nelder–Mead 法と呼ぶらしい。コードも数百行ぐらいで閉じているので、頑張って間違わずに打ち込めば、すぐに動く。この方法のよい点はモデル式の微分が要らない、不連続な箇所があってもよいなどで、まあとにかく制限がほとんど無いので、どんな状況にも適用できる。欠点は時間がかかる、間違えた解にトラップされやすいなど。よって、予想できる解がすでにある時には、できるだけそこからスタートするとよいです。

こんな(失礼ながら)子供遊びのような方法で数学的な最適化ができるのか?と思われ勝ちだが、試してみるとたいへん強力であった。例えば、NMR の残余双極子相互作用値を蛋白質の構造に当てはめる場合、400 残基分のデータをフィットするのに今の PC であれば 0.1 秒とかからない。当時でも 3 秒あれば十分であった。そこで、いろいろな初期値を 10 個ぐらい適当に準備して、それらを全部試してみる。 30 秒ぐらいで 10 個のフィッティングがすべて終わるので、その中から最小の二乗偏差を示す結果だけを選ぶ。エラーバーはどうするのかということになるが、これはモンテカルロ・シミュレーションがよい。100 個ほど模擬データを作っておき、全てにアメーバを振りかける。バナナを食べ終わる 10 分後にはすでに終わっており、その結果をエクセルで統計処理すればエラーバー(標準偏差)が出てくる。

結局つい数年前まで、NMR の緩和、残余双極子相互作用、回転拡散の異方性、拡散係数など、ほとんど全ての処理にアメーバを這わせたが、まったく問題なかった。緩和分散曲線もかなりは問題なし。もちろん Levenberg–Marquardt 法を使えば 0.1 秒ほどで終わってしまうが、今の PC をもってすると、それが延びたところで 1 秒ぐらいなので、もはや大した問題ではなくなっている。今は Perl に書き直したコードも使っている。C の 3-5 倍ぐらいかかるが、上記の NMR データの最適化で 1 分以上かかるような処理はあまりない。

(https://github.com/tikegami-tak/cpmg_hsqc) の中の perl/TI_lib_perl/TI_montecarlo.pm の中の lsquare_simplex というサブルーチンがアメーバ法です。

Fortran 一色という友達がおり「何故?」と尋ねてみると、いろいろ試してみたけれど、やはりこれが最速とのこと。特に数学処理では LAPACK ライブラリなどを使うと(もちろん C でも使えます)そこには何十年もかけて多くの人々が努力してきた成果が埋め込まれており、量子力学の計算ではそれを使わないと計算が終わるまでに一生かかるとのこと。NumPy も中ではこの LAPACK や BLAS といったライブラリーが使われているそうで、まあ道理で速いはずです。そこで、Perl でもこのようなライブラリーをさっと使えるようにならないだろうか?そしたら、アメーバからやっと卒業できるかも?一応、CPAN には Perl と LAPACK などをつなぐラッパーがあるようですが、NumPy のような使い方ではないような気がする。

ちなみに、最近はずるをして Mathematica で Levenberg–Marquardt 法をこっそりと使ったりするのであるが(Perl のアメーバには内緒)、Python を見てみると、変数の範囲を限定して Levenberg–Marquardt 法が使えるようになっていた。さらに CPMG 法では各残基ごとに異なる変数と分子全体で共通の変数があり、Mathematica のようにきっちりとまとまり過ぎた関数ではうまく最適化のためのコードを書けない時がある(ちゃんと勉強したら出来るのかもしれないが、私にはダメだった)。そんな変則的な時、ちょっと原始的な Python は非常に便利だった。また、アメーバ法も今はアルゴリズムがさらに進化しており、もっと高速化しているようです。

2023年9月10日日曜日

つれづれ思うこと Perl 編 その4

Perl と Python の比較だけでは話が単調になってしまうので、他の言語についても触れてみたい。

実は、最初に学んだ言語は Prolog だった。学んだというよりかは、大学の教養課程の授業「情報処理」で半年ほど触れただけである。1987 年当時、理系の授業で例として習うプログラム言語は普通は Pascal であった。ところが何故か私の授業の担当教員は Prolog に興味をもっており、そのため初めて触れるプログラム言語が Prolog となってしまった。「A さんの親は B さんで、B さんの兄は C さんで...」などという関係性を一行ずつ書いていく。そして、最後に A さんの叔父さんは誰ですか?」と質問すると「C さんです」という答が返ってくる。当時は人工知能のための言語として将来を期待されていたらしく、その先生も夢をもって語っていたのを思い出す。なにしろ初めて見たプログラムなので「Prolog で行列の計算ができないではないか!」などという疑問をもつこともなく、素直に「プログラミングって面白いな」と思った。

人口知能用の言語ということで、今の ChatGPT などの祖先のように思ってしまうが、おそらく全く違うように思う。今この言語はどうなっているのだろう?と思い調べてみたら、今もマニアの間では人気があるようだ。SWI-Prolog など無料でダウンロードできるサイトも活躍している。たぶん Prolog でしか処理できないような論理的な問題があるためであろう。C, Python, Perl などとは全く異なったコンセプトで設計されているので、視野を広げる意味でもいつか復習してみたい。なお、Perl との関係はなさそうで、唯一見つけられたのは、どちらもプログラムファイルの拡張子が ".pl" であることぐらいか?

Prolog の次に習ったのは C 言語で、これはたいへん難しかった。特にポインタの部分はよく分からない状態が続いた。しかし、当時勤めていた会社がたいへん教育的で、毎週 C 言語の講座を開いてくれて、少しずつではあるが理解できるようになってきた。1991 年当時は開発を担当していた半導体検査用電子顕微鏡を制御するのにアセンブリ言語(おそらくモトローラの MC6800 だったか?)が使われており、多くの技師がこれでプログラミングしていた。これは素人にはただの暗号に見える。そして、電顕の画像処理などに C 言語が使われ始めたのをきっかけに、機械制御の部分もワークステーション上での C 言語処理に少しずつ置き換えられつつあった。そのような状況もあり、アセンブリ言語の講座も社内にあった。しかし、その講座は一週間の合宿制になっており、参加するには上司の許可が必要であった。おそるおそる上司に相談してみると OK とのこと。実はこれが良かった。この講座によりアセンブリ言語がどのようにメモリーに値を入れたり、ビットをシフトさせたり、読み出したりしているかが分かり、同時に C 言語のアドレス(ポインタ)が理解できるようになった。あの時の上司の理解がなければ、プログラミングをその後 30 年以上にわたって今日までの仕事に活かすことはできなかったであろう。今も当時の教科書は残してあり、時々思い出しては感謝している(「マイコン回路の手ほどき」(1983)白土義男著)。

今はアセンブリ言語に触れることはあまりなく(マイコン制御ではあるのかな?)Python などあまりアドレスを意識しないで書けるプログラミング言語が主流となった。しかし、その根底にはメモリーの制御が常にある。よって、若い人ほどアセンブリ言語をちょっと勉強してほしい。私が受けた第二種情報処理技術者試験では CASL というアセンブリ言語が出題されたのであるが、今でもそれが選択肢のひとつとして残っていることを知って嬉しかった。是非 CASL を選んで受験して欲しいと思う。そしたら、人によっては、その後に学ぶすべてのプログラミング言語での見方が変わるだろう。

最後にアセンブリ言語と Perl との間に何か関係があるのか?という点になるが、もちろんあります!Perl でも Python でもそうですが、配列 abc をコピーしたりする時に (hiq = abc)、配列そのものが複製されるのか、それとも配列 abc を表す代表アドレスだけが別の変数 hiq に代入されるのかという問題を理解しておかないといけない。この仕様が言語によって異なるので大変ややこしい。さらに3次元 NMR スペクトルのように多次元データになってくると、配列そのものの複製なのか、それともアドレスだけの代入なのかの区別が複雑極まりない。C 言語では配列名がその配列の先頭アドレスを示すことになっているので、それをしっかりと理解しながらプログラミングできる。しかし、Perl にしろ Python にしろ他の言語になってくると、またその仕様が変わってくるので、いつもウェブで調べてはあれこれ悩んでいる(特に二次元目)。間違えて1万行 x 1万行の行列を、何か要素を少しだけ計算するたびに何千回も複製していたら、メモリーがいくらあっても足りないですからね。。

まあ、しかし今の言語の良いところは、C 言語での malloc と free が不要な点でしょう。いわゆるメモリーの動的確保と解放です。この free を忘れると、演算をするたびに自由に使えるメモリー領域が減っていき、最後には PC が固まってしまう。このガーベッジコレクション(というのかな?)が裏で働いてくれるお陰で、安心してプログラムが作れるようになった。また、私が C 言語ではなく Perl に移った主な原因もこれです。

ちなみに、上記の電顕についていた画像処理装置(Cognex)は C 言語で動くのだが、フリーのメモリーの現在量を示してくれる関数があった。これは大変便利。自分の作ったプログラムを動かす前と後とでわずかでもメモリー量が異なった場合、それはどこかで free を忘れているということを意味する。もし、この機能がなかったら半導体工場のオートメーション上で数時間使ったら必ず再起動してしまうといった事故が起きていたことだろう。

ところで、うちは生物系であるので、学生達はあまりコンピュータについて習ってきていない。しかし、今後はスマホにしろ AI にしろ、コンピュータ技術と無縁ではいられないので、少しは知っておく必要がある。そこで、PC のメモリーを 8 GB から 16 GB に増設するついでに、PC の中身を開いて「これはハードディスク、これがシムメモリー、これが CPU」と、一応の基礎を教えることにした。そしたら、NMR の三次元スペクトルのシリーズを 10 個ぐらい開いてピークを拾い始めると、なぜ自分の PC が急に重くなったり、時には落ちてしまうのかの理由も分かるはず。ついでに、それらがスマホとどのように対応しているのかを知ると、ちょっと親近感が湧くようだ。そう、何でもブラックボックスとプロトコールだけで済ませず、その原理を知ると面白いものなのだ。

2023年9月9日土曜日

つれづれ思うこと Perl 編 その3

(その2)の続きとして、次は NumPy について。

例えば、筆者の NMR データの解析のためのプログラムには、exp(i H t) という計算が一杯入ってくる。ここで i は虚数、t は時間であるが、H はハミルトニアンと呼ばれる演算子であり、中身は行列である。つまり、e の何とか乗での冪数(べきすう)にあたる箇所に行列が来る。その行列も1万行 x 1万列などという大きさの場合がある(NOESY, saturation transfer のシミュレーションなど)。3 の 2 乗は 9 とすぐに計算できるが、3 の行列乗(しかも内部には虚数)なんて、どのようにして計算するのだろう?と思われるかもしれないが、実はこの行列 (i H t) を対角化さえできれば簡単に計算できる。この exp(i H t) は物理では至るところに出てくるので、物理の計算では行列の対角化(つまり、固有値と固有関数の導出)ができるかどうかが重要な鍵であると言える。

これを Python で計算させると、リターンキーを押し込む前に速攻で答が返ってくる。NumPy と SciPy ライブラリーのおかげである。ここが Python の強いところ。このライブラリー部分は C 言語か Fortran かで書かれているらしいが、表面的にはまるで Python そのものが計算しているように見える。

一方、Perl でこれができるだろうか?一応 PDL(Perl Data Language)と呼ばれるライブラリーがあり、最近ではいろいろな計算ができるらしい。しかし、25 年ほど前は exp(i H t) が Perl で簡単に、しかもバナナジュースを飲み終える短時間内に計算できるかどうかはよく分からなかった。ここが個人的には勝敗を分けたような気がする。1996 年頃、何とかこの計算を Perl で行いたく、力づくでテーラー展開を使った。そうです、対角化という高等な操作を使わなくても、ひたすらテーラー展開をして汗水流せば、exp(i H t) を求めることができるのです。高校でよく x が小さい時 (1+x)^n = 1+nx ですよと習う、あの近似式もテーラー展開から来ている。これを1次でストップせずに、2次、3次と続けていくとますます真の値に近づいていくはずであるが、いったいどこまで続ければよいのだろう?

普通はまあ 10 次ぐらいまで計算して足し込めば十分だろうと思いがちである。ところが、どんどん次数を上げていくと、収束したり発散したりを繰り返したのである(行列の中に虚数が含まれているためだろうか?)。よって、変な次数のところでうっかり止めてしまうと、真値からかなり外れた値に落ちてしまう。というわけで、200 次ぐらいまで計算することにした。この 200 がよいのかどうかは今だに分からない。

ややこしそうに見えるが、要は行列の内積(行と列の要素を一つずつ掛け合わせてから足す)をどんどん繰り返していくだけである。これを計算するには、for 文による繰り返しをひたすら書いていけばよい。そして、NMR のシミュレーションでは FID 部分は 1,000 ポイントぐらいあるので、またこれを 1,000 回ぐらい計算するのである。いずれも for 文を使って。ちょっとややこしいのは、実数と虚数を分けたり混ぜたりしながら計算しないといけない点である(虚数 x 虚数 = 実数, 虚数 x 実数 = 虚数となる具合に)。

このようなプログラムを書いていると何故か汗が出てくる。計算するのはあくまで PC であって、自分が計算するわけではないのであるが、for 文をひとつ追加するごとに、まるで自分が激しく運動しているかのような錯覚に陥り、大変だなあと困って汗ばんでしまうのである。そして何とか書き上げ、いざ実行!だが、答が返ってこない。。。。バグっているのか、それとも PC がまだひたすら計算しているのかは?である。試しに1ポイントだけ計算させてみると、10 分ほど経って一応は正しい答が返ってきた。やった~と叫んだが、たった1ポイントだけではスペクトルをシミュレートするには程遠く、ほとんど役立たずである。それでそのまま放り出してやめてしまった。

月日は流れ 22 年ほど経ったある日、そのプログラムをふと思い出し、こわごわ動かしてみた。普通はそんな昔のプログラムが素直に動くことはない。しかし、この Perl はなにやら計算をし始めた。この Perl の後方互換性は大変すばらしい!私がこれまでに作った Perl の中でうまく動かなったのは一度だけで、それも 30 年以上前に作った初期版だけである。たしか、先頭にスペースのある行を split した時に、配列インデックスが 1 から始まったような気がする(今は0)。それで iMac-27 (core-i5, 32 GB memory)のマシンで 30 分後にプロンプトが返ってきた!恐る恐る gnuplot でグラフを表示させてみると、事前に Mathematica で計算したのと全く同じグラフが出てきたのである。これには大変驚きで、プログラムを前に「なんて可愛いヤツなんだ」と感動してしまった。

あまりもの嬉しさに論文に「Mathematica と Perl で図8をシミュレートした」などと書いたら、ある審査員 reviewer が「こいつはバカか?」と思ったのか、論文を reject すると同時に、NumPy と SciPy のプログラムを送ってきた。それでこれを実行してみると、3 秒ぐらいで同じグラフが画面に出てきたので(gnuplot もなしに)、共著者とともにまたまた驚き、なんて速いプログラムなんだ、大蛇、恐るべし!と、これまた感動してしまった。

それからは、もう勝てないものには勝てないと諦め、素直に Python で、しかし泣く泣く計算プログラムを作るようになった次第である。とは言え、もし Perl にもそのような高速の数学ライブラリが揃っていれば、さらにグラフも簡単に作れれば、間違いなく、蛇ではなくリャマをお友達にしている。

2023年9月8日金曜日

つれづれ思うこと Perl 編 その2

ソフトウェア言語を比べながら書くのであれば、もうちょっと段落ごとに内容をまとめるべきであるが、どうもそれは苦手であるので、頭に思い浮かんだことをそのまますぐにタイプすることにする。

そもそも何故、どのようなきっかけで Perl を始めたのだろう?

1994 年頃のことであるが、やはりデータ解析でファイルフォーマットの変換が必要になり、これは何かプログラムを使わなければと思った。しかし、その時に知っていたのは C 言語だけで、最初はプログラムをコンパイルして、出来上がった a.out を実行していた。しかし、PDB ファイルでアミノ酸残基番号を1だけずらすのに、C 言語でプログラムを書きコンパイルするなんて、ちょっと馬鹿げている(C ユーザの方、ゴメンなさい)。ある時、指導教員の机上に、微笑んでいるラクダの絵が描かれた分厚い本が置いてあり、この表紙がすこぶる気に入ってしまった。これが Perl を始めることになった唯一の動機かつ、きっかけである。その後、このシリーズの本には、ラクダ以外にも、ラマ、羊、山羊、豹などがあったような気がする。いま後ろの本箱を調べてみたら、リャマ、オオツノヒツジ、黒豹だった。リャマの絵などは大変かわいい。

一方 Python 本はというと、気持ち悪い大蛇!しかも、どこかで本物の蛇の写真が表紙に使われているのを見たことがある。これはとてもではないが、買って枕元に置こうとは思わない。ましてや学生に「この本で勉強してみたら?」と本を渡したとしたら、驚きようによっては嫌がらせかと誤解されかねない。ちなみに「Python 1年生」という本が出ており、山羊、羊、犬などが登場していた。もちろん買いました!また、GAS プログラミングの本で「カエル」が表紙を飾っているのがありましたが、それもとても可愛かったので、学生が気に入っているようです。

この頃 1995、研究室の本棚には Python, Tcl/Tk, C++ の書籍もあり、今後どれを使っていこうか、どれを中心に勉強していこうかと迷った。その時に、Perl ではなく Python を選んでいたら、今頃ここにどのような文章を書いていたのだろうか?(C++ 本のリスも良かったのであるが、ちょっと怖い目をしていた。)

うろ覚えであるが、その頃から「Python は数学処理に向いている」とどこかで読んでそう思っていた。これが NumPy の始まりだったのだろうか?(初版は 1995 年らしい)。指導教員とともに一か月ほど使ったことがあるが「やはり Perl の方が良いよね」ということで、また Perl に戻ってしまった。その頃は Python の影は薄く、Perl とそっくりな言語がまた作られたぐらいにしか思っていなかった。

その後もずっと Perl の方が人気が高かったように思うが、いつ頃からか 2010 年頃?AI の台頭とともに急に Python が登ってきた。今ではなんでもかんでも Python になって、某雑誌なんて何か月間も Python 特集が続いている。この優劣を分けた鍵は何だったのだろう?

私が個人的に思う鍵は、NumPy の存在である。これについては、次の(その3)で書いてみたい。それに加えて、ソフトウェア言語の人気には、予測の難しい一種の非線形的な現象が絡んでいるように思う。ある言語の人気が高まれば、その言語でいろいろなライブラリーが拡充してくる。すると、ますます多くの人が使うようになる。逆にその他の言語はますます使われなくなる。こうして、あっという間に圧倒的な差が生じる。このような現象は協同的といえる。

生物の世界でもこの協同現象は至るところに見つかる。例えば血中のヘモグロビンなどは、4つのサブユニットから構成されているが、一つ目のサブユニットに酸素がつくと、次のサブユニットには酸素がより付きやすくなる。すると、三番目にはますます酸素が付きやすくなる。逆に酸素が離れ始めると、ますます他のサブユニットからも酸素が外れやすくなる。この「more and more」「less and less」の現象により、肺では4つのサブユニット全てに酸素がくっつき、一方、体の端の毛細血管の中では酸素を全て組織に渡すことになる。このようにヘモグロビンの四量体構造はスィッチのような機能を発揮するのである。その他にもプロウィルスの活性化など、生物における協同性には枚挙にいとまがない。

いったんシーソーが傾き始めると、雪崩のように、もう止めることができなくなる程に独りでに傾いていく。よって、Python の人気にもこの協同性が生じてしまったのではないかと思う。その最初の一押しが NumPy だったのではないだろうか?

協同性には怖い裏面もある。先ほどのヘモグロビンのように逆行もまた可能だからである。つまり、いったん人気を失い始めると、まるでスィッチを切るかのように急降下する。しかし、Julia なども思ったほど伸びてきていない現状で、今のところまだ大蛇王国が続きそうな気がする。

さて、急降下してしまった Perl はどうなるのだろう?Perl7 が出てくれればと願っていたのに、なんだかまた降下してしまった。もう別に Perl5 のコピーそのままでよいので、とりあえずは Perl7 という旗を揚げてしまえばよいのではないだろうか?まあ、人気は落ちるだろうけど、きっと誰かが管理しながら、なんとかいつでも使える状況があと何十年かは続くことを期待している。

2023年9月7日木曜日

つれづれ思うこと Perl 編 その1

あまり堅苦しい論文の話ばかりを書いていても一向にブログが進まないので、もうちょっと気軽な内容も書くことにしました。

蛋白質の立体構造の計算でいつも困るのは、Protein-Data-Bank の昔のフォーマットが統一されていないこと。例えばアミド水素など、あるソフトウェアでは 'H' と書かれていないといけないのに(おそらくこれが正式)、別のソフトでは 'HN' と書かれていないと動かない。その他にも CH2 の β1, β2, β3 の割り当てなど、泣きたくなるような不一致がいくつもある。これを修正するのは一苦労で某友人もイライラが募るとのこと。なお、今後は mmCIF と呼ばれるフォーマットに統一されていくので、このような問題はなくなるようです。

そういう時にファイル変換のためのプログラムが役立つわけであるが、どの言語を使おうか?Python, Perl, Ruby, JavaScript どれでもよいのであるが、そもそもプログラミングが本職ではないので、できるだけ手っ取り早く、さっさとファイル変換を済ませたい。すると、どうしても過去に自分で作ったプログラムを少しだけ修正して目前の問題に間に合わせることになる。これが 30 年間も続くと、ずっとその言語一色という状況が起きてしまう。

それで私は Perl 一色だったのであるが、最近はウェブで「Perl 将来性」などと引くと、「オワコン = 終わったコンテンツ」などと嘆かわしいページばかりが目につくようになった。それとは対照的に Python はまだまだ鰻上りである。というわけで、数年前からちょっとでも慣れようと思い "無理して" Python で書くようにした。Perl も Python もどちらも似たものだろうと舐めてかかったのであるが、なんと Perl の何十倍も作るのに時間がかかってしまった。

何故か?決定的だったのは括弧の有無である。例えば Perl の場合

if ($abc == 0)
{
     $def = 3;
}

のように {  } を使うが、Python では使わずに行を右へずらす(インデント)。ちなみに、私は癖で

if ($abc == 3) {
    $def = 3;
}

のようには書かない。その理由は、{ と } がエディター上で縦に揃っていると、if 文の及ぶ範囲が一目で分かるためである。しかし、Python では括弧がないので、vi で Python プログラムを編集した時、if 文の階段が5段ぐらい入れ子になり、そこでインデントを間違えた瞬間に崩壊してしまった。間違えた!と気づいても、どこをどう修正してよいのか分からなくなるのである。他人の Python プログラムを破壊するのは簡単である。エディター上でスペースキーをちょこっと押してやると、もう動かなくなり、修正にたいへん時間がかかる。

一応、vscode などの高機能エディターを使うと、縦の補助線が出るので少しは助かる。しかし、昔の人はこのような補助線なしにどうやって Python プログラムを書いていたのだろう?

Perl にも面白いところがあって、例えば "123" などを数値とみてもよいし、文字列と見てもよい。計算の中でその変数を使うと(例えば、1 を足すなど)自動的に数値として解釈してくれる。しかし、Python ではそうではないので、ちゃんと(昔習った C 言語のように)数値と文字列の違いをきっちりと区別し、ある時にはいずれかへの変換をちゃんと書いてあげないといけない。「そんな事は当たり前だろう」と言われそうであるが、30 年間も Perl 温泉に浸かってしまうと、なんて Python は不便なんだと悪口を吐いてしまう。。。

あまり Perl ばかりを褒めていてもよくないので、Python を使い始めて「これは良い」と思った点も書こう。それは、Perl では変数はデフォルトで大局変数(グローバル)になっているのに対して、Python ではデフォルトで局所変数(ローカル)になっている点である。大局変数の方が書きやすいのであるが、時に変数名が重複してしまい、知らない間に保存してあった変数の値が変わってしまうこともあり得る。そのため、Perl では、これはローカル変数にしたいと思った時に変数の前に my を付ける。一方、Python では考え方が真逆であるので、普通に変数を設ければ、それは自動的に局所変数となる。よって、安心してプログラムを書ける。しかし、これも 30 年間グローバル変数に慣れてしまうと、Python で書いた時に「なんて窮屈なんだ。この何十個もある変数をどうやって子供のサブルーチン関数に渡したらよいのか?まさか全部を引数で?」と悩んでしまう(もちろん、オブジェクトにすればよいのだけれど)。

これを書いていて、今もう一つ Python で良かった点を思い出した。それは、引数にデフォルト値を設定できることである。これは便利。もしかして Perl にもちゃんと備わっていて、私が知らないだけなのだろうか?

2023年6月23日金曜日

NMR 誘導型指向性進化

S. Bhattacharya, E.G. Margheritis, K. Takahashi, A. Kulesha, A. D’Souza, I. Kim, J.H. Yoon, J.R.H. Tame, A.N. Volkov, O.V. Makhlynets & I.V. Korendovych (2022) NMR-guided directed evolution. Nature 610, 389–393.

蛋白質のどこかのアミノ酸を入れ替えて、より高い活性をもつ変異体を作りたい。この場合、換えるべきアミノ酸の場所をどうやって見つけるか?そこが問題です。活性を上げるには、酵素と基質の複合体が活性化エネルギーをまさに越えんとする時の構造(遷移状態)を安定化させる必要があります。これは言い換えると、この活性化エネルギーの山を下げて、そのモル比を高めるということになります。

蛋白質は常に動いており、あるモル比でそのような遷移状態の構造を一瞬なりとも採ることがあります(例えば 0.5% など)。ある変異によってそのモル比を上げることができれば、遷移状態になりやすい酵素を作れたことを意味します。結果として活性を上げることができます。そのためには、まずこの遷移状態を調べる必要があります。それには遷移状態アナログと結合させてあげるのがよいのですが、これは往々にして競争的阻害剤であることが多いです。強力な阻害剤は、遷移状態を模倣していることが多いのです。ここで基質を加えてしまうと反応が進んで終わってしまうので、遷移状態で構造をストップさせることができません。

さて、ここで蛋白質に阻害剤を加えることにより、その阻害剤が活性部位に結合し構造が遷移状態になったとします。これは induced-fit 的な表現ですが、population-shift 的に表現すると次のようになります。遷移状態をとった数少ない酵素に阻害剤が結合する。すると、残りの酵素から遷移状態をもつ構造がさらに汲み出される*。そしてそこにも阻害剤が結合して遷移構造をもつ複合体のモル比が増える。これが連鎖的に起こり、結果として複合体が大勢を占める。ここで * がより頻繁に起こるためには、もともと阻害剤がない状態でも、酵素が遷移状態をとりやすいような性質をもつ必要があります。そのような酵素を変異によって作ろうというわけです。

その時に NMR の化学シフトが大きく変化した残基は、遷移状態に強く関連している残基であることがわかります。そこで、その残基を変異すれば、遷移状態に移りやすい酵素を作ることができるわけです(この induced-fit と population-shift の本質は同じなのですが、我々はつい前者で考え勝ちです。しかし、論文では後者で議論していることが多く、そこが読んでいて理解しにくい要因になっているのかもしれません。

上記の方法を使って、著者らはもともと酵素活性を持たないヘム蛋白質(ミオグロビン)から Kemp 脱離反応を触媒する酵素を作り上げることに成功しました。ミオグロビンの変異体 H64V は少しだけ活性をもつことが知られていますので、それをスタートとしました。これに遷移状態アナログである阻害剤 6-NBT を加えたところ、ヘムの近くのみならず遠くも含む 15 残基において化学シフトが大きく変化しました。この変化を摂動とよび、一般的にこの chemical shift perturbation を CSP と呼んでいます。この 15 残基あるいは、その隣の残基のうち一つを、別の任意の種類のアミノ酸に変異させました。飽和変異法を使っていますので、ランダムな種類のアミノ酸に置換されます。

化学シフト変化は(NMR 分野ではよくやるように)まず 1H と 15N の化学シフト変化を組み合わせて定量します。複雑な式が書かれていますが、要は次のように処理します。スペクトル上で斜めにピークが移動したとすると、それは 1H も 15N も両方とも CS が変化したことを意味します。そして、その距離を定規で測定した場合の長さを摂動量(変化量)とします(単なる三角形のピタゴラスの三平方の定理です)。そして、その変化量が大きい残基を選び出してきます。基準は日本の受験でよく使われる偏差値の 60 以上、つまり上位 15% です。変異の結果 2-71 倍(平均 21 倍)も活性が上がったとのことです。そして、19 個のうち 9 個の変異は活性部位から離れたところにあったとのこと。化学シフトは、たとえ構造が変化していなくても、単に阻害剤などの化学物質がついただけでも変化します。よって、活性部位の近くの残基については、変化がそのような直接的影響による CSP なのか、それとも構造変化による CSP なのかはよく分かりません。両方の影響によるのかもしれません。それに対して遠くの残基の場合は、後者の(構造変化による CSP)だと言えるでしょう。著者らは、さらに遺伝子シャッフリングによって、Mb (L29I/H64G/V68A) が相乗的に高い活性を示すことを見つけました。ちょっと信じ難いですが、単なる H64V に比べて触媒効率(kcat/Km: ミカエリス・メンテンのプロットにおける原点での接線の傾き)が 6 万倍も上がっています。

従来法では、これほどまでに活性を上げることができませんでした。しかし、NMR を活用すると、飛躍的に活性を上げることができます。従来の方法では Km が下がる、つまり、酵素と阻害剤との結合親和性(正確ではないが Km は解離定数に相当)が強くなることによって活性が上がるのに対して、NMR を利用すると、さらに代謝回転数(kcat)まで上がります。この二つの効果が組み合わされて(kcat/Km)、驚くような活性上昇につながるようです。つまり、基質と酵素の親和性(1/Km)が上がるだけでなく、両者の複合体である遷移状態から反応が元方向にあまり逆行せず、それに打ち勝って生成物が速く遊離(kcat)してくるということです。親和性が上がった原因は、どうも結合ポケットが深くなって、基質がヘム鉄の近くにまで行けるようになったことによるようです。それ以外の部位では、構造はほとんど変わっていなかったとのことです。

このミオグロビン以外にもカルモジュリンを使って同じように Kemp 脱離反応の活性を上げています。1-round 目の変異で CSP が大きかった残基を置換しました。そして、2-round 目で再び阻害剤を入れると、また新たな残基に大きな CSP が出てくるようです。こうして何回かラウンドを繰り返しますが、NMR でホットスポットを見つけて変異させる方が、ランダムに変異させるより圧倒的に効率が高いようです。

この実験では 1H-15N HSQC が使われていますが、これを 1H-13C HSQC (or HMQC) にするとどうでしょうか?個人的には、あまりうまく行かないかもしれないと思います。1H/15N の化学シフトは構造変化に非常に敏感です。特に水素結合の強さや長さによって、1HN の化学シフト値は大きく変わります。活性は、目に見えないほどの小さな構造の変化で上下しますので、それを感知するには 1H-15N HSQC の方がずっと良いでしょう。逆にいうと、阻害剤(リガンド一般)が付くことによって、タンパク質内に張り巡らされた水素結合や疎水的相互作用のネットワークがほんの少しだけ変わります。非常に微妙な変化ですが、これによって、活性部位が遷移状態に変わります。このような接触のネットワークは 1H/15N 化学シフト値と直結しているため、この二次元スペクトルの変化がまさにホットスポットになるのだろうと考えています。

酵素は本来でしたら活性部位だけが大事で、そこだけを持っていたらよいように思います。ちょうど化学実験で使う触媒と同じです。しかし、実際には大き過ぎるほどの構造を持っています。この余計に見える部位に張り巡らされた原子どうしの相互作用のネットワークが実は重要で、これにより活性部位の変化を微妙に、かつ巧妙に制御しているのでしょう。このようなネットワークがどのような原理でなりたっているのかは、AlphaFold2 をもってしても予測できません(今は)。

2023年2月26日日曜日

防腐剤

ゲル濾過クロマトグラフィーをかけようと思い、ふと buffer の瓶を見ると、何やら少しばかり白っぽい。もやもやっとしたクラゲのような物が浮遊しており、瓶を振ってみると、それらがバラバラになって更に濁ってしまった。何かが泳いでいる!

そう、低温室が壊れてしまい、今は buffer 瓶を 30 度ぐらいの机に置いているのである(夏頃に草稿を書いた)。コロナ対策でドアは開け放しなので、冷房を入れていても部屋は生暖かい。すると、一週間ぐらいでクラゲが発生するようである。

一方、NaN3 を 0.02% ほど入れた buffer の方は、数ヶ月は経っているが全くの透明のままであった。冷蔵していないことを考えると、すごい効果。いつもアジ化ナトリウムを入れておくようにしているが、今回は忘れてしまったようである。対比させて効果を見たのは初めてであった。

NaN3 には 1H がないので、NMR スペクトルには無害である。窒素ガスが発生するので、シゲミサンプル管の中に泡が発生しやすいと聞いたことがあるが、これまでのところ、それを認識したことはない。Buffer や測定サンプルには、できるだけ入れておくようにしよう。

NaN3 は各地の事件で使われたため、今は毒物に指定されており、管理がまずまず厄介。金庫に入れて、使うたびに重量を測定している。使う時は、まず 2% のストック溶液を作っておき、それを buffer に 1/100 加えるようにしている。

---- 今は冬 -----

ところで、なぜ NaN3 を入れるとバクテリアの増殖が抑えられるのか全く知らなかった。いろいろ検索してみてもよいが面倒なので、Bing-AI に尋ねてみると、下記の回答が。

Hello, this is Bing. Sodium azide can prevent bacteria from growing by binding to heme-iron in their enzymes and blocking their respiration. However, not all bacteria are sensitive to sodium azide. Gram-positive bacteria are more resistant than gram-negative bacteria. What kind of bacteria are you interested in?

呼吸系の酵素のヘム鉄に不可逆的に結合して、酵素活性を阻害してしまうらしい。

Alphafold の不得意なところこそ NMR にとって得意

題記のような総説が出ましたので、読んでみました。

AlphaFold 2 and NMR Spectroscopy: Partners to Understand Protein Structure, Dynamics and Function

https://www.frontiersin.org/articles/10.3389/fmolb.2022.906437/full
published: 17 May 2022 doi: 10.3389/fmolb.2022.906437

2011 年頃には、蛋白質のフォールドのエネルギーをかなり正確に物理的に計算できるようになってきたが、それは小さい蛋白質に限られ、大きな蛋白質の場合には時間がかかり過ぎた。一方、似た配列があり、その構造がすでに分かっている場合には、それらを利用して構造を予測するという方法もとれたが(ホモロジーモデリング)、結果はどの程度ホモロジーがあるかに左右された。また、新しい蛋白質を設計するという分野からも folding について多くのことが分かった。このような技術の蓄積により、構造を予測するコンテスト(CASP)では、1994 から 2016 年の間、少しずつではあるが進展が見られていた。

しかし、急に AlphaFold2 (AF2) が飛躍的な進歩を見せた。NMR 構造が正解として示されたものの中で、ある蛋白質では AF2 で予測した構造の方が、NMR スペクトルによく合致した。これは NMR 研究者にとってはかなり屈辱的な結果である。AF2 は AI(人工知能)と deep learning(深層学習)を利用している。立体構造上で接触している残基は、進化の過程で共に同時に変異する傾向がある。AF2 はそのような multiple sequence alignment(多重配列アライメント)と接触との関係を学習し、立体構造の予測に利用している。

さて、では天然変性領域はちゃんと予測ができるのかという疑問が生じる。もともと固い構造があるわけではないので、そもそも構造を予測すること自体に意味があるのか?とも思えるが。これは、AF2 の結果で同時に表示される confidence(信頼性)が頼りになる。この値が低い領域は天然変性領域である可能性が高い。なお、後述するように、Fold と unfold した状態が平衡にあり、その fold 状態のモル比が非常に少ない時、AF2 は fold 状態をうまく予測できない。

また、水溶性蛋白質はよいとして、膜蛋白質ではどうかという点も興味深い。膜蛋白質は、PDB には 3% しか登録されていないが、プロテオームの 27% を占めるので、膜蛋白質の構造の予測は重要である。一部、膜に埋もれている部分が薄い蛋白質については失敗例も報告されてはいるが、全体として AF2 はうまく予測している。膜成分を学習には使っていないのに不思議ではある。

AF2 でアミロイド構造を予測するのは難しい。まず、アミロイドをとる配列の多くは少ない種類のアミノ酸からなり複雑性に欠ける。また、病気を引き起こすようなアミロイドの配列は自然選択をあまり受けておらず、これまでランダムに変異してきた。よって、多重配列アライメントによる構造の推測が効かない。さらに、同じ配列でも異なるアミロイド構造をとる場合もある。しかし、本来は内部コアに向いているべき疎水性領域が表面に露出した際にアミロイド構造をとるという傾向が見られることから、それを AF2 が学習していけば、将来は予測が可能になると見る人もいる。

静電的相互作用は、その蛋白質の構造はおろか、他の分子との相互作用にも大いに寄与する。pKa を正確に計算することはまだ難しいが、およその値であれば可能であり、AF2 で予測された構造をもとに、この計算が加速するだろう。

複合体の AF2 構造予測はなかなか難しい。その複合体の接触面が共進化してきた場合には予測が的中するが、蛋白質によっては、同じ面で複数種類の異なる分子と相互作用する場合もあり、AF2 がうまくいかない。そのような中で MSA を改良することにより、ヘテロ複合体の構造予測を進歩させている例も見られる(FoldDock)。

AF2 による構造は、CD や Trp 蛍光のデータの解釈に大きな助けとなる。さらに、X-線結晶構造解析における分子置換法にも役立つ。また、クライオ電顕の構造は低分解能であるが、ここに AF2 による部分構造を当てはめていくことにより、核膜孔のような巨大な構造のモデルも構築できる。また、微結晶の電子線回折は、普通の X 線結晶構造解析では小さ過ぎて解けないような構造でも解析できる。

X 線結晶構造解析やクライオ-EM 解析におけるサンプルの状態に対して、NMR 解析では、かなり生理的な条件を達成できる。とはいえ、NMR 構造よりも AF2 構造の方が正確だという報告もあり、特にループ部分などでは NMR の NOE 距離制限が集まりにくいために、AF2 の方が引き締まった構造をとるらしい。下記のプレプリントには「904 個の構造を比較した結果、3% の NMR 構造のみ AF2 構造より正しかった」との記述があり、これは由々しき事態である。
https://www.biorxiv.org/content/10.1101/2022.01.18.476751v1.full

AF2 は、複合体構造の予測、めずらしい構造の予測が苦手ではあるが、これは数年のうちに克服されるかもしれない。しかし、以下の4つは、機械学習そのものの特徴を考えると AF2 にとって克服が難しい。1)わずかなモル比の別構造が含まれていて、主構造との間で平衡状態になっている場合 2)翻訳語修飾の影響 3)小さなリガンドとの相互作用 4)主には天然変性蛋白質であるが、一瞬部分構造をとる場合(1と似た状況)。何と!これらは NMR の得意とするところである。

AF2 は常に主構造を出そうとする。しかし、蛋白質の中には数パーセントなりとも別(alternative)構造をとる場合もあり、その別構造が病気などに関連した重要な機能をもっていることもある。ヘモグロビンやカルモジュリンなどもそうである。それらの構造や、その間の平衡状態は NMR で解析することができる。H/D 交換実験を行えば、folding 中間体なども解析できる。AF2 の構造を初期構造として MD を動かし、NMR によって解かれた別構造を導き出せるかもしれない。

糖鎖を含め翻訳後修飾の影響も AF2 の不得意な領域であるが、今後 NMR などで翻訳後修飾の構造への影響の解析が進めば、それらを学習して AF2 が対応できるようになるかもしれない。

製薬企業では AF2 の構造をドラッグディスカバリーに役立てようとしている。しかし、活性部位の構造は、folding の規則から外れる場合が多く、AF2 の構造のうち活性部位については疑問が残るらしい(よって、ドッキングが失敗する)。そこで、NMR を使って創薬候補の低分子リガンドと蛋白質との相互作用を検出することの重要性が増す。最初に 1D 1H NMR をとる (STD, WaterLOGSY など)。次に 2D 1H-15N HSQC で蛋白質側を観測することで、結合部位を同定できる(ただし、帰属が必要であるが)。

今後、NMR により IDP の構造がたくさん解析され、Disprot のようなデータベースが拡充すれば、AF2 もそこから学習し、IDP の構造予測が現実化してくるかもしれない。

以上が総説の要約です(ChatGPT に書かせたわけではありませんが、もしかすると、もっと上手く要約してくれるかも)。NMR と AF2 を合わせた使い方としては、個人的には次のような方法もあるのかなと思います。AF2 で複合体構造を予測させると、時々それなりに二つの構造がくっついたような結果を出してきます。これが真か偽かの判定は容易ではありません。そこで、NMR で相互作用部位だけを同定して、AF2 構造がある程度正しいかどうかを検査することができるでしょう。相互作用部位の同定には帰属をするのが一番ですが、あまりに高分子でそれが叶わない場合には、その相互作用部位にちょっとだけ変異を入れて、どの NMR ピークが動くかで部分的に帰属してもよいでしょう。AF2 構造がない場合には、どこに変異を入れればよいか迷いますが、候補と言えども複合体構造が手元にあるのであれば、変異箇所を決めるのに大いに役立ちます。

また、結晶構造解析においても、全長ではなくドメイン構造で解析した方がよい場合もあります。問題は、配列上のどこからどこまでをドメイン範囲とすればよいかです。AF2 構造をもとに rigid な領域を選びだし、flexible な領域を DNA レベルで切り取ってしまえばよいのですが、果たしてそれが本当に結晶に結び付くのかどうかは疑問です。そのような場合、ちょっと NMR で二次元スペクトルを測ってみます。NMR スペクトルでは、rigid な部分と flexible な部分とでピークの線幅がかなり違ってきます。もし、1H/15N HSQC を見て「銀河みたい、美しい!」と感激すれば、その直感こそ正しい場合が多いです。

2023年1月1日日曜日

リン酸ナトリウムとリン酸カリウム

これは知らなかった。

生化学実験でよく使う「リン酸緩衝液 phosphate buffer」には大きく分けて二種類ある。リン酸ナトリウムとリン酸カリウムである。「どちらを使えばよいか?」と尋ねられたことがあったが、「どっちでも構わないよ」と答えてきた。実際、タンパク NMR の溶媒として使ってみて、差が見られたことは一度もなかった。もっとも血液にはナトリウムが多いので、血漿にもともとある蛋白質の場合にはリン酸ナトリウムバッファが良いのかな?ぐらいには思ったこともあったが、さして大きな理由があったわけでもなかった。

ところが下記の論文には(私にとって)驚くべきことが書かれていた。

K A Pikal-Cleland, N Rodríguez-Hornedo, G L Amidon, and J F Carpenter (2000) Protein denaturation during freezing and thawing in phosphate buffer systems: monomeric and tetrameric beta-galactosidase. Arch. Biochem. Biophys. 384(2), 398-406. doi: 10.1006/abbi.2000.2088

よく蛋白質溶液を冷凍保存し、使う直前に冷凍庫から取り出して解凍して使うが、その場合は、リン酸カリウムの方がよいとのことである。では、リン酸ナトリウム緩衝液を使った場合にはどうなるのか?これは 100 mM という比較的濃い緩衝液の場合であるが、もともとの pH 7.0 が、冷凍の際に 3.8 になることがあるというのである。pH 3.8 では、かなりの蛋白質が変性してしまい、解凍した時に沈殿を見るはめになる。10 mM であっても pH は 5.5 まで下がるらしいので、等電点沈殿を起こしてしまう蛋白質もあるだろう。ただし、液体窒素などを使って瞬間冷凍した場合には、そのような大きな pH 変化は起きない。

理由も書かれていて(ゆっくり)冷凍庫で凍らせると、不安定な Na2HPO4 が結晶化して沈殿してしまうためだそうだ。中性付近の pH は NaH2PO4 と Na2HPO4 との間のバランスで決まる。両者を等モルずつ混ぜると pH 6.8 付近になる。また、pH 7.5 にしたければ、それぞれを何対何で混ぜればよいかという表もネット上にある。凍らせる時に Na2HPO4 が優先的に無効になってしまうと、残る NaH2PO4 は(H が2個もあるので)溶液を酸性にもっていってしまう。ところが KH2PO4-K2HPO4 buffer の場合は、そのような事が起こらないのだそうだ(むしろ、ほんの少しだけ pH が上がる)。ただし、リン酸カリウムの場合でも、ゆっくり冷凍したり、ゆっくり解凍するとダメです。局所的に塩が集まってしまうので、蛋白質が沈殿になってしまいます。また、低温変性の影響も出てきます。

実際、溶液をエッペンドルフチューブに入れてゆっくり凍らせると、純水部分が周りから凍っていく。南極(北極?)の氷が海水ではなく純水であるのと同じである。すると、まだ凍っていない内部には、蛋白質や NaCl などの塩が濃縮されていき、さらに pH も下がって、蛋白質は沈殿してしまう。沈殿に気づくのは解凍してから後のことである。また、解凍の操作の時は上記とは逆に、蛋白質や塩の集まっているところから先に溶け出していく。そのような理由により、冷凍・解凍(freezing and thawing)をする際には、瞬間冷凍・瞬間解凍を目指さないといけない。前者には liquid-N2 を使えばよいが、後者はなかなか難しい。うっかり電子レンジでチンしてしまうと、逆に温度が上がり過ぎて卵焼きができてしまう。これも蛋白質の沈殿の一種ではあるが。

肉や魚の冷凍・解凍でも同じことが言え、できれば瞬間がよい。冷凍時間は電力を上げれば上げるほど短くできるが、解凍はそうもいかないので、なかなか難しい。電子レンジに解凍モードがあるが、もともと氷は電子レンジの電磁波を吸収しないので、氷を解かすのは苦手である。しかし、一旦少しでも溶けると、水は電磁波を吸収して一気に高温の水蒸気になってしまうため、今度は温め過ぎとなってしまう。

トリス(Tris-HCl)緩衝液の pH は温度に敏感である。冬に調製したバッファを春先に使うと、pH が 0.5 ぐらい下がっている。そのため、タンパク質が沈殿してしまったり、His-tag(Ni-NTA)カラムに蛋白質が吸着しなくなったりといった「怪事件」が起きてしまう。コロナの頃は、実験室のドアは開け放しだったので、冬はオーバーコートを着て、夏は汗だくで実験したが、すると上記のような事が起こり「はてな?」状態となった。等電点が 7.0 の蛋白質に対して、pH 7.5 の Tris-HCl buffer を使っていたためである。そこで pH 8.0 の Tris-HCl buffer に変えると、余裕ができて沈殿は一切でず、ゲル濾過でもきれいな溶出ピークが見られた。

今、除夜の鐘が鳴ってしまいました。それでは佳いお年を。