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))