magattacaのブログ

日付以外誤報

RDKitで変換可能なペプチド配列と核酸配列について

以前、マクロ分子の表現HELMについて取り上げた記事の中で、ChEMBLに登録されているモノマー表記を調べました*1。その結果、天然のアミノ酸だけでなく様々な修飾アミノ酸が登録されており、略号(ID)で表せるようになっていることがわかりました。

ところでRDKitも同様に略号を使って構造を表すことができます。@iwatobipen先生のこちらの記事に詳しいです。

とても便利な機能ですが、どのような略号が使えるかわからないと、うまく活用できません。そこで今回はRDKitで扱える略号はどのようなものがあるのか調べてみました。

RDKitでの略号からの構造生成例

まずはイメージを掴むために実際に動きを確認してみましょう。

RDKitのドキュメンテーションMolFromHELM()の項目では、「Construct a molecule from a HELM string (currently only supports peptides).」となっています。一方でGitHubのissueで指摘されているように、実際にはペプチド以外にも核酸の配列からMolオブジェクトを作成することができます。

確認してみます。

from rdkit import rdBase, Chem
from rdkit.Chem import AllChem, Draw
from rdkit.Chem.Draw import IPythonConsole, rdMolDraw2D
from IPython.display import SVG

print(rdBase.rdkitVersion)  
#  2020.03.2

# ペプチドの例
Glutathione = Chem.MolFromHELM("PEPTIDE1{E.C.G}$$$$")

f:id:magattaca:20201231223107p:plain

# RNAの例
RNA_AU = Chem.MolFromHELM("RNA1{P.R(A)P.R(U)P}$$$$")

f:id:magattaca:20201231223151p:plain

# DNAの例
DNA_ACGA = Chem.MolFromHELM("RNA1{[dR](A)P.[dR](C)P.[dR](G)P.[dR](A)}$$$$")

f:id:magattaca:20201231223226p:plain

確かに、アミノ酸の一文字表記に加えてRNA、DNAの核酸の略号にも対応しているようです。

以上はHELMからMolオブジェクトを生成する例です。

ついで、配列(Sequence)からMolオブジェクトを生成する例も確認しておきます。こちらは上でも引用させていただいた@iwatobipen先生の記事で扱われている機能です。

Plan! Do! Check! Act!

# 描画の設定を変更
IPythonConsole.drawOptions.addStereoAnnotation = True
IPythonConsole.drawOptions.annotationFontScale = 1.3

# SequenceからMolオブジェクトを生成
PDCA = Chem.MolFromSequence('PDCA')

f:id:magattaca:20201231223257p:plain

できました!*2

flavor=1という引数を与えるとD-アミノ酸も扱えるようになり、小文字でD体を表せます。*3

# D-アミノ酸の使用例
d_PDCA = Chem.MolFromSequence('pdca', flavor=1)

f:id:magattaca:20201231223348p:plain

くさび表記は見づらいですが、ステレオ表記から立体が反転していることが確認できます。

コードから利用可能な略号を探ろう!

RDKitドキュメンテーションの情報も最新ではない、ということなので、該当と思われる箇所のコードを確認してみましょう。以下がそれっぽい箇所です。*4

どうやらC++名前空間として略号とその表す構造が定義されているようです。

さっぱりわかりません。。。

RDKit UGM_2015 Roger Sayle氏の発表資料*5の記述が、仕組みを理解する上で役に立ちました。

  1. シークエンス情報は、内部でPDBの残基コード(residue number)を使ってエンコードされている
  2. (residue number のような3文字表記は、)1文字表記よりもたくさんの構造を表現できる

これを踏まえてコード(SequenceParsers)を見直すと、確かにPDBで見られる残基、原子の表現を用いながらオブジェクトを作っている感じが伝わってきます。

ここまでHELMとシークエンスの話をごちゃ混ぜに進めてきました。見通しをよくするために、まずはシークエンスからの構造生成に焦点をあてて見ていきたいと思います。

アミノ酸の構築方法

シークエンスを構造に起こすにあたって、1文字表記から各アミノ酸をどうやって構造におこしているのでしょうか?

SequenceParsers 84行目から抜粋します。

具体的な構造構築の情報は下図の真ん中あたりからです。最初のアラニン(ALA)、アルギニン(ARG)の例を見比べていただくと分かりやすいです。

f:id:magattaca:20201231223510p:plain

上図の通り、アミノ酸は以下のように構築しています。

  1. アミノ酸主鎖を構築(CreateAABackbone)
  2. 側鎖を構築(CreateAAAtomで原子を指定し、CreateAABondで結合関係と結合次数を指定)

側鎖の原子の表現にはPDBファイルでよく見かけるγ炭素(CG)、δ炭素(CD)といった表現が使われています。  

注意点としては、ALAの表現から分かるようにβ炭素までCreateAABackboneで構築しています。プログラム実装上の都合と思いますが、通常の主鎖とはズレています。

実際に、グリシン(GLY)は以下のようにCreateAABackboneを使わずに表現されています。

f:id:magattaca:20201231223817p:plain

シークエンスから構築したMolオブジェクトには上で見た原子の情報が含まれています。AtomオブジェクトのGetPDBResidueInfoというメソッドを利用することで取り出せそうです。

# 一文字表記からアルギニンを構築
arg_mol = Chem.MolFromSequence("R")

# 原子の名称を取得しリスト化
atom_names_list = []

for a in arg_mol.GetAtoms():
    a_name = a.GetPDBResidueInfo().GetName()
    atom_names_list.append(a_name)

# 原子名と一緒に描画
view = rdMolDraw2D.MolDraw2DSVG(300,300)
tm = rdMolDraw2D.PrepareMolForDrawing(arg_mol)

# optionで描画にatom labelを追加
option = view.drawOptions()
for i, an in enumerate(atom_names_list):
    option.atomLabels[i] = an

option.padding=0.01
option.legendFontSize=20
    
view.DrawMolecule(tm, legend="arginine with atom labels")
view.FinishDrawing()

svg = view.GetDrawingText()
SVG(svg)

f:id:magattaca:20201231223854p:plain

できました!

C末端のカルボキシル基酸素原子はOXTなんですね。なるほど。。

登録されているアミノ酸

構造構築の裏側がわかってきました。デフォルトではどのようなアミノ酸を含んでいるのでしょうか?

コードにある3文字と1文字略号を表にしてみました。

f:id:magattaca:20201231223932p:plain

約50種のアミノ酸情報がありました。

標準アミノ酸L体、D体の他にもセレノメチオニンやオルニチンといったものもあります。

D体の1文字表記はL体の表記を小文字にしたものとなっています。

コードに不備があるのか、D-セリンD-チロシンは構造生成のための情報が欠けており、利用することができません。
1文字略号syでMolオブジェクトは生成されますが、中身は空です。

d_SER = Chem.MolFromSequence('s', flavor=1)
print(type(d_ser))
#  rdkit.Chem.rdchem.Mol

print([a for a in d_ser.GetAtoms()])
# []

登録済みのヌクレオチド

こちらは種類が少ないので簡単に。

塩基として標準的なACGTUが用意されています。

詳細はコードの中身を見ていただきたいですが、どうやらリン酸-を別に用意し、略号で指定された塩基を結合させてそれぞれのヌクレオチドを構築しているようです。

他の特徴として、末端の5'側3'側、それぞれについてリン酸でキャップした構造(PCap5PCap3)を生成するための情報も組み込まれています。

DNAとRNAのシークエンスの区別は引数flavorで可能です。

シークエンスの種類を区別するflavor

ここまでRDKitで利用可能な略号を確認してきましたが、アミノ酸ヌクレオチドで同じ略号があるため、区別する必要があります。

MolFromSequenceでは、引数flavorの値により、シークエンスがペプチド、DNA、RNAいずれかを区別することができます。

f:id:magattaca:20201231224152p:plain

同じシークエンスを使って違いを確認しましょう。Proteinについては既にみたのでRNA、DNAを試します。

# 5'のみリン酸キャップしたRNA
RNA_test = Chem.MolFromSequence('ACG', flavor=3)

f:id:magattaca:20201231224809p:plain

# 3'のみリン酸キャップしたDNA
DNA_test = Chem.MolFromSequence('ACG', flavor=8)

f:id:magattaca:20201231224827p:plain

図の通り、シークエンスをヌクレオチドとして認識し、それぞれリン酸キャップの違いが反映されたオブジェクトが生成できました。

以上でMolFromSequence()で構築可能な構造の範囲がおおよそわかりました。

先に見た登録済みのアミノ酸の表を再度見直すと、非標準のアミノ酸3文字表記のみで、1文字表記がありません。ですが、MolFromSequnece()は1文字表記の配列が対象なので、これらのアミノ酸を利用できません。

これらのアミノ酸はHELMであれば利用可能です。では続いてHELMからの構造生成を見てみましょう!

HELMで利用可能な略号

HELMではモノマーが複数文字の場合、「角括弧[ ]」で囲むことで一つとして扱えます。したがってシークエンスで扱えなかった3文字表記のアミノ酸も利用可能です。ただし略記(ID)が若干異なるので注意してください。

以下の表にまとめました。L-アミノ酸はシークエンスと同様、一般的な1文字略号でOKなので省略しています。

f:id:magattaca:20201231225024p:plain

末端のキャップを含めて、非標準のアミノ酸を試してみましょう!

peptide_test = Chem.MolFromHELM("PEPTIDE1{[ac].[Orn].[Glp].[seC].[am]}$$$$")

f:id:magattaca:20201231225106p:plain

「N末端: アセチルーオルニチンL-ピログルタミン酸L-セレノメチオニンーNH2:C末端」という構造が生成されました!

HELMは表現の幅を広げやすいのが良いですね!

ヌクレオチドについては冒頭に見た通り、について

  • RNA : リボース「R
  • DNA : デオキシリボース「dR

を使うことに注意すればOKです。

以上で、RDKitに組み込まれている略号は終了です。

メッセージをペプチドにのせて!

さて、RDKitで扱える配列を眺めてきました。短いエントリですがまとめに代えて。。。

2020年は本当に色々なことがありました。来年のことを言うと鬼が笑う、なんて言いますが、最後はこのメッセージを構造式にしてしまいましょう!

#  シークエンスをペプチドに変換
HNY = Chem.MolFromSequence("HAPPYNEWYEAR")

#  描画の設定
view = rdMolDraw2D.MolDraw2DSVG(400,400)
tm = rdMolDraw2D.PrepareMolForDrawing(HNY)

# optionで調整
option = view.drawOptions()
option.legendFontSize=20
    
view.DrawMolecule(tm, legend="Happy New Year")
view.FinishDrawing()

svg = view.GetDrawingText()
SVG(svg)

f:id:magattaca:20201231225218p:plain

良いお年を!

*1:過去記事はこちら

*2:サイクルは回ってませんが

*3:RDKit ドキュメンテーション MolFromSequence

*4:Pistoia Alliance Public Resources HELM Parsers and Writersの記述を参考

*5:p21