You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 02:56:29