PyhtonのRDKitを使って,DOBNAを作る
以前の記事で紹介した置換基スクリーニングを活用して,多環骨格を作れないかと思って色々と試行錯誤したので,その記録です。
まず,大前提のDOBNAってなあに?という方のために,一応論文を貼っておきます。
https://onlinelibrary.wiley.com/doi/10.1002/anie.201506335
当初イメージした工程は以下の通り。
1. フェニルエーテルを作る。
2. ホウ素を入れる。
3. 結合をつないで,失敗作は消す。
実際,1の工程は簡単でした。2は少し工夫が必要でした。最大の難関は3です。
まずは,1の工程として,メタ位選択的にフェノキシ基を導入の検討を色々とやりました。
メタ位の選択性を出すのはそれほど難しくありません。
from rdkit import Chem
from rdkit.Chem.Draw import IPythonConsole
from rdkit.Chem import rdChemReactions
from rdkit.Chem import Draw
Draw.rdDepictor.SetPreferCoordGen(True)
rxnSmarts = '[O:2][c:3][c:4][ch:5]>>[O:2][c:3][c:4][ch0:5][O]C1=CC=CC=C1'
rxn = rdChemReactions.ReactionFromSmarts(rxnSmarts)
rxn
SMARTS記法での反応位置の指定のスキームを可視化すると次の図のとおりです。
'[O:2][c:3][c:4][ch:5]>>[O:2][c:3][c:4][ch0:5][O]C1=CC=CC=C1'で,O:2から始めている理由は,ベンゼン環を付加するときにC1とC1で指定してその間を結んで環を指定しているので,ややこしくなりそうなので,ナンバリングを分けています。
例えば,先の反応をフェノキシベンゼン(phenoxybenzene)に適用すると,m-ジフェノキシベンゼンが生成します。
phenoxylationの反応を定義し、PhO_rxnと命名。
phenoxybenzeneを定義してtestに放り込む。
from rdkit.Chem import AllChem, Draw
from itertools import chain
PhO_rxn = AllChem.ReactionFromSmarts("[O:2][c:3][c:4][ch:5]>>[O:2][c:3][c:4][ch0:5][O]C1=CC=CC=C1")
test = Chem.MolFromSmiles("C1=CC=CC(OC3=CC=CC=C3)=C1")
PhOs = list(chain.from_iterable(PhO_rxn.RunReactants([test])))
PhOs_unique = [Chem.MolFromSmiles(smile) for smile in {Chem.MolToSmiles(mol) for mol in PhOs}]
AllChem.Compute2DCoords(test)
for mol in PhOs_unique:
if mol.HasSubstructMatch(test):
AllChem.GenerateDepictionMatching2DStructure(mol, test)
Draw.MolsToGridImage(PhOs_unique)
繰り返しフェノキシ化を行い,拡張していきたい場合は以下のように,for i in range(n):として,n = 2を指定すれば,2回実施されます。
n = 2
for i in range(n):
PhOs_list = []
for mol in PhOs_unique:
mol.UpdatePropertyCache(strict = False)
PhOs = list(chain.from_iterable(PhO_rxn.RunReactants([mol])))
PhOs_list = PhOs_list + PhOs
PhOs_unique = PhOs_unique + [Chem.MolFromSmiles(smile) for smile in {Chem.MolToSmiles(mol) for mol in PhOs_list}]
AllChem.Compute2DCoords(test)
for mol in PhOs_unique:
if mol.HasSubstructMatch(test):
AllChem.GenerateDepictionMatching2DStructure(mol, test)
Draw.MolsToGridImage(PhOs_unique)
余談ですが,nに入力する数字を任意の数のインプットとする場合,また,今回はリストにどんどんぶっ込んでいますが,特定の回数実施した分子群が欲しい場合は,リストにぶっ込まずに,最後だけ使えばOKです。
n = int(input("回数を入力してください:"))
for i in range(n):
PhOs_list = []
for mol in PhOs_unique:
PhOs = list(chain.from_iterable(rxn.RunReactants([mol])))
PhOs_list = PhOs_list + PhOs
PhOs_unique = PhOs_unique + [Chem.MolFromSmiles(smile) for smile in {Chem.MolToSmiles(mol) for mol in PhOs_list}]
AllChem.Compute2DCoords(test)
for mol in PhOs_unique:
if mol.HasSubstructMatch(test):
AllChem.GenerateDepictionMatching2DStructure(mol, test)
Draw.MolsToGridImage(PhOs_unique)
例えば,回数に5を入力すると,
回数を入力してください:5
以前に少し触れた重複を削除が分子が大きくなってきたときにあまり上手くワークしなかったに関係します。良い方法あれば教えて欲しいです。スタバで一杯おごります笑
次は,2の工程として,酸素と酸素に挟まれた間のベンゼン環上の炭素選択的なホウ素置換基の導入の検討を色々とやりました。
この選択性を出すのはそれほど難しくありません。
今回の反応式"[O:2][c:3][ch:4][c:5][O:6]>>[O:2][c:3][ch0:4]([B:7])[c:5][O:6]"では,括弧で囲う事で,直線ではなく分枝として,ホウ素置換基を生痩せることがポイントです。
rxnSmarts = "[O:2][c:3][ch:4][c:5][O:6]>>[O:2][c:3][ch0:4]([B:7])[c:5][O:6]"
rxn = rdChemReactions.ReactionFromSmarts(rxnSmarts)
rxn
続いて,3. 結合をつないで,失敗作は消す。に相当する工程として,生やしたホウ素置換基を周辺環と結合する必要があります。
今回の反応式"([B:1][c:2][c:3][O:4][c:5][ch:6])>>[B:1]7[c:2][c:3][O:4][c:5][ch0:6]7"では,[B:1]7・・・[ch0:6]7でとすることで,[B:1]7を起点として[ch0:6]7を終点とする環を作ることがポイントです。環を巻くかどうかはこの[]の後ろに数字を置くだけなので,とても簡単ですね。今回は被らないように数字が被らないように7としています。
rxnSmarts = "([B:1][c:2][c:3][O:4][c:5][ch:6])>>[B:1]1[c:2][c:3][O:4][c:5][ch0:6]1"
rxn = rdChemReactions.ReactionFromSmarts(rxnSmarts)
rxn
これまでの工程を組み合わせて,さらに,3. 結合をつないで,失敗作は消す。の失敗作は消す。に相当する工程を加えれば完成です。
def multi_rxn(B1s_unique):
ホウ素化工程を組み合わせたものをmulti_rxnとして定義します。中身の要点としては,以前の臭素化して置換基をスクリーニングした時と同じで,まずは,ホウ素化されたB1に対して1回目のBO2_rxnを実施し、生成物の格納されたリストをsupplと命名。
suppl = list(chain.from_iterable(BO2_rxn.RunReactants([mol])))
部分構造マッチによって,環化失敗作はリストに入れない。
tmp = Chem.MolFromSmiles("B1C2=CC=CC3=C2OC2=C(B3)C=CC=C12")
B1Os = [x for x in suppl if not x.HasSubstructMatch(tmp)]
環化成功作のBO2s内の分子の中でもまだ反応が可能なBO2_rxnの基質だった場合,if BO2_rxn.IsMoleculeReactant(mol):以降で再度BO2_rxnを実施する。
from rdkit import Chem
from rdkit.Chem import AllChem, Draw
from itertools import chain
PhO_rxn = AllChem.ReactionFromSmarts("[O:2][c:3][c:4][ch:5]>>[O:2][c:3][c:4][ch0:5][O]C1=CC=CC=C1")
test = Chem.MolFromSmiles("C1=CC=CC(OC3=CC=CC=C3)=C1")
PhOs = list(chain.from_iterable(PhO_rxn.RunReactants([test])))
PhOs_unique = [Chem.MolFromSmiles(smile) for smile in {Chem.MolToSmiles(mol) for mol in PhOs}]
B_rxn = AllChem.ReactionFromSmarts("[O:2][c:3][ch:4][c:5][O:6]>>[O:2][c:3][ch0:4]([B:7])[c:5][O:6]")
BO2_rxn = AllChem.ReactionFromSmarts("([B:1][c:2][c:3][O:4][c:5][ch:6])>>[B:1]7[c:2][c:3][O:4][c:5][ch0:6]7")
def multi_rxn(B1s_unique):
B1O2s_list = []
for mol in B1s_unique:
mol.UpdatePropertyCache(strict = False)
suppl = list(chain.from_iterable(BO2_rxn.RunReactants([mol])))
tmp = Chem.MolFromSmiles("B1C2=CC=CC3=C2OC2=C(B3)C=CC=C12")
B1Os = [x for x in suppl if not x.HasSubstructMatch(tmp)]
for mol in B1Os:
mol.UpdatePropertyCache(strict = False)
if BO2_rxn.IsMoleculeReactant(mol):
B1O2s = list(chain.from_iterable(BO2_rxn.RunReactants([mol])))
B1O2s = [x for x in B1O2s if not x.HasSubstructMatch(tmp)]
tmp_2 = Chem.MolFromSmiles("O1C2=C3C=CC=C2B3C2=CC=CC=C12")
B1O2s_list.extend([x for x in B1O2s if not x.HasSubstructMatch(tmp_2)])
B1O2s_unique = [Chem.MolFromSmiles(smile) for smile in {Chem.MolToSmiles(mol) for mol in B1O2s_list}]
return B1O2s_unique
n = 2
for i in range(n):
PhOs_list = []
for mol in PhOs_unique:
mol.UpdatePropertyCache(strict = False)
PhOs_list.extend(list(chain.from_iterable(PhO_rxn.RunReactants([mol]))))
PhOs_unique.extend([Chem.MolFromSmiles(smile) for smile in {Chem.MolToSmiles(mol) for mol in PhOs_list}])
B1O2s_unique = [x for x in PhOs_unique if not x is None]
for i in range(n):
B1s_list = []
for mol in B1O2s_unique:
try:
mol.UpdatePropertyCache(strict = False)
B1s_list.extend(list(chain.from_iterable(B_rxn.RunReactants([mol]))))
B1s_unique = [Chem.MolFromSmiles(smile) for smile in {Chem.MolToSmiles(mol) for mol in B1s_list}]
B1O2s_unique = multi_rxn(B1s_unique)
except:
print('stop' + str(i))
print(Chem.MolToSmiles(mol))
Draw.MolsToGridImage(B1O2s_unique)
ここから先は
¥ 100
この記事が気に入ったらサポートをしてみませんか?