71 lines
2.6 KiB
Python
71 lines
2.6 KiB
Python
from pymol import cmd
|
||
import math
|
||
|
||
def calculate_gradient_transparency(obj, mole, num_segments=10, transparency_min=0.5, transparency_max=1.0):
|
||
"""
|
||
设置基于距离的透明度梯度,并允许自定义透明度变化范围。
|
||
|
||
参数:
|
||
- obj: 对象名 (str)
|
||
- mole: 小分子名 (str)
|
||
- num_segments: 梯度分段数 (int)
|
||
- transparency_min: 最小透明度 (float)
|
||
- transparency_max: 最大透明度 (float)
|
||
"""
|
||
# 检查 obj 是否存在
|
||
if not cmd.count_atoms(obj):
|
||
print(f"Error: The object '{obj}' does not exist or is empty. Please check your inputs.")
|
||
return
|
||
|
||
# 检查 mole 是否存在
|
||
if not cmd.count_atoms(mole):
|
||
print(f"Error: The object '{mole}' does not exist or is empty. Please check your inputs.")
|
||
return
|
||
|
||
# 获取复合物的边界框
|
||
min_coords, max_coords = cmd.get_extent(obj)
|
||
diagonal_length = math.sqrt(sum((max_coords[i] - min_coords[i])**2 for i in range(3)))
|
||
|
||
# 手动计算 mole 的几何中心
|
||
model = cmd.get_model(mole)
|
||
x, y, z = 0, 0, 0
|
||
for atom in model.atom:
|
||
x += atom.coord[0]
|
||
y += atom.coord[1]
|
||
z += atom.coord[2]
|
||
num_atoms = len(model.atom)
|
||
center_coords = (x / num_atoms, y / num_atoms, z / num_atoms)
|
||
|
||
# 打印计算信息
|
||
print("\n[Gradient Transparency Calculation]")
|
||
print(f"Bounding Box Min: {min_coords}")
|
||
print(f"Bounding Box Max: {max_coords}")
|
||
print(f"Diagonal Length: {diagonal_length:.3f} Å")
|
||
print(f"Center of {mole}: ({center_coords[0]:.3f}, {center_coords[1]:.3f}, {center_coords[2]:.3f})\n")
|
||
|
||
# 4. 计算梯度区间
|
||
segment_length = diagonal_length / num_segments # 每个梯度的长度
|
||
print(f"Gradient Segments: {num_segments} (Length per Segment: {segment_length:.3f} Å)\n")
|
||
|
||
# 打印透明度范围
|
||
print(f"Transparency Range: {transparency_min} to {transparency_max}")
|
||
|
||
# 创建透明度梯度
|
||
for i in range(num_segments):
|
||
start = i * segment_length
|
||
end = (i + 1) * segment_length
|
||
|
||
# 计算透明度值(线性插值)
|
||
transparency = transparency_min + (transparency_max - transparency_min) * (i / (num_segments - 1))
|
||
|
||
# 创建选择并设置透明度(略去重复代码)
|
||
print(f"Segment {i+1}: {start:.3f}-{end:.3f} Å, Transparency: {transparency:.2f}")
|
||
|
||
# 显示表面和卡通
|
||
cmd.show("surface", obj)
|
||
cmd.show("cartoon", obj)
|
||
print("\n[Gradient Transparency Applied Successfully]\n")
|
||
|
||
# 调用函数(默认使用20个梯度)
|
||
calculate_gradient_transparency("all", "mole", num_segments=20)
|