Difference between revisions of "FocalBlur"

From PyMOLWiki
Jump to navigation Jump to search
m
Line 5: Line 5:
 
===Usage===
 
===Usage===
  
Load the script using the [[run]] command
+
Load the script using the [[run]] command. Execute the script using PyMOL syntax:
 
+
<source lang="python">
 +
FocalBlur aperture=2.0,samples=100,ray=1
 +
</source>
 +
or using python syntax:
 
<source lang="python">
 
<source lang="python">
FocalBlur(aperture=2.0,samples=100,raytrace=True)
+
FocalBlur(aperture=2.0,samples=100,ray=1)
 
</source>
 
</source>
 +
  
 
For additional options, see the script comments.
 
For additional options, see the script comments.
Line 24: Line 28:
  
 
{|
 
{|
|[[Image:FocalBlur_a1.0_r1.png|thumb|400px|left|FocalBlur(aperture=1,samples=100,raytrace=True)]]
+
|[[Image:FocalBlur_a1.0_r1.png|thumb|400px|left|FocalBlur aperture=1,samples=100,ray=1]]
|[[Image:FocalBlur_a2.0_r1.png|thumb|400px|left|FocalBlur(aperture=2,samples=100,raytrace=True)]]
+
|[[Image:FocalBlur_a2.0_r1.png|thumb|400px|left|FocalBlur aperture=2,samples=100,ray=1]]
 
|-
 
|-
|[[Image:FocalBlur_a4.0_r1.png|thumb|400px|left|FocalBlur(aperture=4,samples=400,raytrace=True)]]
+
|[[Image:FocalBlur_a4.0_r1.png|thumb|400px|left|FocalBlur aperture=4,samples=400,ray=1]]
|[[Image:FocalBlur_a4.0_r0.png|thumb|400px|left|FocalBlur(aperture=4,samples=400,raytrace=False)]]
+
|[[Image:FocalBlur_a4.0_r0.png|thumb|400px|left|FocalBlur aperture=4,samples=400,ray=0]]
 
|}
 
|}
  
Line 43: Line 47:
 
from math import sin,cos,pi
 
from math import sin,cos,pi
  
print 'Usage: FocalBlur(aperture=float,samples=int,raytrace=True/False,width=int,height=int)'
+
def FocalBlur(aperture=2.0,samples=10,ray=0,width=0,height=0):
 
 
def FocalBlur(aperture=2.0,samples=10,raytrace=False,width=0,height=0):
 
 
     '''
 
     '''
 +
DESCRIPTION
  
     AUTHOR
+
     Creates fancy figures by introducing a focal blur to the image. The object
 +
    at the origin will be in focus.
  
      Jarl Underhaug
+
AUTHOR
      University of Bergen
 
      jarl_dot_underhaug_at_gmail_dot_com
 
  
     USAGE
+
     Jarl Underhaug
 +
    University of Bergen
 +
    jarl_dot_underhaug_at_gmail_dot_com
  
      FocalBlur(aperture=float,samples=int,raytrace=True/False,width=int,height=int)
+
USAGE
     
 
    EXAMPELS
 
  
      FocalBlur(aperture=1,samples=100,raytrace=False)
+
    FocalBlur aperture=float, samples=int, ray=0/1, width=int, height=int
      FocalBlur(aperture=2,samples=100,raytrace=True,width=600,height=400)
 
 
        
 
        
 +
EXAMPELS
  
 +
    FocalBlur aperture=1, samples=100
 +
    FocalBlur aperture=2, samples=100, ray=1, width=600, height=400
 
     '''
 
     '''
 +
    aperture, samples = float(aperture), int(samples)
 +
    ray, width, height = int(ray), int(width), int(height)
  
 
     # Because of a bug, only custom sizes when raytracing
 
     # Because of a bug, only custom sizes when raytracing
     if not raytrace:
+
     if not ray:
 
         width=0
 
         width=0
 
         height=0
 
         height=0
Line 99: Line 105:
  
 
         # Save the image
 
         # Save the image
         cmd.png(tmpdir+'/frame-%04d.png' % (frame),width=width,height=height,ray=raytrace)
+
         cmd.png(tmpdir+'/frame-%04d.png' % (frame),width=width,height=height,ray=ray)
 
          
 
          
 
         # Return the protein and the light to the original orientation
 
         # Return the protein and the light to the original orientation
Line 113: Line 119:
 
     # Delete the temporary files
 
     # Delete the temporary files
 
     rmtree(tmpdir)
 
     rmtree(tmpdir)
 +
 +
cmd.extend('FocalBlur', FocalBlur)
  
 
</source>
 
</source>

Revision as of 05:24, 8 June 2011

Description

This script creates fancy figures by introducing a focal blur to the image. The object at the origin will be in focus.

Usage

Load the script using the run command. Execute the script using PyMOL syntax:

FocalBlur aperture=2.0,samples=100,ray=1

or using python syntax:

FocalBlur(aperture=2.0,samples=100,ray=1)


For additional options, see the script comments.

Notes

  • When using raytracing, the image creation will take n times longer than normal, where n is the number of samples.
  • The script uses ImageMagick for creating the blured image. It has only been tested on Linux
  • The aperture is a purely arbitrary value and not related to f stops on a camera.
  • There is a bug preventing custom image sizes when not using raytracing.


Examples

FocalBlur aperture=1,samples=100,ray=1
FocalBlur aperture=2,samples=100,ray=1
FocalBlur aperture=4,samples=400,ray=1
FocalBlur aperture=4,samples=400,ray=0

Script

Load the script using the run command

import random

from pymol import cmd
from os import system
from tempfile import mkdtemp
from shutil import rmtree
from math import sin,cos,pi

def FocalBlur(aperture=2.0,samples=10,ray=0,width=0,height=0):
    '''
DESCRIPTION

    Creates fancy figures by introducing a focal blur to the image. The object
    at the origin will be in focus. 

AUTHOR

    Jarl Underhaug
    University of Bergen
    jarl_dot_underhaug_at_gmail_dot_com

USAGE

    FocalBlur aperture=float, samples=int, ray=0/1, width=int, height=int
       
EXAMPELS

    FocalBlur aperture=1, samples=100
    FocalBlur aperture=2, samples=100, ray=1, width=600, height=400
    '''
    aperture, samples = float(aperture), int(samples)
    ray, width, height = int(ray), int(width), int(height)

    # Because of a bug, only custom sizes when raytracing
    if not ray:
        width=0
        height=0

    # Create a temporary directory
    tmpdir = mkdtemp()

    # Get the orientation of the protein and the light
    light = cmd.get('light')[1:-1]
    light = [float(s) for s in light.split(',')]
    view = cmd.get_view()

    # Rotate the protein and the light in order to create the blur
    for frame in range(samples):
        # Angles to rotate protein and light
        x  = (random.random()-0.5)*aperture
        y  = (random.random()-0.5)*aperture
        xr = x/180.0*pi
        yr = y/180.0*pi

        # Rotate the protein
        cmd.turn('x',x)
        cmd.turn('y',y)

        # Rotate the light
        ly = light[1]*cos(xr)-light[2]*sin(xr)
        lz = light[2]*cos(xr)+light[1]*sin(xr)
        lx = light[0]*cos(yr)+lz*sin(yr)
        lz = lz*cos(yr)-lx*sin(yr)
        cmd.set('light',[lx,ly,lz])

        # Save the image
        cmd.png(tmpdir+'/frame-%04d.png' % (frame),width=width,height=height,ray=ray)
        
        # Return the protein and the light to the original orientation
        cmd.set('light',light)
        cmd.set_view(view)

    # Create a blured image of all the frames
    system('convert %s/frame-*.png +matte -average %s/blur.png' % (tmpdir,tmpdir))

    # Load the blured image 
    cmd.load('%s/blur.png' % (tmpdir))

    # Delete the temporary files
    rmtree(tmpdir)

cmd.extend('FocalBlur', FocalBlur)