LoginSignup
2
2

More than 3 years have passed since last update.

SMARTSで鎖の末端の炭素のみ反応させてみる

Last updated at Posted at 2020-02-10

はじめに

RDKitで反応パターンをSMARTSで定義し反応物を生成するでは、炭素原子の水酸化反応を例にSMARTSによる反応をRDKitでやってみた。しかし、全ての炭素原子を水酸化させたいケースは現実的ではない。そこで今回はより細かい条件をSAMRTSで指定してみた。具体的には、鎖の末端のメチル基を指定し、そこだけ水酸化してみた。

方法

前回、以下のようなSMARTSを書いた。

[C:1]>>[C:1][OH]

しかしこれでは任意の炭素原子に反応してしまう。今回は鎖の末端のメチル基のみ酸化させたい。末端のメチル基は、水素原子が3つついているはずだから、以下のようにルールを変えてみる。

'[CH3:1]>>[CH2:1]-[OH]'

やってみよう。今回テストするのは前回とおなじ化合物である。前回は4つ反応物が生成されたが、今回は2つある末端のメチル基のみの反応物が生成されるはずだ。

reactant.png

やってみると生成された反応物は2つ。見てみよう。

1つ目。末端のメチル基が反応している。
metablite_0.png

2つ目。もう一つの末端のメチル基が反応している。予想通りである。

metablite_1.png

ちなみに、鎖の中間にある水素原子が2つ結合してる2つの炭素原子のみを反応させるSMARTSは以下の通りとなる。

'[CH2:1]>>[CH1:1]-[OH]'

ソース

最後に画像生成も含むソースの全体を掲載する。

from rdkit.Chem import AllChem
from rdkit.Chem.Draw import rdMolDraw2D
from io import BytesIO
from cairosvg import svg2png
from IPython.display import SVG
from rdkit import Chem

# 参考(rdkit-smarts)https://magattaca.hatenablog.com/entry/2019/02/10/194853
# 参考(smarts) https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5515729/table/Tab1/?report=objectonly
# https://sourceforge.net/p/rdkit/mailman/message/36294482/

def generate_image(mol, size, path, name):
    image_data = BytesIO()
    view = rdMolDraw2D.MolDraw2DSVG(size[0], size[1])
    tm = rdMolDraw2D.PrepareMolForDrawing(mol)
    view.DrawMolecule(tm)
    view.FinishDrawing()
    svg = view.GetDrawingText()
    SVG(svg.replace('svg:', ''))
    print(path + "/" + name)
    try:
        svg2png(bytestring=svg, write_to=path + "/" + name + ".png")
    except:
        print("errro")
        pass


def main():
    reactant_1 = Chem.MolFromSmiles('COc2ccc1cccc(CCNC(C)=O)c1c2')
    generate_image(reactant_1, (300, 300), "./tmp", "reactant")

    #reaction_pattern = '[CH3:1]>>[CH2:1]-[OH]'
    reaction_pattern = '[CH3:1]>>[CH2:1]-[OH]'
    rxn = AllChem.ReactionFromSmarts(reaction_pattern)
    x = rxn.RunReactants([reactant_1])
    for i, mol in enumerate(x):
        print(mol[0])
        try:
            Chem.SanitizeMol(mol[0])
            generate_image(mol[0], (300, 300), "./tmp", "metablite_{0}".format(i))
        except:
            print("Error")
            print(Chem.MolToMolBlock(mol[0]))

if __name__ == "__main__":
    main()

おわりに

  • 厳密には電荷等も考慮しないといけないかもしれない。化学的にはシロートなのでよくわからず。
  • 今後の課題として反応部位が分かっている時に、その部位のみ反応させてみたい。また、SMARTSとは関係ないかもしれないが、反応のされやすさを評価してみたい。
  • 応用として、SMARTSで反応テンプレート群を定義し、そこから生成された反応物を使って、https://www.frontiersin.org/articles/10.3389/fphar.2019.01586/full のようなDeepLearningによる反応予測してみても面白そうではある。
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2