python 了解从MDAnalysis密度分析中获得的密度对象

rn0zuynd  于 2023-02-11  发布在  Python
关注(0)|答案(1)|浏览(209)

我很难理解Density对象从DensityAnalysis类中到底产生了什么。文档在here中找到。
运行代码并不是问题所在,但要理解Density对象究竟生成了什么以及如何解释这些信息。
“(113,113,113)箱”是什么意思?我已经看到了MDAnalysis User guide的例子,但我仍然不明白这是什么,也不知道如何解释它。

from MDAnalysis.analysis.density import Density
    from MDAnalysis.analysis.density import DensityAnalysis
    from MDAnalysis import *
    import numpy as np

    PDB = '/Users/joveyosagie/Desktop/1vmd6lu7.pdb'
    DCD = '/Users/joveyosagie/Desktop/1vmd6lu7.dcd'
    u = Universe(PDB, DCD)
    protein = u.select_atoms('protein')
    OH2 = u.select_atoms('name OH2')

    OH2 = u.select_atoms('name OH2')    #select for water atoms
    D = DensityAnalysis(OH2, delta = 1.0) # each bin in histogram has size of 1 Angstrom
    D.run()

    D.density

[Out]Density density with (113, 113, 113) bins
unguejic

unguejic1#

MDAnalysis.analysis.density.Density对象保存使用DensityAnalysis生成的3D直方图。生成密度的方法是计算粒子在一个小空间区域(体积元素或体素)中出现的频率(斜方盒子,例如,1 Å长,但是Density.delta确切地告诉你体素尺寸)或称为"bin"。我们在轨迹的所有帧上求平均并归一化计数以获得密度形状为(num_bins_x, num_bins_y, num_bins_z)的原始NumPy数组可作为Density.grid访问
密度与原始模拟的坐标系有关,因此,我们还需要知道体素网格的原点在哪里(Density.origin保存此信息)。使用origindelta和数组的形状,我们现在可以计算每个bin在空间中的位置。Density.edges属性提供了bin边缘沿x、y、例如,edges = [np.array(-2.5, -0.5, 1.5, 3.5]), np.array([0., 1., 2.]), np.array([2.5, 4.5])]属于形状为(3, 2, 1)delta = np.array(2.0, 1.0, 2.0])的网格。左下角的面元位于原点(-1.5, 0.5, 3.5)(原点位于面元的 * 中心 *),并且包含坐标为-2.5 ≤ x〈-0.5、0 ≤ y〈1和2.5 ≤ z〈4.5的点。
该类包含更改密度存储单位(即Density.convert_density())的方法。此方法通过将grid中存储的值乘以适当的因子来更改基础数据。
其他方法继承自gridData.core.Grid类,Density类是Density的基础。请参阅GridDataFormats文档,了解这些类还能做什么。例如,可以将两个Density对象视为numpy数组,并对它们执行算术运算,如将它们相减以获得差异密度。

示例:比较水密度

如果密度是在同一坐标系上生成的(即,具有相同的边),则可以减去密度。
让我们比较两个模拟的水密度,看看配体对水做了什么:

  • 载脂蛋白(无配体):u_apo宇宙
  • Holo(与配体):u_holo

首先将轨迹叠加到一个公共的参考结构上,使蛋白质处于相同的坐标系中。您可以使用MDAnalysis.analysis.align.AlignTraj,如Aligning a trajectory with AlignTraj中所述,或者查看用户指南中关于密度分析的更详细说明,如居中、对齐和使用动态转换使分子完整。
然后我们需要确保我们的密度是在同一个坐标系中分析的。

  • 找到公共参考中心。
  • 在两种密度下设置相同数量的箱,我们假设30 Å x 30 Å x 30 Å的立方体就足够了,但在实际分析中需要计算出正确的尺寸。
protein_apo = u_apo.select("protein")
gridcenter = protein_apo.center_of_mass()  # should be the same as for holo

# select water oxygens for density
water_apo = u_apo.select_atoms("resname SOL and name OW")  # adjust for your simulation
water_holo = u_holo.select_atoms("resname SOL and name OW")

# perform the analysis
D_apo = DensityAnalysis(water_apo, gridcenter=gridcenter, xdim=30, ydim=30, zdim=30).run(verbose=True)
D_holo = DensityAnalysis(water_holo, gridcenter=gridcenter, xdim=30, ydim=30, zdim=30).run(verbose=True)

# work with the density instances
density_apo = D_apo.results.density
density_holo = D_holo.results.density

# convert to units in which water at standard conditions is 1
# (see Density.convert_units() docs for more choices)
density_apo.convert_units("water")
density_holo.convert_units("water")

# compare densities
delta_density = density_holo - density_apo

print("max difference", delta_density.grid.max())
print("min difference", delta_density.grid.min())

# export to DX file for visualization
delta_density.export("delta_holo_apo.dx")

更多帮助?

如果您有更多的问题,请看看如何参与MDAnalysis社区-我们有一个discord服务器和邮件列表,人们(用户和开发人员)很乐意帮助和讨论。

相关问题