Thanks very much Thomas for your help.

> no need to implement common linear algebra functions, there is the
> chempy.cpv module shipped with pymol (and there is numpy as well).
>
> Ramiro, I recently did something similar, just adjust the residue
> selection in the code below (requires numpy):
>

I have pymol compiled with numpy support, so I have everyhting needed.
However, please excuse my ignorance in this matter, as I'm just
beginning to use pymol and have some basic questions:

* How do I adjust the code with my selected rings? Do I need to include
both residues in the same selection in pymol, then rename the selection,
and then include the chosen selection name in the code where you write
"selection"?

* How do I run the code after I adjust it with my "selection"? I have
never run a python program from within pymol. What should I do?

Thanks in advance.

> python
> from chempy import cpv
> import numpy, math
> def plane_normal(selection):
>     stored.x = list()
>     cmd.iterate_state(-1, selection, 'stored.x.append([x,y,z])')
>     x = numpy.array(stored.x)
>     U,s,Vh = numpy.linalg.svd(x - x.mean(0))
>     return cpv.normalize(Vh[2])
> dir1 = plane_normal('A/37/CG+CD1+CE1+CZ+CE2+CD2')
> dir2 = plane_normal('A/41/CG+CD1+CE1+CZ+CE2+CD2')
> print 'Angle in degrees:', math.degrees(cpv.get_angle(dir1, dir2))
> python end
>
> Cheers,
>   Thomas
>
> On Thu, 2010-09-23 at 13:02 +0200, Tsjerk Wassenaar wrote:
>> Hi Ramiro,
>>
>> A bit of linear algebra wouldn't hurt... :p
>> In python:
>>
>> def vsub(a,b): return a[0]-b[0], a[1]-b[1], a[2]-b[2]
>>
>> def dot(a,b): return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]
>>
>> def svmul(s,a): return s*a[0], s*a[1], s*a[2]
>>
>> def normalize(a): return svmul(1/math.sqrt(dot(a,a)),a)
>>
>> def cross(a,b): return a[1]*b[2]-a[2]*b[1], a[2]*b[0]-a[0]*b[2],
>> a[0]*b[1]-a[1]*b[0]
>>
>> a = cmd.get_model('r. phe and i. ##RESIDUE1## and n. cg,ce1,ce2').atom
>> a = [ i.coord for i in a ]
>> b = cmd.get_model('r. phe and i. ##RESIDUE2## and n. cg,ce1,ce2').atom
>> b = [ i.coord for i in b ]
>>
>> na = normalize(cross(vsub(a[1],a[0]),vsub(a[2],a[0])))
>> nb = normalize(cross(vsub(b[1],b[0]),vsub(b[2],b[0])))
>> angle = math.acos(dot(na,nb))
>>
>> print angle
>>
>> ###
>>
>> Haven't tested it, and there may be more efficient ways of getting the
>> coordinates. If you run into problems like this more often, it's
>> likely that you should pick up on algebra and programming... :)
>>
>> Have fun,
>>
>> Tsjerk
>>
>>
>> On Thu, Sep 23, 2010 at 12:19 PM, Ramiro Téllez Sanz
>> <urcind...@gmail.com> wrote:
>>>  Thanks for your kind help, Tsjerk.
>>>
>>>> Hi Ramiro,
>>>>
>>>> Assuming your rings are nicely planar, and representing the ring as:
>>>>
>>>> 1-2-3
>>>> |     |
>>>> 6-5-4
>>>>
>>>> you can get the plane normal vector as the vector cross product from
>>>> (3)-(1) and (5)-(1).
>>> OK. But I just started to use pymol. Which are the commands to do so?
>>> I know how to get the coordinates of a selected atom, but need the pymol
>>> commands to treat the data:
>>> a) How to create the vectors from 1->3 and from 1->5
>>> b) How to treat the vectors to perform the vector cross product
>>>
>>>> Doing so for both rings gives you the two normal vectors. The angle
>>>> then follows from the dot product of the (normalized) normal vectors:
>>>>
>>>> angle = acos(n1 . n2)
>>> Again, I would need the commands to:
>>> c) Normalize the vectors (how to set their modules = 1)
>>>
>>> I also guess n1 and n2 represent the normalized vectors, don't they? So
>>> this command is very clear :)
>>>
>>>> It becomes a bit more elaborate if the planes are not planar :)
>>>>
>>>> Hope it helps,
>>>>
>>>> Tsjerk
>>> Again, thanks very much in advance for your kind help.
>>>
>>>> On Thu, Sep 23, 2010 at 10:53 AM, Ramiro Téllez Sanz
>>>> <urcind...@gmail.com> wrote:
>>>>> Hi everyone and thanks for reading this!
>>>>>
>>>>> I am interested in measuring the angle between aromatic ring planes.
>>>>> Is there any easy way/script to do it?
>>>>>
>>>>> One way that came to my mind is creating a pseudoatom representing the
>>>>> centroid for each ring (I already know how to do that), then drawing two
>>>>> lines perpendicularly to the planes from both centroids, and finally
>>>>> measuring the angle between the lines. Will that be possible? How could
>>>>> this be done?
>>>>>
>>>>> Is there any other way? I'm completely clueless. Any help will be
>>>>> greatly appreciated.
>>>>>
>>>>> Thanks in advance,
>>>>>
>>>>> Ramiro Tellez Sanz
>>>>> Dept. Physical Chemistry
>>>>> University of Almeria
>>>>> Spain
>>
>> -- 
>> Tsjerk A. Wassenaar, Ph.D.
>>
>> post-doctoral researcher
>> Molecular Dynamics Group
>> Groningen Institute for Biomolecular Research and Biotechnology /
>> University of Groningen
>> The Netherlands


------------------------------------------------------------------------------
Start uncovering the many advantages of virtual appliances
and start using them to simplify application deployment and
accelerate your shift to cloud computing.
http://p.sf.net/sfu/novell-sfdev2dev
_______________________________________________
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

Reply via email to