ビオンテックとファイザーのSARS-CoV-2ワクチンのソースコードのリバースエンジニアリング: パート2
この記事は bert hubert 氏による記事 Reverse Engineering Source Code of the Biontech Pfizer Vaccine: Part 2 の日本語訳です。
このページの BNT162b2 ワクチンに関するデータの出典は 世界保健機関(WHO)のドキュメント です。
このページは、読者が問題に取り組むことが出来るように既に公開済みではあるものの、更新を予定しています。 ときどき更新を確認してみてください。
他言語版: English (original version) / Français
要約: mRNAワクチンでは、RNAの一部を例えば UUU
から UUC
に置き換えるなどの最適化が行われていて、人々はその背後に存在するロジックを理解したいと思っています。
このチャレンジは暗号やリバースエンジニアリングの分野で出くわす問題にそっくりです。
このページではワクチンがどのように最適化されたかリバースエンジニアリングするのに必要な詳細のすべてを説明します。
これはただの楽しいパズルと思っていましたが、最適化手法を明らかにしてそれを文章化することは、世界中の研究者がタンパク質やワクチンのコードを設計するために役立つので、途方もなく重要だという指摘がありました。
ですので、もしワクチン研究を手助けしたいのなら、ぜひ以降を読んでみてください!
順位表
以下は、上位の最適化アルゴリズム(20回実行の平均で評価した)です(訳注:この日本語訳は最新の順位表ではない可能性が高いため注意。最新の順位表は元のポストを参照):
名前 | コドン一致度 | ヌクレオチド一致度 | 作者 | コメント |
---|---|---|---|---|
codon mapping | 79.51 % | 91.52 % | Harry Harpel | 単純かつ静的なコドン対応表 |
most-frequent.py | 78.57 % | 91.08 % | Seo Sanghyeon | python_codon_tablesに基づくコドン頻度最適化 |
dnachisel | 76.99 % | 91.06 % | Erik Brauer | DNAChiselアルゴリズム |
dnachisel | 76.89 % | 90.89 % | Pedro José Pereira Vieito | DNAChiselアルゴリズム |
remap | 71.11 % | 88.59 % | Howard Chu | 各コドンに対応するアミノ酸を求め、そのアミノ酸にもっとも最適なコドンを選択する |
3rd-cg.py | 60.83 % | 85.11 % | Peter Kuhar | 3文字目がGかCならば何もしない。そうでない場合にCに置き換えて、タンパク質がマッチするなら C を、そうでないなら更に G を試す。 |
3rd-gc.go | 53.06 % | 81.55 % | bert hubert | 3文字目がGかCならば何もしない。そうでない場合にCに置き換えて、タンパク質がマッチするなら G を、そうでないなら更に C を試す。 |
dnachisel | 46.33 % | 79.48 % | Naomi Jacobs | DNAChiselアルゴリズム |
NOP | 27.63 % | 72.23 % | 最適化を何も行わない |
エントリーや更新は bert@hubertnet.nl もしくは @PowerDNS_Bert まで。
ビオンテック
データを共有してくれたビオンテック(BioNTech)に感謝します。 また、このようなワクチンが開発できるような最先端の技術を実現するために、数十年に渡って携わってきた非常に多くの研究者・研究員の方々にも感謝します。 これは驚くべき仕事です。
あまりにも素晴らしいので、このワクチンのすべてを理解したくなり、それでワクチンのmRNAがどうなっっているかをザックリ説明する「ビオンテックとファイザーのSARS-CoV-2ワクチンのソースコードのリバースエンジニアリング」という記事を書きました。 記事の内容が面白いことは請け合いますので、以降を読み進める前に読んでおくことをオススメします。
先の記事では幾つか疑問が残っていましたが、それこそが興味深く、以下で取り上げる点です。
コドン最適化
ワクチンは SARS-CoV-2 のSタンパク質を微妙に変更したタンパク質を生成するRNAコードを含んでいます。
しかし、ワクチンのRNAコードそれ自体は、元のウイルスのRNAコードから大幅に変更されています。 これは、ワクチン製造者が人体の機能についての理解に基づいて行った変更です。
そして、我々の理解では、この変更はワクチンの有効性を極めて大幅に向上しています。 この変更を理解することはきっと楽しいはずで、例えばそこからモデルナのワクチンには100マイクログラム必要な一方でビオンテックのワクチンには30マイクログラムで十分な理由などが分かるかも知れません。
以下は、ウイルスとBNT162b2ワクチンのRNAコードそれぞれのSタンパク質に関する部分の初めです。 違いのある箇所は感嘆符(!)で示しています。
ウイルス: AUG UUU GUU UUU CUU GUU UUA UUG CCA CUA GUC UCU AGU CAG UGU GUU
ワクチン: AUG UUC GUG UUC CUG GUG CUG CUG CCU CUG GUG UCC AGC CAG UGU GUU
! ! ! ! ! ! ! ! ! ! ! ! !
RNAは文字 A, T, G, U からなる(文字通りの)文字列です。 物理的な区切りがあるわけではないですが、3文字ごとにグループ化して分析するのが合理的です。
グループ化されたそれぞれはコドンと呼ばれ、アミノ酸に対応しています。 以下ではアミノ酸を大文字で表しており、アミノ酸の列がタンパク質です。 例えばこんな風に対応しています:
ウイルス: AUG UUU GUU UUU CUU GUU UUA UUG CCA CUA GUC UCU AGU CAG UGU GUU
M F V F L V L L P L V S S Q C V
ワクチン: AUG UUC GUG UUC CUG GUG CUG CUG CCU CUG GUG UCC AGC CAG UGU GUU
! ! ! ! ! ! ! ! ! ! ! ! !
比較してみると、それぞれのコドンは異なっているものの、アミノ酸の方は同一になっていることが分かります。 コドンには 4*4*4 種類がありますが、アミノ酸は20種類しかありません。 つまり、典型的には、あるコドンに対して同じアミノ酸を符号化しているコドンが2つあります。
二番目のコドンでは UUU
が UUC
に変更されていますが、それによりトータルではワクチンのCが一つ増えています。
三番目のコドンでは GUU
が GUG
に変更されていて、同様にGが一つ増えています。
mRNAワクチンのGとCの文字の比率を上げることで、mRNAワクチンの有効性を向上することができることが知られているのです。
さて、これが全てなのだとしたら、「アルゴリズムによってGとCが増えるようにする」ということで、このページはここで終わりですが、9番目のコドンを見ると CCA
が CCU
に変更されています。
約4千文字のワクチン中に、この変更は何度も現れています。
挑戦求む
ゴール: 「野生型」(wild-type)の(ウイルスの)RNAコードをBNT162b2のRNAコードに変換するアルゴリズムを見つけよ。
というのも、ウイルスのRNAを有効なワクチンに変換できたらと誰もが思っているためです。 アルゴリズムは厳密に同じRNAコードを再現する必要はないものの、ワクチンのコードに似たコードを生成できつつ、また簡潔であるのが望ましいです。
お役に立てるように、このGitHubページで説明するように、データを様々な形で準備してあります。
注意:これらのファイルでは上記で
U
で表していた部分がT
になっています。U
とT
はそれぞれDNAとRNAで同じ情報を表したものです。
おそらく、side-by-side.csv から始めるのが良いでしょう。 このファイルは元のRNAと変更されたRNAをコドン単位で比較したものになっています:
abspos,codonOrig,codonVaccine
0,ATG,ATG
3,TTT,TTC
6,GTT,GTG
...
3813,TAC,TAC
3816,ACA,ACA
3819,TAA,TGA
生成するアミノ酸を変化させずに置き換えられる同値なコドンの表も codon-table-grouped.csv に用意してあります。 これを可視化した表もあります。
サンプルアルゴリズム
GitHubレポジトリに、3rd-gc.goというファイルを用意してあります。
これは以下のような単純な戦略を実装しています:
- ウイルスのコドンが G もしくは C で終わっていたら、それをそのままワクチンのmRNAにコピーします。
- そうでなかったら、最後のヌクレオチドを G に置き換え、アミノ酸が同じままであれば、それをワクチンにのmRNAにコピーします。
- G の代わりに C で同じことを試みます。
- それ以外の場合には元のコドンをそのままコピーします。
golang
で書けば以下の通り:
// base case, don't do anything
our = vir
// don't do anything if codon ends on G or C already
if(vir[2] == 'G' || vir[2] =='C') {
fmt.Printf("Codon ended on G or C already, not doing anything.")
} else {
prop = vir[:2]+"G"
fmt.Printf("Attempting G substitution, new candidate '%s'. ", prop)
if(c2s[vir] == c2s[prop]) {
fmt.Printf("Amino acid still the same, done!")
our = prop
} else {
fmt.Printf("Oops, amino acid changed. Trying C, new candidate '%s'. ", prop)
prop = vir[:2]+"C"
if(c2s[vir] == c2s[prop]) {
fmt.Printf("Amino acid still the same, done!")
our=prop
}
}
}
結果はビオンテックのRNAワクチンと53.1%のマッチと、あまり良くない結果ですが、これはあくまで出発点です。
自分自身でアルゴリズムを設計する際には、ウイルスのRNAだけの情報を用いて、ワクチンのRNAの情報を参照しないよう注意してください。
53.1%以上のスコアを達成できたら、コードへのリンクを bert@hubertnet.nl (もしくは @PowerDNS_Bert) に連絡してください。 そうしたら、このページ上部の順位表に載せますので。
参考情報
リバースエンジニアリングや暗号解読では常にそうですが、人々が何に注目しているかを理解することは重要です。
GC比率
「コドン最適化」のゴールは、ワクチンRNA中の C
と G
を増やすことでした。
ですが、それには制限があります。
ワクチンの製造に使うDNAでは、 G
と C
は強く結合するので、それらの「ヌクレオチド」を増やしすぎると、DNAは効率的に複製できなくなってしまうのです。
そのため、DNA中のGとCの比率が高くなりすぎる箇所では、実際にはGとCの比率を下げるような変更を行うかも知れません。
コドン最適化
一部のコドンは人間のDNAもしくは特定の細胞ではまれにしか出現しません。 それらの細胞でよく使われているという理由で置き換えられたコドンもあるかも知れません。
RNA畳み込み
ここまでコドンに注目してきましたが、RNAにはコドンを区切るマーカーなどはないので、RNAそれ自体にコドンの構造が反映されているわけではありません。 しかし、タンパク質の最初のコドンだけは常にATGです(これはDNAの場合で、RNAの場合にはAUG)。
RNAは丸まって特定の形状になります。 その形状によって、免疫系の目を逃れたり、アミノ酸への翻訳効率を上げることが出来るかも知れません。 この形状はRNAのヌクレオチドの列で決まるもので、特定のコドンで決まるものではありません。
ウィーン大学理論化学研究所のサーバにRNAの列を投稿することで、RNAの畳み込み結果を確認することが出来ます。 これは精密な計算を行う非常に高度なサーバです。
このWikipediaページにその仕組みの説明があります。
畳み込みを改善するためのための最適化もあるかも知れません。
(別のmRNAワクチンの製造者である)モデルナによるこの論文が関係しているかも知れません: mRNA structure regulates protein expression through changes in functional half-life。