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}$$$$")
# RNAの例 RNA_AU = Chem.MolFromHELM("RNA1{P.R(A)P.R(U)P}$$$$")
# DNAの例 DNA_ACGA = Chem.MolFromHELM("RNA1{[dR](A)P.[dR](C)P.[dR](G)P.[dR](A)}$$$$")
確かに、アミノ酸の一文字表記に加えて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')
できました!*2
flavor=1
という引数を与えるとD-アミノ酸も扱えるようになり、小文字でD体を表せます。*3
# D-アミノ酸の使用例 d_PDCA = Chem.MolFromSequence('pdca', flavor=1)
くさび表記は見づらいですが、ステレオ表記から立体が反転していることが確認できます。
コードから利用可能な略号を探ろう!
RDKitドキュメンテーションの情報も最新ではない、ということなので、該当と思われる箇所のコードを確認してみましょう。以下がそれっぽい箇所です。*4
- rdkit/Code/GraphMol/FileParsers/SequenceParsers.cpp
- rdkit/Code/GraphMol/FileParsers/SequenceWriters.cpp
どうやらC++の名前空間として略号とその表す構造が定義されているようです。
さっぱりわかりません。。。
RDKit UGM_2015 Roger Sayle氏の発表資料*5の記述が、仕組みを理解する上で役に立ちました。
- シークエンス情報は、内部でPDBの残基コード(residue number)を使ってエンコードされている
- (residue number のような3文字表記は、)1文字表記よりもたくさんの構造を表現できる
これを踏まえてコード(SequenceParsers
)を見直すと、確かにPDBで見られる残基、原子の表現を用いながらオブジェクトを作っている感じが伝わってきます。
ここまでHELMとシークエンスの話をごちゃ混ぜに進めてきました。見通しをよくするために、まずはシークエンスからの構造生成に焦点をあてて見ていきたいと思います。
アミノ酸の構築方法
シークエンスを構造に起こすにあたって、1文字表記から各アミノ酸をどうやって構造におこしているのでしょうか?
SequenceParsers
84行目から抜粋します。
具体的な構造構築の情報は下図の真ん中あたりからです。最初のアラニン(ALA
)、アルギニン(ARG
)の例を見比べていただくと分かりやすいです。
上図の通り、アミノ酸は以下のように構築しています。
- アミノ酸主鎖を構築(
CreateAABackbone
) - 側鎖を構築(
CreateAAAtom
で原子を指定し、CreateAABond
で結合関係と結合次数を指定)
側鎖の原子の表現にはPDBファイルでよく見かけるγ炭素(CG)、δ炭素(CD)といった表現が使われています。
注意点としては、ALA
の表現から分かるようにβ炭素までCreateAABackbone
で構築しています。プログラム実装上の都合と思いますが、通常の主鎖とはズレています。
実際に、グリシン(GLY
)は以下のようにCreateAABackbone
を使わずに表現されています。
シークエンスから構築した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)
できました!
C末端のカルボキシル基酸素原子はOXT
なんですね。なるほど。。
登録されているアミノ酸
構造構築の裏側がわかってきました。デフォルトではどのようなアミノ酸を含んでいるのでしょうか?
コードにある3文字と1文字略号を表にしてみました。
約50種のアミノ酸情報がありました。
標準アミノ酸のL体、D体の他にもセレノメチオニンやオルニチンといったものもあります。
D体の1文字表記はL体の表記を小文字にしたものとなっています。
コードに不備があるのか、D-セリン、D-チロシンは構造生成のための情報が欠けており、利用することができません。
1文字略号s
やy
でMolオブジェクトは生成されますが、中身は空です。
d_SER = Chem.MolFromSequence('s', flavor=1) print(type(d_ser)) # rdkit.Chem.rdchem.Mol print([a for a in d_ser.GetAtoms()]) # []
登録済みのヌクレオチド
こちらは種類が少ないので簡単に。
塩基として標準的なA
、C
、G
、T
、U
が用意されています。
詳細はコードの中身を見ていただきたいですが、どうやらリン酸-糖を別に用意し、略号で指定された塩基を結合させてそれぞれのヌクレオチドを構築しているようです。
他の特徴として、末端の5'側、3'側、それぞれについてリン酸でキャップした構造(PCap5
、PCap3
)を生成するための情報も組み込まれています。
DNAとRNAのシークエンスの区別は引数flavor
で可能です。
シークエンスの種類を区別するflavor
ここまでRDKitで利用可能な略号を確認してきましたが、アミノ酸とヌクレオチドで同じ略号があるため、区別する必要があります。
MolFromSequenceでは、引数flavor
の値により、シークエンスがペプチド、DNA、RNAいずれかを区別することができます。
同じシークエンスを使って違いを確認しましょう。Proteinについては既にみたのでRNA、DNAを試します。
# 5'のみリン酸キャップしたRNA RNA_test = Chem.MolFromSequence('ACG', flavor=3)
# 3'のみリン酸キャップしたDNA DNA_test = Chem.MolFromSequence('ACG', flavor=8)
図の通り、シークエンスをヌクレオチドとして認識し、それぞれリン酸キャップと糖の違いが反映されたオブジェクトが生成できました。
以上でMolFromSequence()
で構築可能な構造の範囲がおおよそわかりました。
先に見た登録済みのアミノ酸の表を再度見直すと、非標準のアミノ酸は3文字表記のみで、1文字表記がありません。ですが、MolFromSequnece()
は1文字表記の配列が対象なので、これらのアミノ酸を利用できません。
これらのアミノ酸はHELMであれば利用可能です。では続いてHELMからの構造生成を見てみましょう!
HELMで利用可能な略号
HELMではモノマーが複数文字の場合、「角括弧[ ]
」で囲むことで一つとして扱えます。したがってシークエンスで扱えなかった3文字表記のアミノ酸も利用可能です。ただし略記(ID)が若干異なるので注意してください。
以下の表にまとめました。L-アミノ酸はシークエンスと同様、一般的な1文字略号でOKなので省略しています。
末端のキャップを含めて、非標準のアミノ酸を試してみましょう!
peptide_test = Chem.MolFromHELM("PEPTIDE1{[ac].[Orn].[Glp].[seC].[am]}$$$$")
「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)
良いお年を!
*2:サイクルは回ってませんが
*3:RDKit ドキュメンテーション MolFromSequence
*4:Pistoia Alliance Public Resources HELM Parsers and Writersの記述を参考
*5:p21