So, I did some coding last night and I came up with a fairly good
looking, albeit a little slow, workaround for drawing wire mesh spheres.
The code is below, the main function is make_mesh. It is a little rough,
in that they get_neighbors function is quite naive, but it comes out
looking ok and is ray traceable.
Please let me know if you have any questions,
Matt
import math
import numpy as np
import random
def generate_sphere_points(n):
"""
Returns list of 3d coordinates of points on a sphere using the
Golden Section Spiral algorithm.
Arguments:
n -- number of points to generate
Returns:
points -- np array of the points (n x 3)
"""
points = []
inc = math.pi * (3 - math.sqrt(5))
offset = 2 / float(n)
for k in range(int(n)):
y = k * offset - 1 + (offset / 2)
r = math.sqrt(1 - y*y)
phi = k * inc
points.append([math.cos(phi)*r, y, math.sin(phi)*r])
return np.array(points) #MB
def get_neighbors(points, point, num_neighbors):
'''
Naive method for finding the nearest neighbors of a
point on a sphere of points
Arguments:
points -- list of points (numpy arrays)
point -- point of interest
num_neighbors -- number of neighbors to return
Returns:
neighbors -- list of neighboring points
'''
distances = [ [pt, np.linalg.norm(point - pt)] for pt in points]
distances = sorted(distances, key = lambda foo: foo[1])
#don't return the point itself - i.e. the first one in the list
neighbors = np.array(distances)[1:(num_neighbors + 1), 0]
return neighbors
def make_mesh(x,y,z, rad, color = [0,0,0], n = 100, num_neighbors = 6,
rand_rot = True):
'''
Draw a wire mesh sphere of radius rad centered at x,y,z
Arguments:
x,y,z -- coordinates of center of sphere
rad -- radius of the sphere
n -- number of sphere points -> density of the mesh
neighbors -- number of nearest neighbors to draw lines with
rand_rot -- boolean for whether to rotate the spheres a little.
This allows for viewing of overlapping pharmacophores
Returns:
mesh -- list of cgo floats
'''
#get the points centered at the origen
points = generate_sphere_points(n)
#expand based on the radius
points = points * rad
if rand_rot:
#generate a random amount to rotate (0 to 2*pi) around the z axis
rot = random.random() * 2*math.pi
#set up the transformation matrix
trans = np.array([[math.cos(rot), -math.sin(rot), 0, 0], \
[math.sin(rot), math.cos(rot), 0, 0], \
[0, 0, 1, 0], \
[0, 0, 0, 1] ])
#append a 1 to each coordinate vector for doing the transformation
tmppoints = [ np.array([ pt[0], pt[1], pt[2], 1]) for pt in
points ]
#apply the rotation
tmppoints = np.array([ trans.dot(pt) for pt in tmppoints ])
#Strip off the 1 that was added
points = tmppoints[:,:3]
#center them at the specified location
points = points + np.array([x,y,z])
#start building the cgo list
mesh = [LINES]
mesh.extend([COLOR, color[0], color[1], color[2]])
for point in points:
neighbors = get_neighbors(points, point, num_neighbors)
for nbr in neighbors:
mesh.extend([VERTEX, point[0], point[1], point[2]])
mesh.extend([VERTEX, nbr[0], nbr[1], nbr[2]])
return mesh
Post by Jason VertreesHi Matt,
Post by Matthew BaumgartnerSo some brief background, I am writing a pymol plugin for displaying
pharmacophores queries from ZincPharmer ( http://zincpharmer.csb.pitt.edu/),
http://sourceforge.net/projects/pharmer/files/ under the name load_query.
Sorry if that quickly turned into an advertisement, but what I would like to
On the contrary, we welcome the promotion of PyMOL extensions! They
help the community find resources we may not have known about and it
helps the developer drive usage of his or her tools -- a win-win. In
(1) Create a PyMOLWiki webpage with example code, images, and links
back to your own project page (if you have one)
(2) Email the list an enticing advertisement for your new functionality
Some people have even used PyMOLWiki page view counts in their grant
applications to show usage.
Post by Matthew Baumgartnerhttp://i.imgur.com/hiX2i.png . Where the wire mesh sphere's represent the
pharamacophores. Currently, I am using the cgo sphere's but they do not do
well when there are overlapping pharmacophores (a common case).
We are planning on adding improved graphical and text annotations to
PyMOL. So, while we cannot currently do what you want we hope to be
able to in the near future.
Last, I hesitate to suggest this because it's so unsightly, but if you
need something in the meantime that resembles a mesh sphere (but is
not exact) you can create your CGO spheres and then do,
set cgo_debug, 1
No, it won't ray trace like that either -- they'll be converted to full spheres.
Cheers,
-- Jason
Post by Matthew BaumgartnerHi Matt,
There's currently no easy way to do this. Can you please send us some
screenshots of what you'd like to see implemented?
Cheers,
-- Jason
Hi,
Is it now possible to have wire mesh cgo object spheres in pymol?
I found this thread from a while ago (2004) but googleing, I didn't
find anything more recent.
The one sort of work around that I though of was to create pseudo-atoms
and somehow modify their radius and then show them as mesh.
But I would like to use CGO objects if possible.
Does anyone have any suggestions?
Thanks,
Matt Baumgartner
Sphere transparency example included below...
ALPHA must preceed COLOR to be effective.
PyMOL does not yet do a global sort of tranparent triangles, so there will
be artifacts in OpenGL. Raytracing should look fine however.
# from within a .py OR .pym file...
from pymol.cgo import *
from pymol import cmd
obj = [
ALPHA, 1.0,
COLOR, 1.0, 1.0, 1.0,
SPHERE, 0.0, 0.0, 0.0, 0.5,
ALPHA, 0.66,
COLOR, 1.0, 0.0, 0.0,
SPHERE, 1.0, 0.0, 0.0, 0.5,
ALPHA, 0.33,
COLOR, 0.0, 1.0, 0.0,
SPHERE, 0.0, 1.0, 0.0, 0.5,
ALPHA, 0.11,
COLOR, 0.0, 0.0, 1.0,
SPHERE, 0.0, 0.0, 1.0, 0.5,
]
cmd.load_cgo(obj,'cgo01')
Warren
--
Warren L. DeLano, Ph.D.
Principal Scientist
. DeLano Scientific LLC
. 400 Oyster Point Blvd., Suite 213
. South San Francisco, CA 94080
. Biz:(650)-872-0942 Tech:(650)-872-0834
. Fax:(650)-872-0273 Cell:(650)-346-1154
-----Original Message-----
Michael George Lerner
Sent: Wednesday, November 17, 2004 9:43 AM
Subject: [PyMOL] wire-mesh spheres?
Hi,
I want to draw a bunch of spheres of various sizes and
colors. I'm currently using cgos for this. No problem.
Now, I also want to draw wire-mesh spheres. Does anyone have
a script for making these? While I'm at it, is there a way
to make cgos transparent?
Thanks,
-Michael
--
This isn't a democracy;| _ |Michael Lerner
it's a cheer-ocracy. | ASCII ribbon campaign ( ) | Michigan
-Torrence, Bring It On| - against HTML email X | Biophysics
-------------------------------------------------------
This SF.Net email is sponsored by: InterSystems CACHE FREE
OODBMS DOWNLOAD - A multidimensional database that combines
robust object and relational technologies, making it a
perfect match for Java, C++,COM, XML, ODBC and JDBC.
www.intersystems.com/match8
_______________________________________________
PyMOL-users mailing list
https://lists.sourceforge.net/lists/listinfo/pymol-users
------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
http://p.sf.net/sfu/appdyn_sfd2d_oct
_______________________________________________
Info Page: https://lists.sourceforge.net/lists/listinfo/pymol-users