如何从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
相关产品推荐
相关产品推荐

