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)的一维阵列
- 返回:
向量的范数
- 返回类型:
- MDAnalysis.lib.mdamath.pdot(a: ndarray[Any, dtype[_ScalarType_co]], b: ndarray[Any, dtype[_ScalarType_co]]) ndarray[Any, dtype[_ScalarType_co]] [源代码]
成对点积。
a
形状必须与b
。- 参数:
a (
numpy.ndarray
of shape (N, M)) --b (
numpy.ndarray
of shape (N, M)) --
- 返回类型:
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
。- 返回类型:
- 抛出:
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]
。无效的方框将作为零向量返回。- 返回类型:
在 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)
。- 参数:
dimensions (array_like) -- 以与返回的格式相同的格式提供的单位尺寸
MDAnalysis.coordinates.timestep.Timestep.dimensions
:[lx, ly, lz, alpha, beta, gamma]
。dtype (numpy.dtype) -- 返回的框矩阵的数据类型。
- 返回:
box_matrix --一排麻木的形状
(3, 3)
和数据类型 dtype ,具有box_matrix[0]
包含第一个,box_matrix[1]
第二个,以及box_matrix[2]
第三个框向量。- 返回类型:
备注
第一个向量保证指向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]
。- 返回:
卷 --单位电池的体积。对于无效的框,将为零。
- 返回类型:
在 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
,坐标将被原地修改。
- 返回:
余弦 --展开的原子坐标。
- 返回类型:
- 抛出:
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 版本加入.