- 2019-09-18 16:25:06
PyMOL官方网站上给了两个绘制坐标轴的脚本, 但无法满足我的需要. 所以我就照葫芦画瓢, 改写了一个根据PDB中的信息绘制坐标轴和盒子的脚本.
PyMOL读取的盒子信息来自PDB文件中的CRYST1
行, 类似如下:
CRYST1 42.844 42.844 128.531 90.00 90.00 90.00 P 1 1
如果你使用gmx editconf -f FILE.gro -o FILE.pdb
进行转换, 得到的PDB文件中会自动带有这些信息.
这个脚本只能绘制简单的长方体盒子, 但改成任意的六面体盒子也不困难. 因为我暂时用不到这个功能, 就不再操心了.
绘制出的效果类似下图, 看起来还可以. 这也是我们在最近发表的一篇文章中所用的图.
使用
打开PyMOL, 在命令行中执行 load FILE.pdb; run axes.py
.
或者, 将脚本中注释掉的 #cmd.load('FILE.pdb') # 载入PDB
这行取消注释, 直接run axes.py
就可以了.
脚本
axes.py | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | # coding: utf-8
from pymol.cgo import *
from pymol import cmd
r=0.5 # 坐标轴半径
h=5 # 圆锥高度
d=2*r*1.618 # 圆锥底面直径
#cmd.load('FILE.pdb') # 载入PDB
a, b, c = cmd.get_symmetry(cmd.get_object_list()[0])[0:3]
cmd.bg_color('white')
cmd.set('cgo_line_width', 5)
cmd.delete('axes')
obj = [
CYLINDER, 0, 0, 0, a-h, 0, 0, r, 1, 0, 0, 1, 0, 0,
CYLINDER, 0, 0, 0, 0, b-h, 0, r, 0, 1, 0, 0, 1, 0,
CYLINDER, 0, 0, 0, 0, 0, c-h, r, 0, 0, 1, 0, 0, 1,
CONE, a-h, 0, 0, a, 0, 0, d, 0, 1, 0, 0, 1, 0, 0, 1, 1,
CONE, 0, b-h, 0, 0, b, 0, d, 0, 0, 1, 0, 0, 1, 0, 1, 1,
CONE, 0, 0, c-h, 0, 0, c, d, 0, 0, 0, 1, 0, 0, 1, 1, 1,
CYLINDER, a, 0, 0, a, b, 0, r/2, .5, .5, .5, .5, .5, .5,
CYLINDER, 0, b, 0, a, b, 0, r/2, .5, .5, .5, .5, .5, .5,
CYLINDER, 0, 0, c, a, 0, c, r/2, .5, .5, .5, .5, .5, .5,
CYLINDER, 0, 0, c, 0, b, c, r/2, .5, .5, .5, .5, .5, .5,
CYLINDER, a, 0, c, a, b, c, r/2, .5, .5, .5, .5, .5, .5,
CYLINDER, 0, b, c, a, b, c, r/2, .5, .5, .5, .5, .5, .5,
CYLINDER, a, 0, 0, a, 0, c, r/2, .5, .5, .5, .5, .5, .5,
CYLINDER, 0, b, 0, 0, b, c, r/2, .5, .5, .5, .5, .5, .5,
CYLINDER, a, b, 0, a, b, c, r/2, .5, .5, .5, .5, .5, .5
]
cmd.load_cgo(obj, 'axes')
cmd.set('label_size', -5)
cmd.set('label_font_id', 7)
cmd.delete('xtag')
cmd.delete('ytag')
cmd.delete('ztag')
cmd.pseudoatom('xtag', name='xtag', pos=[a+5, 0, 0])
cmd.pseudoatom('ytag', name='ytag', pos=[0, b+5, 0])
cmd.pseudoatom('ztag', name='ztag', pos=[0, 0, c+5])
cmd.hide('everything', 'name xtag')
cmd.hide('everything', 'name ytag')
cmd.hide('everything', 'name ztag')
cmd.label('name xtag', '"X"')
cmd.label('name ytag', '"Y"')
cmd.label('name ztag', '"Z"') |