show_UNRES.py - large loops speedup by using xrange
[unres.git] / source / pymol / show_UNRES.py
1 # -*- coding: utf-8 -*-
2 '''
3 -------------------------------------------------------------------------------
4   show_UNRES.py - UNRES model viewer v 1.0
5 -------------------------------------------------------------------------------
6  
7   Written by Dawid JagieÅ‚a (lightnir@chem.univ.gda.pl)  Feb 2013 
8  
9 '''
10
11 from chempy import cpv
12 from pymol import cmd
13 import cmd
14 from pymol.cgo import *
15
16 from pymol.menu import *
17 import pymol.menu
18
19 def __init__(self):
20         # Add unres to known represtentations 
21         from pymol import constants
22         constants.repres_sc.append('unres')
23
24
25 def show_UNRES(sl='(all)'):
26         # basic settings
27         p_radius = 0.6
28         e_size = 1.0
29         # residue dictionary
30         # resn = [color_Red, color_Green, color_Blue, ellipsoid_width, ellipsoid_length ]
31         resdb = {       'CYS': [1.000, 1.000, 0.000, 1.33741, 2.96868],
32                                 'MET': [0.000, 1.000, 0.000, 1.36694, 3.08863],
33                                 'PHE': [0.000, 0.392, 0.000, 1.48323, 3.04238],
34                                 'ILE': [0.000, 1.000, 0.000, 1.44098, 3.17389],
35                                 'LEU': [0.000, 1.000, 0.000, 1.51054, 2.52078],
36                                 'VAL': [0.000, 1.000, 0.000, 1.42072, 2.68924],
37                                 'TRP': [0.000, 0.392, 0.000, 1.23867, 3.47403],
38                                 'TYR': [0.596, 0.984, 0.596, 1.23060, 3.35434],
39                                 'ALA': [0.000, 1.000, 0.000, 1.23266, 1.72686],
40                                 'GLY': [1.000, 1.000, 1.000, 1.24626, 1.11383],
41                                 'THR': [1.000, 0.000, 1.000, 1.28674, 2.59210],
42                                 'SER': [1.000, 0.000, 1.000, 1.22820, 1.68800],
43                                 'GLN': [1.000, 0.000, 1.000, 1.24239, 2.22201],
44                                 'ASN': [1.000, 0.000, 1.000, 1.24447, 2.24946],
45                                 'GLU': [1.000, 0.000, 0.000, 1.25448, 2.05551],
46                                 'ASP': [1.000, 0.000, 0.000, 1.25417, 1.77556],
47                                 'HIS': [1.000, 0.000, 1.000, 1.21103, 3.02627],
48                                 'ARG': [0.000, 0.000, 1.000, 1.13573, 3.25143],
49                                 'LYS': [0.000, 0.000, 1.000, 1.22604, 4.50054],
50                                 'PRO': [0.000, 1.000, 1.000, 1.35131, 2.20525]
51                         }
52
53
54         # Get pseudo-peptide group positions
55         atoms=cmd.get_model(sl+" & n. CA").atom
56         p=[]
57         for i in xrange(0,len(atoms)-1):
58                 p.append( [atoms[i].coord[0]+(atoms[i+1].coord[0]-atoms[i].coord[0])/2, atoms[i].coord[1]+(atoms[i+1].coord[1]-atoms[i].coord[1])/2, atoms[i].coord[2]+(atoms[i+1].coord[2]-atoms[i].coord[2])/2 ] )
59         obj=[]
60         for i in xrange(0,len(p)):
61                 obj.extend( [ COLOR, 0.643, 0.933, 0.960 ] )
62                 obj.extend( [ SPHERE, p[i][0], p[i][1], p[i][2], p_radius ] )
63
64         # Get Sidechain elipsoids positions
65         atoms=cmd.get_model(sl+" & n. CB").atom
66         e=[]
67         for i in xrange(0,len(atoms)):
68                 ca=cmd.get_model(sl+" & n. CA & resn "+atoms[i].resn+" & resi "+atoms[i].resi).atom
69                 e.append( [ atoms[i].resn, atoms[i].coord[0], atoms[i].coord[1], atoms[i].coord[2], atoms[i].coord[0]-ca[0].coord[0], atoms[i].coord[1]-ca[0].coord[1], atoms[i].coord[2]-ca[0].coord[2] ] )
70
71         obj.extend([NORMAL,  0.0,  1.0,  0.0])
72         # This is from pymol devel example cgo07.py form http://pymol.sourcearchive.com/documentation/1.2r1/cgo07_8py-source.html
73     #
74         # [ ELLIPSOID, x_pos, y_pos, z_pos, size, x0, y0, z0, x1, y1, z2, x2, y2, z2 ]
75         # where the xyz vectors are orthogonal and of length 1.0 or less.
76         for i in xrange(0,len(e)):
77                 # vactor CB->CA
78                 tmp0=[e[i][4], e[i][5], e[i][6]]
79                 #l=cpv.length(tmp0)
80                 # random vector
81                 tmp1 = cpv.random_vector()
82                 # orthogonal vector to tmp0 and tmp1 
83                 tmp2 = cpv.cross_product(tmp1, tmp0)
84                 tmp3 = cpv.cross_product(tmp0, tmp2)
85                 tmp0 = cpv.normalize(tmp0)
86                 tmp2 = cpv.normalize(tmp2)
87                 tmp3 = cpv.normalize(tmp3)
88                 tmp0 = cpv.scale(tmp0,resdb[e[i][0]][4])
89                 tmp2 = cpv.scale(tmp2,resdb[e[i][0]][3])
90                 tmp3 = cpv.scale(tmp3,resdb[e[i][0]][3])
91                 factor = 1.0 / max( cpv.length(tmp0), cpv.length(tmp2), cpv.length(tmp3))
92                 tmp0 = cpv.scale(tmp0, factor)
93                 tmp2 = cpv.scale(tmp2, factor)
94                 tmp3 = cpv.scale(tmp3, factor)
95                 obj.extend( [ COLOR, resdb[e[i][0]][0], resdb[e[i][0]][1], resdb[e[i][0]][2] ] )
96                 obj.extend( [ ELLIPSOID, e[i][1], e[i][2], e[i][3], 1.0/factor, ] + tmp0 + tmp2 + tmp3 )
97
98         # Get Glicynes positions
99         atoms=cmd.get_model(sl+' & n. CA & resn GLY').atom
100         g=[]
101         for i in xrange(0,len(atoms)):
102                 g.append( [ atoms[i].resn, atoms[i].coord[0], atoms[i].coord[1], atoms[i].coord[2] ])
103         # Draw the glicyne spheres      
104         for i in xrange(0, len(g)):
105                 obj.extend( [ COLOR, resdb[g[i][0]][0], resdb[g[i][0]][1], resdb[g[i][0]][2] ] )
106                 obj.extend( [ SPHERE, g[i][1], g[i][2], g[i][3], resdb[g[i][0]][3]])
107
108
109         cmd.set('cgo_ellipsoid_quality', 2)
110         cmd.load_cgo(obj,'UNRES_'+sl)
111
112
113 # Hook up to PyMols show command
114
115 def myshow(representation="",selection="",_self=cmd):
116         '''
117 DESCRIPTION
118          
119     "show" turns on representations for objects and selections.
120          
121 USAGE
122  
123     show [ representation [, selection ]]
124  
125 ARGUMENTS
126  
127     representation = lines, spheres, mesh, ribbon, cartoon, sticks,
128     dots, surface, labels, extent, nonbonded, nb_spheres, slice,
129     extent, slice, dashes, angles, dihedrals, cgo, cell, callback,
130     unres or everything
131  
132     selection = string: a selection-expression or name-pattern
133  
134 NOTES
135  
136     With no arguments, "show" alone turns on lines for all bonds and
137     nonbonded for all atoms in all molecular objects.
138  
139 EXAMPLES
140  
141     show
142     show ribbon
143     show lines, (name ca or name c or name n)
144
145 SEE ALSO
146  
147     hide, enable, disable
148  
149 '''
150
151         if representation=='unres':
152                 if selection=="":
153                         show_UNRES('all')
154                 else:
155                         show_UNRES(selection)
156         else:
157                 cmd.show(representation, selection,_self)
158
159
160 cmd.extend('show',myshow)