有機分子の3D構造を生成する一つの手法として、SMILES記法により書かれた分子情報から生成する手法があります。本記事ではMatlantis環境での実行方法について説明いたします。
- Matlantis Featuresを利用する方法
- autodEを利用する方法(5配位, 6配位構造作成用)
------------------------------------------------------------
1. Matlantis Featuresを利用する方法
Matlantis環境ではMatlantis Featuresを使うことで以下のようにして生成することが可能です。
# Testosterone分子の作成例
from matlantis_features.atoms import MatlantisAtoms
molec = MatlantisAtoms.from_smiles("O=C4\C=C2/[C@]([C@H]1CC[C@@]3([C@@H](O)CC[C@H]3[C@@H]1CC2)C)(C)CC4").ase_atoms
molec
以下、実行結果です。
Atoms(symbols='OC9OC10H28', pbc=False)
3D構造の表示か以下のように実行します。
from pfcc_extras import view_ngl
view_ngl(molec, representations=["ball+stick"])
注:ただし、5配位、6配位の構造については失敗します。
molec = MatlantisAtoms.from_smiles("[P1](F)(F)(F)(F)(F)(F)").ase_atoms
実行結果として以下のエラーが得られます。
[00:14:42] SMILES Parse Error: syntax error while parsing: [P1](F)(F)(F)(F)(F)(F) [00:14:42] SMILES Parse Error: Failed parsing SMILES '[P1](F)(F)(F)(F)(F)(F)' for input: '[P1](F)(F)(F)(F)(F)(F)'
--------------------------------------------------------------------------- ArgumentError Traceback (most recent call last) /tmp/ipykernel_3167/1113753141.py in <cell line: 1>() ----> 1 molec = MatlantisAtoms.from_smiles("[P1](F)(F)(F)(F)(F)(F)").ase_atoms ~/.py39/lib/python3.9/site-packages/matlantis_features/atoms.py in from_smiles(cls, smiles, method, seed) 73 """ 74 mol = Chem.MolFromSmiles(smiles) ---> 75 mol = Chem.AddHs(mol) 76 77 if method not in ["etkdg_v2", "etkdg", "etdg", "kdg", "2d"]: ArgumentError: Python argument types in rdkit.Chem.rdmolops.AddHs(NoneType) did not match C++ signature: AddHs(RDKit::ROMol mol, bool explicitOnly=False, bool addCoords=False, boost::python::api::object onlyOnAtoms=None, bool addResidueInfo=False)
これを解決する手法につきましては、以下を参考にしてください。
2. autodEを利用する方法(5配位, 6配位構造作成用)
SMILES記法から5配位, 6配位構造を作成する際にはautodEを利用することで解決できることを確認しています。
まずは、以下の手順でautodEをインストールしてください。
!git clone https://github.com/duartegroup/autodE.git
!cd autodE && pip install .
その後、以下の関数を定義して、それを使うことで5,6配位の構造についても3D構造を生成できるようになります。
import autode as ade
from ase import Atoms, Atom
import numpy as np
from pfcc_extras import view_ngl
def smiles_to_ase_atoms(smiles):
ade_mol = ade.Molecule(smiles=smiles)
ase_atoms = ade_to_ase_atoms(ade_mol.atoms)
return ase_atoms
def ade_to_ase_atoms(ade_atoms):
ele = np.array([atom.atomic_symbol for atom in ade_atoms])
pos = np.array([atom.coord for atom in ade_atoms])
return Atoms(ele, pos)
molec = smiles_to_ase_atoms("[P1](F)(F)(F)(F)(F)(F)")
view_ngl(molec, representations=["ball+stick"])