Chapter 36

RDKitで分子の情報の取得

poclabweb
poclabweb
2022.11.05に更新

3. 分子情報の取得

分子をmolファイルにする(復習)

# rdkitのインストール
!pip install rdkit==2022.3.5
#pubchempyのインストール
!pip install pubchempy
compoud = "quercetine"
pcp_compoud = pcp.get_compounds(compoud, 'name')
compoud_smiles = pcp_compoud[0].isomeric_smiles
mol = Chem.MolFromSmiles(compoud_smiles)
Draw.MolsToGridImage([mol])

環関係

ringinfo = mol.GetRingInfo()
ringinfo.NumRings()

結合関係

結合の情報が得られる

bonds_info = mol.GetBonds()
#結合の数を調べる
len(bonds_info)

for bond in bonds_info:
    print("---" * 10)
    # 結合の種類 AROMATIC, DOUBLE, SINGLEなど
    print(bond.GetBondType())
    # 結合の最初の原子の情報を表示
    begin_atom = bond.GetBeginAtom()
    print(begin_atom.GetIdx(), begin_atom.GetSymbol())
    # 結合の終わりの原子の情報を表示
    end_atom = bond.GetEndAtom()
    print(end_atom.GetIdx(), end_atom.GetSymbol())

原子番号の表示

for atom in mol.GetAtoms():
    atom.SetProp('molAtomMapNumber', str(atom.GetIdx()))
Draw.MolsToGridImage([mol])

'molAtomMapNumber'の部分を、 'atomLabel'や'atomNote'に変更することもできる。
変更すると、表示される数字の場所が変わる。

原子関係

分子の一部をラジカルにして、それがどこかをRDKitで表示できるかを試してみる。

# 1つの原子をラジカルにしてみる。
mol = Chem.MolFromSmiles("C1=CC(=C(C=C1C2=C(C(=O)C3=C(C=C(C=C3O2)O)O)O)O)[O]")
Draw.MolsToGridImage([mol])
#原子の情報色々を取得できる。
atoms_info = mol.GetAtoms()
for atom in atoms_info:
    print("---" * 10)
    print(atom.GetIdx(), end=(":"))
    print(atom.GetSymbol())
    print("radical:" + str(atom.GetNumRadicalElectrons()) )
    print("charge:"+ str(atom.GetFormalCharge()))

ラジカルがどこかなどの情報も取得することができる。

if文を使用すると、そこだけを表示もできる。

for atom in atoms_info:
    if atom.GetNumRadicalElectrons() >= 1:
        print(atom.GetIdx(), end=(":"))
        print(atom.GetSymbol())

原子の座標情報

構造最適化

Chem.AddHs(mol, addCoords=True)
# 3次元構造の作成。
AllChem.EmbedMolecule(mol, AllChem.ETKDG())
# MMFFで最適化
AllChem.MMFFOptimizeMoleculeConfs(mol)

配座の情報を得ることができる。

conf = mol.GetConformer(0)
for i, (x,y,z) in enumerate(conf.GetPositions()):
    atom = mol.GetAtomWithIdx(i)
    print('{}\tx: {:.2f}\ty: {:.2f}\tz: {:.2f}'.format(atom.GetSymbol(),x,y,z))