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

RdKit环境中多肽结构优化报错及前药构建技术问询

解决RdKit多肽MMFF优化报错及前药构建方案

一、修复多肽"Bad Conformer Id"优化错误

Bad Conformer Id报错的核心原因是长多肽(16肽)用默认参数构象嵌入失败,导致MMFF找不到有效构象进行优化。以下是稳定的优化方案:

import os
from rdkit import Chem
from rdkit.Chem import AllChem

aa_seq = "GDYSHASPLRYPEGGG"
pep = Chem.MolFromSequence(aa_seq)
pep = Chem.AddHs(pep)
drug_smiles = "CCCC1SC[C@]2(C)NC(=O)N[C@]12C"
drug = Chem.MolFromSmiles(drug_smiles)
drug = Chem.AddHs(drug)

# 药物构象优化(保留原逻辑)
AllChem.EmbedMolecule(drug, randomSeed=42)
AllChem.MMFFOptimizeMolecule(drug)

# 多肽构象生成与优化修复
# 使用ETKDGv3参数适配多肽构象生成,开启多线程加速
params = AllChem.ETKDGv3()
params.randomSeed = 11
params.numThreads = 4

# 先尝试单次嵌入,失败则生成多个构象筛选
embed_status = AllChem.EmbedMolecule(pep, params)
if embed_status == -1:
    conf_ids = AllChem.EmbedMultipleConfs(pep, numConfs=10, params=params)
    if not conf_ids:
        raise ValueError("多肽构象生成失败,请检查序列合法性")
    # 选取第一个生成的构象作为基础
    pep.SetConformer(pep.GetConformer(conf_ids[0]))

# 先用UFF力场做初步优化(对大分子兼容性更好)
AllChem.UFFOptimizeMolecule(pep)
# 再尝试MMFF优化,兼容则执行,否则保留UFF结果
mmff_props = AllChem.MMFFGetMoleculeProperties(pep)
if mmff_props:
    AllChem.MMFFOptimizeMolecule(pep, mmffProps=mmff_props)
else:
    print("MMFF力场不支持当前多肽结构,已使用UFF完成优化")

二、药物与多肽连接构建前药并导出PDB

完成优化后,按需求连接分子并导出PDB:

# 1. 定位目标原子(需提前确认原子索引正确性,可通过遍历打印核对)
drug_c0 = drug.GetAtomWithIdx(0)
pep_n0 = pep.GetAtomWithIdx(0)

# 2. 移除指定氢原子
drug.RemoveAtom(14)  # 移除药物H14
pep.RemoveAtom(118)  # 移除多肽H118

# 3. 合并分子并创建共价键
prodrug = Chem.CombineMols(pep, drug)
pep_atom_count = pep.GetNumAtoms()
# 合并后药物原子索引偏移多肽原子总数
prodrug_c0_idx = pep_atom_count + 0
prodrug_n0_idx = 0
prodrug.AddBond(prodrug_n0_idx, prodrug_c0_idx, Chem.BondType.SINGLE)

# 4. 前药构象优化
AllChem.UFFOptimizeMolecule(prodrug)
mmff_props_prodrug = AllChem.MMFFGetMoleculeProperties(prodrug)
if mmff_props_prodrug:
    AllChem.MMFFOptimizeMolecule(prodrug, mmffProps=mmff_props_prodrug)

# 5. 导出PDB文件
Chem.MolToPDBFile(prodrug, "prodrug.pdb")

辅助核对原子索引的代码

若不确定原子索引,可执行以下代码遍历打印原子信息:

# 打印药物原子信息
for atom in drug.GetAtoms():
    print(f"索引: {atom.GetIdx()}, 元素: {atom.GetSymbol()}, 关联氢数: {atom.GetTotalNumHs()}")

# 打印多肽原子信息
for atom in pep.GetAtoms():
    print(f"索引: {atom.GetIdx()}, 元素: {atom.GetSymbol()}, 关联氢数: {atom.GetTotalNumHs()}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 13:04:58