您可以使用Universe.empty()方法创建一个带有空原子的新 Universe 。在以下示例中,我使用来自测试的示例文件(data.PSF
但data.DCD
您可以使用自己的文件)。
import MDAnalysis as mda
from MDAnalysis.tests import datafiles as data # only needed for the example files
u = mda.Universe(data.PSF, data.DCD)
# create the "coarse grained" universe with one Atom per Residue
cg = mda.Universe.empty(n_atoms=u.residues.n_residues, n_residues=u.residues.n_residues,
atom_resindex=u.residues.ix, trajectory=True)
# add total mass for each residue
cg.add_TopologyAttr("masses", u.residues.masses)
# add total charge per residue
cg.add_TopologyAttr("charges", u.residues.charges)
# add names etc... so that cg.select_atoms("protein") works
cg.add_TopologyAttr("resnames", u.residues.resnames)
cg.add_TopologyAttr("resnums", u.residues.resnums)
# use the residue center of mass for each residue as the position of the CG particle
centers = u.residues.center_of_mass(compound="residues")
cg.atoms.positions = centers
空虚的宇宙是光秃秃的;使用Universe.add_TopologyAttr()
我们可以添加诸如质量和电荷之类的拓扑属性,这可能对粗粒度粒子有意义。我们用聚合的每个残基值初始化这些属性(u.residues.masses
包含每个残基的质量,而u.atoms.masses
包含每个原子的质量)。添加残基名称可以进行选择,例如
protein = cg.select_atoms("protein")
也可以在cg
宇宙上工作。可以以类似的方式添加其他拓扑属性。(目前可用属性的文档不是很好,所以也许可以在用户邮件列表中询问或查看用户指南:拓扑系统(截至 2019 年 11 月的工作正在进行中)。
我们还可以将位置分配给 CG“原子”(因为我们添加了一个空的单帧轨迹trajectory=True
),以便进行典型的分析,例如,我们选择的蛋白质残基的回转半径:
rgyr = protein.radius_of_gyration()
以上应该回答最初发布的问题。
但是,请注意,为轨迹中的每个时间步创建一个 Universe 可能效率低下。创建一个带有内存轨迹的粗粒度宇宙会很方便,但当前的Universe.empty()
方法(MDAnalysis 0.20.1)不支持这个功能——主要是因为没有人要求它。实现起来很简单,所以如果您需要它,请在我们的问题跟踪器https://github.com/mdanalysis/mdanalysis/issues中提出问题并建议该功能。