Package functions :: Module jw_mf_trans
[hide private]
[frames] | no frames]

Source Code for Module functions.jw_mf_trans

  1  from Numeric import Float64, zeros 
  2  from re import match 
  3   
4 -class Jw:
5 - def __init__(self):
6 "Function for creating the model-free spectral density values using parameter transformations."
7 8
9 - def Jw(self):
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 # The value of the constant. 68 self.data.c = 1e10 69 70 # Calculate frequency independent terms (to increase speed) 71 self.initialise_jw_values() 72 73 # Initialise the spectral density values. 74 self.data.jw = zeros((self.mf.data.num_frq, 5), Float64) 75 76 # Isotropic rotational diffusion. 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 # Axially symmetric rotational diffusion. 101 elif match(self.data.diff_type, 'axail'): 102 raise NameError, "Axially symetric diffusion not implemented yet, quitting program." 103 104 # Anisotropic rotational diffusion. 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
112 - def calc_jw_iso_m13(self, i, frq_index):
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
119 - def calc_jw_iso_m24(self, i, frq_index):
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
128 - def calc_jw_iso_m5(self, i, frq_index):
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
137 - def initialise_jw_values(self):
138 "Remap the parameters in self.data.params" 139 140 # Isotropic dependent values. 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 # Diffusion independent values. 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