13.2.7. 数学辅助函数 MDAnalysis.lib.mdamath

用于常见数学运算的辅助函数。其中一些函数是用C/cython编写的,以获得更高的性能。

13.2.7.1. 线性代数

MDAnalysis.lib.mdamath.normal(vec1: _SupportsArray[dtype[Any]] | _NestedSequence[_SupportsArray[dtype[Any]]] | bool | int | float | complex | str | bytes | _NestedSequence[bool | int | float | complex | str | bytes], vec2: _SupportsArray[dtype[Any]] | _NestedSequence[_SupportsArray[dtype[Any]]] | bool | int | float | complex | str | bytes | _NestedSequence[bool | int | float | complex | str | bytes]) ndarray[Any, dtype[_ScalarType_co]][源代码]

返回垂直于两个向量的单位向量。

\[{\mathbf{n}}=\frac{\mathbf{v}_1\Times\mathbf{v}_2}{|\mathbf{v}_1\Times\mathbf{v}_2|}\]

如果两个向量共线,则向量 \(\mathbf{{0}}\) 返回。

在 0.11.0 版本发生变更: 搬到lib.mDamath

MDAnalysis.lib.mdamath.norm(v: _SupportsArray[dtype[Any]] | _NestedSequence[_SupportsArray[dtype[Any]]] | bool | int | float | complex | str | bytes | _NestedSequence[bool | int | float | complex | str | bytes]) float[源代码]

计算向量v的范数。

\[V=\Sqrt{\mathbf{v}\cdot\mathbf{v}}\]

这个版本比numpy.linalg.Norm更快,因为它只适用于单个向量,因此可以跳过许多额外的乱七八糟的linalg.norm。

参数:

v (array_like) -- 长度为N的矢量的形状(N)的一维阵列

返回:

向量的范数

返回类型:

float

MDAnalysis.lib.mdamath.pdot(a: ndarray[Any, dtype[_ScalarType_co]], b: ndarray[Any, dtype[_ScalarType_co]]) ndarray[Any, dtype[_ScalarType_co]][源代码]

成对点积。

a 形状必须与 b

参数:
返回类型:

numpy.ndarray 形状(N,)

MDAnalysis.lib.mdamath.pnorm(a: ndarray[Any, dtype[_ScalarType_co]]) ndarray[Any, dtype[_ScalarType_co]][源代码]

矩阵中每个向量的欧几里得范数

参数:

a (numpy.ndarray of shape (N, M)) --

返回类型:

numpy.ndarray 形状(N,)

MDAnalysis.lib.mdamath.angle(a: _SupportsArray[dtype[Any]] | _NestedSequence[_SupportsArray[dtype[Any]]] | bool | int | float | complex | str | bytes | _NestedSequence[bool | int | float | complex | str | bytes], b: _SupportsArray[dtype[Any]] | _NestedSequence[_SupportsArray[dtype[Any]]] | bool | int | float | complex | str | bytes | _NestedSequence[bool | int | float | complex | str | bytes]) float[源代码]

返回以弧度表示的两个向量之间的角度

在 0.11.0 版本发生变更: 搬到lib.mDamath

在 1.0.0 版本发生变更: 将舍入代码更改为使用 np.clip() 。低于-1.0的值现在返回 np.pi 而不是 -np.pi

MDAnalysis.lib.mdamath.dihedral(ab: _SupportsArray[dtype[Any]] | _NestedSequence[_SupportsArray[dtype[Any]]] | bool | int | float | complex | str | bytes | _NestedSequence[bool | int | float | complex | str | bytes], bc: _SupportsArray[dtype[Any]] | _NestedSequence[_SupportsArray[dtype[Any]]] | bool | int | float | complex | str | bytes | _NestedSequence[bool | int | float | complex | str | bytes], cd: _SupportsArray[dtype[Any]] | _NestedSequence[_SupportsArray[dtype[Any]]] | bool | int | float | complex | str | bytes | _NestedSequence[bool | int | float | complex | str | bytes]) float[源代码]

返回连接A、B、C、D的矢量之间的二面角(以弧度为单位)。

二面体测量BC::周围的旋转:

  ab
A---->B
       \ bc
       _\'
         C---->D
           cd

二面角限制在-π<=x<=π的范围内。

在 0.8 版本加入.

在 0.11.0 版本发生变更: 搬到lib.mDamath

MDAnalysis.lib.mdamath.stp(vec1: _SupportsArray[dtype[Any]] | _NestedSequence[_SupportsArray[dtype[Any]]] | bool | int | float | complex | str | bytes | _NestedSequence[bool | int | float | complex | str | bytes], vec2: _SupportsArray[dtype[Any]] | _NestedSequence[_SupportsArray[dtype[Any]]] | bool | int | float | complex | str | bytes | _NestedSequence[bool | int | float | complex | str | bytes], vec3: _SupportsArray[dtype[Any]] | _NestedSequence[_SupportsArray[dtype[Any]]] | bool | int | float | complex | str | bytes | _NestedSequence[bool | int | float | complex | str | bytes]) float[源代码]

取三个向量的标量三重积。

返回音量 V 由这三个向量所跨越的平行椭圆的

\[V=\mathbf{v}_3\cdot(\mathbf{v}_1\Times\mathbf{v}_2)\]

在 0.11.0 版本发生变更: 搬到lib.mDamath

MDAnalysis.lib.mdamath.sarrus_det(matrix: ndarray[Any, dtype[_ScalarType_co]]) float | ndarray[Any, dtype[_ScalarType_co]][源代码]

方法计算3x3矩阵的行列式。 rule of Sarrus

如果提供了3x3矩阵的数组,则按矩阵计算行列式,并将其作为适当形状的NumPy数组返回。

参数:

matrix (numpy.ndarray) -- 一系列形状 (..., 3, 3) 其中3x3矩阵位于最后两个维度中。

返回:

det --行列式 matrix 。如果 matrix.shape == (3, 3) 行列式将作为标量返回。如果 matrix.shape == (..., 3, 3) 行列式将作为 numpy.ndarray 形状的 (...,) 和数据类型 numpy.float64

返回类型:

float or numpy.ndarray

抛出:

ValueError: -- 如果 matrix 具有少于两个维度或其最后两个维度不是形状 (3, 3)

在 0.20.0 版本加入.

MDAnalysis.lib.mdamath.triclinic_box(x: _SupportsArray[dtype[Any]] | _NestedSequence[_SupportsArray[dtype[Any]]] | bool | int | float | complex | str | bytes | _NestedSequence[bool | int | float | complex | str | bytes], y: _SupportsArray[dtype[Any]] | _NestedSequence[_SupportsArray[dtype[Any]]] | bool | int | float | complex | str | bytes | _NestedSequence[bool | int | float | complex | str | bytes], z: _SupportsArray[dtype[Any]] | _NestedSequence[_SupportsArray[dtype[Any]]] | bool | int | float | complex | str | bytes | _NestedSequence[bool | int | float | complex | str | bytes]) ndarray[Any, dtype[_ScalarType_co]][源代码]

将三个三斜线框向量转换为 [lx, ly, lz, alpha, beta, gamma]

如果结果框无效,即任何框长度为零或负数,或者任何角度在开放区间之外 (0, 180) ,则返回零向量。

所有角度都以度为单位,定义如下:

  • alpha = angle(y,z)

  • beta  = angle(x,z)

  • gamma = angle(x,y)

参数:
  • x (array_like) -- 形状数组 (3,) 表示第一个框向量

  • y (array_like) -- 形状数组 (3,) 表示第二个框向量

  • z (array_like) -- 形状数组 (3,) 表示第三个框向量

返回:

一排稀疏的形状 (6,) 和数据类型 np.float32 以与返回的格式相同的格式提供单位尺寸 MDAnalysis.coordinates.timestep.Timestep.dimensions[lx, ly, lz, alpha, beta, gamma] 。无效的方框将作为零向量返回。

返回类型:

numpy.ndarray

在 0.20.0 版本发生变更: 计算以双精度执行,无效的长方体向量将导致全零长方体。

MDAnalysis.lib.mdamath.triclinic_vectors(dimensions: ~numpy._typing._array_like._SupportsArray[~numpy.dtype[~typing.Any]] | ~numpy._typing._nested_sequence._NestedSequence[~numpy._typing._array_like._SupportsArray[~numpy.dtype[~typing.Any]]] | bool | int | float | complex | str | bytes | ~numpy._typing._nested_sequence._NestedSequence[bool | int | float | complex | str | bytes], dtype: ~numpy.dtype[~typing.Any] | None | type[typing.Any] | ~numpy._typing._dtype_like._SupportsDType[~numpy.dtype[~typing.Any]] | str | tuple[typing.Any, int] | tuple[typing.Any, typing.Union[typing.SupportsIndex, collections.abc.Sequence[typing.SupportsIndex]]] | list[typing.Any] | ~numpy._typing._dtype_like._DTypeDict | tuple[typing.Any, typing.Any] = <class 'numpy.float32'>) ndarray[Any, dtype[_ScalarType_co]][源代码]

转换 [lx, ly, lz, alpha, beta, gamma] 转化为三斜矩阵表示。

原创 code by Tsjerk Wassenaar 发布在Gromacs邮件列表上。

如果 dimensions 表示非周期系统(即所有长度均为零),则返回零矢量。这同样适用于无效的 dimensions 即,任何框长度为零或负数,或任何角度在开放区间之外 (0, 180)

参数:
返回:

box_matrix --一排麻木的形状 (3, 3) 和数据类型 dtype ,具有 box_matrix[0] 包含第一个, box_matrix[1] 第二个,以及 box_matrix[2] 第三个框向量。

返回类型:

numpy.ndarray

备注

  • 第一个向量保证指向x轴,即它具有如下形式 (lx, 0, 0)

  • 第二个向量保证位于x/y平面,即它的z分量保证为零。

  • 如果任何长方体长度为负或零,或者如果任何长方体角度为零,则该长方体被视为无效,并返回全零矩阵。

在 0.7.6 版本发生变更: 对于非周期(或缺失)单元,返回空向量。

在 0.20.0 版本发生变更: 计算是以双精度执行的,对于无效的框,也会返回零矢量。 添加了可选的输出数据类型参数。

MDAnalysis.lib.mdamath.box_volume(dimensions: _SupportsArray[dtype[Any]] | _NestedSequence[_SupportsArray[dtype[Any]]] | bool | int | float | complex | str | bytes | _NestedSequence[bool | int | float | complex | str | bytes]) float[源代码]

所描述的单元格的体积 dimensions

体积计算为框矩阵迹的乘积,矩阵从 triclinic_vectors() 。如果方框无效,即任何方框长度为零或负数,或者任何角度在开放区间之外 (0, 180) ,则产生的体积将为零。

参数:

dimensions (array_like) -- 以与返回的格式相同的格式提供的单位尺寸 MDAnalysis.coordinates.timestep.Timestep.dimensions[lx, ly, lz, alpha, beta, gamma]

返回:

--单位电池的体积。对于无效的框,将为零。

返回类型:

float

在 0.20.0 版本发生变更: 计算以双精度执行,对于无效的尺寸,返回零。

13.2.7.2. 连通性

MDAnalysis.lib.mdamath.make_whole(atomgroup, reference_atom=None, inplace=True)

移动单个分子中的所有原子,这样键就不会在图像上分裂。

当原子被填充到初级单胞中,导致分子中间断裂时,这种功能最有用,然后分子出现在单胞的两边。这对于计算分子的质心等操作是有问题的。**

+-----------+     +-----------+
|           |     |           |
| 6       3 |     |         3 | 6
| !       ! |     |         ! | !
|-5-8   1-2-| ->  |       1-2-|-5-8
| !       ! |     |         ! | !
| 7       4 |     |         4 | 7
|           |     |           |
+-----------+     +-----------+
参数:
  • atomgroup (AtomGroup) -- 这个 MDAnalysis.core.groups.AtomGroup 一起工作。这个位置被适当地修改了。所有这些原子必须属于同一分子或片段。

  • reference_atom (Atom) -- 所有其他原子都将围绕其运动的原子。默认为原子组中的ATOM 0。

  • inplace (bool, optional) -- 如果 True ,坐标将被原地修改。

返回:

余弦 --展开的原子坐标。

返回类型:

numpy.ndarray

抛出:
  • NoDataError -- 不存在任何债券。(请参阅 guess_bonds() )

  • ValueError -- 这个算法不起作用。这通常是由于原子组不是单个片段造成的。(即分子不能通过以下键穿透)

示例

使碎片完整::

from MDAnalysis.lib.mdamath import make_whole

# This algorithm requires bonds, these can be guessed!
u = mda.Universe(......, guess_bonds=True)

# MDAnalysis can split AtomGroups into their fragments
# based on bonding information.
# Note that this function will only handle a single fragment
# at a time, necessitating a loop.
for frag in u.atoms.fragments:
    make_whole(frag)

或者,要保持单个原子作为锚的位置:

# This will mean that atomgroup[10] will NOT get moved,
# and all other atoms will move (if necessary).
make_whole(atomgroup, reference_atom=atomgroup[10])

在 0.11.0 版本加入.

在 0.20.0 版本发生变更: 原子位置的就地修改现在是可选的,位置以数字数组的形式返回。

MDAnalysis.lib.mdamath.find_fragments(atoms, bondlist)

根据节点(原子索引)和边(原子索引对)计算不同的碎片。

参数:
  • atoms (array_like) -- 一维原子索引数组(dtype将转换为 numpy.int64 内部)

  • bonds (array_like) -- 焊接的2-D数组(数据类型将转换为 numpy.int32 内部),其中 bonds[i, 0]bonds[i, 1] 是由原子连接的指数 i -TH债券。任何涉及原子指数的键都不在 atoms 将被忽略。

返回:

  • 碎片 ( list )--数组列表,每个数组包含一个片段的原子索引。

  • 。。添加的版本::0.19.0

在 0.11.0 版本加入.