[chimera-dev] [Chimera-users] place fragment (again)
Eric Pettersen
pett at cgl.ucsf.edu
Tue May 4 11:58:48 PDT 2010
On May 4, 2010, at 7:44 AM, Elisabeth Ortega wrote:
> Dear all,
>
> We are trying to place a fragment in an exact position. We created a
> fragment with tetrahedral symmetry and we are trying to link an atom
> of
> other molecule at 2.00 A of the central atom of the new fragment and
> making a certain angle (120 degrees for example) with one of the
> substituents to get the correct orientation of the new fragment.
>
> Has anybody an idea that how can we do that?
Hi Elisabeth,
I think you'll find that you've under-defined the positioning -- I
think you'll need another angle and a dihedral at least to uniquely
position the fragment, but nonetheless I can provide some code to get
you pointed in the right direction. First, of course, you would use
placeFragment() to get your fragment to some (arbitrary) initial
position. The function will return a Residue that contains your
fragment's atoms. From this you can find the central atom, etc. So
let's say you've found the relevant atoms for positioning and you have
these variables:
fca = central fragment atom
fsa = fragment substituent atom (for angle positioning)
oa = atom from other atom (for distance)
r = fragment residue
--- start code ---
# make fca-oa distance 2.0 [assumes fragment in same model as other
molecule]
dv = fca.coord() - oa.coord()
dv.length = 2.0 - dv.length
for a in r.atoms:
a.setCoord(a.coord() + dv)
# make fsa-fca-oa angle 120
from chimera import cross, angle, Point, Xform
fscrd, fccrd, ocrd = [a.coord() for a in (fsa, fca, oa)]
axis = cross(fscrd-fccrd, fccrd-ocrd) # axis the rotation will be around
delta = 120.0 - angle(fscrd, fccrd, ocrd)
v = fccrd - Point(0.0, 0.0, 0.0) # rotation is about origin, so move
center atom there
trans1 = Xform.translation(v) # translation to origin
v.negate()
trans2 = Xform.translation(v) # translation back from origin
trans1.multiply(Xform.rotation(axis, delta))
trans1.multiply(trans2)
for a in r.atoms:
a.setCoord(trans1.apply(a.coord()))
--- end code ---
If your initial positioning of the fragment places the center atom in
the proper direction from the other molecule atom you may be able to
get away with only one angle (may still need a dihedral though).
I am working on a function for bonding molecules together that would
have been helpful here but it isn't done yet (the partially-completed
function is bind() which you can look at in BuildStructure/
__init__.py). Also, I cc'ed chimera-dev on this and redirected
replies there since this is pretty programming intensive. Good luck
and don't hesitate to ask more questions.
--Eric
Eric Pettersen
UCSF Computer Graphics Lab
http://www.cgl.ucsf.edu
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://plato.cgl.ucsf.edu/pipermail/chimera-dev/attachments/20100504/3012f60b/attachment.html>
More information about the Chimera-dev
mailing list