1from pymol.wizard import Wizard
2from pymol import cmd
3import pymol
4import types
5
6saved = {}
7
8class Stereodemo(Wizard):
9
10    def launch(self,name,pretty_name=None):
11        demo = DemoInfo()
12        if self.last:
13            if hasattr(demo,self.last):
14                getattr(demo,self.last)(cleanup=1)
15        if hasattr(demo,name):
16            cmd.delete("all")
17            if pretty_name is not None:
18                cmd.do("_ wizard message, Please wait while the %s example loads..., dismiss=0"%pretty_name)
19            self.message = demo.message_dict.get(name,None)
20            cmd.refresh_wizard()
21            self.last = name
22            demo_fn = getattr(demo,name)
23            t = threading.Thread(target=demo_fn)
24            t.setDaemon(1)
25            t.start()
26        else:
27            self.last = None
28        saved['last']=self.last
29
30    def __init__(self,*arg,**kw):
31        _self=kw.get('_self',cmd)
32        Wizard.__init__(self,_self)
33        self.message = []
34        self.last = None
35        cmd.full_screen("off")
36        if not  ("mono" in list(kw.keys())):
37            cmd.stereo("on")
38        cmd.set("sphere_mode","5")
39        if 'last' in saved:
40            self.last = saved['last']
41        if len(arg):
42            self.launch(arg[0])
43        else:
44            self.launch("cartoon")
45
46    def get_prompt(self):
47        saved['last']=self.last
48        self.prompt = self.message
49        return self.prompt
50
51    def get_panel(self):
52        return [
53            [ 1, 'Structural Biology', '' ],
54            [ 2, 'X-ray Crystallography', 'cmd.get_wizard().launch("roving_density")'],
55            [ 2, 'Electron Tomography',
56	      'cmd.get_wizard().launch("electomo", "Electron Tomography")'],
57            [ 1, 'Drug Discovery', '' ],
58            [ 2, 'Medicinal Chemistry',
59	      'cmd.get_wizard().launch("medchem","Medicinal Chemistry")'],
60            [ 2, 'Computational Chemistry', 'cmd.get_wizard().launch("electro","Computational Chemistry")'],
61            [ 1, 'Presentation Graphics', '' ],
62            [ 2, 'Molecular Animation', 'cmd.get_wizard().launch("animate","Molecular Animation")'],
63            [ 2, 'Multiprocessor Raytracing', 'cmd.get_wizard().launch("ray")'],
64	    [ 1, 'Bioinformatics', ''],
65            [ 2, 'Structure Alignments', 'cmd.get_wizard().launch("structure","Structure Alignment")'],
66            [ 2, 'Homology Modeling',
67	      'cmd.get_wizard().launch("homology","Homology Modeling")'],
68	    [ 1, 'Science Education', ''],
69            [ 2, 'Interactive Modeling', 'cmd.get_wizard().launch("sculpt")'],
70            [ 1, 'Configuration', ''],
71	    [ 2, 'Toggle Fullscreen',
72	      'cmd.full_screen()'],
73	    [ 2, 'Toggle Stereo 3D',
74              'cmd.stereo("off" if cmd.get_setting_int("stereo") else "on")'],
75#            [ 2, 'End Demonstration', 'cmd.get_wizard().launch("finish")' ],
76#            [ 2, 'Swap Left/Right Stereo', 'stereo swap'],
77            ]
78
79from pymol.vfont import plain
80from pymol.cgo import *
81import traceback
82from pymol import util
83import threading
84
85class DemoInfo:
86
87    message_dict = {
88        'roving' : [
89        "Middle-click-and-drag to move...",],
90        'roving_density' : [
91        "Middle-click-and-drag to move..."],
92        'elec' : [
93        "CTRL-Middle-Click on color bar to change levels...",],
94        'sculpt' : [
95        "Control-left-click-and-drag on atom centers to drag atoms...",],
96        }
97
98    def get_sess(self,file):
99        from chempy import io
100        file = cmd.exp_path(file)
101        sess = io.pkl.fromFile(file)
102        del sess['wizard']
103        del sess['main']
104        return sess
105
106    def homology(self,cleanup=0):
107        if not cleanup:
108            cmd.set_session(self.get_sess("$PYMOL_DATA/big_demo/homology.pse"))
109            cmd.do("replace_wizard toggle, Homology Modeling")
110
111    def structure(self,cleanup=0):
112        if not cleanup:
113            cmd.set_session(self.get_sess("$PYMOL_DATA/big_demo/structure.pse"))
114            cmd.do("replace_wizard toggle, Structure Alignment")
115            cmd.set("seq_view_label_mode",1)
116            cmd.set("seq_view",1)
117        else:
118            cmd.set("seq_view_label_mode",0)
119            cmd.set("seq_view",0)
120
121    def medchem(self,cleanup=0):
122        if not cleanup:
123            cmd.set_session(self.get_sess("$PYMOL_DATA/big_demo/drugdisc.pse"))
124            cmd.do("replace_wizard toggle, Medicinal Chemistry")
125        else:
126            cmd.set("sphere_scale",1.0)
127
128    def electomo(self,cleanup=0):
129        if not cleanup:
130            cmd.feedback("disable","objectsurface","actions")
131            cmd.set_session(self.get_sess("$PYMOL_DATA/big_demo/flagellar.pse"))
132            cmd.set("sweep_mode",3)
133            cmd.set("sweep_angle",3)
134            cmd.rock()
135            cmd.do("replace_wizard toggle, Electron Tomography")
136        else:
137            cmd.mstop()
138            cmd.rock(0)
139
140    def electro(self,cleanup=0):
141        if not cleanup:
142            cmd.set_session(self.get_sess("$PYMOL_DATA/big_demo/electro.pse"))
143            cmd.do("replace_wizard toggle, Computational Chemistry (Electrostatics)")
144            cmd.rock(1)
145        else:
146            cmd.rock(0)
147
148    def animate(self,cleanup=0):
149        if not cleanup:
150            cmd.set("security",0)
151            cmd.set_session(self.get_sess("$PYMOL_DATA/big_demo/animate.pse"))
152            cmd.rock(1)
153            cmd.set("field_of_view",23)
154            cmd.rock(1)
155            cmd.set("sweep_mode",3)
156            cmd.set("sweep_angle",10)
157            cmd.set("sphere_mode",5)
158            cmd.do("replace_wizard toggle, Molecular Animation")
159        else:
160            cmd.set("mesh_width",1)
161            cmd.set("field_of_view",20)
162            cmd.rock(0)
163            cmd.mset()
164            cmd.mstop()
165
166    def rep_old(self,cleanup=0):
167        if not cleanup:
168            try:
169                cmd.set("suspend_updates",1,quiet=1)
170                cmd.disable()
171                cmd.delete("pept")
172                cmd.delete("pept_dist")
173                cmd.load("$PYMOL_DATA/demo/pept.pdb")
174                cmd.show("sticks","(pept and not i;5:7)")
175                cmd.show("surface","(pept and i;5,6)")
176                cmd.show("mesh","(pept and i;1,11,12,13)")
177                cmd.show("spheres","(?pept & resi 2+12+9+4 &! name C+N+O+CA)")
178                cmd.show("dots","(i;8)")
179                cmd.dist("pept_dist","(pept and i;1&n;OD2)","(pept and i;13&n;OG1)")
180                cmd.set("dot_width","2");
181            finally:
182                cmd.set("suspend_updates",0,quiet=1)
183        else:
184            cmd.delete("pept")
185            cmd.delete("pept_dist")
186
187    def reps(self,cleanup=0):
188        rep_list = [ "lines","sticks","spheres","surface","mesh","dots","ribbon","cartoon" ]
189        try:
190            if not cleanup:
191                cmd.disable()
192                cmd.set("suspend_updates",1,quiet=1)
193                cmd.load("$PYMOL_DATA/demo/pept.pdb","rep1")
194                cmd.alter("rep1///1-5+8-13/","ss='S'")
195                cmd.cartoon("auto")
196                cmd.hide("everything","rep1")
197                for a in range(2,9):
198                    cmd.create("rep%d"%a,"rep1")
199                for x, y in enumerate(rep_list, 1):
200                    cmd.show(x, "rep%d" % y)
201                cmd.reset()
202                cmd.zoom("rep1",24)
203                util.cbay("rep2")
204                util.cbac("rep3")
205                util.cbas("rep4")
206                util.cbab("rep5")
207                util.cbaw("rep6")
208                util.cbay("rep8")
209
210
211                cmd.set("suspend_updates",0,quiet=1)
212                scale=0.5
213                for b in range(1,20):
214                    cmd.set("suspend_updates",0,quiet=1)
215                    cmd.refresh()
216                    cmd.set("suspend_updates",1,quiet=1)
217                    xt=-3.2
218                    yt=1.6
219                    for a in range(1,5):
220                        cmd.translate([xt*scale,yt*scale,0],object="rep%d"%a,camera=0)
221                        xt=xt+2
222                    yt=-yt
223                    xt=-3.2
224                    for a in range(5,9):
225                        cmd.translate([xt*scale,yt*scale,0],object="rep%d"%a,camera=0)
226                        xt=xt+2
227                for a in range(1,9):
228                    cmd.origin("rep%d"%a,object="rep%d"%a)
229                cmd.mset("1")
230                st = ' '.join(map(lambda x,y:"rotate angle=-3,object=rep%d,axis=%s;"%(x,y),list(range(1,9)),
231                                            ['x','y','x','y','x','y','x','y']))
232                cmd.mdo(1,st)
233                cmd.set("suspend_updates",0,quiet=1)
234                cmd.mplay()
235
236                cgo = []
237                axes = [[4.5,0.0,0.0],[0.0,3.0,0.0],[0.0,0.0,3.0]]
238
239                c = 1
240                for a in rep_list:
241                    ext = cmd.get_extent("rep%d"%c)
242                    pos = [(ext[0][0]+ext[1][0])/2,
243                             (ext[0][1]+ext[1][1])/2+14,
244                             (ext[0][2]+ext[1][2])/2]
245                    c = c + 1
246                    pos[0]=pos[0]-(measure_text(plain,a,axes)/2)
247                    wire_text(cgo,plain,pos,a,axes)
248                cmd.set("cgo_line_width",1.5)
249                cmd.set("auto_zoom",0)
250                cmd.load_cgo(cgo,'reps')
251                cmd.set("auto_zoom",1)
252            else:
253                cmd.delete("rep*")
254                cmd.mset()
255                cmd.mstop()
256        except:
257            traceback.print_exc()
258
259
260    def roving(self,cleanup=0):
261        if not cleanup:
262            cmd.load("$PYMOL_DATA/demo/il2.pdb")
263            cmd.remove("hydro")
264            cmd.disable()
265            cmd.enable("il2")
266            cmd.set("ribbon_color","blue","il2")
267            cmd.set("roving_detail",1)
268            cmd.set("roving_origin",1)
269            cmd.set("stick_radius",0.12,"il2")
270#         cmd.zoom("/il2///16/O")
271#         cmd.zoom("center",12)
272            cmd.set_view ((\
273      0.132852688,   -0.729740858,    0.670686543,\
274      -0.228543565,    0.635894477,    0.737154961,\
275      -0.964425683,   -0.251212329,   -0.082298420,\
276      0.000062190,    0.000183226,  -58.861488342,\
277      13.349151611,   -1.565427899,   22.383148193,\
278      55.259441376,   63.259449005,    0.000000000 ))
279        else:
280            cmd.delete("il2")
281            cmd.set("roving_detail",0)
282            cmd.refresh()
283            cmd.delete("rov_*")
284
285    def roving_density(self,cleanup=0):
286        if not cleanup:
287            try:
288                cmd.load("$PYMOL_DATA/demo/il2.pdb")
289                cmd.set("suspend_updates",1,quiet=1)
290                cmd.remove("hydro")
291                cmd.disable()
292                cmd.enable("il2")
293                cmd.map_new("map","gaussian","0.75","il2")
294                cmd.feedback("disable","objectmesh","actions")
295                cmd.set("ribbon_color","purple","il2")
296                cmd.set("roving_detail",1)
297                cmd.set("roving_origin",1)
298                cmd.set("stick_radius",0.12,"il2")
299                cmd.set("roving_sticks",0)
300                cmd.set("roving_polar_contacts",0)
301                cmd.set("line_width","3")
302                cmd.set("roving_map1_name","map")
303                cmd.isomesh("rov_m1","map",9999.0,"il2")
304                cmd.color("density","rov_m1")
305
306                cmd.set_view ((\
307          0.132852688,   -0.729740858,    0.670686543,\
308          -0.228543565,    0.635894477,    0.737154961,\
309          -0.964425683,   -0.251212329,   -0.082298420,\
310          0.000062190,    0.000183226,  -58.861488342,\
311          13.349151611,   -1.565427899,   22.383148193,\
312          55.259441376,   63.259449005,    0.000000000 ))
313            finally:
314                cmd.set("suspend_updates",0,quiet=1)
315            cmd.refresh()
316        else:
317            cmd.set("roving_detail",0)
318            cmd.set("roving_map1_name","")
319            cmd.set("roving_polar_contacts",7)
320            cmd.set("roving_sticks",6)
321            cmd.delete("il2")
322            cmd.delete("map")
323            cmd.set("line_width",1.5)
324            cmd.refresh()
325            cmd.set("roving_detail",0)
326            cmd.delete("rov_*")
327            cmd.sync()
328
329    def cartoon(self,cleanup=0):
330        if not cleanup:
331            try:
332                cmd.set("suspend_updates",1,quiet=1)
333                cmd.disable()
334                cmd.delete("1tii")
335                cmd.load("$PYMOL_DATA/demo/1tii.pdb")
336                cmd.hide("(1tii)")
337                cmd.show("cartoon","1tii")
338                cmd.zoom("1tii")
339                cmd.spectrum("count","rainbow","1tii////ca")
340                cmd.set("cartoon_highlight_color","grey50","1tii")
341                cmd.set("cartoon_fancy_helices",1,"1tii")
342            finally:
343                cmd.set("suspend_updates",0,quiet=1)
344            cmd.refresh()
345        else:
346            cmd.delete("1tii")
347
348    def elec(self,cleanup=0):
349        if not cleanup:
350            cmd.disable()
351            cmd.delete("pept")
352            cmd.delete("e_pot")
353            cmd.delete("e_lvl")
354            cmd.load("$PYMOL_DATA/demo/pept.pkl")
355            cmd.hide("(pept)")
356            cmd.show("surface","pept")
357            cmd.set("coulomb_dielectric",80.0)
358            cmd.map_new("e_pot","coulomb",1.0,"pept",5)
359            cmd.ramp_new("e_lvl","e_pot",[-3.6,-1.6,0.4])
360            cmd.set("surface_color","e_lvl","pept")
361            cmd.refresh()
362        else:
363            cmd.delete("pept")
364            cmd.delete("e_pot")
365            cmd.delete("e_lvl")
366
367    def trans(self,cleanup=0):
368        if not cleanup:
369            try:
370                cmd.set("suspend_updates",1,quiet=1)
371                cmd.disable()
372                cmd.delete("trans")
373                cmd.load("$PYMOL_DATA/demo/pept.pdb","trans")
374                cmd.hide("(trans)")
375                cmd.show("surface","trans")
376                cmd.show("sticks","trans")
377                cmd.set("surface_color","white","trans")
378                cmd.set("transparency",0.5,"trans")
379                cmd.zoom("trans")
380            finally:
381                cmd.set("suspend_updates",0,quiet=1)
382            cmd.refresh()
383        else:
384            cmd.delete("trans")
385
386    def ray(self,cleanup=0):
387        if not cleanup:
388            cmd.set("suspend_updates",1,quiet=1)
389            cmd.disable()
390            cmd.delete("ray")
391            cmd.set("sphere_mode",5)
392            cmd.set("sphere_scale",1.0)
393            cmd.load("$PYMOL_DATA/demo/il2.pdb","ray")
394            cmd.remove("(ray and hydro)")
395            cmd.hide("lines","ray")
396            cmd.show("spheres","ray")
397            cmd.orient("ray")
398            cmd.turn("x",90)
399            util.ray_shadows('heavy')
400            cmd.mstop()
401            cmd.rock(0)
402            cmd.set("suspend_updates",0,quiet=1)
403            cmd.refresh()
404            cmd.do("ray")
405        else:
406            cmd.delete("ray")
407
408    def finish(self,cleanup=0):
409        cmd.do("_ wizard")
410
411    def sculpt(self,cleanup=0):
412        if not cleanup:
413            cmd.set("suspend_updates",1,quiet=1)
414            cmd.disable()
415            cmd.delete("sculpt")
416            cmd.set("sphere_scale","1.0")
417            cmd.set("sphere_mode",5)
418            cmd.load("$PYMOL_DATA/demo/pept.pdb","sculpt")
419            cmd.hide("lines","sculpt")
420#            cmd.show("sticks","sculpt")
421            cmd.show("spheres","sculpt")
422#            cmd.set("sphere_transparency","0.75","sculpt")
423#            cmd.set("sphere_color","grey","sculpt")
424            cmd.frame(1)
425            cmd.set("auto_sculpt",1)
426            cmd.set("sculpting",1)
427            cmd.sculpt_activate("sculpt")
428            cmd.set("sculpting_cycles","100")
429            cmd.do("edit_mode")
430            cmd.set("valence","0.05")
431            cmd.set("suspend_updates",0,quiet=0)
432            cmd.sculpt_iterate("sculpt")
433            cmd.alter_state(1,"sculpt","x=x*1.5;y=y*0.1;z=z*1.5")
434            cmd.zoom()
435
436            cmd.unpick()
437        else:
438            cmd.set("valence","0")
439            cmd.set("sculpting",0)
440            cmd.set("auto_sculpt",0)
441            cmd.delete("sculpt")
442            cmd.mouse()
443
444
445if __name__=='pymol':
446   pymol.wizard.stereodemo = Stereodemo()
447   cmd.set_wizard(pymol.wizard.stereodemo)
448   cmd.stereo("on")
449   cmd.set("max_threads",4)
450