RDKit 操作分子對象

1 引入所需庫

#! /usr/bin/python
# coding: utf-8
# rdkit 操作分子對象

from rdkit import Chem

2 獲取分子中的原子

smi='CC(C)OC(=O)C(C)NP(=O)(OCC1C(C(C(O1)N2C=CC(=O)NC2=O)(C)F)O)OC3=CC=CC=C3'
mol = Chem.MolFromSmiles(smi)
atoms = mol.GetAtoms()
atoms_num = mol.GetNumAtoms()
print(atoms)  # <rdkit.Chem.rdchem._ROAtomSeq object at 0x1050ddc10>
print(atoms[0])  # <rdkit.Chem.rdchem.Atom object at 0x10aa13760>
print('類型=',type(atoms))  # 類型= <class 'rdkit.Chem.rdchem._ROAtomSeq'>
print('類型0=',type(atoms[0]))  # 類型0= <class 'rdkit.Chem.rdchem.Atom'>
print("省略氫的原子數=",atoms_num)

3 獲取原子的座標信息

注:前提,導入的原子必須帶有座標信息

print(mol.GetConformer().GetAtomPosition(1)[0])
print(mol.GetConformer().GetAtomPosition(1).x)
print(mol.GetConformer().GetAtomPosition(1).y)
print(mol.GetConformer().GetAtomPosition(1).z)
x,y,z = mol.GetConformer().GetAtomPosition(1)
print(x,y,z)
xyz = list(mol.GetConformer().GetAtomPosition(3))
print(xyz)

4 訪問單個原子的信息

訪問原子信息可能用到的函數
對原子進行遍歷:mol.GetAtoms()
獲取原子索引:GetIdx()
獲取原子序號:GetAtomicNum()
獲取原子符號:GetSymbol()
獲取原子連接數(受H是否隱藏影響):GetDegree()
獲取原子總連接數(與H是否隱藏無關):GetTotalDegree()
獲取原子形式電荷:GetFormalCharge()
獲取原子雜化方式:GetHybridization()
獲取原子顯式化合價:GetExplicitValence()
獲取原子隱式化合價:GetImplicitValence()
獲取原子總的化合價:GetTotalValence()

atom = mol.GetAtomWithIdx(0)
print("標籤=", atom.GetSymbol())  # C
print("價電子=", atom.GetExplicitValence()) # 4
print("原子元素週期編號=", atom.GetAtomicNum())  # 6

print("雜化類型=", atom.GetHybridization()) # 返回雜化類型   雜化類型= SP3
print("是否在芳香烴內=", atom.GetIsAromatic ()) # 該原子是否在芳香烴內   是否在芳香烴內= False

# 與該原子連接的氫原子個數
print("該原子連接的氫原子個數=", atom.GetTotalNumHs()) #  該原子連接的氫原子個數= 3

# 返回該原子的所有鄰居原子,以元祖的形式返回
neighbors = atom.GetNeighbors() 
print([x.GetAtomicNum() for x in neighbors])  #[6]

4.1 訪問所有原子:

print('\t'.join(['id', 'num', 'exp','symbol', 'degree', 'charge', 'hybrid']))
for at in atoms:
    print(at.GetIdx(), end='\t')
    print(at.GetAtomicNum(), end='\t')
    print(at.GetExplicitValence(), end='\t')
    print(at.GetSymbol(), end='\t')
    print(at.GetDegree(), end='\t')
    print(at.GetFormalCharge(), end='\t')
    print(at.GetHybridization())

返回結果
id num exp symbol degree charge hybrid
0 6 1 C 1 0 SP3
1 6 3 C 3 0 SP3
2 6 1 C 1 0 SP3
3 8 2 O 2 0 SP2
4 6 4 C 3 0 SP2
5 8 2 O 1 0 SP2
6 6 3 C 3 0 SP3
7 6 1 C 1 0 SP3
8 7 2 N 2 0 SP3
9 15 5 P 4 0 SP3
10 8 2 O 1 0 SP2
11 8 2 O 2 0 SP3
12 6 2 C 2 0 SP3
13 6 3 C 3 0 SP3
14 6 3 C 3 0 SP3
15 6 4 C 4 0 SP3
16 6 3 C 3 0 SP3
17 8 2 O 2 0 SP3
18 7 3 N 3 0 SP2
19 6 3 C 2 0 SP2
20 6 3 C 2 0 SP2
21 6 4 C 3 0 SP2
22 8 2 O 1 0 SP2
23 7 3 N 2 0 SP2
24 6 4 C 3 0 SP2
25 8 2 O 1 0 SP2
26 6 1 C 1 0 SP3
27 9 1 F 1 0 SP3
28 8 1 O 1 0 SP3
29 8 2 O 2 0 SP2
30 6 4 C 3 0 SP2
31 6 3 C 2 0 SP2
32 6 3 C 2 0 SP2
33 6 3 C 2 0 SP2
34 6 3 C 2 0 SP2
35 6 3 C 2 0 SP2

5 分子中的鍵操作

同樣,每一個鍵也都是對象,可以通過屬性和函數來獲取鍵的信息。

獲取分子中鍵的信息所能用到的函數

對鍵進行遍歷:m.GetBonds()
獲取鍵的索引:GetIdx()
獲取鍵的類型:GetBondType()
以數字形式顯示鍵的類型:GetBondTypeAsDouble()
是否爲芳香鍵:GetIsAromatic()
是否爲共軛鍵:GetIsConjugated()
是否在環中:IsInRing()
是否在n元環中:IsInRingSize(n)
獲取起始原子:GetBeginAtom()
獲取末尾原子:GetEndAtom()

bonds = mol.GetBonds()  # 對鍵進行遍歷
print(type(bonds))

print('\t'.join(['id', 'type', 'double', 'aromic', 'conjug', 'ring', 'begin', 'end']))
for bond in bonds:
    print(bond.GetIdx(), end='\t')
    print(bond.GetBondType(), end='\t')
    print(bond.GetBondTypeAsDouble(), end='\t')
    print(bond.GetIsAromatic(), end='\t')
    print(bond.GetIsConjugated(), end='\t')
    print(bond.IsInRing(), end='\t')
    print(bond.GetBeginAtomIdx(), end='\t')
    print(bond.GetEndAtomIdx())

分子中鍵的信息
id type double aromic conjug ring begin end
0 SINGLE 1.0 False False False 0 1
1 SINGLE 1.0 False False False 1 2
2 SINGLE 1.0 False False False 1 3
3 SINGLE 1.0 False True False 3 4
4 DOUBLE 2.0 False True False 4 5
5 SINGLE 1.0 False False False 4 6
6 SINGLE 1.0 False False False 6 7
7 SINGLE 1.0 False False False 6 8
8 SINGLE 1.0 False False False 8 9
9 DOUBLE 2.0 False False False 9 10
10 SINGLE 1.0 False False False 9 11
11 SINGLE 1.0 False False False 11 12
12 SINGLE 1.0 False False False 12 13
13 SINGLE 1.0 False False True 13 14
14 SINGLE 1.0 False False True 14 15
15 SINGLE 1.0 False False True 15 16
16 SINGLE 1.0 False False True 16 17
17 SINGLE 1.0 False False False 16 18
18 AROMATIC 1.5 True True True 18 19
19 AROMATIC 1.5 True True True 19 20
20 AROMATIC 1.5 True True True 20 21
21 DOUBLE 2.0 False True False 21 22
22 AROMATIC 1.5 True True True 21 23
23 AROMATIC 1.5 True True True 23 24
24 DOUBLE 2.0 False True False 24 25
25 SINGLE 1.0 False False False 15 26
26 SINGLE 1.0 False False False 15 27
27 SINGLE 1.0 False False False 14 28
28 SINGLE 1.0 False False False 9 29
29 SINGLE 1.0 False True False 29 30
30 AROMATIC 1.5 True True True 30 31
31 AROMATIC 1.5 True True True 31 32
32 AROMATIC 1.5 True True True 32 33
33 AROMATIC 1.5 True True True 33 34
34 AROMATIC 1.5 True True True 34 35
35 SINGLE 1.0 False False True 17 13
36 AROMATIC 1.5 True True True 24 18
37 AROMATIC 1.5 True True True 35 30

5.1 也可以通過索引獲取鍵:

# 通過索引獲取鍵 SINGLE
print('通過索引獲取鍵',mol.GetBondWithIdx(3).GetBondType())  

6 獲取分子中所有的環

查看所有最小環(smallest set of smallest rings, SSSR)的信息:GetSymmSSSR()

ssr = Chem.GetSymmSSSR(mol)
num_ring = len(ssr)
print("環的個數=", num_ring)   #環的個數= 3
for ring in ssr:
    print('ring consisted of atoms id:', list(ring))

環信息
ring consisted of atoms id: [14, 13, 17, 16, 15]
ring consisted of atoms id: [19, 20, 21, 23, 24, 18]
ring consisted of atoms id: [31, 32, 33, 34, 35, 30]

獲取分子環信息用到的函數
直接獲取環的信息:GetRingInfo()
查看一共有幾個環:NumRings()
查看原子在幾個環中:NumAtomRings()
查看id爲n的原子是否在n1元環中.IsAtomInRingOfSize(n, n1)
查看id爲n的鍵是否在n1元環中.IsBondInRingOfSize(n , n1)

ri = mol.GetRingInfo()
print('分子中環的個數=',ri.NumRings())  # 分子中環的個數= 3
print(ri.NumAtomRings(2))  # 0
print(ri.IsAtomInRingOfSize(3,3))  # False
print(ri.IsBondInRingOfSize(2,3))  # False
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章