Hello Tsjerk,

I can use the function and commands. print clipped("clipsed") - but not print clipped("3lzt") - shows the indices of the atoms between the clipping planes

Tsjerk Wassenaar wrote:
Hi Johannes,

Coincidentally, I found myself in need of the same functionality the
other day. I came up with this:


 from pymol import cmd

def clipped_by(at,v):
    x,y,z = at.coord
    nz = v[2]*(x-v[12])+v[5]*(y-v[13])+v[8]*(z-v[14])-v[11]
    return nz > v[15] and nz < v[16]

ATTENTION: The rotation matrix is in column-major order - that's understandable. Hence by multiplying with v[2], v[5] and v[8], you multiply the third column - not row! - with the coordinate vector, in order to get the rotated z-component. The matrix seems to be transposed. For me that is very unusual. In my R script, I made ordinary matrix multiplication and got erroneous results.

def clipped(selection="all",state=1):
    v = cmd.get_view()
    return [ i.id for i in cmd.get_model(selection,state).atom if
clipped_by(i,v) ]


The function 'clipped' returns a list of IDs for atoms from a given
selection that are outside the clipping planes. You can use it like:
The function returns the atoms inside the planes.

run clipped.py
fetch 3lzt,async=0
clip near,-30
show spheres, not clipsed
Hence show spheres, clipsed reproduces the selection by a previous slab.

Thank you very much.


On Wed, Mar 2, 2011 at 5:27 PM, Johannes Wollbold <jwollbold@gmx.de> wrote:

I implemented the coordinate transformation and the selection of atoms
outside PyMol, in R. In principle it works, but there seems to be some
error, since too many atoms are selected, corresponding roughly, but not
completely to an enlarged clipping corridor between the planes defined by
get_view, matrix elements (6,1) and (6,2).  Or could it be that not the
complete slab is visualized in PyMol? However, the missing atoms are
completely shadowed.

Do I understand the rows of the view matrix well (see
http://www.pymolwiki.org/index.php/Get_View), by computing the following
coordinate transformation?:
1) Translation of the original pdb coordinates by subtracting row 5 of the
view matrix (translation of the coordinate origin to the rotation center).
2) Rotation of the coordinates by rows 1-3 of the view matrix.
3) Test: view[4,3] + view[6,1]) <= z <= view[4,3] + view[6,2].

Sorry for this simple question of affine geometry, but I hope I did not make
a logical mistake in this domain...


Tsjerk Wassenaar wrote:

Hi Johannes,

It's not that hard. The clipping planes are defined by the z coordinate (in
the viewing matrix). So you can get the atoms for a selection, transform to
get the new z coordinate only, and check whether it's in between the planes:

m = cmd.get_model(selection).atom
v = cmd.get_view()
m = [ i for i in m if clipped(i,v) ]

So clipped should do the transform and check whether the atom is clipped.
The trick then is to turn m back into a selection.

Hope it helps,


On Feb 25, 2011 5:18 PM, "Johannes Wollbold" <jwollbold@gmx.de> wrote:

Jason Vertrees wrote: > Having said this, you can however, can get the
clipping information > from P...

Hi Jason,

thank you again for the hint. First I looked if I can select atoms
according to their coordinates, or store new coordinates after a
rotation / shift. But implicitly you already said that such
functionalities are not yet implemented. If clipping is performed with
the original camera view, the task is simple. get_view gives the output
(see above link to the help page):

set_view (\
    1.000000000,    0.000000000,    0.000000000,\
    0.000000000,    1.000000000,    0.000000000,\
    0.000000000,    0.000000000,    1.000000000,\
    0.000000000,    0.000000000, -320.337890625,\
   74.147140503,   74.174217224,   74.123344421,\
  317.145324707,  323.530487061,  -20.000000000 )

According to (4,3), the camera is shifted by -320 A in z direction only.
Since (6,1) and (6,2) indicate the camera distances of the slab planes,
I can select, in the pdb file, the atoms with (74 - 320 + 317 ) <= z <=
(74 - 320 + 323).

For different views, coordinate transformations with the rotation matrix
of the first 3 lines are needed. This should not be very difficult, but
perhaps somebody has already a solution?

Best regards

On Thu, Feb 24, 2011 at 3:50 AM, Johannes Wollbold <jwollbold@gmx.de>
wrote: > >> Hello, >> >>...
Free Software Download: Index, Search & Analyze Logs and other IT data in
Real-Time with Splunk. Collect, index and harness all the fast moving IT
generated by your applications, servers and devices whether physical,
or in the cloud. Deliver compliance at lower cost and gain new business
insights. http://p.sf.net/sfu/splunk-dev2dev
PyMOL-users mailing list (PyMOL-users@lists.sourceforge.net)
Info Page: https://lists.sourceforge.net/lists/listinfo/pymol-users
Archives: http://www.mail-archive.com/pymol-users@lists.sourceforge.net