Hi Ricardo - You can install this open-source contribution to pymol. It was distributed with v.80, but isn't working in the publicly available distribution I think because of some changes Warren made to the pymol code.
The command is 'movie.tdroll' so type help movie.tdroll for advice on how to use it after you install it. The code below will work with pymol v.80 (currently only available for windows release, I think...). Put the code in the movie.py file ([installation root]/DeLano Scientific/python/modules/python/ ) directory. Make sure you remove the tdroll routine that is currently in the movie.py code before adding this new piece of code. Alternatively, just replace your movie.py file with the one I've attached to this email (hope it makes it through the maillist server...) Now how to use it - movie.tdroll ('Three-Dimensional roll') will allow you to use make a quick movie of rotation along multiple axes of whatever is showing on the pymol screen. You can speed it up or slow it down by changing the 'skip' value. Play with setting different axes to 0 until you achieve what you want. I like movie.tdroll 180,180,0,5 for a cool display of the molecule. If your movies are still too fast, you can alter the fps setting in pymol to be whatever you want. Otherwise, you will have to change the playback rate with whatever you are using to generate your movies. I use bink&smacker software (freely available, just google the name) for generating avi's - it allows pseudo-control over the playback speed. Good luck - Byron --->start below here----> def tdroll(rangex,rangey,rangez,skip=1): ''' AUTHOR Byron DeLaBarre USAGE movie.tdroll(rangex,rangey,rangez,skip=1,mset=0) This is an extension of the roll command along other axes (3d-roll) rangex/y/z = rotation range on respective axis enter 0 for no rotation on the particular axis. skip is angle increment in each frame Use skip to reduce final movie size or to speed up rotation. EXAMPLE movie.tdroll 360,360,360,5 ''' rangex = float(rangex) rangey = float(rangey) rangez = float(rangez) skip = int(skip) axis=['x','y','z'] rangel=[rangex,rangey,rangez] axpos=0 frpos=1 tot_frames=(((rangex+rangey+rangez)/skip) + (rangex % skip) + (rangey % skip) + (rangez % skip)) cmd.mset ("1 x%d" %((int(tot_frames)))) for ax in axis: range = int(rangel[axpos]) if range: leftover = divmod(range,skip) print leftover[1] if leftover[1]: range = range + int(leftover[1]) a = 0 while a<=range: cmd.mdo("%d" % (int(frpos)),"turn %s,%8.3f" % (ax,skip)) a = a + skip frpos+=1 axpos+=1 else: axpos+=1 print (" tdroll: defined rotations for %s frames" %(int(frpos) - 1)) <----- cut above here > -----Original Message----- > From: pymol-users-ad...@lists.sourceforge.net > [mailto:pymol-users-ad...@lists.sourceforge.net]on Behalf Of Ricardo > Aparicio > Sent: Monday, May 06, 2002 10:36 AM > To: pymol-users@lists.sourceforge.net > Subject: [PyMOL] util.mroll & movie rate > > > Dear users: > > Sorry if these are trivial questions for you but I am in trouble and any > help is very welcomed: > > 1) How to use util.mroll to rotate around another axis other than Y axis ? > > 2) how to control the speed of a movie? > (it is possible to change size and number of images but I think there is > an easier answer to this question) > > Thank you in advance, > > > Ricardo Aparicio > PhD Student > Brazil > > > _______________________________________________________________ > > Have big pipes? SourceForge.net is looking for download mirrors. We supply > the hardware. You get the recognition. Email Us: bandwi...@sourceforge.net > _______________________________________________ > PyMOL-users mailing list > PyMOL-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/pymol-users >
#A* ------------------------------------------------------------------- #B* This file contains source code for the PyMOL computer program #C* copyright 1998-2000 by Warren Lyford Delano of DeLano Scientific. #D* ------------------------------------------------------------------- #E* It is unlawful to modify or remove this copyright notice. #F* ------------------------------------------------------------------- #G* Please see the accompanying LICENSE file for further information. #H* ------------------------------------------------------------------- #I* Additional authors of this source file include: #-* Peter Haebel, Byron DeLaBarre #-* #-* #Z* ------------------------------------------------------------------- import cmd import glob import math def load(*args): nam = "mov" if len(args)>1: nam = args[1] fils = glob.glob(args[0]) fils.sort() if not len(fils): print "Error: no matching files" else: for a in fils: cmd.load(a,nam) def rock(first,last,angle=30,phase=0,loop=1,axis='y'): first=int(first) last=int(last) angle=float(angle) phase=float(phase) loop=int(loop) nstep = (last-first)+1 if nstep<0: nstep = 1 if loop: subdiv = nstep else: subdiv = nstep+1 ang_cur = math.pi*phase/180 ang_inc = 2*math.pi/subdiv ang_cur = ang_cur - ang_inc a = 0 while a<nstep: last = angle*math.sin(ang_cur)/2 ang_cur = ang_cur + ang_inc disp = angle*math.sin(ang_cur)/2 diff = disp-last # com = "mdo %d:turn %s,%8.3f" % (first+a,axis,diff) # cmd.do(com) cmd.mdo("%d"%(first+a),"turn %s,%8.3f"% (axis,diff)) a = a + 1 def roll(first,last,loop=1,axis='y'): first=int(first) last=int(last) loop=int(loop) n = last - first if loop: step = 2*math.pi/(n+1) else: step = 2*math.pi/n a = 0 deg = (180*step/math.pi) while a<=n: # com = "mdo %d:turn %s,%8.3f" % (first+a,axis,deg) # cmd.do(com) cmd.mdo("%d" % (first+a), "turn %s,%8.3f" % (axis,deg)) a = a + 1 def tdroll(rangex,rangey,rangez,skip=1): ''' AUTHOR Byron DeLaBarre USAGE movie.tdroll(rangex,rangey,rangez,skip=1,mset=0) This is an extension of the roll command along other axes (3d-roll) rangex/y/z = rotation range on respective axis enter 0 for no rotation on the particular axis. skip is angle increment in each frame Use skip to reduce final movie size or to speed up rotation. EXAMPLE movie.tdroll 360,360,360,5 ''' rangex = float(rangex) rangey = float(rangey) rangez = float(rangez) skip = int(skip) axis=['x','y','z'] rangel=[rangex,rangey,rangez] axpos=0 frpos=1 tot_frames=(((rangex+rangey+rangez)/skip) + (rangex % skip) + (rangey % skip) + (rangez % skip)) cmd.mset ("1 x%d" %((int(tot_frames)))) for ax in axis: range = int(rangel[axpos]) if range: leftover = divmod(range,skip) print leftover[1] if leftover[1]: range = range + int(leftover[1]) a = 0 while a<=range: cmd.mdo("%d" % (int(frpos)),"turn %s,%8.3f" % (ax,skip)) a = a + skip frpos+=1 axpos+=1 else: axpos+=1 print (" tdroll: defined rotations for %s frames" %(int(frpos) - 1)) def zoom(first,last,step=1,loop=1,axis='z'): # Author: Peter Haebel first=int(first) last=int(last) step=int(step) loop=int(loop) n = last - first a = 0 while a<=n: if (loop and a>n/2): s = -step else: s = step # com = "mdo %d:move %s,%8.3f" % (first+a,axis,s) # cmd.do(com) cmd.mdo("%d" % (first+a),"move %s,%8.3f" % (axis,s)) a = a + 1 def nutate(first,last,angle=30,phase=0,loop=1,shift=math.pi/2.0,factor=0.01): first=int(first) last=int(last) angle=float(angle) phase=float(phase) loop=int(loop) nstep = (last-first)+1 if nstep<0: nstep = 1 if loop: subdiv = nstep else: subdiv = nstep+1 ang_cur = math.pi*phase/180 ang_inc = 2*math.pi/subdiv ang_cur = ang_cur - ang_inc a = 0 while a<nstep: lastx = angle*math.sin(ang_cur)/2 lasty = angle*math.sin(ang_cur+shift)/2 ang_cur = ang_cur + ang_inc nextx = angle*math.sin(ang_cur)/2 nexty = angle*math.sin(ang_cur+shift)/2 # com = "mdo %d:turn %s,%8.3f" % (first+a,axis,diff) # cmd.do(com) cmd.mdo("%d"%(first+a),"turn x,%8.3f;turn y,%8.3f;turn y,%8.3f;turn x,%8.3f"% (-lastx,-lasty,nexty,nextx)) a = a + 1 def screw(first,last,step=1,angle=30,phase=0,loop=1,axis='y'): # Author: Peter Haebel first=int(first) last=int(last) step=int(step) angle=float(angle) phase=float(phase) loop=int(loop) nstep = (last-first)+1 if nstep<0: nstep = 1 if loop: subdiv = nstep else: subdiv = nstep+1 ang_cur = math.pi*phase/180 ang_inc = 2*math.pi/subdiv ang_cur = ang_cur - ang_inc a = 0 while a<nstep: if (loop and a>=nstep/2): s = -step else: s = step last = angle*math.sin(ang_cur)/2 ang_cur = ang_cur + ang_inc disp = angle*math.sin(ang_cur)/2 diff = disp-last # com = "mdo %d:turn %s,%8.3f; move z,%8.3f" % (first+a,axis,diff,s) # cmd.do(com) cmd.mdo("%d" % (first+a), "turn %s,%8.3f; move z,%8.3f" % (axis,diff,s)) a = a + 1