当前位置:首页>python>Python 驱动的聚合物建模与力场赋予

Python 驱动的聚合物建模与力场赋予

  • 2026-10-11 06:58:05
Python 驱动的聚合物建模与力场赋予

【模拟计算  就找算筹】

👉暑期算力预存特惠:最低 0.04 元 / 核时,新用户再送 5000 核时

👉新客专享!5000核时直接送,还可享受预存福利,开箱即用,算力无忧!

以 TPU 单链到五链体系为例|分享讲稿与核心代码

案例体系:(MDI-BDO-MDI-PTMG₁₂)₃ TPU 单链,左端为 -NCO、右端为 -OH;完成单链参数化后,构建 5 链、80 × 80 × 80 ų 的初始无定形盒,并输出 Amber / LAMMPS 可用拓扑。

分享主线:

参数化化学结构 → 3D 单链 → 小寡聚物电荷 → 全链 GAFF2 参数化→ 多链装箱 → Amber 拓扑 → LAMMPS 数据文件

1. 为什么用 Python 驱动这条链路

传统聚合物建模常常依赖手工绘制、逐步点击软件和人工改文件。一旦要改变聚合度、软段长度、端基或链数,前面的工作就要重复。Python 的价值在于把这些变化转换为参数:修改少量变量即可重建整个体系。

本案例中,Python 不替代量化计算或经典力场工具,而是承担三件最重要的工作:

  • 规则化建模:用代码定义 TPU 的连接关系和端基。

  • 自动化衔接:把 OpenBabel、AmberTools、Packmol 和 LAMMPS 串成可重复执行的工作流。

  •  可追溯检查:保留结构、电荷、参数和拓扑的中间文件,问题可定位、体系可重建。

可以把它概括为一句话:把“搭一个模型”变成“定义一套生成模型的规则”。

本案例可调的核心参数如下:

N_PTMG = 12          # 每个软段的 PTMG(丁撑氧)单元数DP     = 3           # 聚合度CHG_PTMG = 3         # 电荷用小寡聚物的 PTMG 单元数CHG_DP   = 2         # 电荷用小寡聚物的聚合度

只要修改 N_PTMG、DP、CHG_PTMG 或 CHG_DP,就能生成另一种分子量或链结构的 TPU,同时仍沿用后续参数化流程。

2.用参数化 SMILES 自动构建 TPU 单链

讲什么

首先要解决的问题不是三维坐标,而是“化学结构是否正确”。TPU 由硬段 MDI–BDO–MDI 和软段 PTMG 组成,且链两端具有不同端基。代码以 SMILES 表达键连关系,再由 OpenBabel 补氢、生成三维构象并进行初步几何优化。

核心代码

下面这段代码用循环生成聚合物主链:每一个重复单元包含两段 MDI 及对应的氨酯连接;n_ptmg 决定软段长度,dp 决定重复次数。

def build_smiles(n_ptmg, dp):    """左端自由异氰酸酯,右端 -OH 的 TPU 链。"""    ring = [0]    closers = []    s = 'O=C=N'                       # 左端 -N=C=O    def mdi():        ring[0] += 1; a = ring[0]        ring[0] += 1; b = ring[0]        pre = f'c{_lab(a)}ccc(Cc{_lab(b)}ccc('        clo = f'){"cc"+_lab(b)})cc{_lab(a)}'        return pre, clo    for r in range(dp):        pre, clo = mdi(); s += pre; closers.append(clo)        s += 'NC(=O)O' + 'CCCC' + 'OC(=O)N'  # 氨酯-BDO-氨酯        pre, clo = mdi(); s += pre; closers.append(clo)        s += 'NC(=O)O' + 'CCCCO' * n_ptmg   # 氨酯 + PTMG        if r < dp - 1:            s += 'C(=O)N'    return s + ''.join(reversed(closers))

生成结构时,脚本还会用 RDKit 复核分子式、分子量、原子数和形式电荷,避免“结构已经生成但化学式不对”的问题。

def make3d_and_write(smiles, prefix, tag=''):    m = pybel.readstring('smi', smiles)    m.addh()    m.make3D(forcefield=FF_OPT, steps=OPT_STEPS)    m.localopt(forcefield=FF_OPT, steps=OPT_STEPS)    m.write('mol2', f'{prefix}.mol2', overwrite=True)    m.write('pdb',  f'{prefix}.pdb',  overwrite=True)

本节要强调的边界

这里得到的是一个化学上正确、几何上可用的初始构象,不是平衡态聚合物构象。真实的链构象、密度和缠结状态要在后续的最小化、升温和 NPT 平衡中形成。

3. 用代表性小寡聚物计算电荷,并映射到整链

讲什么

AM1-BCC 电荷是 GAFF2 常用的电荷方案,但对整条聚合物直接计算会越来越昂贵,也更容易受构象影响。本案例的做法是:构造一个包含端基、内部连接点和软段环境的小寡聚物,先在其上计算 AM1-BCC 电荷,再把电荷按局部化学环境映射回完整链。

这比“相同元素直接复制相同电荷”可靠得多:同样是 O 或 N,位于氨酯、醚键或端基时的电子环境并不一样。

核心代码

小寡聚物与整链同时生成,但尺寸更小:

smi_full = build_smiles(N_PTMG, DP)make3d_and_write(smi_full, OUT_FULL, '整链')smi_chg = build_smiles(CHG_PTMG, CHG_DP)make3d_and_write(smi_chg, OUT_CHG, '电荷寡聚物')

随后在小寡聚物上运行 AM1-BCC:

antechamber -i tpu_charge.mol2 -fi mol2 \            -o tpu_charge_bcc.mol2 -fo mol2 \            -c bcc -at gaff2 -nc 0 -pf y -dr no

电荷映射的关键是“原子周围若干键范围内的化学环境”。本案例以 3 个键为半径,优先匹配最具体的局部环境;若无法匹配,逐步降低半径,最后才使用元素级兜底。

RADIUS = 3for i in range(fm.GetNumAtoms()):    for r in range(RADIUS, 0, -1):        k = env_key(fm, i, r)        if k is not None and k in ref[r]:            vals = ref[r][k]            q[i] = sum(vals) / len(vals)            used_r[r] += 1            break

映射后还要把整链电荷校正到目标净电荷;本例为中性分子:

NET_CHARGE = 0.0tot = sum(q)corr = (tot - NET_CHARGE) / len(q)q = [x - corr for x in q]

本节要强调的检查

  • 输出“半径匹配数”和“元素兜底数”;兜底多说明小寡聚物没有覆盖完整链的化学环境。

  •  检查校正前后的总电荷;校正量不能异常大。

  •  端基、氨酯基、醚氧和芳环附近的原子应重点抽查。

4. GAFF2 参数化:从结构与电荷到可计算拓扑

讲什么

一个可进行分子动力学模拟的体系,不只是坐标和电荷。还必须有原子类型、键、键角、二面角、非键相互作用参数等完整拓扑。此处 Python 负责前处理和调度,AmberTools 负责 GAFF2 类型识别、参数补全和 Amber 拓扑构建。

核心命令

先把已映射的电荷写入整链,并赋 GAFF2 原子类型:

printf("hello world!");antechamber -i tpu_full.mol2 -fi mol2 \            -o tpu_gaff.mol2 -fo mol2 \            -at gaff2 -c rc -cf charges.dat -nc 0 -pf y -dr no

然后由 parmchk2 检索 GAFF2 中没有直接覆盖的参数,生成补充参数文件:

parmchk2 -i tpu_gaff.mol2 -f mol2 -o tpu.frcmod -s gaff2

最后用 tleap 合并结构与参数,并写出 Amber 模拟所需的 prmtop 和 inpcrd:

source leaprc.gaff2mol = loadmol2 tpu_gaff.mol2loadamberparams tpu.frcmodcheck molsaveamberparm mol tpu.prmtop tpu.inpcrdsavepdb mol tpu_amber.pdb

本节要强调的边界

parmchk2 能补“缺失的通用参数”,不等于这些参数都已经过目标体系验证。对力学性质、玻璃化温度、气体吸附或界面相互作用等目标,仍需要用实验或更高层级计算进行验证。

5. 从单链到五链无定形体系,并导入 LAMMPS

讲什么

单链参数化完成后,不应重新为每一条链重复计算电荷和参数。正确做法是将经过验证的单链保存为库,再复制、装箱、重建多链拓扑。这保证每条 TPU 链使用相同的力场定义,也使体系规模扩展更直接。

核心代码与输入

为了让 tleap 能可靠识别重复链,先把原子名唯一化、残基名统一为 TPU:

INP, OUT, RESNAME = 'tpu_gaff.mol2', 'tpu_uniq.mol2', 'TPU'el = ''.join(ch for ch in c[1] if ch.isalpha())[:1].upper()cnt[el] = cnt.get(el, 0) + 1name = f'{el}{cnt[el]}'

使用 Packmol 放入 5 条链:

tolerance 2.0filetype pdboutput box5.pdbstructure tpu_single.pdb  number 5  inside box 1.1.1.79.79.79.end structure

读取装箱后的 PDB,设置周期性盒子,并重建五链 Amber 拓扑:

source leaprc.gaff2loadamberparams tpu.frcmodloadoff tpu.libsys = loadpdb box5.pdbcheck sysset sys box {80.080.080.0}saveamberparm sys tpu5.prmtop tpu5.inpcrd

通过 InterMol 转换至 LAMMPS:

python -m intermol.convert --amb_in tpu5.prmtop tpu5.inpcrd \  --lammps --oname tpu5

本节要强调的检查

  • 5 链体系应为 699 × 5 = 3495 个原子。

  • Packmol 仅生成初始排布,必须进行能量最小化和后续平衡。

  • Amber 与 LAMMPS 间应对照原子数、键角二面角数、盒子大小、净电荷和 improper 项;格式转换可能丢失或改变势函数表达。

  • 后续若加入 ZIF-8、PAD、CO₂ 等组分,需重点审查不同力场的二面角、improper 和交叉相互作用是否兼容。

结尾:这套流程最终交付的是什么

最终交付不应只是一个结构图或 PDB 文件,而应是一套可复建的模拟体系:

printf("hello world!");参数化建链脚本  + 电荷映射脚本  + GAFF2 参数文件(mol2 / frcmod)  + Amber 拓扑(prmtop / inpcrd)  + LAMMPS 数据与输入文件  + 每一步的检查日志

一句话总结:Python 的价值不只是自动生成一条 TPU 链,而是把聚合物的化学结构、局部电荷、力场和多链模拟体系,固化为一条可复用、可检查、可扩展的建模流程。

算筹科技,旨在为高校、科研院所、医院等相关企业提供模拟计算、超算资源、实验测试等服务。我们拥有丰富的计算经验和深厚的案例积累,专业人员一对一全程服务,提供多种定制化的计算方案及算力支持。

点击蓝字 关注我们

👇课程教学、答疑解惑👇

最新文章

随机文章