如何将SMILES表示的聚合物重复单元聚合成二聚体?求RDkit解决方案
用RDKit生成聚合物重复单元的二聚体SMILES
要将带*聚合位点的重复单元聚合成二聚体,核心逻辑是连接两个重复单元的中间聚合位点,同时保留二聚体两端的位点。以下是基于RDKit的具体实现方案:
实现步骤与代码
- 导入RDKit依赖库
from rdkit import Chem
- 定义重复单元并解析为分子对象
repeat_unit = "*CCC(C)C(*)C" # 解析两个重复单元分子,保留代表聚合位点的Dummy原子(*) mol_a = Chem.MolFromSmiles(repeat_unit) mol_b = Chem.MolFromSmiles(repeat_unit)
- 定位聚合位点
每个重复单元包含两个*位点,我们选取mol_a的右端位点和mol_b的左端位点进行连接:
# 筛选出分子中的Dummy原子(符号为*) dummy_a = [atom for atom in mol_a.GetAtoms() if atom.GetSymbol() == '*'] dummy_b = [atom for atom in mol_b.GetAtoms() if atom.GetSymbol() == '*'] # 获取要连接的原子索引:mol_a的第二个Dummy(右端)、mol_b的第一个Dummy(左端) connect_idx_a = dummy_a[1].GetIdx() connect_idx_b = dummy_b[0].GetIdx()
- 合并分子并完成聚合连接
通过编辑对象实现键的添加和冗余Dummy原子的删除:
# 合并两个分子 combined = Chem.CombineMols(mol_a, mol_b) edit_mol = Chem.EditableMol(combined) # 注意:mol_b的原子索引需要加上mol_a的原子总数偏移量 offset = mol_a.GetNumAtoms() edit_mol.AddBond(connect_idx_a, connect_idx_b + offset, Chem.BondType.SINGLE) # 删除用于连接的两个Dummy原子 edit_mol.RemoveAtom(connect_idx_b + offset) edit_mol.RemoveAtom(connect_idx_a) # 生成最终二聚体分子并输出SMILES dimer = edit_mol.GetMol() Chem.SanitizeMol(dimer) # 清理分子结构,确保格式合法 dimer_smiles = Chem.MolToSmiles(dimer) print(dimer_smiles)
关键说明
- 运行后输出的SMILES会保留二聚体两端的
*位点,符合聚合物片段的表示要求; - 若需要生成三聚体,只需重复上述逻辑,将二聚体与第三个重复单元进行连接即可;
- 若Dummy原子的顺序不符合预期(比如左端和右端索引颠倒),可通过打印原子信息调整
dummy_a和dummy_b的索引取值。
内容的提问来源于stack exchange,提问作者Blue
相关产品推荐
相关产品推荐

