Author: bugman Date: Thu Nov 18 18:25:51 2010 New Revision: 11683 URL: http://svn.gna.org/viewcvs/relax?rev=11683&view=rev Log: Fix for the ellipsoid eigenvalue and rotation matrix reordering for when 2 eigenvalues are the same. This only affects the (Dxx, Dyy, Dzz, Dxy, Dxz, Dyz) parameter input into diffusion_tensor.init(). Modified: 1.3/generic_fns/diffusion_tensor.py Modified: 1.3/generic_fns/diffusion_tensor.py URL: http://svn.gna.org/viewcvs/relax/1.3/generic_fns/diffusion_tensor.py?rev=11683&r1=11682&r2=11683&view=diff ============================================================================== --- 1.3/generic_fns/diffusion_tensor.py (original) +++ 1.3/generic_fns/diffusion_tensor.py Thu Nov 18 18:25:51 2010 @@ -28,6 +28,7 @@ from math import cos, pi, sin from numpy import cross, float64, transpose, zeros from numpy.linalg import eig, norm +from operator import itemgetter from re import search # relax module imports. @@ -373,19 +374,26 @@ Di, R = eig(tensor) # Reordering structure. + tup_struct = [] + for i in range(3): + tup_struct.append((i, Di[i])) + + # The indices. + reorder_data = sorted(tup_struct, key=itemgetter(1)) reorder = zeros(3, int) - Di_sort = sorted(Di) - Di = Di.tolist() + Di_sort = zeros(3, int) + for i in range(3): + reorder[i], Di_sort[i] = reorder_data[i] + + # Reorder columns. R_new = zeros((3, 3), float64) - - # Reorder columns. for i in range(3): - R_new[:, i] = R[:, Di.index(Di_sort[i])] + R_new[:, i] = R[:, reorder[i]] # Switch from the left handed to right handed universes (if needed). if norm(cross(R_new[:, 0], R_new[:, 1]) - R_new[:, 2]) > 1e-7: R_new[:, 2] = -R_new[:, 2] - + # Reverse the rotation. R_new = transpose(R_new)