1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 from numpy import array, dot, float64, transpose
24
25
26 from lib.structure.geometric import generate_vector_dist, generate_vector_residues
27
28
29 -def diffusion_tensor(mol=None, tensor=None, tensor_diag=None, diff_type=None, rotation=None, axes=None, sim_axes=None, com=None, scale=1.8e-6):
30 """Create the structural representation of the diffusion tensor.
31
32 @keyword mol: The molecule container.
33 @type mol: MolContainer instance
34 @keyword tensor: The diffusion tensor.
35 @type tensor: numpy rank-2, 3D array
36 @keyword tensor_diag: The diagonalised diffusion tensor in tensor frame.
37 @type tensor_diag: numpy rank-2, 3D array
38 @keyword diff_type: The type of diffusion tensor. This can be one of 'sphere', 'oblate', 'prolate', 'ellipsoid'.
39 @type diff_type: str
40 @keyword rotation: The diffusion tensor rotation matrix.
41 @type rotation: numpy rank-2, 3D array
42 @keyword axes: The axis system of the tensor. For the spheroids this is one vector, for the ellipsoid it should be three vectors.
43 @type axes: list of numpy rank-1, 3D arrays
44 @keyword sim_axes: The axis systems of the tensor for each simulation. For the spheroids this is one vector, for the ellipsoid it should be three vectors. The first dimension is the axis type (x, y, or z), the second is the simulation, and the third is the vector.
45 @type sim_axes: None or list of lists of numpy rank-1, 3D arrays
46 @keyword com: The centre of mass of the diffusion structure.
47 @type com: numpy rank-1, 3D array
48 @keyword scale: The scaling factor for the diffusion tensor.
49 @type scale: float
50 """
51
52
53
54
55
56 res_num = 1
57
58
59 mol.atom_add(pdb_record='HETATM', atom_num=1, atom_name='R', res_name='COM', res_num=res_num, pos=com, segment_id=None, element='C')
60
61
62 res_num = res_num + 1
63
64
65
66
67
68
69 print("\nGenerating the geometric object.")
70
71
72 if diff_type == 'prolate':
73
74 z_rot = array([[ 0, -1, 0],
75 [ 1, 0, 0],
76 [ 0, 0, 1]], float64)
77
78
79 rotation = dot(transpose(rotation), z_rot)
80 tensor = dot(z_rot, dot(tensor_diag, transpose(z_rot)))
81 tensor = dot(rotation, dot(tensor, transpose(rotation)))
82
83
84 if diff_type == 'oblate':
85
86 y_rot = array([[ 0, 0, 1],
87 [ 0, 1, 0],
88 [ -1, 0, 0]], float64)
89
90
91 rotation = dot(transpose(rotation), y_rot)
92 tensor = dot(y_rot, dot(tensor_diag, transpose(y_rot)))
93 tensor = dot(rotation, dot(tensor, transpose(rotation)))
94
95
96 generate_vector_dist(mol=mol, res_name='TNS', res_num=res_num, centre=com, R=rotation, warp=tensor, scale=scale, inc=20)
97
98
99 res_num = res_num + 1
100
101
102
103
104
105
106 if diff_type in ['oblate', 'prolate']:
107
108 print("\nGenerating the unique axis of the diffusion tensor.")
109 print(" Scaling factor: " + repr(scale))
110
111
112 res_num = generate_vector_residues(mol=mol, vector=axes[0], atom_name='Dpar', res_name_vect='AXS', sim_vectors=sim_axes[0], res_num=res_num, origin=com, scale=scale, neg=True)
113
114
115
116 if diff_type == 'ellipsoid':
117
118 print("Generating the three axes of the ellipsoid.")
119 print(" Scaling factor: " + repr(scale))
120
121
122 res_num = generate_vector_residues(mol=mol, vector=axes[0], atom_name='Dx', res_name_vect='AXS', sim_vectors=sim_axes[0], res_num=res_num, origin=com, scale=scale, neg=True)
123 res_num = generate_vector_residues(mol=mol, vector=axes[1], atom_name='Dy', res_name_vect='AXS', sim_vectors=sim_axes[1], res_num=res_num, origin=com, scale=scale, neg=True)
124 res_num = generate_vector_residues(mol=mol, vector=axes[2], atom_name='Dz', res_name_vect='AXS', sim_vectors=sim_axes[2], res_num=res_num, origin=com, scale=scale, neg=True)
125