如何用Scipy正确旋转/对齐粗粒化脂质与参考脂质?
粗粒化DOPC脂质向量对齐优化方案
问题核心
直接使用R.align_vectors(DOPC_upper, DOPC_lower)未得到预期结果的原因:
- 未消除分子间的平移偏移,旋转计算被全局位置干扰
- 上下层脂质的z轴分布完全相反,原始对齐算法无法精准捕捉翻转需求
解决步骤
1. 坐标中心化
先将两个脂质的坐标转换为相对于自身质心的相对坐标,消除平移影响:
import numpy as np from scipy.spatial.transform import Rotation as R # 计算分子质心 centroid_upper = np.mean(DOPC_upper, axis=0) centroid_lower = np.mean(DOPC_lower, axis=0) # 转换为相对质心的坐标 upper_rel = DOPC_upper - centroid_upper lower_rel = DOPC_lower - centroid_lower
2. 执行向量对齐
注意R.align_vectors(target, source)的参数顺序:将源向量(下层脂质相对坐标)对齐到目标向量(上层脂质相对坐标):
rot, rmsd = R.align_vectors(upper_rel, lower_rel) # 旋转下层脂质的相对坐标 lower_aligned_rel = rot.apply(lower_rel) # 可选:平移回上层脂质的质心位置,还原全局坐标 lower_aligned = lower_aligned_rel + centroid_upper
3. 可选:加权对齐优化
若某些珠子(如头部基团)对分子朝向更重要,可设置权重提升关键区域的对齐精度:
# 假设前4个珠子为头部基团,设置2倍权重 weights = np.ones(12) weights[:4] = 2.0 rot_weighted, rmsd_weighted = R.align_vectors(upper_rel, lower_rel, weights=weights) lower_aligned_weighted = rot_weighted.apply(lower_rel) + centroid_upper
4. 结果验证
通过z轴分布或主轴方向验证对齐效果:
# 对比z轴均值 print("原始下层脂质z均值:", np.mean(DOPC_lower[:,2])) print("对齐后脂质z均值:", np.mean(lower_aligned[:,2])) # 用PCA计算分子主轴方向 from sklearn.decomposition import PCA pca_upper = PCA(n_components=1).fit(upper_rel) pca_aligned = PCA(n_components=1).fit(lower_aligned_rel) print("上层脂质主轴方向:", pca_upper.components_[0]) print("对齐后脂质主轴方向:", pca_aligned.components_[0])
关键说明
- 中心化是核心:旋转操作需基于分子自身相对位置,而非全局坐标
- 参数顺序不可颠倒:
align_vectors(target, source)生成的是将source转换到target的旋转矩阵 - 加权对齐可让关键结构的匹配优先级更高,更贴合生物分子的实际特性
内容的提问来源于stack exchange,提问作者Cromsley
相关产品推荐
相关产品推荐

