346 lines
10 KiB
Python
346 lines
10 KiB
Python
|
|||
|
|
# constant objects
|
||
|
|
|
||
|
|
from .parsing import QuietException
|
||
|
|
from .shortcut import Shortcut
|
||
|
|
from .constants_palette import palette_dict
|
||
|
|
import re
|
||
|
|
|
||
|
|
class _loadable:
|
||
|
|
pdb = 0
|
||
|
|
mol = 1
|
||
|
|
molstr = 3
|
||
|
|
mmod = 4
|
||
|
|
mmodstr = 6
|
||
|
|
xplor = 7
|
||
|
|
model = 8
|
||
|
|
pdbstr = 9
|
||
|
|
brick = 10 # chempy.brick object
|
||
|
|
chempymap = 11 # chempy.map object (only used by cctbx/examples/view_fft_map.py)
|
||
|
|
callback = 12 # pymol callback obejct
|
||
|
|
cgo = 13 # compiled graphic object
|
||
|
|
xyz = 15 # xyz, tinker format
|
||
|
|
ccp4 = 18 # CCP4 map, under development
|
||
|
|
pmo = 19 # pmo, experimental molecular object format
|
||
|
|
top = 21 # AMBER topology
|
||
|
|
trj = 22 # AMBER trajectory
|
||
|
|
crd = 23 # AMBER coordinate
|
||
|
|
rst = 24 # AMBER restart
|
||
|
|
xplorstr = 26 # XPLOR map as string
|
||
|
|
phi = 27 # Delphi/Grasp
|
||
|
|
fld = 28 # AVS field format (not yet general -- only uniform allowed)
|
||
|
|
brix = 29 # BRIX/DSN6/O map format
|
||
|
|
grd = 30 # Insight II Grid format
|
||
|
|
pqr = 31 # PQR file (modified PDB file for APBS)
|
||
|
|
dx = 32 # DX file (APBS)
|
||
|
|
mol2 = 33 # MOL2 file (TRIPOS)
|
||
|
|
mol2str = 34 # MOL2 file string (TRIPOS)
|
||
|
|
p1m = 35 # P1M file (combined data & secure commands)
|
||
|
|
ccp4str = 36 # CCP4 map string
|
||
|
|
sdf = 37 # new default...
|
||
|
|
sdf2 = 37 # SDF using C-based SDF parser (instead of Python)
|
||
|
|
sdf2str = 38 # SDF ditto
|
||
|
|
trj2 = 45 # trj trajectroy format (via plugin)
|
||
|
|
xyzstr = 49 #
|
||
|
|
phistr = 51 # electrostatic map as a string
|
||
|
|
acnt = 56 # Tripos/Sybyl acnt grid file (proposed)
|
||
|
|
cif = 60 # C++ based CIF parser
|
||
|
|
cifstr = 61
|
||
|
|
plugin = 64
|
||
|
|
mae = 65
|
||
|
|
maestr = 66
|
||
|
|
pdbqt = 67
|
||
|
|
vdbstr = 69
|
||
|
|
vdb = 70
|
||
|
|
mmtf = 71
|
||
|
|
mmtfstr = 72
|
||
|
|
map = 73 # unspecified CCP4 or MRC map
|
||
|
|
mrc = 74
|
||
|
|
dxstr = 75 # DX file (APBS)
|
||
|
|
mapstr = 76 # unspecified CCP4 or MRC map
|
||
|
|
mrcstr = 77
|
||
|
|
bcif = 78
|
||
|
|
bcifstr = 79
|
||
|
|
|
||
|
|
class loadable(_loadable):
|
||
|
|
@classmethod
|
||
|
|
def _reverse_lookup(cls, number):
|
||
|
|
for name in dir(cls):
|
||
|
|
if getattr(cls, name) == number:
|
||
|
|
return name
|
||
|
|
return ''
|
||
|
|
|
||
|
|
_load2str = { loadable.pdb : loadable.pdbstr,
|
||
|
|
loadable.vdb: loadable.vdbstr,
|
||
|
|
loadable.cif : loadable.cifstr,
|
||
|
|
loadable.mmtf : loadable.mmtfstr,
|
||
|
|
loadable.mae : loadable.maestr,
|
||
|
|
loadable.mol : loadable.molstr,
|
||
|
|
loadable.xplor : loadable.xplorstr,
|
||
|
|
loadable.mol2 : loadable.mol2str,
|
||
|
|
loadable.mmod : loadable.mmodstr,
|
||
|
|
loadable.ccp4 : loadable.ccp4str,
|
||
|
|
loadable.mrc : loadable.mrcstr,
|
||
|
|
loadable.map : loadable.mapstr,
|
||
|
|
loadable.dx : loadable.dxstr,
|
||
|
|
loadable.xyz : loadable.xyzstr,
|
||
|
|
loadable.sdf2 : loadable.sdf2str,
|
||
|
|
loadable.bcif : loadable.bcifstr}
|
||
|
|
|
||
|
|
sanitize_alpha_list_re = re.compile(r"[^a-zA-Z0-9_\'\"\.\-\[\]\,]+")
|
||
|
|
nt_hidden_path_re = re.compile(r"\$[\/\\]")
|
||
|
|
|
||
|
|
def safe_alpha_list_eval(st):
|
||
|
|
'''Like `safe_eval` but removes most non-alpha-numeric characters.
|
||
|
|
|
||
|
|
>>> safe_alpha_list_eval("[A B/C, D+E:F]")
|
||
|
|
['ABC', 'DEF']
|
||
|
|
'''
|
||
|
|
st = sanitize_alpha_list_re.sub('',st)
|
||
|
|
return safe_list_eval(st)
|
||
|
|
|
||
|
|
class SafeEvalNS(object):
|
||
|
|
def __getitem__(self, name):
|
||
|
|
return name
|
||
|
|
|
||
|
|
def safe_eval(st):
|
||
|
|
'''Safe version of "eval" which evaluates names to strings.
|
||
|
|
|
||
|
|
# "foo" is a string
|
||
|
|
>>> safe_eval('foo, 123, 4 + 5, "A B C", {}, "{}"')
|
||
|
|
('foo', 123, 9, 'A B C', {}, '{}')
|
||
|
|
|
||
|
|
# no harmful code possible
|
||
|
|
>>> safe_eval('__import__("os").unlink("foo.txt")')
|
||
|
|
TypeError: 'str' object is not callable
|
||
|
|
'''
|
||
|
|
return eval(st, {}, SafeEvalNS())
|
||
|
|
|
||
|
|
safe_list_eval = safe_eval
|
||
|
|
|
||
|
|
DEFAULT_ERROR = -1
|
||
|
|
DEFAULT_SUCCESS = None
|
||
|
|
|
||
|
|
#--------------------------------------------------------------------
|
||
|
|
# shortcuts...
|
||
|
|
|
||
|
|
toggle_dict = {'on':1,'off':0,'1':1,'0':0,'toggle':-1, '-1':-1}
|
||
|
|
toggle_sc = Shortcut(toggle_dict.keys())
|
||
|
|
|
||
|
|
stereo_dict = {'on':-2,'off':0,'0':0,'1':-2,'swap':-1,
|
||
|
|
'chromadepth': -3,
|
||
|
|
'quadbuffer':1,'crosseye':2,
|
||
|
|
'walleye':3,'geowall':4,'sidebyside':5,
|
||
|
|
'byrow':6, 'bycolumn':7, 'checkerboard':8,
|
||
|
|
'custom': 9, 'anaglyph' : 10,
|
||
|
|
'dynamic' : 11, 'clonedynamic': 12,
|
||
|
|
'openvr' : 13 }
|
||
|
|
|
||
|
|
stereo_sc = Shortcut(stereo_dict.keys())
|
||
|
|
|
||
|
|
space_dict = {
|
||
|
|
'cmyk': "$PYMOL_DATA/pymol/cmyk.png",
|
||
|
|
'pymol': 'pymol',
|
||
|
|
'rgb': 'rgb',
|
||
|
|
'greyscale': 'greyscale',
|
||
|
|
}
|
||
|
|
|
||
|
|
space_sc = Shortcut(space_dict)
|
||
|
|
|
||
|
|
window_dict = { 'show' : 1, 'hide' : 0, 'position' : 2, 'size' : 3,
|
||
|
|
'box' : 4, 'maximize' : 5, 'fit' : 6, 'focus' : 7,
|
||
|
|
'defocus' : 8 }
|
||
|
|
window_sc = Shortcut(window_dict.keys())
|
||
|
|
|
||
|
|
repres = {
|
||
|
|
'everything' : -1,
|
||
|
|
'sticks' : 0,
|
||
|
|
'spheres' : 1,
|
||
|
|
'surface' : 2,
|
||
|
|
'labels' : 3,
|
||
|
|
'nb_spheres' : 4,
|
||
|
|
'cartoon' : 5,
|
||
|
|
'ribbon' : 6,
|
||
|
|
'lines' : 7,
|
||
|
|
'mesh' : 8,
|
||
|
|
'dots' : 9,
|
||
|
|
'dashes' :10,
|
||
|
|
'nonbonded' :11,
|
||
|
|
'cell' :12,
|
||
|
|
'cgo' :13,
|
||
|
|
'callback' :14,
|
||
|
|
'extent' :15,
|
||
|
|
'slice' :16,
|
||
|
|
'angles' :17,
|
||
|
|
'dihedrals' :18,
|
||
|
|
'ellipsoids' :19,
|
||
|
|
'volume' :20,
|
||
|
|
}
|
||
|
|
|
||
|
|
repmasks = {
|
||
|
|
'everything' : 0b000111111111111111111111,
|
||
|
|
'sticks' : 0b000000000000000000000001,
|
||
|
|
'spheres' : 0b000000000000000000000010,
|
||
|
|
'surface' : 0b000000000000000000000100,
|
||
|
|
'labels' : 0b000000000000000000001000,
|
||
|
|
'nb_spheres' : 0b000000000000000000010000,
|
||
|
|
'cartoon' : 0b000000000000000000100000,
|
||
|
|
'ribbon' : 0b000000000000000001000000,
|
||
|
|
'lines' : 0b000000000000000010000000,
|
||
|
|
'mesh' : 0b000000000000000100000000,
|
||
|
|
'dots' : 0b000000000000001000000000,
|
||
|
|
'dashes' : 0b000000000000010000000000,
|
||
|
|
'nonbonded' : 0b000000000000100000000000,
|
||
|
|
'cell' : 0b000000000001000000000000,
|
||
|
|
'cgo' : 0b000000000010000000000000,
|
||
|
|
'callback' : 0b000000000100000000000000,
|
||
|
|
'extent' : 0b000000001000000000000000,
|
||
|
|
'slice' : 0b000000010000000000000000,
|
||
|
|
'angles' : 0b000000100000000000000000,
|
||
|
|
'dihedrals' : 0b000001000000000000000000,
|
||
|
|
'ellipsoids' : 0b000010000000000000000000,
|
||
|
|
'volume' : 0b000100000000000000000000,
|
||
|
|
|
||
|
|
# combinations
|
||
|
|
'licorice' : 0b000000000000000000010001, # sticks | nb_spheres
|
||
|
|
'wire' : 0b000000000000100010000000, # lines | nonbonded
|
||
|
|
}
|
||
|
|
|
||
|
|
repmasks_sc = Shortcut(repmasks)
|
||
|
|
repres_sc = Shortcut(repres.keys())
|
||
|
|
|
||
|
|
boolean_dict = {
|
||
|
|
'yes' : 1,
|
||
|
|
'no' : 0,
|
||
|
|
'1' : 1,
|
||
|
|
'0' : 0,
|
||
|
|
'on' : 1,
|
||
|
|
'off' : 0
|
||
|
|
}
|
||
|
|
|
||
|
|
boolean_sc = Shortcut(boolean_dict.keys())
|
||
|
|
|
||
|
|
palette_sc = Shortcut(palette_dict.keys())
|
||
|
|
|
||
|
|
|
||
|
|
location_code = {
|
||
|
|
'first' : -1,
|
||
|
|
'top' : -1,
|
||
|
|
'upper' : -2,
|
||
|
|
'current' : 0,
|
||
|
|
'bottom' : 1,
|
||
|
|
'last' : 1
|
||
|
|
}
|
||
|
|
location_sc = Shortcut(location_code.keys())
|
||
|
|
|
||
|
|
class fb_action:
|
||
|
|
set = 0
|
||
|
|
enable = 1
|
||
|
|
disable = 2
|
||
|
|
push = 3
|
||
|
|
pop = 4
|
||
|
|
|
||
|
|
class fb_module:
|
||
|
|
|
||
|
|
# This first set represents internal C systems
|
||
|
|
|
||
|
|
all =0
|
||
|
|
isomesh =1
|
||
|
|
map =2
|
||
|
|
matrix =3
|
||
|
|
mypng =4
|
||
|
|
triangle =5
|
||
|
|
match =6
|
||
|
|
raw =7
|
||
|
|
isosurface =8
|
||
|
|
opengl =9
|
||
|
|
|
||
|
|
color =10
|
||
|
|
cgo =11
|
||
|
|
feedback =12
|
||
|
|
scene =13
|
||
|
|
threads =14
|
||
|
|
symmetry =15
|
||
|
|
ray =16
|
||
|
|
setting =17
|
||
|
|
object =18
|
||
|
|
ortho =19
|
||
|
|
movie =20
|
||
|
|
python =21
|
||
|
|
extrude =22
|
||
|
|
rep =23
|
||
|
|
shaker =24
|
||
|
|
|
||
|
|
coordset =25
|
||
|
|
distset =26
|
||
|
|
gadgetset =27
|
||
|
|
|
||
|
|
objectmolecule =30
|
||
|
|
objectmap =31
|
||
|
|
objectmesh =32
|
||
|
|
objectdist =33
|
||
|
|
objectcgo =34
|
||
|
|
objectcallback =35
|
||
|
|
objectsurface =36
|
||
|
|
objectgadget =37
|
||
|
|
objectslice =38
|
||
|
|
objectvolume =39
|
||
|
|
|
||
|
|
repangle =43
|
||
|
|
repdihederal =44
|
||
|
|
repwirebond =45
|
||
|
|
repcylbond =46
|
||
|
|
replabel =47
|
||
|
|
repsphere =49
|
||
|
|
repsurface =50
|
||
|
|
repmesh =51
|
||
|
|
repdot =52
|
||
|
|
repnonbonded =53
|
||
|
|
repnonbondedsphere =54
|
||
|
|
repdistdash =55
|
||
|
|
repdistlabel =56
|
||
|
|
repribbon =57
|
||
|
|
repcartoon =58
|
||
|
|
sculpt =59
|
||
|
|
vfont =60
|
||
|
|
# in layer0
|
||
|
|
shader =61
|
||
|
|
shadermgr =62
|
||
|
|
shaderprg =63
|
||
|
|
session =64
|
||
|
|
# in layer1
|
||
|
|
property =65
|
||
|
|
|
||
|
|
executive =70
|
||
|
|
selector =71
|
||
|
|
editor =72
|
||
|
|
nag =73
|
||
|
|
|
||
|
|
export =75
|
||
|
|
ccmd =76
|
||
|
|
api =77
|
||
|
|
|
||
|
|
main =80
|
||
|
|
|
||
|
|
# This second set, with negative indices
|
||
|
|
# represent "python-only" subsystems
|
||
|
|
|
||
|
|
parser =-1
|
||
|
|
cmd =-2
|
||
|
|
|
||
|
|
class fb_mask:
|
||
|
|
output = 0x01 # Python/text output
|
||
|
|
results = 0x02
|
||
|
|
errors = 0x04
|
||
|
|
actions = 0x08
|
||
|
|
warnings = 0x10
|
||
|
|
details = 0x20
|
||
|
|
blather = 0x40
|
||
|
|
debugging = 0x80
|
||
|
|
everything = 0xFF
|
||
|
|
|
||
|
|
|
||
|
|
# State count starts at 1. Values <=0 have special meaning.
|
||
|
|
ALL_STATES = 0
|
||
|
|
CURRENT_STATE = -1
|