Johan,

"JL" == Johan Leckner wrote:

 JL> So there is no way to run and control PyMol from within another python
 JL> program?

Why?  There is!

[...]

 JL> Has anyone been able to run and quit PyMol from within python without
 JL> killing the interpreter? Is it possible? How?

Here's a script, that I've used to use in Nov.  Not sure that it will run
with current version of pymol, however.

# -*- python -*- file
# $Id: mov.py,v 1.8 2001/11/23 23:47:48 akhavr Exp $
#
# Copyright (C) 2001 by KDS Software Group http://www.kds.com.ua/

from glob import glob
import os
import sys

def split(movie_name):
    movie = open(movie_name)
    filename = "output"
    counter = 1
    f = open(filename+"%010d" % counter,"w")
    
    skipnextline = 1
    
    while 1:
        l = movie.readline()
        if l == "":
            break
        if l == " \r\n" or l == " \n":
            f.close()
            counter = counter + 1
            f = open(filename+"%010d" % counter,"w")
            skipnextline = 1
            continue
        if skipnextline == 1:
            skipnextline = 0
            continue
        else:
            f.write(l)
    f.close()
    os.remove(filename+"%010d" % counter)

def make_pdb():
    for file in glob("output*"):
        os.system("transform 5 "+file+" "+file+".xyz")
        os.system("babel -ixyz "+file+".xyz -opdb "+file+".pdb")
        os.remove(file+".xyz")
        os.remove(file)

def def_movie(width,height):
    file_list = glob("output*.pdb")

    for file in file_list:
        cmd.load(file, "mov")

    cmd.move("z",-10)
    cmd.hide("lines")
    cmd.show("spheres")

    mov_def = ""
    for i in range(1, len(file_list)+1):
        mov_def = mov_def + str(i) + "  "
        
    cmd.mset(mov_def)
    cmd.viewport(width,height)
    cmd.bg_color("white")

def make_png():
    if not os.path.exists("png"): os.mkdir("png")

    # enable raytracing
    cmd.set("ray_trace_frames",1)
    cmd.set("cache_frame",0)

    # render
    cmd.mpng("png/mov")

def make_yuv():
    os.chdir("png")
    for i in glob("*"):
        ( base, suffix ) = re.split('_', i)
        ( no, suffix ) = re.split('\.', suffix)
        yuv_name = base+"."+str(int(no))
        os.system("pngtopnm "+i+" | ppmtoyuvsplit "+yuv_name)
    os.chdir("..")

def make_avi(width, height):
    os.chdir("png")
    num = str(len(glob("mov*Y")))
    os.system("mpeg -a 1 -b "+num+" -h "+str(width)+" -v "+str(height)+
              " -PF mov. -s mov.mpg")
    os.system("ffmpeg -f mpegvideo -i mov.mpg -r 25 " +
              "-an -f avi -b 1000 mov.avi ")
    try:
      os.remove("../mov.mpg")
      os.remove("../mov.avi")
    except OSError: pass
    os.rename("mov.mpg","../mov.mpg")
    os.rename("mov.avi","../mov.avi")
    os.chdir("..")

def clean():
    for file in glob("output*"):
        os.remove(file)
    for file in glob("png/*"):
        os.remove(file)
    os.rmdir("png")

width=800
height=600

try:
    movie_name = sys.argv[3]
    print "Processing "+movie_name
    split(movie_name)
    make_pdb()
    def_movie(width,height)
    make_png()
    make_yuv()
    make_avi(width,height)
    clean()
except IndexError:
    print """
Usage:
            pymol -c mov.py z-sequence-file
"""

-- 
Andrey V Khavryuchenko          http://www.kds.com.ua/
Software Solutions

Reply via email to