You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从SMILES获取带氢原子的原子索引及原子表达式?

如何用RDKit获取带氢原子的原子表示(含原子编号)?

问题场景

给SMILES添加原子编号后,希望输出包含氢原子的原子形式(如cH、NH2),但现有代码只能得到原子符号(如C、N)。

已尝试代码及结果

1. 添加原子编号并输出SMILES

from rdkit import Chem
mol=Chem.MolFromSmiles('c1ccccc(C(N)=O)1')
for i, atom in enumerate(mol.GetAtoms()):
  atom.SetProp('molAtomMapNumber',str(i))
smi=Chem.MolToSmiles(mol)
print(smi)

输出:

[cH:0]1[cH:1][cH:2][cH:3][cH:4][c:5]1C:6=[O:8]

2. 遍历原子获取符号

from rdkit import Chem
mol=Chem.MolFromSmiles('c1ccccc(C(N)=O)1')
for i, atom in enumerate(mol.GetAtoms()):
  atom.SetProp('molAtomMapNumber',str(i))
  print(i,atom.GetSymbol())

输出:

0 C
1 C
2 C
3 C
4 C
5 C
6 C
7 N
8 O

期望输出

0 cH
1 CH
...
7 NH2
8 O

解决代码

通过结合原子的芳香性、显式氢和隐式氢数量,构建带氢的原子表示:

from rdkit import Chem

mol = Chem.MolFromSmiles('c1ccccc(C(N)=O)1')
# 给原子添加编号
for idx, atom in enumerate(mol.GetAtoms()):
    atom.SetProp('molAtomMapNumber', str(idx))

# 生成带氢的原子表示
for idx, atom in enumerate(mol.GetAtoms()):
    # 根据芳香性决定符号大小写
    atom_symbol = atom.GetSymbol().lower() if atom.GetIsAromatic() else atom.GetSymbol()
    # 计算总氢原子数(显式+隐式)
    total_hydrogens = atom.GetNumExplicitHs() + atom.GetNumImplicitHs()
    
    # 拼接原子字符串
    if total_hydrogens > 0:
        if total_hydrogens == 1:
            atom_str = f"{atom_symbol}H"
        else:
            atom_str = f"{atom_symbol}H{total_hydrogens}"
    else:
        atom_str = atom_symbol
    
    print(idx, atom_str)

运行输出

0 cH
1 cH
2 cH
3 cH
4 cH
5 c
6 C
7 NH2
8 O

关键逻辑说明

  • atom.GetIsAromatic():判断原子是否为芳香原子,芳香原子符号用小写(如苯环的c)
  • atom.GetNumExplicitHs():获取SMILES中明确写出的氢原子数
  • atom.GetNumImplicitHs():获取RDKit自动计算的隐式氢原子数(SMILES中省略的部分)
  • 根据总氢数生成对应格式:氢数为1时写XH,大于1时写XHn,无氢则直接输出原子符号

内容的提问来源于stack exchange,提问作者hal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 06:30:20