当前位置: 首页 > news >正文

(autode计算化学—atoms)AtomCollection原子集类

子类实例:class autode.atoms.AtomCollection(atoms: List[Atom] | Atoms | None = None)

构造函数:init(atoms: List[Atom] | Atoms | None = None)

autode.atoms.AtomCollection 类简要介绍

AtomCollectionautoDE 库中的一个基础类,代表一个原子的集合。它本身通常不直接使用,而是作为其他包含多个原子的类(如 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”(质心)的缩写。该属性计算并返回原子集合(AtomCollectionMolecule)的质心坐标。
  • 单位: 默认单位是埃(Å)。
  • 只读: 这是一个只读属性,其值由 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: 是单个原子的质量(基于其元素的原子量)。

AtomCollectionmass 属性依赖于其包含的每个 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=imiyi2+zi2xiyixizixiyixi2+zi2yizixiziyizixi2+yi2

即,每个原子根据其质量与相对于质心的位置,贡献一个 3×3 的子矩阵,最终求和得到完整的转动惯量张量。

  • 求和: 将所有原子的 Ii\mathbf{I}_iIi 矩阵相加,得到总的转动惯量张量 I\mathbf{I}I

即:

I=∑iIi \mathbf{I} = \sum_i \mathbf{I}_i I=iIi

其中每个 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}IxxIyyIzz
    • 对称顶(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 库中,weightmass 是同一个属性的两个别名。

  • 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

总结 weightmass 属性的同义词,都用于获取 AtomCollection 或 Molecule 的总质量。您可以根据个人偏好使用 mass 或 weight,它们在功能上没有任何区别。


AtomCollection类的方法介绍

angle(i: int, j: int, k: int) -> Angle 方法介绍

  • 所属类: autode.atoms.AtomCollection(因此 Molecule 类也可用)

  • 功能:
    计算并返回原子集合中由三个指定原子构成的键角(Bond Angle)。
    三个原子的索引分别为 i, j, k,其中 j 是中间原子,ik 是两端原子。

  • 返回值:
    一个 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=[(xixj)2+(yiyj)2+(zizj)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) 分别是原子 ij 的坐标。

示例:

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)

用途

  • 键长分析: 验证或计算分子中的化学键长度。
  • 非键相互作用: 判断原子间是否存在范德华相互作用或空间位阻(例如,距离是否小于范德华半径之和)。
  • 几何约束: 在计算中设置距离约束。
  • 分子相似性: 作为分子几何比较的一部分。

注意事项

  • 索引范围: 确保 ij 都在 0n_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(ij)rcov(i)+rcov(j)
其中:

  • rcov(i)r_{\text{cov}}(i)rcov(i)rcov(j)r_{\text{cov}}(j)rcov(j) 分别是原子 iiijjj共价半径
    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() 方法提供了一种快速估算两个原子间标准化学键长度的方式。它是分子建模、结构分析和几何优化中一个有用的辅助工具,帮助判断键长的合理性或为计算提供初始参数。

http://www.dtcms.com/a/443221.html

相关文章:

  • 主键索引和唯一性索引的区别与联系
  • 免备案域名是危险网站荣耀手机商城官方网
  • 电磁兼容试验标准:电快速脉冲EFT
  • 建立一个平台网站需要多少钱大学软件开发需要学什么
  • wordpress安装好了怎么登陆网站电影网站如何做长尾关键词
  • 苏州h5模板建站效果图
  • yy直播官网怀化网站优化多少钱
  • 浅聊一下TCP协议
  • 怎么建设微网站智能建造师证书
  • 网站询盘量制作网站需要什么语言
  • AI大事记8:深蓝与卡斯帕罗夫——符号主义 AI 的巅峰与局限(中)
  • 数据结构—双链表
  • 长沙公司网站建设上海专业网站制作公司
  • 黄冈网站免费投放平台免费下载计算机网站建设及管理
  • Tailwind CSS介绍(现代CSS框架,与传统CSS框架Bootstrap对比)Tailwind介绍
  • 网群企业网站管理系统哈尔滨快速建站专业定制
  • 做农家乐农产品旅游的网站黄南北京网站建设
  • wdcp网站打不开wordpress文章固定链接
  • C语言模拟面向对象编程方法之this指针
  • SAP杂记
  • 建设网站的意义作用是什么在哪个网站订酒店做申根签证
  • 微信商城网站建设视频宁波哪家建网站好
  • IMX6ULL学习笔记_Boot和裸机篇(2)--- SEGGER Embedded Studio基本相关配置
  • Linux--文件IO
  • wip: 正则regex
  • 一个网站建设花了10万元永久免费网站
  • 139、【OS】【Nuttx】【周边】效果呈现方案解析:strace 日志解析(五)
  • 阿里云网站建设合作广告传媒公司业务
  • 购物网站建设 成都番禺网站建设技术
  • 网站双线主机优势wordpress降版本