如何用Python生成带中心空腔的Dummy Atoms立方体网格并导出坐标
Python实现带中心空腔的3D网格Dummy原子填充与导出
核心逻辑说明
- 先通过距离阈值界定分子占据的中心空腔:网格点与分子所有原子的距离若小于阈值,视为空腔区域,不填充Dummy原子
- 用
X作为Dummy原子的通用标识(可自定义为D或其他符号) - 最终导出为XYZ格式文本文件,适配多数分子可视化/模拟工具
完整代码示例
import numpy as np # ---------------------- 配置参数 ---------------------- # 替换为你的实际分子原子坐标列表(可从PDB/mol2文件读取) molecule_atoms = [ (0.0, 0.0, 0.0), (1.0, 0.0, 0.0), (0.0, 1.0, 0.0), (0.0, 0.0, 1.0) ] # 网格参数 grid_spacing = 1.0 # 网格点间距 grid_min = (-5.0, -5.0, -5.0) # 网格立方体最小边界 grid_max = (5.0, 5.0, 5.0) # 网格立方体最大边界 # 空腔阈值:网格点与分子原子的最小距离,小于此值的点不填充Dummy cavity_threshold = 2.0 # ---------------------- 生成3D网格 ---------------------- x_coords = np.arange(grid_min[0], grid_max[0], grid_spacing) y_coords = np.arange(grid_min[1], grid_max[1], grid_spacing) z_coords = np.arange(grid_min[2], grid_max[2], grid_spacing) # 转换为扁平化的网格点坐标数组 grid_points = np.array(np.meshgrid(x_coords, y_coords, z_coords)).T.reshape(-1, 3) # ---------------------- 筛选可填充Dummy的网格点 ---------------------- # 向量化计算,提升大规模网格的处理速度 diff = grid_points[:, np.newaxis, :] - np.array(molecule_atoms)[np.newaxis, :, :] min_distances = np.min(np.linalg.norm(diff, axis=2), axis=1) valid_points = grid_points[min_distances > cavity_threshold] # 组装Dummy原子数据:(元素符号, x, y, z) dummy_atoms = [("X", p[0], p[1], p[2]) for p in valid_points] # ---------------------- 导出坐标到文本文件 ---------------------- output_path = "dummy_grid_atoms.xyz" with open(output_path, "w") as f: # XYZ格式规范:第一行原子数,第二行注释,后续每行原子信息 f.write(f"{len(dummy_atoms)}\n") f.write("3D grid with central cavity (Dummy atoms marked as X)\n") for atom in dummy_atoms: f.write(f"{atom[0]:<2} {atom[1]:.4f} {atom[2]:.4f} {atom[3]:.4f}\n") print(f"已生成{len(dummy_atoms)}个Dummy原子,文件保存至{output_path}")
关键细节解析
- 空腔判断:通过
np.linalg.norm计算欧氏距离,确保Dummy原子不会与目标分子重叠;若需要更精准的空间判断,可结合分子原子的范德华半径(比如将阈值设为原子范德华半径+缓冲值) - 性能优化:用numpy向量化操作替代循环,处理数千甚至上万网格点时,速度会比循环快一个数量级
- 格式兼容性:XYZ格式是VMD、PyMOL等工具的通用输入格式,直接打开即可可视化网格结构
扩展建议
- 若分子坐标来自外部文件,可使用
MDAnalysis或OpenBabel库自动读取,无需手动输入原子坐标 - 调整
grid_spacing可控制网格密度,cavity_threshold可适配不同尺寸的目标分子 - 若需要生成非立方体网格,可修改
np.arange为自定义坐标序列
内容的提问来源于stack exchange,提问作者compcal
相关产品推荐
相关产品推荐

