1from pymol.wizard import Wizard
2from pymol import cmd
3
4saved = {}
5
6
7class Demo(Wizard):
8
9    def launch(self,name):
10        return None
11
12    def __init__(self,name=None,_self=cmd):
13        Wizard.__init__(self,_self)
14        self.message = []
15        self.last = None
16        if 'last' in saved:
17            self.last = saved['last']
18        if name is not None:
19            demo = DemoInfo(_self=_self)
20            if self.last:
21                if hasattr(demo,self.last):
22                    getattr(demo,self.last)(cleanup=1)
23            if hasattr(demo,name):
24                self.last = name
25                demo_fn = getattr(demo,name)
26                t = threading.Thread(target=demo_fn)
27                t.setDaemon(1)
28                t.start()
29                self.message = demo.message_dict.get(name,None)
30            else:
31                self.last = None
32            saved['last']=self.last
33
34    def get_prompt(self):
35        saved['last']=self.last
36        self.prompt = self.message
37        return self.prompt
38
39    def get_panel(self):
40        return [
41            [ 1, 'Demonstrations', '' ],
42            [ 2, 'Representations', 'replace_wizard demo,reps'],
43            [ 2, 'Cartoon Ribbons', 'replace_wizard demo,cartoon'],
44            [ 2, 'Roving Detail', 'replace_wizard demo,roving'],
45            [ 2, 'Roving Density', 'replace_wizard demo,roving_density'],
46            [ 2, 'Transparency', 'replace_wizard demo,trans'],
47            [ 2, 'Ray Tracing', 'replace_wizard demo,ray'],
48            [ 2, 'Sculpting', 'replace_wizard demo,sculpt'],
49            [ 2, 'Scripted Animation', 'replace_wizard demo,anime'],
50            [ 2, 'Electrostatics', 'replace_wizard demo,elec'],
51            [ 2, 'CGOs', 'replace_wizard demo,cgo'],
52            [ 2, 'Molscript/R3D Input', 'replace_wizard demo,raster3d'],
53            [ 2, 'End Demonstration', 'replace_wizard demo,finish' ]
54            ]
55
56from pymol.vfont import plain
57from pymol.cgo import measure_text, wire_text
58import traceback
59from pymol import util
60import threading
61
62class DemoInfo:
63
64    def __init__(self,_self=cmd):
65        self.cmd=_self
66
67    message_dict = {
68        'roving' : [
69        "Middle-Click to rove...         CTRL-SHIFT-Middle-Click to center...",],
70        'roving_density' : [
71        "Middle-Click to rove...         CTRL-SHIFT-Middle-Click to center...",],
72        'elec' : [
73        "CTRL-Middle-Click on color bar to change levels...",],
74        'sculpt' : [
75        "CTRL-Left-Click to drag atoms...       CTRL-Right-Click to rotate bonds...",],
76        }
77
78    def rep_old(self,cleanup=0):
79        if not cleanup:
80            try:
81                self.cmd.set("suspend_updates",1,quiet=1)
82                self.cmd.disable()
83                self.cmd.delete("pept")
84                self.cmd.delete("pept_dist")
85                self.cmd.load("$PYMOL_DATA/demo/pept.pdb")
86                self.cmd.hide("everything", "pept")
87                self.cmd.show("sticks","(pept and not i;5:7)")
88                self.cmd.show("surface","(pept and i;5,6)")
89                self.cmd.show("mesh","(pept and i;1,11,12,13)")
90                self.cmd.show("spheres","(?pept & resi 2+12+9+4 &! name C+N+O+CA)")
91                self.cmd.show("dots","(i;8)")
92                self.cmd.dist("pept_dist","(pept and i;1&n;OD2)","(pept and i;13&n;OG1)")
93                self.cmd.set("dot_width","2");
94            finally:
95                self.cmd.set("suspend_updates",0,quiet=1)
96        else:
97            self.cmd.delete("pept")
98            self.cmd.delete("pept_dist")
99
100    def reps(self,cleanup=0):
101        rep_list = [ "lines","sticks","spheres","surface","mesh","dots","ribbon","cartoon" ]
102        try:
103            if not cleanup:
104                self.cmd.disable()
105                self.cmd.set("suspend_updates",1,quiet=1)
106                self.cmd.mset()
107                self.cmd.set("movie_panel", 0)
108                self.cmd.load("$PYMOL_DATA/demo/pept.pdb","rep1")
109                self.cmd.alter("rep1///1-5+8-13/","ss='S'")
110                self.cmd.cartoon("auto")
111                self.cmd.hide("everything","rep1")
112                for a in range(2,9):
113                    self.cmd.create("rep%d"%a,"rep1")
114                for y, x in enumerate(rep_list, 1):
115                    self.cmd.show(x, "rep%d" % y)
116                self.cmd.reset()
117                self.cmd.zoom("rep1",24)
118                util.cbay("rep2",_self=self.cmd)
119                util.cbac("rep3",_self=self.cmd)
120                util.cbas("rep4",_self=self.cmd)
121                util.cbab("rep5",_self=self.cmd)
122                util.cbaw("rep6",_self=self.cmd)
123                util.cbay("rep8",_self=self.cmd)
124
125
126                self.cmd.set("suspend_updates",0,quiet=1)
127                scale=0.5
128                for b in range(1,20):
129                    self.cmd.set("suspend_updates",0,quiet=1)
130                    self.cmd.refresh()
131                    self.cmd.set("suspend_updates",1,quiet=1)
132                    xt=-3.2
133                    yt=1.6
134                    for a in range(1,5):
135                        self.cmd.translate([xt*scale,yt*scale,0],object="rep%d"%a,camera=0)
136                        xt=xt+2
137                    yt=-yt
138                    xt=-3.2
139                    for a in range(5,9):
140                        self.cmd.translate([xt*scale,yt*scale,0],object="rep%d"%a,camera=0)
141                        xt=xt+2
142                for a in range(1,9):
143                    self.cmd.origin("rep%d"%a,object="rep%d"%a)
144                self.cmd.mset("1")
145                st = ' '.join("rotate angle=-3,object=rep%d,axis=%s;" % (x, 'yx'[x % 2]) for x in range(1, 9))
146                self.cmd.mdo(1,st)
147                self.cmd.set("suspend_updates",0,quiet=1)
148                self.cmd.mplay()
149
150                cgo = []
151                axes = [[4.5,0.0,0.0],[0.0,3.0,0.0],[0.0,0.0,3.0]]
152
153                c = 1
154                for a in rep_list:
155                    ext = self.cmd.get_extent("rep%d"%c)
156                    pos = [(ext[0][0]+ext[1][0])/2,
157                             (ext[0][1]+ext[1][1])/2+14,
158                             (ext[0][2]+ext[1][2])/2]
159                    c = c + 1
160                    pos[0]=pos[0]-(measure_text(plain,a,axes)/2)
161                    wire_text(cgo,plain,pos,a,axes)
162                self.cmd.set("cgo_line_width",1.5)
163                self.cmd.set("auto_zoom",0)
164                self.cmd.load_cgo(cgo,'reps')
165                self.cmd.set("auto_zoom",1)
166            else:
167                self.cmd.delete("rep*")
168                self.cmd.mset()
169                self.cmd.mstop()
170                self.cmd.set("movie_panel",1)
171        except:
172            traceback.print_exc()
173
174    def raster3d(self,cleanup=0):
175        if not cleanup:
176            self.cmd.disable()
177
178            self.cmd.set_view( (\
179      0.269525230,   -0.492282957,    0.827655137,\
180     -0.158114254,   -0.870419860,   -0.466229916,\
181      0.949923635,   -0.005200397,   -0.312437057,\
182     -0.000086844,    0.000019042, -133.217041016,\
183     11.377667427,   21.768899918,    9.270449638,\
184    105.029335022,  169.626159668,    0.000000000 ))
185            self.cmd.load("$PYMOL_DATA/demo/1hpv.r3d","cgo1")
186            self.cmd.zoom("cgo1")
187        else:
188            self.cmd.delete("cgo1")
189
190    def cgo(self,cleanup=0):
191        if not cleanup:
192            self.cmd.disable()
193            try:
194                self.cmd.set("suspend_updates",1,quiet=1)
195                self.cmd.do("run $PYMOL_DATA/demo/cgo03.py")
196            finally:
197                self.cmd.set("suspend_updates",0,quiet=1)
198        else:
199            self.cmd.delete("cgo03")
200            self.cmd.mset()
201            self.cmd.mstop()
202            self.cmd.rewind()
203
204    def anime_old(self,cleanup=0):
205        if not cleanup:
206            self.cmd.disable()
207            self.cmd.delete("arg")
208            self.cmd.fragment("arg")
209            self.cmd.zoom("arg",2)
210            self.cmd.show("sticks","arg")
211            self.cmd.feedback('dis','sel','res')
212            for a in range(1,181):
213                try:
214                    self.cmd.set("suspend_updates",1,quiet=1)
215                    self.cmd.edit("(arg & name CD)","(arg & name CG)",quiet=1)
216                    self.cmd.torsion("6")
217                    self.cmd.unpick()
218                    self.cmd.edit("(arg & name CB)","(arg & name CA)",quiet=1)
219                    self.cmd.torsion("2")
220                    self.cmd.unpick()
221                finally:
222                    self.cmd.set("suspend_updates",0,quiet=1)
223                self.cmd.refresh()
224            self.cmd.feedback('ena','sel','res')
225        else:
226            self.cmd.delete("arg")
227
228    def anime(self,cleanup=0):
229        if not cleanup:
230            try:
231                self.cmd.set("suspend_updates",1,quiet=1)
232                self.cmd.disable()
233                self.cmd.load("$TUT/1hpv.pdb")
234                util.chainbow("1hpv",_self=self.cmd)
235                self.cmd.hide("everything","1hpv")
236                self.cmd.show("cartoon","1hpv")
237                self.cmd.show("sticks","1hpv///200/")
238                self.cmd.create("1hpv_a","1hpv//A//")
239                self.cmd.set("cartoon_smooth_loops",0,"1hpv_a")
240                self.cmd.create("1hpv_b","1hpv//B//")
241                self.cmd.set("cartoon_smooth_loops",0,"1hpv_b")
242                self.cmd.create("1hpv_l","1hpv///200/")
243                util.cbay("1hpv_l",_self=self.cmd)
244                self.cmd.delete("1hpv")
245                self.cmd.set_view ((\
246          0.374249548,   -0.517475128,    0.769516647,\
247          -0.214397043,   -0.855623126,   -0.471108317,\
248          0.902203023,    0.011330833,   -0.431161582,\
249          -0.000023194,   -0.000007302, -125.089942932,\
250          11.953758240,   20.323493958,    8.406080246,\
251          75.304412842,  189.396347046,    0.000000000 ))
252                self.cmd.translate([-20,0,0],object="1hpv_a")
253                self.cmd.translate([20,0,0],object="1hpv_b")
254                self.cmd.zoom("center",30)
255                self.cmd.translate([0,10,00],object="1hpv_l")
256            finally:
257                self.cmd.set("suspend_updates",0,quiet=1)
258            self.cmd.refresh()
259            for a in range(1,21):
260                try:
261                    self.cmd.set("suspend_updates",1,quiet=1)
262                    self.cmd.translate([1,0,0],object="1hpv_a")
263                    self.cmd.translate([-1,0,0],object="1hpv_b")
264                    self.cmd.translate([0,-0.5,0],object="1hpv_l")
265                finally:
266                    self.cmd.set("suspend_updates",0,quiet=1)
267                self.cmd.refresh()
268            for a in range(1,62):
269                self.cmd.turn("y",6)
270                self.cmd.move('z',2)
271                self.cmd.move('y',-0.12)
272                self.cmd.refresh()
273
274        else:
275            self.cmd.delete("1hpv_*")
276
277    def roving(self,cleanup=0):
278        if not cleanup:
279          try:
280            self.cmd.set("suspend_updates",1,quiet=1)
281            self.cmd.load("$PYMOL_DATA/demo/il2.pdb")
282            self.cmd.hide("everything", "il2")
283            self.cmd.remove("hydro")
284            self.cmd.disable()
285            self.cmd.enable("il2")
286            self.cmd.set("ribbon_color","blue","il2")
287            self.cmd.set("roving_detail",1)
288            self.cmd.set("roving_origin",1)
289            self.cmd.set("stick_radius",0.12,"il2")
290#         self.cmd.zoom("/il2///16/O")
291#         self.cmd.zoom("center",12)
292            self.cmd.set_view ((\
293      0.132852688,   -0.729740858,    0.670686543,\
294      -0.228543565,    0.635894477,    0.737154961,\
295      -0.964425683,   -0.251212329,   -0.082298420,\
296      0.000062190,    0.000183226,  -58.861488342,\
297      13.349151611,   -1.565427899,   22.383148193,\
298      55.259441376,   63.259449005,    0.000000000 ))
299          finally:
300            self.cmd.set("suspend_updates", 0)
301            self.cmd.refresh()
302        else:
303            self.cmd.delete("il2")
304            self.cmd.set("roving_detail",0)
305            self.cmd.refresh()
306            self.cmd.delete("rov_*")
307
308    def roving_density(self,cleanup=0):
309        if not cleanup:
310            try:
311                self.cmd.set("suspend_updates",1,quiet=1)
312                self.cmd.load("$PYMOL_DATA/demo/il2.pdb")
313                self.cmd.hide("everything", "il2")
314                self.cmd.remove("hydro")
315                self.cmd.disable()
316                self.cmd.enable("il2")
317                self.cmd.map_new("map","gaussian","0.75","il2")
318                self.cmd.set("ribbon_color","purple","il2")
319                self.cmd.set("roving_detail",1)
320                self.cmd.set("roving_origin",1)
321                self.cmd.set("stick_radius",0.12,"il2")
322                self.cmd.set("roving_sticks",0)
323                self.cmd.set("roving_polar_contacts",0)
324                self.cmd.set("line_width","3")
325                self.cmd.set("roving_map1_name","map")
326                self.cmd.isomesh("rov_m1","map",9999.0,"il2")
327                self.cmd.color("density","rov_m1")
328
329                self.cmd.set_view ((\
330          0.132852688,   -0.729740858,    0.670686543,\
331          -0.228543565,    0.635894477,    0.737154961,\
332          -0.964425683,   -0.251212329,   -0.082298420,\
333          0.000062190,    0.000183226,  -58.861488342,\
334          13.349151611,   -1.565427899,   22.383148193,\
335          55.259441376,   63.259449005,    0.000000000 ))
336            finally:
337                self.cmd.set("suspend_updates",0,quiet=1)
338            self.cmd.refresh()
339        else:
340            self.cmd.set("roving_detail",0)
341            self.cmd.set("roving_map1_name","")
342            self.cmd.set("roving_polar_contacts",7)
343            self.cmd.set("roving_sticks",6)
344            self.cmd.delete("il2")
345            self.cmd.delete("map")
346            self.cmd.set("line_width",1.5)
347            self.cmd.refresh()
348            self.cmd.set("roving_detail",0)
349            self.cmd.delete("rov_*")
350            self.cmd.sync()
351
352    def cartoon(self,cleanup=0):
353        if not cleanup:
354            try:
355                self.cmd.set("suspend_updates",1,quiet=1)
356                self.cmd.disable()
357                self.cmd.delete("1tii")
358                self.cmd.load("$PYMOL_DATA/demo/1tii.pdb")
359                self.cmd.hide("(1tii)")
360                self.cmd.show("cartoon","1tii")
361                self.cmd.zoom("1tii")
362                self.cmd.spectrum("count","rainbow","1tii////CA")
363                self.cmd.set("cartoon_highlight_color","grey50","1tii")
364                self.cmd.set("cartoon_fancy_helices",1,"1tii")
365            finally:
366                self.cmd.set("suspend_updates",0,quiet=1)
367            self.cmd.refresh()
368        else:
369            self.cmd.delete("1tii")
370
371    def elec(self,cleanup=0):
372        if not cleanup:
373            self.cmd.config_mouse('three_button_viewing')
374            self.cmd.disable()
375            self.cmd.delete("pept")
376            self.cmd.delete("e_pot")
377            self.cmd.delete("e_lvl")
378            self.cmd.load("$PYMOL_DATA/demo/pept.pkl")
379            self.cmd.hide("(pept)")
380            self.cmd.show("surface","pept")
381            self.cmd.set("coulomb_dielectric",80.0)
382            self.cmd.map_new("e_pot","coulomb",1.0,"pept",5)
383            self.cmd.ramp_new("e_lvl","e_pot",[-3.6,-1.6,0.4])
384            self.cmd.set("surface_color","e_lvl","pept")
385            self.cmd.refresh()
386        else:
387            self.cmd.delete("pept")
388            self.cmd.delete("e_pot")
389            self.cmd.delete("e_lvl")
390
391    def trans(self,cleanup=0):
392        if not cleanup:
393            try:
394                self.cmd.set("suspend_updates",1,quiet=1)
395                self.cmd.disable()
396                self.cmd.delete("trans")
397                self.cmd.load("$PYMOL_DATA/demo/pept.pdb","trans")
398                self.cmd.hide("(trans)")
399                self.cmd.show("surface","trans")
400                self.cmd.show("sticks","trans")
401                self.cmd.set("surface_color","white","trans")
402                self.cmd.set("transparency",0.5,"trans")
403                self.cmd.zoom("trans")
404            finally:
405                self.cmd.set("suspend_updates",0,quiet=1)
406            self.cmd.refresh()
407        else:
408            self.cmd.delete("trans")
409
410    def ray(self,cleanup=0):
411        if not cleanup:
412            self.cmd.set("suspend_updates",1,quiet=1)
413            self.cmd.disable()
414            self.cmd.delete("ray")
415            self.cmd.load("$PYMOL_DATA/demo/il2.pdb","ray")
416            self.cmd.remove("(ray and hydro)")
417            self.cmd.hide("everything","ray")
418            self.cmd.show("spheres","ray")
419            self.cmd.orient("ray")
420            self.cmd.turn("x",90)
421            util.ray_shadows('heavy',_self=self.cmd)
422            self.cmd.set("suspend_updates",0,quiet=1)
423            self.cmd.refresh()
424            self.cmd.do("ray")
425        else:
426            self.cmd.delete("ray")
427
428    def finish(self,cleanup=0):
429        self.cmd.do("_ wizard")
430
431    def sculpt(self,cleanup=0):
432        if not cleanup:
433            self.cmd.set("suspend_updates",1,quiet=1)
434            self.cmd.disable()
435            self.cmd.delete("sculpt")
436            self.cmd.load("$PYMOL_DATA/demo/pept.pdb","sculpt")
437            self.cmd.hide("everything","sculpt")
438            self.cmd.show("sticks","sculpt")
439            if self.cmd.get_setting_boolean("use_shaders"):
440                self.cmd.show("spheres","sculpt")
441            self.cmd.set("sphere_transparency","0.75","sculpt")
442            self.cmd.set("sphere_color","grey","sculpt")
443            self.cmd.frame(1)
444            self.cmd.set("auto_sculpt",1)
445            self.cmd.set("sculpting",1)
446            self.cmd.sculpt_activate("sculpt")
447            self.cmd.do("edit_mode")
448            self.cmd.set("valence","0.05")
449            self.cmd.set("suspend_updates",0,quiet=0)
450            self.cmd.unpick()
451        else:
452            self.cmd.set("valence","0")
453            self.cmd.set("sculpting",0)
454            self.cmd.set("auto_sculpt",0)
455            self.cmd.delete("sculpt")
456            self.cmd.mouse()
457