MDAnalysis核酸对应原子与配对几何
实际操作NucPairDist及WatsonCrick、Minor、Major距离,读懂RNA配对候选点和原子命名。
阅读本篇目录
核酸结构中的距离必须先说明“哪两个原子”。本例用RNA的两个G-C候选对应选区,演示四种原生接口和旧版函数;这些是几何量,不自动判定碱基已经配对或形成氢键。
1 下载并运行#
下载RNA与膜叶分类的完整输入、分析脚本、数值和结构图,保存为rna-membrane.zip:
module load pymatgen/2026.9.24
python -m zipfile -e rna-membrane.zip .
cd mdanalysis-rna-membrane
bash run.sh
source env.sh
输出在results/、plots/,请使用新的解压目录。环境是MDAnalysis 2.9.0和NetworkX 3.6.1;setup.sh在示例目录建立NetworkX的局部加载入口,使用集群已有依赖,不修改公共Python环境。env.sh供当前终端中的Python示例使用;没有调用qvasp或VASP。
数据来自MDAnalysisTests 2.9.0官方公开样例,来源、哈希及上游许可随包保留。RNA是PDB 1K5I派生数据中RNAA段的23个核苷酸、739个原子;膜是单个DPPC/胆固醇结构快照。这里在集群上实际执行几何和图分析,没有把这些上游快照说成新做的分子动力学。程序中的90°刚体旋转只检查几何量是否保持不变,不是第二个动力学时间点。
2 先看残基名称和编号#
python - <<'PYCODE'
import MDAnalysis as mda
u = mda.Universe('inputs/rna.pdb')
print(len(u.atoms), len(u.residues))
print(list(zip(u.residues.resids, u.residues.resnames)))
PYCODE
本例残基命名为GUA、ADE、CYT、URA,编号1–23。配套脚本在相隔至少三个残基的G-C候选中,选取N1—N3距离最短的两组,得到G9—C15与C4—G20。这个选择规则可复现,但单个距离仍不足以确认配对,还要结合其他氢键几何、取向和结构背景。
3 WatsonCrickDist:N1—N3#
python - <<'PYCODE'
import MDAnalysis as mda
from MDAnalysis.core.groups import ResidueGroup
from MDAnalysis.analysis.nucleicacids import WatsonCrickDist
u = mda.Universe('inputs/rna.pdb')
def residue(i):
return u.select_atoms(f'segid RNAA and resid {i}').residues[0]
s1 = ResidueGroup([residue(9), residue(4)])
s2 = ResidueGroup([residue(15), residue(20)])
a = WatsonCrickDist(s1, s2).run()
print(a.results.distances)
PYCODE
实际输出约为[[2.84227108, 2.87690936]] Å。形状是(帧数, 配对数),这里原始结构只有一帧。接口按碱基类型选择嘌呤N1与嘧啶N3,不能把它理解成重原子中任意两点的最短距离。

4 MinorPairDist和MajorPairDist#
python - <<'PYCODE'
import MDAnalysis as mda
from MDAnalysis.core.groups import ResidueGroup
from MDAnalysis.analysis.nucleicacids import MinorPairDist, MajorPairDist
u = mda.Universe('inputs/rna.pdb')
def residue(i):
return u.select_atoms(f'resid {i}').residues[0]
s1 = ResidueGroup([residue(9), residue(4)])
s2 = ResidueGroup([residue(15), residue(20)])
print('C2-O2:', MinorPairDist(s1, s2).run().results.distances)
print('O6-N4:', MajorPairDist(s1, s2).run().results.distances)
PYCODE
本例都是G-C,对应C2—O2和O6—N4。它们描述特定对应原子的间隔,不是自动求出了整条核酸的小沟宽度或大沟宽度。换成A-U、A-T、修饰碱基或不同命名体系时,要检查实际原子名及接口参数,不能直接照搬G-C的O6/N4默认选择。
5 通用接口及旧函数#
python - <<'PYCODE'
import MDAnalysis as mda
from MDAnalysis.analysis.nucleicacids import NucPairDist
from MDAnalysis.analysis import nuclinfo
u = mda.Universe('inputs/rna.pdb')
a = NucPairDist([u.select_atoms('resid 9 and name N1')],
[u.select_atoms('resid 15 and name N3')]).run()
print(a.results.distances)
print(nuclinfo.wc_pair(u, 9, 15, seg1='RNAA', seg2='RNAA'))
print(nuclinfo.minor_pair(u, 9, 15, seg1='RNAA', seg2='RNAA'))
print(nuclinfo.major_pair(u, 9, 15, seg1='RNAA', seg2='RNAA'))
PYCODE
NucPairDist适合自己明确挑选对应原子;旧函数一次返回一个选区的数值。本例新旧接口在同一原子定义下相符,包内保留完整字段。换成自己的轨迹时先处理跨周期边界的分子完整性,再确认拓扑、名称及残基顺序;原始快照里的一个短距离不能给出配对寿命或转变速率。
骨架扭转、糖环和拟二面角继续见核酸构象分析。