天天看點

RDKit 操作分子對象1 引入所需庫2 擷取分子中的原子3 擷取原子的坐标資訊4 通路單個原子的資訊5 分子中的鍵操作6 擷取分子中所有的環

文章目錄

  • 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