(autode计算化学—atoms)AtomCollection原子集类
子类实例:
class autode.atoms.AtomCollection(atoms: List[Atom] | Atoms | None = None)
构造函数:init(atoms: List[Atom] | Atoms | None = None)
autode.atoms.AtomCollection
类简要介绍
AtomCollection
是 autoDE
库中的一个基础类,代表一个原子的集合。它本身通常不直接使用,而是作为其他包含多个原子的类(如 Molecule
)的基类。
核心功能:
- 管理一个原子列表(
atoms
):
存储并组织构成分子或体系的所有原子对象。 - 提供对集合中原子的访问和操作:
支持索引、迭代、添加/删除原子等操作,便于遍历和处理原子数据。 - 计算集合的整体属性:
mass
: 计算所有原子的总质量(单位:amu)。centre_of_mass
: 计算质心坐标(三维空间中的加权平均位置)。
- 支持几何变换:
提供对整个原子集合进行统一操作的能力,例如:translate()
: 沿指定向量平移所有原子。rotate()
: 围绕指定轴和中心点旋转所有原子。
全参数构造实例
AtomCollection 的构造函数主要接收一个 atoms 参数。虽然文档显示它接受 List[Atom] | Atoms | None,但最常用和最清晰的方式是传入一个 Atom 对象的列表。
import autode as ade# --- 步骤 1: 创建单个原子 ---
# 为了构造一个 AtomCollection,我们需要先有一些 Atom 对象。
atom1 = ade.Atom('C', 0.0, 0.0, 0.0) # 碳原子
atom2 = ade.Atom('O', 1.2, 0.0, 0.0) # 氧原子
atom3 = ade.Atom('H', -0.6, 1.0, 0.0) # 氢原子
atom4 = ade.Atom('H', -0.6, -1.0, 0.0) # 另一个氢原子# 将原子放入一个列表中
atoms_list = [atom1, atom2, atom3, atom4]# --- 步骤 2: 全参数构造 AtomCollection ---
# 使用唯一的参数 'atoms' 来构造 AtomCollection
# 这就是所谓的"全参数",因为构造函数只接受这一个参数。
collection = ade.atoms.AtomCollection(atoms=atoms_list)
# 等价写法: collection = ade.AtomCollection(atoms_list) # 位置参数# --- 步骤 3: 验证和使用 ---
print(f"原子集合中的原子数量: {collection.n_atoms}") # 输出: 4
print(f"集合的总质量: {collection.mass}") # 输出总质量
print(f"质心坐标: {collection.centre_of_mass}")# 访问单个原子
print(f"第一个原子 (符号): {collection.atoms[0].atomic_symbol}") # 输出: C
print(f"第一个原子 (坐标): {collection.atoms[0].coord}") # 输出坐标# 注意: AtomCollection 本身没有 translate/rotate 方法 (见下方说明)
AtomCollection
类的属性介绍
atoms
属性介绍
-
类型:
List[autode.atoms.Atom]
-
描述:
这是autode.atoms.AtomCollection
类(及其子类如Molecule
)的一个核心属性。它返回一个包含该集合中所有原子的 Python 列表。 -
可读写:
这是一个可读写(read-write)的属性。您可以获取原子列表,也可以直接为其赋值来替换整个原子集合。 -
基础作用:
atoms
属性是AtomCollection
的基础,所有其他属性(如n_atoms
,coordinates
,mass
)和方法(如angle
,distance
)都依赖于这个原子列表来计算。
示例:
1.访问原子
import autode as ade# 创建一个分子
water = ade.Molecule(smiles='O') # 简单创建水分子# 通过 atoms 属性访问原子
oxygen = water.atoms[0] # 获取第一个原子 (氧)
hydrogen1 = water.atoms[1] # 获取第二个原子 (氢)
hydrogen2 = water.atoms[2] # 获取第三个原子 (氢)print(f"第一个原子的元素: {oxygen.atomic_symbol}") # 输出: O
print(f"第二个原子的元素: {hydrogen1.atomic_symbol}")
print(f"第三个原子的元素: {hydrogen2.atomic_symbol}")
print(f"原子的坐标: {oxygen.coord}")
print(f"原子的坐标: {hydrogen1.coord}")
print(f"原子的坐标: {hydrogen2.coord}")
2.遍历原子
# 遍历所有原子
for atom in water.atoms:print(f"原子: {atom.atomic_symbol}, 坐标: {atom.coord}")
3.修改原子集合
# 创建一个新的原子列表
new_atoms = [ade.Atom('C', 0.0, 0.0, 0.0),ade.Atom('C', 1.4, 0.0, 0.0)
]# 直接替换整个原子集合
water.atoms = new_atomsprint(f"更新后原子数: {water.n_atoms}") # 输出: 2
print(f"新分子的总质量: {water.mass}") # 输出 C₂ 的质量
4. 修改单个原子
# 修改列表中特定位置的原子
water.atoms[0] = ade.Atom('N', 0.0, 0.0, 0.0) # 将第一个原子改为氮
print(f"修改后第一个原子: {water.atoms[0]}") # Atom(N, 0.0000, 0.0000, 0.0000)
5. 添加/删除原子
# 添加一个新原子
water.atoms.append(ade.Atom('H', 0.0, 1.0, 0.0))
print(f"添加后原子数: {water.n_atoms}") # 输出: 3# 删除一个原子
water.atoms.pop(1) # 删除索引为1的原子
print(f"删除后原子数: {water.n_atoms}") # 输出: 2
与其他属性的关系
n_atoms
: 返回len(self.atoms)
。coordinates
: 从self.atoms
中每个原子的coord
提取并组合成一个 Nx3 的 numpy 数组。mass
: 对self.atoms
中每个原子的mass
求和。
总结:atoms
属性是 AtomCollection
的核心数据容器。它提供了一个直接的、标准的 Python 列表接口来访问和操作集合中的所有原子。无论是读取原子信息、修改单个原子、替换整个结构,还是动态地添加/删除原子,都是通过操作这个 atoms
列表来完成的。它是连接高级分子操作和底层原子数据的桥梁。
com
属性介绍
- 类型:
autode.values.Coordinate
- 描述:
com
是 “centre of mass”(质心)的缩写。该属性计算并返回原子集合(AtomCollection
或Molecule
)的质心坐标。 - 单位: 默认单位是埃(Å)。
- 只读: 这是一个只读属性,其值由
atoms
列表中的原子坐标和质量动态计算得出,不能直接赋值修改。
计算原理
质心(Center of Mass, COM)是整个原子集合质量分布的平均位置。其计算公式为:
COM = (Σ (mᵢ × rᵢ)) / Σ mᵢ
其中:
- mᵢ 是第 i 个原子的质量。
- rᵢ 是第 i 个原子的坐标向量 (x, y, z)。
- 求和 Σ 遍历集合中的所有原子。
简单来说,它是所有原子坐标的质量加权平均值。质量更大的原子对质心位置的影响也更大。
示例:
import autode as ade# 创建一个不对称的分子来演示质量加权
atoms = [ade.Atom('C', 0.0, 0.0, 0.0), # 碳原子,质量 ~12 amuade.Atom('H', 1.0, 0.0, 0.0), # 氢原子,质量 ~1 amu
]mol = ade.AtomCollection(atoms=atoms)# 计算质心 (com)
print(f"质心 (com): {mol.com}") # 输出: e.g., Coordinate([0.0769 0. 0.] Å)# 计算几何中心 (非质量加权)
geo_centre = (mol.atoms[0].coord + mol.atoms[1].coord) / 2
print(f"几何中心: {geo_centre}") # 输出: Coordinate([0.5 0. 0.] Å)# 对比
print(f"质心更靠近碳原子,因为碳更重")
用途
- 分子对齐: 在比较或叠加分子结构时,常先将分子的质心移动到坐标原点
(0, 0, 0)
。 - 旋转操作: 许多旋转操作(如
rotate
)默认围绕质心进行,以实现更自然的分子转动。 - 动力学模拟: 在分子动力学中,质心的速度和位置是重要的物理量。
- 可视化: 有时会将质心标记出来以分析分子的对称性或质量分布。
总结: com
属性提供了原子集合的质量中心位置,是进行分子对齐、旋转和分析质量分布的关键工具。它与简单的几何中心不同,考虑了每个原子的质量权重。
coordinates
属性介绍
- 类型:
np.ndarray
(一个 Nx3 的 numpy 数组) - 描述: 该属性返回
AtomCollection
(或Molecule
)中所有原子坐标的二维数组。每一行对应一个原子,每一列分别代表 x, y, z 坐标。 - 单位: 默认单位是埃(Å)。
- 可读写: 这是一个可读写(read-write)属性。您可以获取坐标数组,也可以直接为其赋值来一次性更新所有原子的坐标。
- 形状:
(n_atoms, 3)
核心功能与用法
1. 获取坐标 (读取)
import autode as ade
import numpy as np# 创建一个水分子
water = ade.Molecule(smiles='O')# 获取所有原子的坐标
coords = water.coordinates
print(f"坐标数组:\n{coords}")
# 输出示例:
# [[ 0. 0. 0. ] <- 氧原子
# [ 0.96 0. 0. ] <- 氢原子1
# [ 0. -0.96 0. ]] <- 氢原子2print(f"数据类型: {type(coords)}") # 输出: <class 'numpy.ndarray'>
print(f"形状: {coords.shape}") # 输出: (3, 3)
2. 修改坐标 (写入)
您可以直接将一个新的 (n_atoms, 3
) 形状的 numpy 数组赋值给coordinates
属性,以一次性更新所有原子的位置。
# 创建一个新的坐标数组
new_coords = np.array([[1.0, 1.0, 1.0], # 新的氧原子位置[2.0, 1.0, 1.0], # 新的氢原子1位置[1.0, 2.0, 1.0] # 新的氢原子2位置
])# 一次性更新所有原子坐标
water.coordinates = new_coords# 验证更新
print(f"更新后的第一个原子坐标: {water.atoms[0].coord}") # 应为 [1. 1. 1.]
print(f"更新后的 coordinates: \n{water.coordinates}")
3. 与单个原子坐标的同步
coordinates
属性与每个原子的 coord
属性是同步的。修改 coordinates
会直接反映在 atoms
列表中每个原子的 coord
上,反之亦然。
# 修改单个原子的坐标
water.atoms[0].translate(0.1, 0.1, 0.1)# coordinates 数组也会随之更新
print(f"氧原子平移后, coordinates[0]: {water.coordinates[0]}")
# 输出: [1.1 1.1 1.1]
4. 用于外部计算
coordinates
属性是将 autodE
的几何数据与外部库(如 numpy, scipy, matplotlib)进行交互的桥梁。
# 计算所有原子到原点的距离
distances_to_origin = np.linalg.norm(water.coordinates, axis=1)
print(f"各原子到原点的距离: {distances_to_origin}")
注意事项
- 形状匹配: 当赋值给 coordinates 时,新数组的形状 必须 是 (n_atoms, 3),否则会引发 ValueError。
- 数据类型: 通常应为浮点数(float)。
- 效率: 直接操作 coordinates 数组比遍历 atoms 列表并逐个修改 coord 更高效,尤其是在处理大分子时。
总结: coordinates
属性是访问和操作 AtomCollection
中所有原子几何位置的主要接口。它提供了一个高效的 numpy 数组视图,便于进行批量坐标操作、数学计算和与外部科学计算库的集成。作为可读写属性,它是连接 autodE 内部原子数据和外部数值运算的关键枢纽。
mass
属性介绍
- 类型:
autode.values.Mass
- 所属类:
autode.atoms.AtomCollection
(因此Molecule
类也可用) - 描述: 该属性计算并返回原子集合的总质量,即集合中所有原子质量的总和。
- 单位: 默认单位是原子质量单位(amu 或 Da)。
- 只读: 这是一个只读属性。其值由
atoms
列表中每个原子的mass
(或weight
)属性动态计算得出,不能直接修改。
计算原理
mass
属性的计算非常简单:
总质量 = Σ(每个原子的质量)
即,遍历 self.atoms
列表,将每个 Atom
对象的 mass
属性值相加。
示例:
import autode as ade# 创建一个水分子
atoms = [ade.Atom('O', 0.0, 0.0, 0.0), # 氧原子,质量 ~15.999 amuade.Atom('H', 0.96, 0.0, 0.0), # 氢原子1,质量 ~1.008 amuade.Atom('H', 0.0, 0.96, 0.0) # 氢原子2,质量 ~1.008 amu
]water = ade.AtomCollection(atoms=atoms)# 获取总质量
print(f"水分子的总质量: {water.mass}") # 输出: Mass(18.015 amu)# 可以转换为其他单位
print(f"质量 (千克): {water.mass.to('kg')}") # 输出: e.g., Mass(2.991e-26 kg)# 验证计算
manual_sum = sum(atom.mass for atom in water.atoms)
print(f"手动求和: {manual_sum}") # 输出: Mass(18.015 amu)
print(f"两者相等: {water.mass == manual_sum}") # 输出: True
与原子 mass
属性的关系
AtomCollection.mass
: 是集合中所有原子质量的总和。Atom.mass
: 是单个原子的质量(基于其元素的原子量)。
AtomCollection
的 mass
属性依赖于其包含的每个 Atom
对象的 mass
属性。
总结 mass
属性是 AtomCollection
类的一个基础物理属性,提供了整个原子集合的总质量。它是一个只读的、动态计算的值,对于化学和物理计算(如分子量、质心、动力学)至关重要。返回的 autode.values.Mass
对象支持单位转换,使用非常灵活。
moi
属性介绍
- 类型:
np.ndarray
(一个 3×3 的 numpy 数组) - 所属类:
autode.atoms.AtomCollection
(因此Molecule
类也可用) - 描述:
moi
是 “Moment of Inertia”(转动惯量张量)的缩写。该属性计算并返回原子集合围绕其质心(centre of mass)的转动惯量张量(Moment of Inertia Tensor)。 - 单位: 默认单位是原子质量单位·埃²(amu·Å²)。
- 只读: 这是一个只读属性,其值由原子的坐标、质量和质心位置动态计算得出。
物理意义
转动惯量张量描述了物体在三维空间中旋转的难易程度。它是一个 3×3 的对称矩阵,包含了物体在绕不同轴旋转时的惯性信息。
- 对角线元素(Iₓₓ, Iᵧᵧ, Iₓₓ):称为主转动惯量,分别表示绕 x、y、z 轴旋转的转动惯量。
- 非对角线元素(Iₓᵧ, Iₓz, Iᵧz, …):称为惯性积(Products of Inertia),表示质量分布相对于坐标平面的不对称性。
计算原理
- 参考点: 计算基于质心(com),这是标准做法。
- 坐标转换: 将所有原子的坐标平移到以质心为原点的新坐标系。
- 张量公式: 对于每个原子 i(质量 $ m_i $,在质心系中的坐标 $ (x_i, y_i, z_i) $),其对转动惯量张量的贡献为:
I=∑imi[yi2+zi2−xiyi−xizi−xiyixi2+zi2−yizi−xizi−yizixi2+yi2] \mathbf{I} = \sum_i m_i \begin{bmatrix} y_i^2 + z_i^2 & -x_i y_i & -x_i z_i \\ -x_i y_i & x_i^2 + z_i^2 & -y_i z_i \\ -x_i z_i & -y_i z_i & x_i^2 + y_i^2 \end{bmatrix} I=i∑miyi2+zi2−xiyi−xizi−xiyixi2+zi2−yizi−xizi−yizixi2+yi2
即,每个原子根据其质量与相对于质心的位置,贡献一个 3×3 的子矩阵,最终求和得到完整的转动惯量张量。
- 求和: 将所有原子的 Ii\mathbf{I}_iIi 矩阵相加,得到总的转动惯量张量 I\mathbf{I}I。
即:
I=∑iIi \mathbf{I} = \sum_i \mathbf{I}_i I=i∑Ii
其中每个 Ii\mathbf{I}_iIi 是第 iii 个原子对总转动惯量张量的贡献,由其质量与在质心坐标系中的位置决定。
示例:
import autode as ade# 创建一个水分子
water = ade.Molecule(smiles='O')# 获取转动惯量张量
inertia_tensor = water.moi
print(f"转动惯量张量 (3x3 矩阵):\n{inertia_tensor}")# 输出示例:
# [[ 1.567 0. 0. ]
# [ 0. 8.123 0. ]
# [ 0. 0. 9.690]]# 提取主转动惯量 (对角线元素)
I_xx = inertia_tensor[0, 0]
I_yy = inertia_tensor[1, 1]
I_zz = inertia_tensor[2, 2]
print(f"主转动惯量: I_xx={I_xx}, I_yy={I_yy}, I_zz={I_zz}")
用途
-
分子分类: 根据主转动惯量的相对大小,分子可分为:
- 球形顶(Spherical top):Ixx≈Iyy≈IzzI_{xx} \approx I_{yy} \approx I_{zz}Ixx≈Iyy≈Izz
- 对称顶(Symmetric top):两个相等,一个不同
- 非对称顶(Asymmetric top):三个都不同
-
光谱学: 转动惯量是计算分子转动光谱(Rotational Spectroscopy)的基础。
-
分子动力学: 在模拟中,用于计算角动量和旋转运动。
-
主轴对齐: 对
moi
张量进行对角化,可以找到分子的主转动轴,常用于分子的对齐和可视化。
总结
moi
属性提供了原子集合的转动惯量张量,这是一个关键的物理量,用于描述分子的旋转动力学特性。它是一个 3×3 的对称矩阵,单位为 amu·Å²。该属性对于光谱分析、分子分类、动力学模拟等高级应用非常重要。
n_atoms
属性简要介绍
- 类型:
int
- 所属类:
autode.atoms.AtomCollection
(因此Molecule
类也可用) - 描述: 该属性返回原子集合中原子的总数量。
- 只读: 这是一个只读属性,其值由
atoms
列表的长度动态决定。
核心功能
n_atoms
是一个基础且常用的属性,用于快速获取集合的大小。
import autode as ade# 创建一个水分子
water = ade.Molecule(smiles='O')# 获取原子数量
print(f"水分子中的原子数: {water.n_atoms}") # 输出: 3# 等价于
print(f"atoms 列表长度: {len(water.atoms)}") # 输出: 3
用途
循环控制: 在遍历原子时作为循环的上限。
条件判断: 检查分子是否为空或满足特定大小。
数据输出: 在日志或报告中显示分子规模。
总结: n_atoms
属性提供了一种简单、直接的方式来获取 AtomCollection 或 Molecule 中的原子总数,是进行分子分析和操作时最常使用的属性之一。
weight
属性简要介绍
- 类型:
autode.values.Mass
- 所属类:
autode.atoms.AtomCollection
(因此Molecule
类也可用) - 描述: 该属性返回原子集合的总质量,即集合中所有原子质量的总和。
- 单位: 默认单位是原子质量单位(amu 或 Da)。
- 只读: 这是一个只读属性,其值由集合中每个原子的
mass
属性动态计算得出,不能直接修改。
核心说明
weight
属性与 mass
属性完全相同且等价。在 autode
库中,weight
和 mass
是同一个属性的两个别名。
weight = mass
- 它们都表示原子集合的总质量。
- 修改其中一个,另一个也会同步变化(因为它们指向同一个值)。
💡 提示:虽然两者可互换使用,但建议根据上下文选择更合适的命名(如“质量”或“重量”),以增强代码可读性。
示例:
import autode as ade# 创建一个水分子
water = ade.Molecule(smiles='O')# 使用 mass 和 weight
print(f"总质量 (mass): {water.mass}") # 输出: Mass(18.015 amu)
print(f"总质量 (weight): {water.weight}") # 输出: Mass(18.015 amu)# 两者完全相等
print(water.mass == water.weight) # 输出: True
总结 weight
是 mass
属性的同义词,都用于获取 AtomCollection 或 Molecule 的总质量。您可以根据个人偏好使用 mass 或 weight,它们在功能上没有任何区别。
AtomCollection
类的方法介绍
angle(i: int, j: int, k: int) -> Angle
方法介绍
-
所属类:
autode.atoms.AtomCollection
(因此Molecule
类也可用) -
功能:
计算并返回原子集合中由三个指定原子构成的键角(Bond Angle)。
三个原子的索引分别为i
,j
,k
,其中j
是中间原子,i
和k
是两端原子。 -
返回值:
一个autode.values.Angle
对象,表示计算出的角度。默认单位为度(°)。 -
参数说明:
i (int)
: 第一个原子的索引(Index)。j (int)
: 顶点原子的索引。这个原子是键角的中心。k (int)
: 第三个原子的索引。
示例:
import autode as ade# 创建一个水分子 (H-O-H)
atoms = [ade.Atom('O', 0.0, 0.0, 0.0), # 索引 0: 氧原子ade.Atom('H', 0.96, 0.0, -0.24), # 索引 1: 氢原子1ade.Atom('H', -0.24, 0.96, 0.0) # 索引 2: 氢原子2
]# 使用 AtomCollection 或 Molecule
water = ade.AtomCollection(atoms=atoms)# 计算 H-O-H 键角
# i=1 (H1), j=0 (O), k=2 (H2)
hoh_angle = water.angle(i=1, j=0, k=2)print(f"H-O-H 键角: {hoh_angle}") # 输出: Angle(104.479°)
print(f"键角 (弧度): {hoh_angle.to('rad')}") # 可以转换为弧度# 验证顺序 (角度是相同的)
hoh_angle_reverse = water.angle(i=2, j=0, k=1)
print(f"反向计算: {hoh_angle_reverse}") # 输出: Angle(104.479°)
注意事项:
- 索引范围: 确保 i, j, k 都在 0 到 n_atoms - 1 的有效范围内,否则会引发 IndexError。
- 原子位置: 三个原子不能共线或重合,否则向量长度为零,会导致计算失败(如除零错误)。
- 返回类型: 返回的是 Angle 对象,支持单位转换(如 .to(‘rad’) 转换为弧度)。
总结:angle()
方法是分析分子几何结构的基本工具,用于精确计算任意三个原子构成的键角,对于研究分子构型、验证计算结果或进行几何约束非常有用。
dihedral(w: int, x: int, y: int, z: int) -> Angle
方法介绍
- 所属类:
autode.atoms.AtomCollection
(因此Molecule
类也可用) - 功能: 计算并返回由四个指定原子构成的二面角(Dihedral Angle)或扭转角(Torsion Angle)。
- 返回值: 一个
autode.values.Angle
对象,表示计算出的二面角。默认单位为度(°),取值范围通常为 [−180∘,180∘][-180^\circ, 180^\circ][−180∘,180∘]。
参数说明
- w (int): 第一个原子的索引。
- x (int): 第二个原子的索引。
- y (int): 第三个原子的索引。
- z (int): 第四个原子的索引。
该方法计算的是 w-x-y-z 这四个原子形成的二面角。这个角度定义为由原子 w
, x
, y
确定的平面与由原子 x
, y
, z
确定的平面之间的夹角。
工作原理
二面角描述了分子围绕 x-y
键旋转的程度。计算步骤如下:
- 构造三个向量:
v1 = coord[x] - coord[w]
v2 = coord[y] - coord[x]
v3 = coord[z] - coord[y]
- 计算两个平面的法向量:
- 平面
w-x-y
的法向量n1 = v1 × v2
(叉积) - 平面
x-y-z
的法向量n2 = v2 × v3
(叉积)
- 平面
- 使用
arctan2
函数计算两个法向量之间的夹角,以确保结果在正确的象限 [−180∘,180∘][-180^\circ, 180^\circ][−180∘,180∘]。
示例:
import autode as ade# 创建一个简单的丁烷片段 (C-C-C-C) 来演示二面角
atoms = [ade.Atom('C', 0.0, 0.0, 0.0), # 索引 0ade.Atom('C', 1.5, 0.0, 0.0), # 索引 1ade.Atom('C', 2.5, 1.0, 0.0), # 索引 2ade.Atom('C', 4.0, 1.0, 0.0) # 索引 3
]mol = ade.AtomCollection(atoms=atoms)# 计算 C0-C1-C2-C3 的二面角
dihedral_angle = mol.dihedral(w=0, x=1, y=2, z=3)print(f"C0-C1-C2-C3 二面角: {dihedral_angle}") # 输出: e.g., Angle(59.036°)
化学意义
二面角是描述分子构象(conformation)的关键参数:
- 反式 (Trans): 二面角 ≈ 180°
- 顺式 (Cis/Gauche): 二面角 ≈ 0° 或 60°
在蛋白质中,主链的 φ(phi)φ (phi)φ(phi) 和 ψ(psi)ψ (psi)ψ(psi) 角就是二面角。
在分子动力学和构象搜索中,二面角常作为重要的约束或分析变量。
总结 dihedral()
方法是分析分子三维结构和构象的强有力工具,用于精确计算四个连续原子之间的扭转角度,对于理解分子柔性、稳定构象和反应路径至关重要。
distance(i: int, j: int) -> Distance
方法介绍
- 所属类:
autode.atoms.AtomCollection
(因此Molecule
类也可用) - 功能: 计算并返回原子集合中两个指定原子之间的欧几里得距离。
- 返回值: 一个
autode.values.Distance
对象,表示计算出的距离。
参数说明
- i (int): 第一个原子的索引。
- j (int): 第二个原子的索引。
该方法计算的是原子 i
和原子 j
在三维空间中的直线距离。
计算原理
使用标准的三维空间距离公式:
distance=[(xi−xj)2+(yi−yj)2+(zi−zj)2]distance = \sqrt{[(x_i - x_j)² + (y_i - y_j)² + (z_i - z_j)²]}distance=[(xi−xj)2+(yi−yj)2+(zi−zj)2]
其中 (xi,yi,zi)(x_i, y_i, z_i)(xi,yi,zi) 和 (xj,yj,zj)(x_j, y_j, z_j)(xj,yj,zj) 分别是原子 i
和 j
的坐标。
示例:
import autode as ade# 创建一个水分子
atoms = [ade.Atom('O', 0.0, 0.0, 0.0), # 索引 0: 氧原子ade.Atom('H', 0.96, 0.0, 0.0), # 索引 1: 氢原子1ade.Atom('H', 0.0, 0.96, 0.0) # 索引 2: 氢原子2
]water = ade.AtomCollection(atoms=atoms)# 计算 O-H 键长 (氧和第一个氢)
oh_distance = water.distance(i=0, j=1)
print(f"O-H 键长: {oh_distance}") # 输出: Distance(0.96 Å)
print(f"键长 (纳米): {oh_distance.to('nm')}") # 可转换为其他单位# 计算 H...H 距离 (两个氢原子之间)
hh_distance = water.distance(i=1, j=2)
print(f"H...H 距离: {hh_distance}") # 输出: Distance(1.357 Å)
单位与转换
- 默认单位: 埃(Å)。
- 灵活性: 返回的
Distance
对象支持.to()
方法进行单位转换。
print(oh_distance.to('pm')) # 转换为皮米(pm)
print(oh_distance.to('nm')) # 转换为纳米(nm)
用途
- 键长分析: 验证或计算分子中的化学键长度。
- 非键相互作用: 判断原子间是否存在范德华相互作用或空间位阻(例如,距离是否小于范德华半径之和)。
- 几何约束: 在计算中设置距离约束。
- 分子相似性: 作为分子几何比较的一部分。
注意事项
- 索引范围: 确保
i
和j
都在0
到n_atoms - 1
的有效范围内,否则会引发IndexError
。 - 自距离:
distance(i, i)
会返回Distance(0.0 Å)
,因为原子到自身的距离为零。
总结 distance()
方法是分子几何分析中最基础且最常用的工具之一。它提供了一种简单、高效的方式来获取任意两个原子之间的空间距离,并以支持单位转换的 Distance 对象形式返回,便于后续计算和分析。
eqm_bond_distance(i: int, j: int) -> Distance
方法介绍
- 所属类:
autode.atoms.AtomCollection
(因此Molecule
类也可用) - 功能: 估算并返回原子集合中两个指定原子之间化学键的平衡键长(Equilibrium Bond Distance)。
- 返回值: 一个
autode.values.Distance
对象,表示估算的平衡键长。 - 单位: 默认单位是埃(Å)。
参数说明
- i (int): 第一个原子的索引。
- j (int): 第二个原子的索引。
该方法不计算当前几何结构下的实际距离,而是根据两个原子的元素类型,预测它们形成化学键时的典型或理想键长。
工作原理
此方法通常基于键长数据库或经验规则(如原子的共价半径加和)来估算键长:
d(i−j)≈rcov(i)+rcov(j)
d(i-j) \approx r_{\text{cov}}(i) + r_{\text{cov}}(j)
d(i−j)≈rcov(i)+rcov(j)
其中:
- rcov(i)r_{\text{cov}}(i)rcov(i) 和 rcov(j)r_{\text{cov}}(j)rcov(j) 分别是原子 iii 和 jjj 的共价半径。
autode
内部会根据atoms[i]
和atoms[j]
的元素符号(atomic_symbol
)查找对应的共价半径并求和。
示例:
import autode as ade# 创建一个分子(即使坐标不准确,方法仍能估算)
atoms = [ade.Atom('C', 0.0, 0.0, 0.0),ade.Atom('O', 1.0, 0.0, 0.0), # 假设这里距离不是标准值ade.Atom('H', 0.0, 1.0, 0.0)
]mol = ade.AtomCollection(atoms=atoms)# 估算 C-O 键的平衡键长
c_o_eqm = mol.eqm_bond_distance(i=0, j=1)
print(f"估算的 C-O 平衡键长: {c_o_eqm}") # 输出: e.g., Distance(1.43 Å)# 估算 C-H 键的平衡键长
c_h_eqm = mol.eqm_bond_distance(i=0, j=2)
print(f"估算的 C-H 平衡键长: {c_h_eqm}") # 输出: e.g., Distance(1.09 Å)# 对比实际距离
c_o_actual = mol.distance(i=0, j=1)
print(f"实际 C-O 距离: {c_o_actual}") # 输出: Distance(1.0 Å) (非平衡)
用途
- 几何优化的初始猜测: 在构建分子或进行几何优化前,为键长提供一个合理的初始值。
- 键合判断: 在自动识别分子成键时(如从坐标生成连接性),如果两个原子的实际距离接近其
eqm_bond_distance
,则可能认为它们成键。 - 结构合理性检查: 将实际测量或计算的键长与
eqm_bond_distance
比较,判断结构是否合理。 - 分子构建: 在程序化构建分子时,用于确定新键的长度。
注意事项
- 估算值: 这是一个经验估算值,并非精确的量子化学计算结果。实际键长会因分子环境(如杂化、电荷、共轭)而略有变化。
- 仅适用于可能成键的原子: 虽然可以计算任意两个原子,但其意义主要针对可能形成化学键的原子对(如 C-O, C-H, O-H 等)。
- 与
distance
的区别:distance()
返回当前结构下的实际距离。eqm_bond_distance()
返回一个基于元素类型的理想/典型距离。
总结 eqm_bond_distance()
方法提供了一种快速估算两个原子间标准化学键长度的方式。它是分子建模、结构分析和几何优化中一个有用的辅助工具,帮助判断键长的合理性或为计算提供初始参数。