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
On 10/25/2012 09:54 AM, Jason Vertrees wrote:
> Hi Matt,
>
>> So some brief background, I am writing a pymol plugin for displaying
>> pharmacophores queries from ZincPharmer ( http://zincpharmer.csb.pitt.edu/),
>> which is developed in my lab. Version 1 of my plugin is available here:
>> 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
> fact, the best way to promote a new script/plugin is to:
> (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.
>
>
>> be able to reproduce in pymol is something like this:
>> http://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
>
>
>
>> Hi 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
>>
>> On Tue, Oct 23, 2012 at 4:16 PM, Matthew Baumgartner <[email protected]> wrote:
>>
>> 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')
>>
>> Cheers,[email protected]
>> 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
>> . mailto:[email protected]
>>
>>
>> -----Original Message-----
>> From: [email protected]
>> [mailto:[email protected]] On Behalf Of
>> Michael George Lerner
>> Sent: Wednesday, November 17, 2004 9:43 AM
>> To: [email protected]
>> 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
>> | / \ | mler...@umich
>>
>>
>> -------------------------------------------------------
>> 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
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/pymol-users
>>
>>
>>
>> ------------------------------------------------------------------------------
>> Everyone hates slow websites. So do we.
>> Make your web apps faster with AppDynamics
>> Download AppDynamics Lite for free today:
>> http://p.sf.net/sfu/appdyn_sfd2d_oct
>> _______________________________________________
>> PyMOL-users mailing list ([email protected])
>> Info Page: https://lists.sourceforge.net/lists/listinfo/pymol-users
>> Archives: http://www.mail-archive.com/[email protected]
>>
>>
>>
>
>
------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_sfd2d_oct
_______________________________________________
PyMOL-users mailing list ([email protected])
Info Page: https://lists.sourceforge.net/lists/listinfo/pymol-users
Archives: http://www.mail-archive.com/[email protected]