CgoCircle: Difference between revisions

From PyMOLWiki
Jump to navigation Jump to search
No edit summary
No edit summary
 
(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 07: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