Scripts: orient.py

File orient.py, 1.2 KB (added by pett, 14 years ago)
Line 
1from chimera import openModels, Molecule, UserError, numpyArrayFromAtoms
2for 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))