文章目錄
- 1 引入所需庫
- 2 擷取分子中的原子
- 3 擷取原子的坐标資訊
- 4 通路單個原子的資訊
-
- 4.1 通路所有原子:
- 5 分子中的鍵操作
-
- 5.1 也可以通過索引擷取鍵:
- 6 擷取分子中所有的環
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