Difference between revisions of "CgoCircle"

From PyMOLWiki
Jump to navigation Jump to search
(Created page with '= 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…')
 
 
(3 intermediate revisions by the same user not shown)
Line 6: Line 6:
  
 
'''There are two functions here:'''
 
'''There are two functions here:'''
:: '''cgoCircle'''—reates a CGO circle at some user-specified location
 
:: '''circleSelection'''—creates a circle around the named object or selection.
 
  
 +
'''cgoCircle'''
 +
::— creates a CGO circle at some user-specified location
 +
'''circleSelection'''
 +
::—creates a circle around the named object or selection.
  
  
<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 34: 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 59: 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 110: 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: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