1 from Numeric import Float64, zeros
2 from re import match
3
6 "Function for creating the model-free spectral density values using parameter transformations."
7
8
10 """Function to create the model-free spectral density values using parameter transformations."
11
12 The spectral density equation
13 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
14
15 Data structure: self.data.jw
16 Dimension: 2D, (number of NMR frequencies, 5 spectral density frequencies)
17 Type: Numeric matrix, Float64
18 Dependencies: None
19 Required by: self.data.ri, self.data.dri, self.data.d2ri
20
21
22 Formulae
23 ~~~~~~~~
24
25 Parameter transformations
26 ~~~~~~~~~~~~~~~~~~~~~~~~~
27 ae = c.te
28
29 af = c.tf
30
31 as = c.ts
32
33
34 therefore:
35
36 tm.ae
37 te' = ---------
38 ae + c.tm
39
40 tm.af
41 tf' = ---------
42 af + c.tm
43
44 tm.as
45 ts' = ---------
46 as + c.tm
47
48
49 Original
50 ~~~~~~~~
51
52 2.tm / S2 (1 - S2)(ae + c.tm) . ae \
53 J(w) = ---- | ------------- + ----------------------------- |
54 5 \ 1 + (w.tm)**2 (ae + c.tm)**2 + (w.tm.ae)**2 /
55
56
57 Extended
58 ~~~~~~~~
59
60 2.tm / S2 (1 - S2f)(af + c.tm) . af (S2f - S2)(as + c.tm) . as \
61 J(w) = ---- | ------------- + ----------------------------- + ----------------------------- |
62 5 \ 1 + (w.tm)**2 (af + c.tm)**2 + (w.tm.af)**2 (as + c.tm)**2 + (w.tm.as)**2 /
63
64
65 """
66
67
68 self.data.c = 1e10
69
70
71 self.initialise_jw_values()
72
73
74 self.data.jw = zeros((self.mf.data.num_frq, 5), Float64)
75
76
77 if match(self.data.diff_type, 'iso'):
78 if match('m[13]', self.data.model):
79 for i in range(self.mf.data.num_frq):
80 self.data.jw[i, 0] = self.calc_jw_iso_m13(i, 0)
81 self.data.jw[i, 1] = self.calc_jw_iso_m13(i, 1)
82 self.data.jw[i, 2] = self.calc_jw_iso_m13(i, 2)
83 self.data.jw[i, 3] = self.calc_jw_iso_m13(i, 3)
84 self.data.jw[i, 4] = self.calc_jw_iso_m13(i, 4)
85 elif match('m[24]', self.data.model):
86 for i in range(self.mf.data.num_frq):
87 self.data.jw[i, 0] = self.calc_jw_iso_m24(i, 0)
88 self.data.jw[i, 1] = self.calc_jw_iso_m24(i, 1)
89 self.data.jw[i, 2] = self.calc_jw_iso_m24(i, 2)
90 self.data.jw[i, 3] = self.calc_jw_iso_m24(i, 3)
91 self.data.jw[i, 4] = self.calc_jw_iso_m24(i, 4)
92 elif match('m5', self.data.model):
93 for i in range(self.mf.data.num_frq):
94 self.data.jw[i, 0] = self.calc_jw_iso_m5(i, 0)
95 self.data.jw[i, 1] = self.calc_jw_iso_m5(i, 1)
96 self.data.jw[i, 2] = self.calc_jw_iso_m5(i, 2)
97 self.data.jw[i, 3] = self.calc_jw_iso_m5(i, 3)
98 self.data.jw[i, 4] = self.calc_jw_iso_m5(i, 4)
99
100
101 elif match(self.data.diff_type, 'axail'):
102 raise NameError, "Axially symetric diffusion not implemented yet, quitting program."
103
104
105 elif match(self.data.diff_type, 'aniso'):
106 raise NameError, "Anisotropic diffusion not implemented yet, quitting program."
107
108 else:
109 raise NameError, "Diffusion type set incorrectly, quitting program."
110
111
113 "Calculate the model 1 and 3 spectral density values for isotropic rotational diffusion."
114
115 temp = 0.4 * self.data.tm * (self.data.s2 / (1.0 + self.data.omega_tm_sqrd[i, frq_index]))
116 return temp
117
118
120 "Calculate the model 2 and 4 spectral density values for isotropic rotational diffusion."
121
122 a = self.data.s2 / (1.0 + self.data.omega_tm_sqrd[i, frq_index])
123 b = (1.0 - self.data.s2) * self.data.ae_plus_c_tm * self.data.ae / (self.data.ae_plus_c_tm_sqrd + self.data.omega_tm_ae_sqrd[i, frq_index])
124 temp = 0.4 * self.data.tm * (a + b)
125 return temp
126
127
129 "Calculate the model 5 spectral density values for isotropic rotational diffusion."
130
131 a = self.data.s2s / (1.0 + self.data.omega_tm_sqrd[i, frq_index])
132 b = (1.0 - self.data.s2s) * self.data.as_plus_c_tm * self.data.as / (self.data.as_plus_c_tm_sqrd + self.data.omega_tm_as_sqrd[i, frq_index])
133 temp = 0.4 * self.data.tm * self.data.s2f * (a + b)
134 return temp
135
136
138 "Remap the parameters in self.data.params"
139
140
141 if match(self.data.diff_type, 'iso'):
142 self.data.tm = self.data.diff_params
143 self.data.tm_sqrd = self.data.tm ** 2
144 self.data.omega_tm_sqrd = zeros((self.mf.data.num_frq, 5), Float64)
145
146
147 if match('m[13]', self.data.model):
148 self.data.s2 = self.data.params[0]
149
150 elif match('m[24]', self.data.model):
151 self.data.s2 = self.data.params[0]
152 self.data.ae = self.data.params[1]
153 self.data.ae_plus_c_tm = self.data.ae + self.data.c * self.data.tm
154 self.data.ae_plus_c_tm_sqrd = self.data.ae_plus_c_tm ** 2
155 self.data.omega_tm_ae_sqrd = zeros((self.mf.data.num_frq, 5), Float64)
156
157 elif match('m5', self.data.model):
158 self.data.s2f = self.data.params[0]
159 self.data.s2s = self.data.params[1]
160 self.data.s2 = self.data.s2f * self.data.s2s
161 self.data.as = self.data.params[2]
162 self.data.as_plus_c_tm = self.data.as + self.data.c * self.data.tm
163 self.data.as_plus_c_tm_sqrd = self.data.as_plus_c_tm ** 2
164 self.data.omega_tm_as_sqrd = zeros((self.mf.data.num_frq, 5), Float64)
165
166 for i in range(self.mf.data.num_frq):
167 for frq_index in range(5):
168 self.data.omega_tm_sqrd[i, frq_index] = self.mf.data.frq_sqrd_list[i][frq_index] * self.data.tm_sqrd
169 if match('m[24]', self.data.model):
170 self.data.omega_tm_ae_sqrd[i, frq_index] = (self.mf.data.frq_list[i][frq_index] * self.data.tm * self.data.ae)**2
171 elif match('m5', self.data.model):
172 self.data.omega_tm_as_sqrd[i, frq_index] = (self.mf.data.frq_list[i][frq_index] * self.data.tm * self.data.as)**2
173