Difference between revisions of "CgoCircle"

From PyMOLWiki
Jump to navigation Jump to search
 
(2 intermediate revisions by the same user not shown)
Line 14: Line 14:
  
  
<gallery heights=200px widths=300px>
+
<gallery heights=200px widths=300px perrow=3>
 
Image:Circle1.png|Drawn circle.
 
Image:Circle1.png|Drawn circle.
 
Image:Circle2.png|CGO circle.
 
Image:Circle2.png|CGO circle.
 
Image:Circle3.png|Circles of specified radius.
 
Image:Circle3.png|Circles of specified radius.
 +
Image:CircleR.png|Circle with specified width.
 +
Image:CircleR2.png|Circle with a line width of 150.  Pores anyone?
 
</gallery>
 
</gallery>
  
 
= Usage =
 
= Usage =
<source lang="python">
 
# Create a circle centered at X,Y,Z = (10,10,10) with radius=4
 
# and colored red/pink.
 
cgoCircle x=10, y=10, z=10, r=4, cr=1.0, cg=0.4, cb=0.9
 
 
# put a circle around residue 44
 
circleSelection i. 44
 
</source>
 
 
= The Code =
 
 
<source lang="python">
 
<source lang="python">
 
import math
 
import math
Line 37: Line 29:
 
import random
 
import random
  
def cgoCircle(x, y, z, r=8.0, cr=1.0, cg=0.4, cb=0.8):
+
def cgoCircle(x, y, z, r=8.0, cr=1.0, cg=0.4, cb=0.8, w=2.0):
 
   """
 
   """
 
   Create a CGO circle
 
   Create a CGO circle
 
+
 
 
   PARAMS
 
   PARAMS
x, y, z
+
        x, y, z
  X, Y and Z coordinates of the origin
+
          X, Y and Z coordinates of the origin
 +
 
 +
        r
 +
          Radius of the circle
 +
 
 +
        cr, cg, cb
 +
          Color triplet, [r,g,b] where r,g,b are all [0.0,1.0].
 +
 
 +
        w
 +
          Line width of the circle
  
r
 
  Radius of the circle
 
 
 
cr, cg, cb
 
  Color triplet, [r,g,b] where r,g,b are all [0.0,1.0].
 
 
 
 
   RETURNS
 
   RETURNS
the CGO object (it also loads it into PyMOL, too).
+
        the CGO object (it also loads it into PyMOL, too).
+
 
 
   """
 
   """
 
   x = float(x)
 
   x = float(x)
Line 62: Line 57:
 
   cg = abs(float(cg))
 
   cg = abs(float(cg))
 
   cb = abs(float(cb))
 
   cb = abs(float(cb))
    
+
   w = float(w)
 +
 
 
   obj = [ BEGIN, LINES, COLOR, cr, cg, cb ]
 
   obj = [ BEGIN, LINES, COLOR, cr, cg, cb ]
 
   for i in range(180):
 
   for i in range(180):
obj.append( VERTEX )
+
        obj.append( VERTEX )
obj.append(r*math.cos(i) + x )
+
        obj.append(r*math.cos(i) + x )
obj.append(r*math.sin(i) + y )
+
        obj.append(r*math.sin(i) + y )
obj.append(z)
+
        obj.append(z)
obj.append( VERTEX )
+
        obj.append( VERTEX )
obj.append(r*math.cos(i+0.1) + x )
+
        obj.append(r*math.cos(i+0.1) + x )
obj.append(r*math.sin(i+0.1) + y )
+
        obj.append(r*math.sin(i+0.1) + y )
obj.append(z)
+
        obj.append(z)
 
   obj.append(END)
 
   obj.append(END)
 
+
   cmd.load_cgo( obj, "circle_" + str(random.randint(0,1000)))
+
   cName = cmd.get_unused_name("circle_")
 +
  cmd.load_cgo( obj, cName )
 +
  cmd.set("cgo_line_width", w, cName )
 
   return obj
 
   return obj
  
  
def circleSelection( selName, r=None, cr=1.0, cg=0.4, cb=0.8 ):
+
def circleSelection( selName, r=None, cr=1.0, cg=0.4, cb=0.8, w=2.0 ):
 
   """
 
   """
 
   circleSelection -- draws a cgo circle around a given selection or object
 
   circleSelection -- draws a cgo circle around a given selection or object
  
 
   PARAMS
 
   PARAMS
selName
+
        selName
  Name of the thing to encircle.
+
          Name of the thing to encircle.
 
+
 
r
+
        r
  Radius of circle.
+
          Radius of circle.
  DEFAULT: This cript automatically defines the radius for you.  If
+
          DEFAULT: This cript automatically defines the radius for you.  If
  you select one atom and the resultant circle is too small, then
+
          you select one atom and the resultant circle is too small, then
  you can override the script's calculation of r and specify your own.
+
          you can override the script's calculation of r and specify your own.
 
+
 
cr, cg, cb
+
        cr, cg, cb
  red, green and blue coloring, each a value in the range [0.0, 1.0]
+
          red, green and blue coloring, each a value in the range [0.0, 1.0]
 
+
 
 
   RETURNS
 
   RETURNS
The circle object.
+
        The circle object.
+
 
 
   """
 
   """
 
   ((minX, minY, minZ), (maxX, maxY, maxZ)) = cmd.get_extent(selName)
 
   ((minX, minY, minZ), (maxX, maxY, maxZ)) = cmd.get_extent(selName)
  
 
   if r==None:
 
   if r==None:
r = max( [maxX-minX, maxY-minY, maxZ-minZ] )
+
        r = max( [maxX-minX, maxY-minY, maxZ-minZ] )
  
 
   stored.coords = []
 
   stored.coords = []
Line 113: Line 111:
 
   centerZ = sum(map(lambda x: x[2], stored.coords)) / l
 
   centerZ = sum(map(lambda x: x[2], stored.coords)) / l
  
   return cgoCircle( centerX, centerY, centerZ, r, cr, cg, cb )
+
   return cgoCircle( centerX, centerY, centerZ, r, cr, cg, cb, w )
+
 
 
+
 
 
cmd.extend( "cgoCircle", cgoCircle )
 
cmd.extend( "cgoCircle", cgoCircle )
 
cmd.extend( "circleSelection", circleSelection )
 
cmd.extend( "circleSelection", circleSelection )
 
</source>
 
</source>
 +
 +
= Updates =
 +
* Line width option
 +
* better circle naming
  
 
[[Category:Script_Library]]
 
[[Category:Script_Library]]
 
[[Category:Math_Scripts]]
 
[[Category:Math_Scripts]]
 +
[[Category:CGO]]

Latest revision as of 08:56, 25 October 2012

Overview

This script will create a CGO circle with the origin at the specified X,Y,Z coordinates. Also, you can specify the radius and the colors. See the examples.

If you want to draw a circle around an object or selection, use circleSelection. If you want pure flexibility over your circle then use cgoCircle.


There are two functions here:

cgoCircle

— creates a CGO circle at some user-specified location

circleSelection

—creates a circle around the named object or selection.


Usage

import math
import pymol
from pymol.cgo import *
import random

def cgoCircle(x, y, z, r=8.0, cr=1.0, cg=0.4, cb=0.8, w=2.0):
  """
  Create a CGO circle

  PARAMS
        x, y, z
          X, Y and Z coordinates of the origin

        r
          Radius of the circle

        cr, cg, cb
          Color triplet, [r,g,b] where r,g,b are all [0.0,1.0].

        w
          Line width of the circle

  RETURNS
        the CGO object (it also loads it into PyMOL, too).

  """
  x = float(x)
  y = float(y)
  z = float(z)
  r = abs(float(r))
  cr = abs(float(cr))
  cg = abs(float(cg))
  cb = abs(float(cb))
  w = float(w)

  obj = [ BEGIN, LINES, COLOR, cr, cg, cb ]
  for i in range(180):
        obj.append( VERTEX )
        obj.append(r*math.cos(i) + x )
        obj.append(r*math.sin(i) + y )
        obj.append(z)
        obj.append( VERTEX )
        obj.append(r*math.cos(i+0.1) + x )
        obj.append(r*math.sin(i+0.1) + y )
        obj.append(z)
  obj.append(END)
 
  cName = cmd.get_unused_name("circle_")
  cmd.load_cgo( obj, cName )
  cmd.set("cgo_line_width", w, cName )
  return obj


def circleSelection( selName, r=None, cr=1.0, cg=0.4, cb=0.8, w=2.0 ):
  """
  circleSelection -- draws a cgo circle around a given selection or object

  PARAMS
        selName
          Name of the thing to encircle.

        r
          Radius of circle.
          DEFAULT: This cript automatically defines the radius for you.  If
          you select one atom and the resultant circle is too small, then
          you can override the script's calculation of r and specify your own.

        cr, cg, cb
          red, green and blue coloring, each a value in the range [0.0, 1.0]

  RETURNS
        The circle object.

  """
  ((minX, minY, minZ), (maxX, maxY, maxZ)) = cmd.get_extent(selName)

  if r==None:
        r = max( [maxX-minX, maxY-minY, maxZ-minZ] )

  stored.coords = []
  cmd.iterate_state(1, selName, "stored.coords.append([x,y,z])")
  l = len(stored.coords)

  centerX = sum(map(lambda x: x[0], stored.coords)) / l
  centerY = sum(map(lambda x: x[1], stored.coords)) / l
  centerZ = sum(map(lambda x: x[2], stored.coords)) / l

  return cgoCircle( centerX, centerY, centerZ, r, cr, cg, cb, w )


cmd.extend( "cgoCircle", cgoCircle )
cmd.extend( "circleSelection", circleSelection )

Updates

  • Line width option
  • better circle naming