| 1 | from chimera import openModels, Molecule, UserError, numpyArrayFromAtoms
|
|---|
| 2 | for mol in openModels.list(modelTypes=[Molecule]):
|
|---|
| 3 | coords = numpyArrayFromAtoms(mol.atoms, xformed=True)
|
|---|
| 4 | from StructMeasure import bestLine
|
|---|
| 5 | centroidPt, majorVec, centroidArray, majorArray, centered, vals, vecs = \
|
|---|
| 6 | bestLine(coords)
|
|---|
| 7 | sortableVecs = zip(vals, vecs)
|
|---|
| 8 | sortableVecs.sort()
|
|---|
| 9 | sortableVecs.reverse()
|
|---|
| 10 |
|
|---|
| 11 | from chimera import Xform, Point, cross, angle, Vector
|
|---|
| 12 | openState = mol.openState
|
|---|
| 13 | toOrigin = Point() - centroidPt
|
|---|
| 14 | sv1, sv2 = sortableVecs[0][1], sortableVecs[1][1]
|
|---|
| 15 | v1 = Vector(*sv1)
|
|---|
| 16 | v2 = Vector(*sv2)
|
|---|
| 17 | openState.globalXform(Xform.translation(toOrigin))
|
|---|
| 18 | # major axis onto Y
|
|---|
| 19 | y_axis = Vector(0.0, 1.0, 0.0)
|
|---|
| 20 | delta = angle(y_axis, v1)
|
|---|
| 21 | if abs(delta) > 0.001 and abs(180.0 - delta) > 0.001:
|
|---|
| 22 | rotAxis = cross(y_axis, v1)
|
|---|
| 23 | rot = Xform.rotation(rotAxis, -delta)
|
|---|
| 24 | openState.globalXform(rot)
|
|---|
| 25 | rv2 = rot.apply(v2)
|
|---|
| 26 | else:
|
|---|
| 27 | rv2 = v2
|
|---|
| 28 |
|
|---|
| 29 | # second axis onto X
|
|---|
| 30 | x_axis = Vector(1.0, 0.0, 0.0)
|
|---|
| 31 | delta = angle(x_axis, rv2)
|
|---|
| 32 | if abs(delta) > 0.001 and abs(180.0 - delta) > 0.001:
|
|---|
| 33 | rotAxis = cross(x_axis, rv2)
|
|---|
| 34 | rot = Xform.rotation(rotAxis, -delta)
|
|---|
| 35 | openState.globalXform(rot)
|
|---|
| 36 | openState.globalXform(Xform.translation(-toOrigin))
|
|---|