1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 from math import pi
25 from numpy import dot, float64, ones, sum, transpose, zeros
26
27
28 from lib.auto_relaxation.ri import calc_noe, calc_dnoe, calc_d2noe, calc_r1, calc_dr1, calc_d2r1, extract_r1, extract_dr1, extract_d2r1
29 from lib.auto_relaxation.ri_comps import ri_comps, ri_comps_rex, ri_comps_r, ri_comps_csa, ri_comps_r_csa, ri_comps_r_rex, ri_comps_csa_rex, ri_comps_r_csa_rex, dri_comps, dri_comps_rex, dri_comps_r, dri_comps_csa, dri_comps_r_csa, dri_comps_r_rex, dri_comps_csa_rex, dri_comps_r_csa_rex, d2ri_comps, d2ri_comps_r, d2ri_comps_csa, d2ri_comps_r_csa, calc_fixed_dip, calc_fixed_csa, comp_dip_const_func, comp_csa_const_func, comp_rex_const_func, comp_rex_const_grad, comp_r2_dip_const, comp_r1_csa_const, comp_r2_csa_const, comp_r1_dip_jw, comp_r2_dip_jw, comp_sigma_noe_dip_jw, comp_r1_csa_jw, comp_r2_csa_jw
30 from lib.auto_relaxation.ri_prime import func_ri_prime, func_ri_prime_rex, func_dri_djw_prime, func_dri_drex_prime, func_dri_dr_prime, func_dri_dcsa_prime, func_d2ri_djwidjwj_prime, func_d2ri_djwdcsa_prime, func_d2ri_djwdr_prime, func_d2ri_dcsa2_prime, func_d2ri_dr2_prime
31 from lib.diffusion.correlation_time import calc_sphere_ti, calc_sphere_dti, calc_spheroid_ti, calc_spheroid_dti, calc_spheroid_d2ti, calc_ellipsoid_ti, calc_ellipsoid_dti, calc_ellipsoid_d2ti
32 from lib.diffusion.direction_cosine import calc_ellipsoid_di, calc_ellipsoid_ddi, calc_ellipsoid_d2di, calc_spheroid_di, calc_spheroid_ddi, calc_spheroid_d2di
33 from lib.diffusion.weights import calc_sphere_ci, calc_spheroid_ci, calc_spheroid_dci, calc_spheroid_d2ci, calc_ellipsoid_ci, calc_ellipsoid_dci, calc_ellipsoid_d2ci
34 from lib.errors import RelaxError
35 from lib.spectral_densities.model_free import calc_jw, calc_S2_jw, calc_S2_te_jw, calc_S2f_S2_ts_jw, calc_S2f_tf_S2_ts_jw, calc_S2f_S2s_ts_jw, calc_S2f_tf_S2s_ts_jw, calc_diff_djw_dGj, calc_ellipsoid_djw_dGj, calc_diff_S2_djw_dGj, calc_ellipsoid_S2_djw_dGj, calc_diff_S2_te_djw_dGj, calc_ellipsoid_S2_te_djw_dGj, calc_diff_djw_dOj, calc_diff_S2_djw_dOj, calc_diff_S2_te_djw_dOj, calc_S2_djw_dS2, calc_S2_te_djw_dS2, calc_S2_te_djw_dte, calc_diff_S2f_S2_ts_djw_dGj, calc_ellipsoid_S2f_S2_ts_djw_dGj, calc_diff_S2f_tf_S2_ts_djw_dGj, calc_ellipsoid_S2f_tf_S2_ts_djw_dGj, calc_diff_S2f_S2_ts_djw_dOj, calc_diff_S2f_tf_S2_ts_djw_dOj, calc_S2f_S2_ts_djw_dS2, calc_S2f_S2_ts_djw_dS2f, calc_S2f_tf_S2_ts_djw_dS2f, calc_S2f_tf_S2_ts_djw_dtf, calc_S2f_S2_ts_djw_dts, calc_diff_S2f_S2s_ts_djw_dGj, calc_ellipsoid_S2f_S2s_ts_djw_dGj, calc_diff_S2f_tf_S2s_ts_djw_dGj, calc_ellipsoid_S2f_tf_S2s_ts_djw_dGj, calc_diff_S2f_S2s_ts_djw_dOj, calc_diff_S2f_tf_S2s_ts_djw_dOj, calc_S2f_S2s_ts_djw_dS2f, calc_S2f_tf_S2s_ts_djw_dS2f, calc_S2f_tf_S2s_ts_djw_dS2s, calc_S2f_tf_S2s_ts_djw_dtf, calc_S2f_S2s_ts_djw_dts, calc_diff_d2jw_dGjdGk, calc_ellipsoid_d2jw_dGjdGk, calc_diff_S2_d2jw_dGjdGk, calc_ellipsoid_S2_d2jw_dGjdGk, calc_diff_S2_te_d2jw_dGjdGk, calc_ellipsoid_S2_te_d2jw_dGjdGk, calc_diff_d2jw_dGjdOj, calc_ellipsoid_d2jw_dGjdOj, calc_diff_S2_d2jw_dGjdOj, calc_ellipsoid_S2_d2jw_dGjdOj, calc_diff_S2_te_d2jw_dGjdOj, calc_ellipsoid_S2_te_d2jw_dGjdOj, calc_diff_S2_d2jw_dGjdS2, calc_ellipsoid_S2_d2jw_dGjdS2, calc_diff_S2_te_d2jw_dGjdS2, calc_ellipsoid_S2_te_d2jw_dGjdS2, calc_diff_S2_te_d2jw_dGjdte, calc_ellipsoid_S2_te_d2jw_dGjdte, calc_diff_d2jw_dOjdOk, calc_diff_S2_d2jw_dOjdOk, calc_diff_S2_te_d2jw_dOjdOk, calc_diff_S2_d2jw_dOjdS2, calc_diff_S2_te_d2jw_dOjdS2, calc_diff_S2_te_d2jw_dOjdte, calc_S2_te_d2jw_dS2dte, calc_S2_te_d2jw_dte2, calc_diff_S2f_S2_ts_d2jw_dGjdGk, calc_ellipsoid_S2f_S2_ts_d2jw_dGjdGk, calc_diff_S2f_tf_S2_ts_d2jw_dGjdGk, calc_ellipsoid_S2f_tf_S2_ts_d2jw_dGjdGk, calc_diff_S2f_S2_ts_d2jw_dGjdOj, calc_ellipsoid_S2f_S2_ts_d2jw_dGjdOj, calc_diff_S2f_tf_S2_ts_d2jw_dGjdOj, calc_ellipsoid_S2f_tf_S2_ts_d2jw_dGjdOj, calc_diff_S2f_S2_ts_d2jw_dGjdS2, calc_ellipsoid_S2f_S2_ts_d2jw_dGjdS2, calc_diff_S2f_S2_ts_d2jw_dGjdS2f, calc_ellipsoid_S2f_S2_ts_d2jw_dGjdS2f, calc_diff_S2f_tf_S2_ts_d2jw_dGjdS2f, calc_ellipsoid_S2f_tf_S2_ts_d2jw_dGjdS2f, calc_diff_S2f_tf_S2_ts_d2jw_dGjdtf, calc_ellipsoid_S2f_tf_S2_ts_d2jw_dGjdtf, calc_diff_S2f_S2_ts_d2jw_dGjdts, calc_ellipsoid_S2f_S2_ts_d2jw_dGjdts, calc_diff_S2f_S2_ts_d2jw_dOjdOk, calc_diff_S2f_tf_S2_ts_d2jw_dOjdOk, calc_diff_S2f_S2_ts_d2jw_dOjdS2, calc_diff_S2f_S2_ts_d2jw_dOjdS2f, calc_diff_S2f_tf_S2_ts_d2jw_dOjdS2f, calc_diff_S2f_tf_S2_ts_d2jw_dOjdtf, calc_diff_S2f_S2_ts_d2jw_dOjdts, calc_S2f_S2_ts_d2jw_dS2dts, calc_S2f_tf_S2_ts_d2jw_dS2fdtf, calc_S2f_S2_ts_d2jw_dS2fdts, calc_S2f_tf_S2_ts_d2jw_dtf2, calc_S2f_S2_ts_d2jw_dts2, calc_diff_S2f_S2s_ts_d2jw_dGjdGk, calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdGk, calc_diff_S2f_tf_S2s_ts_d2jw_dGjdGk, calc_ellipsoid_S2f_tf_S2s_ts_d2jw_dGjdGk, calc_diff_S2f_S2s_ts_d2jw_dGjdOj, calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdOj, calc_diff_S2f_tf_S2s_ts_d2jw_dGjdOj, calc_ellipsoid_S2f_tf_S2s_ts_d2jw_dGjdOj, calc_diff_S2f_S2s_ts_d2jw_dGjdS2f, calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdS2f, calc_diff_S2f_tf_S2s_ts_d2jw_dGjdS2f, calc_ellipsoid_S2f_tf_S2s_ts_d2jw_dGjdS2f, calc_diff_S2f_S2s_ts_d2jw_dGjdS2s, calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdS2s, calc_diff_S2f_tf_S2s_ts_d2jw_dGjdtf, calc_ellipsoid_S2f_tf_S2s_ts_d2jw_dGjdtf, calc_diff_S2f_S2s_ts_d2jw_dGjdts, calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdts, calc_diff_S2f_S2s_ts_d2jw_dOjdOk, calc_diff_S2f_tf_S2s_ts_d2jw_dOjdOk, calc_diff_S2f_S2s_ts_d2jw_dOjdS2f, calc_diff_S2f_tf_S2s_ts_d2jw_dOjdS2f, calc_diff_S2f_tf_S2s_ts_d2jw_dOjdtf, calc_diff_S2f_S2s_ts_d2jw_dOjdts, calc_S2f_S2s_ts_d2jw_dS2fdS2s, calc_S2f_tf_S2s_ts_d2jw_dS2fdtf, calc_S2f_S2s_ts_d2jw_dS2fdts, calc_S2f_S2s_ts_d2jw_dS2sdts, calc_S2f_tf_S2s_ts_d2jw_dtf2, calc_S2f_S2s_ts_d2jw_dts2
36 from lib.spectral_densities.model_free_components import calc_S2_te_jw_comps, calc_S2f_S2_ts_jw_comps, calc_S2f_S2s_ts_jw_comps, calc_S2f_tf_S2_ts_jw_comps, calc_S2f_tf_S2s_ts_jw_comps, calc_diff_djw_comps, calc_S2_te_djw_comps, calc_diff_S2_te_djw_comps, calc_S2f_S2_ts_djw_comps, calc_diff_S2f_S2_ts_djw_comps, calc_S2f_tf_S2_ts_djw_comps, calc_diff_S2f_tf_S2_ts_djw_comps, calc_S2f_S2s_ts_djw_comps, calc_diff_S2f_S2s_ts_djw_comps, calc_S2f_tf_S2s_ts_djw_comps, calc_diff_S2f_tf_S2s_ts_djw_comps
37 from target_functions.chi2 import chi2, dchi2_element, d2chi2_element
38
39
41 - def __init__(self, init_params=None, model_type=None, diff_type=None, diff_params=None, scaling_matrix=None, num_spins=None, equations=None, param_types=None, param_values=None, relax_data=None, errors=None, bond_length=None, csa=None, num_frq=0, frq=None, num_ri=None, remap_table=None, noe_r1_table=None, ri_labels=None, gx=0, gh=0, h_bar=0, mu0=0, num_params=None, vectors=None):
42 """The model-free minimisation class.
43
44 This class should be initialised before every calculation.
45
46
47 Arguments
48 =========
49
50 equation: The model-free equation string which should be either 'mf_orig' or 'mf_ext'.
51
52 param_types: An array of the parameter types used in minimisation.
53
54 relax_data: An array containing the experimental relaxation values.
55
56 errors: An array containing the experimental errors.
57
58 bond_length: The fixed bond length in meters.
59
60 csa: The fixed CSA value.
61
62 diff_type: The diffusion tensor string which should be either 'sphere', 'spheroid', or
63 'ellipsoid'.
64
65 diff_params: An array with the diffusion parameters.
66
67 scaling_matrix: A diagonal matrix of scaling factors.
68
69
70
71 Additional layer of equations to simplify the relaxation equations, gradients, and Hessians.
72 ============================================================================================
73
74 The R1 and R2 equations are left alone, while the NOE is calculated from the R1 and
75 sigma_noe values.
76
77
78 The relaxation equations
79 ========================
80
81 Data structure: data.ri
82 Dimension: 1D, (relaxation data)
83 Type: numpy, float64
84 Dependencies: data.ri_prime
85 Required by: data.chi2, data.dchi2, data.d2chi2
86
87 The equations are::
88
89 R1() = R1'()
90
91
92 R2() = R2'()
93
94 gH sigma_noe()
95 NOE() = 1 + -- . -----------
96 gN R1()
97
98
99
100 The relaxation gradients
101 ========================
102
103 Data structure: data.dri
104 Dimension: 2D, (parameters, relaxation data)
105 Type: numpy array, float64
106 Dependencies: data.ri_prime, data.dri_prime
107 Required by: data.dchi2, data.d2chi2
108
109 The equations are::
110
111 dR1() dR1'()
112 ------- = -------
113 dthetaj dthetaj
114
115
116 dR2() dR2'()
117 ------- = -------
118 dthetaj dthetaj
119
120
121 dNOE() gH 1 / dsigma_noe() dR1() \
122 ------- = -- . ------- . | R1() . ------------ - sigma_noe() . ------- |
123 dthetaj gN R1()**2 \ dthetaj dthetaj /
124
125
126
127 The relaxation Hessians
128 =======================
129
130 Data structure: data.d2ri
131 Dimension: 3D, (parameters, parameters, relaxation data)
132 Type: numpy array, float64
133 Dependencies: data.ri_prime, data.dri_prime, data.d2ri_prime
134 Required by: data.d2chi2
135
136 The equations are::
137
138 d2R1() d2R1'()
139 --------------- = ---------------
140 dthetai.dthetaj dthetai.dthetaj
141
142
143 d2R2() d2R2'()
144 --------------- = ---------------
145 dthetai.dthetaj dthetai.dthetaj
146
147
148 d2NOE() gH 1 / / dR1() dR1() d2R1() \
149 --------------- = -- . ------- . | sigma_noe() . | 2 . ------- . ------- - R1() . --------------- |
150 dthetai.dthetaj gN R1()**3 \ \ dthetai dthetaj dthetai.dthetaj /
151
152 / dsigma_noe() dR1() dR1() dsigma_noe() d2sigma_noe() \ \
153 - R1() . | ------------ . ------- + ------- . ------------ - R1() . --------------- | |
154 \ dthetai dthetaj dthetai dthetaj dthetai.dthetaj / /
155
156
157
158 The chi-sqared equation
159 =======================
160
161 The equation is::
162 _n_
163 \ (Ri - Ri()) ** 2
164 chi2 = > ----------------
165 /__ sigma_i ** 2
166 i=1
167
168 where:
169 - Ri are the values of the measured relaxation data set.
170 - Ri() are the values of the back calculated relaxation data set.
171 - sigma_i are the values of the error set.
172
173
174 The chi-sqared gradient
175 =======================
176
177 The equation is::
178 _n_
179 dchi2 \ / Ri - Ri() dRi() \
180 ------- = -2 > | ---------- . ------- |
181 dthetaj /__ \ sigma_i**2 dthetaj /
182 i=1
183
184 where:
185 - Ri are the values of the measured relaxation data set.
186 - Ri() are the values of the back calculated relaxation data set.
187 - sigma_i are the values of the error set.
188
189
190 The chi-sqared Hessian
191 ======================
192
193 The equation is::
194 _n_
195 d2chi2 \ 1 / dRi() dRi() d2Ri() \
196 --------------- = 2 > ---------- | ------- . ------- - (Ri - Ri()) . --------------- |
197 dthetaj.dthetak /__ sigma_i**2 \ dthetaj dthetak dthetaj.dthetak /
198 i=1
199
200 where:
201 - Ri are the values of the measured relaxation data set.
202 - Ri() are the values of the back calculated relaxation data set.
203 - sigma_i are the values of the error set.
204 """
205
206
207 self.model_type = model_type
208 self.total_num_params = len(init_params)
209 self.scaling_matrix = scaling_matrix
210 self.num_spins = num_spins
211 self.params = 1.0 * init_params
212
213
214 self.func_test = pi * ones(self.total_num_params, float64)
215 self.grad_test = pi * ones(self.total_num_params, float64)
216 self.hess_test = pi * ones(self.total_num_params, float64)
217
218
219 self.diff_data = Data()
220 self.diff_data.type = diff_type
221 self.diff_data.params = diff_params
222 self.init_diff_data(self.diff_data)
223
224
225 self.total_num_ri = 0
226
227
228 if self.diff_data.type == 'sphere':
229 self.param_index = 1
230 self.diff_end_index = 1
231 elif self.diff_data.type == 'spheroid':
232 self.param_index = 4
233 self.diff_end_index = 4
234 elif self.diff_data.type == 'ellipsoid':
235 self.param_index = 6
236 self.diff_end_index = 6
237 if self.model_type != 'all':
238 self.param_index = 0
239
240
241 self.data = []
242 for i in range(self.num_spins):
243
244 self.total_num_ri = self.total_num_ri + num_ri[i]
245
246
247 g_ratio = gh[i] / gx[i]
248
249
250 self.data.append(Data())
251
252
253 self.data[i].num_indices = self.diff_data.num_indices
254
255
256 self.data[i].frq_list = zeros((num_frq[i], 5), float64)
257 self.data[i].frq_list_ext = zeros((num_frq[i], 5, self.diff_data.num_indices), float64)
258 self.data[i].frq_sqrd_list_ext = zeros((num_frq[i], 5, self.diff_data.num_indices), float64)
259 for j in range(num_frq[i]):
260 frqH = 2.0 * pi * frq[i][j]
261 frqX = frqH / g_ratio
262 self.data[i].frq_list[j, 1] = frqX
263 self.data[i].frq_list[j, 2] = frqH - frqX
264 self.data[i].frq_list[j, 3] = frqH
265 self.data[i].frq_list[j, 4] = frqH + frqX
266 self.data[i].frq_sqrd_list = self.data[i].frq_list ** 2
267 for j in range(self.diff_data.num_indices):
268 self.data[i].frq_list_ext[:,:, j] = self.data[i].frq_list
269 self.data[i].frq_sqrd_list_ext[:,:, j] = self.data[i].frq_sqrd_list
270
271
272 self.data[i].gh = gh[i]
273 self.data[i].gx = gx[i]
274 self.data[i].g_ratio = g_ratio
275 self.data[i].h_bar = h_bar
276 self.data[i].mu0 = mu0
277 self.data[i].equations = equations[i]
278 self.data[i].param_types = param_types[i]
279 self.data[i].relax_data = relax_data[i]
280 self.data[i].errors = errors[i]
281 self.data[i].bond_length = bond_length[i]
282 self.data[i].csa = csa[i]
283 self.data[i].num_ri = num_ri[i]
284 self.data[i].num_frq = num_frq[i]
285 self.data[i].frq = frq[i]
286 self.data[i].remap_table = remap_table[i]
287 self.data[i].noe_r1_table = noe_r1_table[i]
288 self.data[i].ri_labels = ri_labels[i]
289 self.data[i].num_params = num_params[i]
290 self.data[i].xh_unit_vector = vectors[i]
291
292
293 if self.model_type == 'diff':
294 self.data[i].param_values = param_values[i]
295
296
297 if i == 0:
298 self.data[i].start_index = self.diff_data.num_params
299 else:
300 self.data[i].start_index = self.data[i-1].end_index
301 self.data[i].end_index = self.data[i].start_index + self.data[i].num_params
302
303
304 if self.model_type == 'mf' or self.model_type == 'local_tm':
305 self.data[i].total_num_params = self.data[i].num_params
306 elif self.model_type == 'diff':
307 self.data[i].total_num_params = self.diff_data.num_params
308 else:
309 self.data[i].total_num_params = self.data[i].num_params + self.diff_data.num_params
310
311
312 self.init_res_data(self.data[i], self.diff_data)
313
314
315 if not self.setup_equations(self.data[i]):
316 raise RelaxError("The model-free equations could not be setup.")
317
318
319 if self.model_type == 'local_tm':
320 self.diff_data.params = self.params[0:1]
321 elif self.model_type == 'diff' or self.model_type == 'all':
322 self.diff_data.params = self.params[0:self.diff_end_index]
323
324
325 self.diff_data.calc_ti(self.data[i], self.diff_data)
326
327
328 self.data[i].w_ti_sqrd = self.data[i].frq_sqrd_list_ext * self.data[i].ti ** 2
329 self.data[i].fact_ti = 1.0 / (1.0 + self.data[i].w_ti_sqrd)
330
331
332 missing_r1 = 0
333 for j in range(self.data[i].num_ri):
334 if self.data[i].ri_labels[j] == 'NOE' and self.data[i].noe_r1_table[j] == None:
335 missing_r1 = 1
336 if missing_r1:
337 self.init_res_r1_data(self.data[i])
338
339
340 if self.scaling_matrix != None:
341 self.scaling_flag = 1
342 else:
343 self.scaling_flag = 0
344
345
346 self.total_chi2 = 0.0
347 self.total_dchi2 = zeros((self.total_num_params), float64)
348 self.total_d2chi2 = zeros((self.total_num_params, self.total_num_params), float64)
349
350
351 self.total_dri = zeros((self.total_num_params, self.total_num_ri), float64)
352
353
354
355
356
357 if self.model_type == 'mf':
358 self.func = self.func_mf
359 self.dfunc = self.dfunc_mf
360 self.d2func = self.d2func_mf
361
362
363 elif self.model_type == 'local_tm':
364 self.func = self.func_local_tm
365 self.dfunc = self.dfunc_local_tm
366 self.d2func = self.d2func_local_tm
367
368
369 elif self.model_type == 'diff':
370 self.func = self.func_diff
371 self.dfunc = self.dfunc_diff
372 self.d2func = self.d2func_diff
373
374
375 elif self.model_type == 'all':
376 self.func = self.func_all
377 self.dfunc = self.dfunc_all
378 self.d2func = self.d2func_all
379
380
382 """Function for calculating the chi-squared value.
383
384 Used in the minimisation of model-free parameters for a single residue.
385 """
386
387
388 self.func_test = params * 1.0
389
390
391 data = self.data[0]
392
393
394 if self.scaling_flag:
395 params = dot(params, self.scaling_matrix)
396
397
398 if self.diff_data.calc_di:
399 self.diff_data.calc_di(data, self.diff_data)
400
401
402 self.diff_data.calc_ci(data, self.diff_data)
403
404
405 self.diff_data.calc_ti(data, self.diff_data)
406
407
408 if data.calc_jw_comps:
409 data.calc_jw_comps(data, params)
410
411
412 data.jw = data.calc_jw(data, params)
413
414
415 data.create_ri_comps(data, params)
416
417
418 data.ri_prime = data.create_ri_prime(data)
419
420
421 data.ri = data.ri_prime * 1.0
422 for m in range(data.num_ri):
423 if data.create_ri[m]:
424 data.create_ri[m](data, m, data.remap_table[m], data.get_r1, params)
425
426
427 data.chi2 = chi2(data.relax_data, data.ri, data.errors)
428
429 return data.chi2
430
431
433 """Function for calculating the chi-squared value.
434
435 Used in the minimisation of model-free parameters for a single residue with a local tm.
436 """
437
438
439 self.func_test = params * 1.0
440
441
442 data = self.data[0]
443
444
445 if self.scaling_flag:
446 params = dot(params, self.scaling_matrix)
447
448
449 self.diff_data.params = params[0:1]
450
451
452 self.diff_data.calc_ci(data, self.diff_data)
453
454
455 self.diff_data.calc_ti(data, self.diff_data)
456
457
458 data.w_ti_sqrd = data.frq_sqrd_list_ext * data.ti ** 2
459 data.fact_ti = 1.0 / (1.0 + data.w_ti_sqrd)
460
461
462 if data.calc_jw_comps:
463 data.calc_jw_comps(data, params)
464
465
466 data.jw = data.calc_jw(data, params)
467
468
469 data.create_ri_comps(data, params)
470
471
472 data.ri_prime = data.create_ri_prime(data)
473
474
475 data.ri = data.ri_prime * 1.0
476 for m in range(data.num_ri):
477 if data.create_ri[m]:
478 data.create_ri[m](data, m, data.remap_table[m], data.get_r1, params)
479
480
481 data.chi2 = chi2(data.relax_data, data.ri, data.errors)
482
483 return data.chi2
484
485
487 """Function for calculating the chi-squared value.
488
489 Used in the minimisation of diffusion tensor parameters with all model-free parameters
490 fixed.
491 """
492
493
494 self.func_test = params * 1.0
495
496
497 if self.scaling_flag:
498 params = dot(params, self.scaling_matrix)
499
500
501 self.diff_data.params = params[0:self.diff_end_index]
502
503
504 self.total_chi2 = 0.0
505
506
507 for i in range(self.num_spins):
508
509 data = self.data[i]
510
511
512 if self.diff_data.calc_di:
513 self.diff_data.calc_di(data, self.diff_data)
514
515
516 self.diff_data.calc_ci(data, self.diff_data)
517
518
519 self.diff_data.calc_ti(data, self.diff_data)
520
521
522 data.w_ti_sqrd = data.frq_sqrd_list_ext * data.ti ** 2
523 data.fact_ti = 1.0 / (1.0 + data.w_ti_sqrd)
524
525
526 if data.calc_jw_comps:
527 data.calc_jw_comps(data, data.param_values)
528
529
530 data.jw = data.calc_jw(data, data.param_values)
531
532
533 data.create_ri_comps(data, data.param_values)
534
535
536 data.ri_prime = data.create_ri_prime(data)
537
538
539 data.ri = data.ri_prime * 1.0
540 for m in range(data.num_ri):
541 if data.create_ri[m]:
542 data.create_ri[m](data, m, data.remap_table[m], data.get_r1, data.param_values)
543
544
545 data.chi2 = chi2(data.relax_data, data.ri, data.errors)
546
547
548 self.total_chi2 = self.total_chi2 + data.chi2
549
550 return self.total_chi2
551
552
554 """Function for calculating the chi-squared value.
555
556 Used in the minimisation of diffusion tensor parameters together with all model-free
557 parameters.
558 """
559
560
561 self.func_test = params * 1.0
562
563
564 if self.scaling_flag:
565 params = dot(params, self.scaling_matrix)
566
567
568 self.diff_data.params = params[0:self.diff_end_index]
569
570
571 self.total_chi2 = 0.0
572
573
574 for i in range(self.num_spins):
575
576 data = self.data[i]
577
578
579 if self.diff_data.calc_di:
580 self.diff_data.calc_di(data, self.diff_data)
581
582
583 self.diff_data.calc_ci(data, self.diff_data)
584
585
586 self.diff_data.calc_ti(data, self.diff_data)
587
588
589 data.w_ti_sqrd = data.frq_sqrd_list_ext * data.ti ** 2
590 data.fact_ti = 1.0 / (1.0 + data.w_ti_sqrd)
591
592
593 if data.calc_jw_comps:
594 data.calc_jw_comps(data, params)
595
596
597 data.jw = data.calc_jw(data, params)
598
599
600 data.create_ri_comps(data, params)
601
602
603 data.ri_prime = data.create_ri_prime(data)
604
605
606 data.ri = data.ri_prime * 1.0
607 for m in range(data.num_ri):
608 if data.create_ri[m]:
609 data.create_ri[m](data, m, data.remap_table[m], data.get_r1, params)
610
611
612 data.chi2 = chi2(data.relax_data, data.ri, data.errors)
613
614
615 self.total_chi2 = self.total_chi2 + data.chi2
616
617 return self.total_chi2
618
619
621 """Function for calculating the chi-squared gradient.
622
623 Used in the minimisation of model-free parameters for a single residue.
624 """
625
626
627 if sum(params == self.func_test) != self.total_num_params:
628 self.func(params)
629
630
631 self.grad_test = params * 1.0
632
633
634 data = self.data[0]
635
636
637 if self.scaling_flag:
638 params = dot(params, self.scaling_matrix)
639
640
641 if data.calc_djw_comps:
642 data.calc_djw_comps(data, params)
643
644
645 for j in range(data.total_num_params):
646
647 if data.calc_djw[j]:
648 data.djw = data.calc_djw[j](data, params, j)
649 else:
650 data.djw = data.djw * 0.0
651
652
653 data.create_dri_comps(data, params)
654
655
656 data.dri_prime[j] = data.create_dri_prime[j](data)
657
658
659 data.dri[j] = data.dri_prime[j]
660 for m in range(data.num_ri):
661 if data.create_dri[m]:
662 data.create_dri[m](data, m, data.remap_table[m], data.get_dr1, params, j)
663
664
665 data.dchi2[j] = dchi2_element(data.relax_data, data.ri, data.dri[j], data.errors)
666
667
668 if self.scaling_flag:
669 data.dchi2 = dot(data.dchi2, self.scaling_matrix)
670
671
672 return data.dchi2 * 1.0
673
674
676 """Function for calculating the chi-squared gradient.
677
678 Used in the minimisation of model-free parameters for a single residue with a local tm.
679 """
680
681
682 if sum(params == self.func_test) != self.total_num_params:
683 self.func(params)
684
685
686 self.grad_test = params * 1.0
687
688
689 data = self.data[0]
690
691
692 if self.scaling_flag:
693 params = dot(params, self.scaling_matrix)
694
695
696 self.diff_data.params = params[0:1]
697
698
699 if data.calc_djw_comps:
700 data.calc_djw_comps(data, params)
701
702
703 self.diff_data.calc_dti(data, self.diff_data)
704
705
706 for j in range(data.total_num_params):
707
708 if data.calc_djw[j]:
709 data.djw = data.calc_djw[j](data, params, j)
710 else:
711 data.djw = data.djw * 0.0
712
713
714 data.create_dri_comps(data, params)
715
716
717 data.dri_prime[j] = data.create_dri_prime[j](data)
718
719
720 data.dri[j] = data.dri_prime[j]
721 for m in range(data.num_ri):
722 if data.create_dri[m]:
723 data.create_dri[m](data, m, data.remap_table[m], data.get_dr1, params, j)
724
725
726 data.dchi2[j] = dchi2_element(data.relax_data, data.ri, data.dri[j], data.errors)
727
728
729 if self.scaling_flag:
730 data.dchi2 = dot(data.dchi2, self.scaling_matrix)
731
732
733 return data.dchi2 * 1.0
734
735
737 """Function for calculating the chi-squared gradient.
738
739 Used in the minimisation of diffusion tensor parameters with all model-free parameters
740 fixed.
741 """
742
743
744 if sum(params == self.func_test) != self.total_num_params:
745 self.func(params)
746
747
748 self.grad_test = params * 1.0
749
750
751 if self.scaling_flag:
752 params = dot(params, self.scaling_matrix)
753
754
755 self.diff_data.params = params[0:self.diff_end_index]
756
757
758 self.total_dchi2 = self.total_dchi2 * 0.0
759
760
761 for i in range(self.num_spins):
762
763
764 data = self.data[i]
765
766
767 if self.diff_data.calc_ddi:
768 self.diff_data.calc_ddi(data, self.diff_data)
769
770
771 if self.diff_data.calc_dci:
772 self.diff_data.calc_dci(data, self.diff_data)
773
774
775 self.diff_data.calc_dti(data, self.diff_data)
776
777
778 if data.calc_djw_comps:
779 data.calc_djw_comps(data, data.param_values)
780
781
782 for j in range(data.total_num_params):
783
784 if data.calc_djw[j]:
785 data.djw = data.calc_djw[j](data, data.param_values, j)
786 else:
787 data.djw = data.djw * 0.0
788
789
790 data.create_dri_comps(data, data.param_values)
791
792
793 data.dri_prime[j] = data.create_dri_prime[j](data)
794
795
796 data.dri[j] = data.dri_prime[j]
797 for m in range(data.num_ri):
798 if data.create_dri[m]:
799 data.create_dri[m](data, m, data.remap_table[m], data.get_dr1, params, j)
800
801
802 data.dchi2[j] = dchi2_element(data.relax_data, data.ri, data.dri[j], data.errors)
803
804
805 index = self.diff_data.num_params
806
807
808 self.total_dchi2[0:index] = self.total_dchi2[0:index] + data.dchi2[0:index]
809
810
811 if self.scaling_flag:
812 self.total_dchi2 = dot(self.total_dchi2, self.scaling_matrix)
813
814
815 return self.total_dchi2 * 1.0
816
817
819 """Function for calculating the chi-squared gradient.
820
821 Used in the minimisation of diffusion tensor parameters together with all model-free
822 parameters.
823 """
824
825
826 if sum(params == self.func_test) != self.total_num_params:
827 self.func(params)
828
829
830 self.grad_test = params * 1.0
831
832
833 if self.scaling_flag:
834 params = dot(params, self.scaling_matrix)
835
836
837 self.diff_data.params = params[0:self.diff_end_index]
838
839
840 self.total_dchi2 = self.total_dchi2 * 0.0
841
842
843 for i in range(self.num_spins):
844
845 data = self.data[i]
846
847
848 if self.diff_data.calc_ddi:
849 self.diff_data.calc_ddi(data, self.diff_data)
850
851
852 if self.diff_data.calc_dci:
853 self.diff_data.calc_dci(data, self.diff_data)
854
855
856 self.diff_data.calc_dti(data, self.diff_data)
857
858
859 if data.calc_djw_comps:
860 data.calc_djw_comps(data, params)
861
862
863 for j in range(data.total_num_params):
864
865 if data.calc_djw[j]:
866 data.djw = data.calc_djw[j](data, params, j)
867 else:
868 data.djw = data.djw * 0.0
869
870
871 data.create_dri_comps(data, params)
872
873
874 data.dri_prime[j] = data.create_dri_prime[j](data)
875
876
877 data.dri[j] = data.dri_prime[j]
878 for m in range(data.num_ri):
879 if data.create_dri[m]:
880 data.create_dri[m](data, m, data.remap_table[m], data.get_dr1, params, j)
881
882
883 data.dchi2[j] = dchi2_element(data.relax_data, data.ri, data.dri[j], data.errors)
884
885
886 index = self.diff_data.num_params
887
888
889 self.total_dchi2[0:index] = self.total_dchi2[0:index] + data.dchi2[0:index]
890
891
892 self.total_dchi2[data.start_index:data.end_index] = self.total_dchi2[data.start_index:data.end_index] + data.dchi2[index:]
893
894
895 if self.scaling_flag:
896 self.total_dchi2 = dot(self.total_dchi2, self.scaling_matrix)
897
898
899 return self.total_dchi2 * 1.0
900
901
903 """Function for calculating the chi-squared Hessian.
904
905 Used in the minimisation of model-free parameters for a single residue.
906 """
907
908
909 if sum(params == self.grad_test) != self.total_num_params:
910 self.dfunc(params)
911
912
913 data = self.data[0]
914
915
916 if self.scaling_flag:
917 params = dot(params, self.scaling_matrix)
918
919
920 for j in range(data.total_num_params):
921 for k in range(j + 1):
922
923 if data.calc_d2jw[j][k]:
924 data.d2jw = data.calc_d2jw[j][k](data, params, j, k)
925 else:
926 data.d2jw = data.d2jw * 0.0
927
928
929 data.create_d2ri_comps(data, params)
930
931
932 if data.create_d2ri_prime[j][k]:
933 data.d2ri_prime[j, k] = data.create_d2ri_prime[j][k](data)
934
935
936 data.d2ri[j, k] = data.d2ri_prime[j, k]
937 for m in range(data.num_ri):
938 if data.create_d2ri[m]:
939 data.create_d2ri[m](data, m, data.remap_table[m], data.get_d2r1, params, j, k)
940
941
942 data.d2chi2[j, k] = data.d2chi2[k, j] = d2chi2_element(data.relax_data, data.ri, data.dri[j], data.dri[k], data.d2ri[j, k], data.errors)
943
944
945 if self.scaling_flag:
946 data.d2chi2 = dot(self.scaling_matrix, dot(data.d2chi2, self.scaling_matrix))
947
948
949 return data.d2chi2 * 1.0
950
951
953 """Function for calculating the chi-squared Hessian.
954
955 Used in the minimisation of model-free parameters for a single residue with a local tm.
956 """
957
958
959 if sum(params == self.grad_test) != self.total_num_params:
960 self.dfunc(params)
961
962
963 data = self.data[0]
964
965
966 if self.scaling_flag:
967 params = dot(params, self.scaling_matrix)
968
969
970 self.diff_data.params = params[0:1]
971
972
973 for j in range(data.total_num_params):
974 for k in range(j + 1):
975
976 if data.calc_d2jw[j][k]:
977 data.d2jw = data.calc_d2jw[j][k](data, params, j, k)
978 else:
979 data.d2jw = data.d2jw * 0.0
980
981
982 data.create_d2ri_comps(data, params)
983
984
985 if data.create_d2ri_prime[j][k]:
986 data.d2ri_prime[j, k] = data.create_d2ri_prime[j][k](data)
987
988
989 data.d2ri[j, k] = data.d2ri_prime[j, k]
990 for m in range(data.num_ri):
991 if data.create_d2ri[m]:
992 data.create_d2ri[m](data, m, data.remap_table[m], data.get_d2r1, params, j, k)
993
994
995 data.d2chi2[j, k] = data.d2chi2[k, j] = d2chi2_element(data.relax_data, data.ri, data.dri[j], data.dri[k], data.d2ri[j, k], data.errors)
996
997
998 if self.scaling_flag:
999 data.d2chi2 = dot(self.scaling_matrix, dot(data.d2chi2, self.scaling_matrix))
1000
1001
1002 return data.d2chi2 * 1.0
1003
1004
1006 """Function for calculating the chi-squared Hessian.
1007
1008 Used in the minimisation of diffusion tensor parameters with all model-free parameters
1009 fixed.
1010 """
1011
1012
1013 if sum(params == self.grad_test) != self.total_num_params:
1014 self.dfunc(params)
1015
1016
1017 if self.scaling_flag:
1018 params = dot(params, self.scaling_matrix)
1019
1020
1021 self.diff_data.params = params[0:self.diff_end_index]
1022
1023
1024 self.total_d2chi2 = self.total_d2chi2 * 0.0
1025
1026
1027 for i in range(self.num_spins):
1028
1029 data = self.data[i]
1030
1031
1032 if self.diff_data.calc_d2di:
1033 self.diff_data.calc_d2di(data, self.diff_data)
1034
1035
1036 if self.diff_data.calc_d2ci:
1037 self.diff_data.calc_d2ci(data, self.diff_data)
1038
1039
1040 if self.diff_data.calc_d2ti:
1041 self.diff_data.calc_d2ti(data, self.diff_data)
1042
1043
1044 for j in range(data.total_num_params):
1045 for k in range(j + 1):
1046
1047 if data.calc_d2jw[j][k]:
1048 data.d2jw = data.calc_d2jw[j][k](data, data.param_values, j, k)
1049 else:
1050 data.d2jw = data.d2jw * 0.0
1051
1052
1053 data.create_d2ri_comps(data, data.param_values)
1054
1055
1056 if data.create_d2ri_prime[j][k]:
1057 data.d2ri_prime[j, k] = data.create_d2ri_prime[j][k](data)
1058
1059
1060 data.d2ri[j, k] = data.d2ri_prime[j, k]
1061 for m in range(data.num_ri):
1062 if data.create_d2ri[m]:
1063 data.create_d2ri[m](data, m, data.remap_table[m], data.get_d2r1, params, j, k)
1064
1065
1066 data.d2chi2[j, k] = data.d2chi2[k, j] = d2chi2_element(data.relax_data, data.ri, data.dri[j], data.dri[k], data.d2ri[j, k], data.errors)
1067
1068
1069 self.total_d2chi2 = self.total_d2chi2 + data.d2chi2
1070
1071
1072 if self.scaling_flag:
1073 self.total_d2chi2 = dot(self.scaling_matrix, dot(self.total_d2chi2, self.scaling_matrix))
1074
1075
1076 return self.total_d2chi2 * 1.0
1077
1078
1080 """Function for calculating the chi-squared Hessian.
1081
1082 Used in the minimisation of diffusion tensor parameters together with all model-free
1083 parameters.
1084 """
1085
1086
1087 if sum(params == self.grad_test) != self.total_num_params:
1088 self.dfunc(params)
1089
1090
1091 if self.scaling_flag:
1092 params = dot(params, self.scaling_matrix)
1093
1094
1095 self.diff_data.params = params[0:self.diff_end_index]
1096
1097
1098 self.total_d2chi2 = self.total_d2chi2 * 0.0
1099
1100
1101 for i in range(self.num_spins):
1102
1103 data = self.data[i]
1104
1105
1106 if self.diff_data.calc_d2di:
1107 self.diff_data.calc_d2di(data, self.diff_data)
1108
1109
1110 if self.diff_data.calc_d2ci:
1111 self.diff_data.calc_d2ci(data, self.diff_data)
1112
1113
1114 if self.diff_data.calc_d2ti:
1115 self.diff_data.calc_d2ti(data, self.diff_data)
1116
1117
1118 for j in range(data.total_num_params):
1119 for k in range(j + 1):
1120
1121 if data.calc_d2jw[j][k]:
1122 data.d2jw = data.calc_d2jw[j][k](data, params, j, k)
1123 else:
1124 data.d2jw = data.d2jw * 0.0
1125
1126
1127 data.create_d2ri_comps(data, params)
1128
1129
1130 if data.create_d2ri_prime[j][k]:
1131 data.d2ri_prime[j, k] = data.create_d2ri_prime[j][k](data)
1132
1133
1134 data.d2ri[j, k] = data.d2ri_prime[j, k]
1135 for m in range(data.num_ri):
1136 if data.create_d2ri[m]:
1137 data.create_d2ri[m](data, m, data.remap_table[m], data.get_d2r1, params, j, k)
1138
1139
1140 data.d2chi2[j, k] = data.d2chi2[k, j] = d2chi2_element(data.relax_data, data.ri, data.dri[j], data.dri[k], data.d2ri[j, k], data.errors)
1141
1142
1143 index = self.diff_data.num_params
1144
1145
1146 self.total_d2chi2[0:index, 0:index] = self.total_d2chi2[0:index, 0:index] + data.d2chi2[0:index, 0:index]
1147
1148
1149 self.total_d2chi2[data.start_index:data.end_index, data.start_index:data.end_index] = self.total_d2chi2[data.start_index:data.end_index, data.start_index:data.end_index] + data.d2chi2[index:, index:]
1150
1151
1152 self.total_d2chi2[0:index, data.start_index:data.end_index] = self.total_d2chi2[0:index, data.start_index:data.end_index] + data.d2chi2[0:index, index:]
1153 self.total_d2chi2[data.start_index:data.end_index, 0:index] = self.total_d2chi2[data.start_index:data.end_index, 0:index] + data.d2chi2[index:, 0:index]
1154
1155
1156 if self.scaling_flag:
1157 self.total_d2chi2 = dot(self.scaling_matrix, dot(self.total_d2chi2, self.scaling_matrix))
1158
1159
1160 return self.total_d2chi2 * 1.0
1161
1162
1164 """Function for calculating relaxation values."""
1165
1166
1167 chi2 = self.func_mf(self.params)
1168
1169
1170 return self.data[0].ri[0]
1171
1172
1174 """Function for the initialisation of diffusion tensor specific data."""
1175
1176
1177 if diff_data.type == 'sphere':
1178
1179 diff_data.num_params = 1
1180
1181
1182 diff_data.num_indices = 1
1183
1184
1185 diff_data.calc_di = None
1186 diff_data.calc_ddi = None
1187 diff_data.calc_d2di = None
1188
1189
1190 diff_data.calc_ci = calc_sphere_ci
1191 diff_data.calc_dci = None
1192 diff_data.calc_d2ci = None
1193
1194
1195 diff_data.calc_ti = calc_sphere_ti
1196 diff_data.calc_dti = calc_sphere_dti
1197 diff_data.calc_d2ti = None
1198
1199
1200
1201 elif diff_data.type == 'spheroid':
1202
1203 diff_data.num_params = 4
1204
1205
1206 diff_data.num_indices = 3
1207
1208
1209 diff_data.calc_di = calc_spheroid_di
1210 diff_data.calc_ddi = calc_spheroid_ddi
1211 diff_data.calc_d2di = calc_spheroid_d2di
1212
1213
1214 diff_data.calc_ci = calc_spheroid_ci
1215 diff_data.calc_dci = calc_spheroid_dci
1216 diff_data.calc_d2ci = calc_spheroid_d2ci
1217
1218
1219 diff_data.calc_ti = calc_spheroid_ti
1220 diff_data.calc_dti = calc_spheroid_dti
1221 diff_data.calc_d2ti = calc_spheroid_d2ti
1222
1223
1224 diff_data.dpar = zeros(3, float64)
1225
1226
1227 diff_data.dpar_dtheta = zeros(3, float64)
1228 diff_data.dpar_dphi = zeros(3, float64)
1229
1230
1231 diff_data.dpar_dtheta2 = zeros(3, float64)
1232 diff_data.dpar_dthetadphi = zeros(3, float64)
1233 diff_data.dpar_dphi2 = zeros(3, float64)
1234
1235
1236 elif diff_data.type == 'ellipsoid':
1237
1238 diff_data.num_params = 6
1239
1240
1241 diff_data.num_indices = 5
1242
1243
1244 diff_data.calc_di = calc_ellipsoid_di
1245 diff_data.calc_ddi = calc_ellipsoid_ddi
1246 diff_data.calc_d2di = calc_ellipsoid_d2di
1247
1248
1249 diff_data.calc_ci = calc_ellipsoid_ci
1250 diff_data.calc_dci = calc_ellipsoid_dci
1251 diff_data.calc_d2ci = calc_ellipsoid_d2ci
1252
1253
1254 diff_data.calc_ti = calc_ellipsoid_ti
1255 diff_data.calc_dti = calc_ellipsoid_dti
1256 diff_data.calc_d2ti = calc_ellipsoid_d2ti
1257
1258
1259 diff_data.dx = zeros(3, float64)
1260 diff_data.dy = zeros(3, float64)
1261 diff_data.dz = zeros(3, float64)
1262
1263
1264 diff_data.ddx_dalpha = zeros(3, float64)
1265 diff_data.ddx_dbeta = zeros(3, float64)
1266 diff_data.ddx_dgamma = zeros(3, float64)
1267
1268 diff_data.ddy_dalpha = zeros(3, float64)
1269 diff_data.ddy_dbeta = zeros(3, float64)
1270 diff_data.ddy_dgamma = zeros(3, float64)
1271
1272 diff_data.ddz_dalpha = zeros(3, float64)
1273 diff_data.ddz_dbeta = zeros(3, float64)
1274 diff_data.ddz_dgamma = zeros(3, float64)
1275
1276
1277 diff_data.d2dx_dalpha2 = zeros(3, float64)
1278 diff_data.d2dx_dalpha_dbeta = zeros(3, float64)
1279 diff_data.d2dx_dalpha_dgamma = zeros(3, float64)
1280 diff_data.d2dx_dbeta2 = zeros(3, float64)
1281 diff_data.d2dx_dbeta_dgamma = zeros(3, float64)
1282 diff_data.d2dx_dgamma2 = zeros(3, float64)
1283
1284 diff_data.d2dy_dalpha2 = zeros(3, float64)
1285 diff_data.d2dy_dalpha_dbeta = zeros(3, float64)
1286 diff_data.d2dy_dalpha_dgamma = zeros(3, float64)
1287 diff_data.d2dy_dbeta2 = zeros(3, float64)
1288 diff_data.d2dy_dbeta_dgamma = zeros(3, float64)
1289 diff_data.d2dy_dgamma2 = zeros(3, float64)
1290
1291 diff_data.d2dz_dalpha2 = zeros(3, float64)
1292 diff_data.d2dz_dalpha_dbeta = zeros(3, float64)
1293 diff_data.d2dz_dalpha_dgamma = zeros(3, float64)
1294 diff_data.d2dz_dbeta2 = zeros(3, float64)
1295 diff_data.d2dz_dbeta_dgamma = zeros(3, float64)
1296 diff_data.d2dz_dgamma2 = zeros(3, float64)
1297
1298
1300 """Function for the initialisation of the residue specific data."""
1301
1302
1303 data.ci = zeros(diff_data.num_indices, float64)
1304 data.ci_comps = zeros(diff_data.num_indices, float64)
1305
1306
1307 data.ti = zeros(diff_data.num_indices, float64)
1308 data.tau_comps = zeros(diff_data.num_indices, float64)
1309 data.tau_comps_sqrd = zeros(diff_data.num_indices, float64)
1310 data.tau_comps_cubed = zeros(diff_data.num_indices, float64)
1311 data.tau_scale = zeros(diff_data.num_indices, float64)
1312
1313
1314 if self.diff_data.type == 'sphere':
1315
1316 data.dti = zeros((1, diff_data.num_indices), float64)
1317 data.d2ti = zeros((1, 1, diff_data.num_indices), float64)
1318
1319
1320 elif self.diff_data.type == 'spheroid':
1321
1322 data.dci = zeros((4, diff_data.num_indices), float64)
1323 data.d2ci = zeros((4, 4, diff_data.num_indices), float64)
1324
1325
1326 data.dti = zeros((2, diff_data.num_indices), float64)
1327 data.d2ti = zeros((2, 2, diff_data.num_indices), float64)
1328
1329
1330 data.dz = 0
1331
1332
1333 data.ddz_dO = zeros(2, float64)
1334
1335
1336 data.d2dz_dO2 = zeros((2, 2), float64)
1337
1338
1339 elif self.diff_data.type == 'ellipsoid':
1340
1341 data.dci = zeros((6, diff_data.num_indices), float64)
1342 data.d2ci = zeros((6, 6, diff_data.num_indices), float64)
1343
1344
1345 data.dti = zeros((3, diff_data.num_indices), float64)
1346 data.d2ti = zeros((3, 3, diff_data.num_indices), float64)
1347
1348
1349 data.dx = 0.0
1350 data.dy = 0.0
1351 data.dz = 0.0
1352
1353
1354 data.ddx_dO = zeros(3, float64)
1355 data.ddy_dO = zeros(3, float64)
1356 data.ddz_dO = zeros(3, float64)
1357
1358
1359 data.d2dx_dO2 = zeros((3, 3), float64)
1360 data.d2dy_dO2 = zeros((3, 3), float64)
1361 data.d2dz_dO2 = zeros((3, 3), float64)
1362
1363
1364 data.w_ti_sqrd = zeros((data.num_frq, 5, diff_data.num_indices), float64)
1365 data.fact_ti = zeros((data.num_frq, 5, diff_data.num_indices), float64)
1366 data.w_te_ti_sqrd = zeros((data.num_frq, 5, diff_data.num_indices), float64)
1367 data.w_tf_ti_sqrd = zeros((data.num_frq, 5, diff_data.num_indices), float64)
1368 data.w_ts_ti_sqrd = zeros((data.num_frq, 5, diff_data.num_indices), float64)
1369 data.inv_te_denom = zeros((data.num_frq, 5, diff_data.num_indices), float64)
1370 data.inv_tf_denom = zeros((data.num_frq, 5, diff_data.num_indices), float64)
1371 data.inv_ts_denom = zeros((data.num_frq, 5, diff_data.num_indices), float64)
1372
1373
1374 data.jw = zeros((data.num_frq, 5), float64)
1375 data.djw = zeros((data.num_frq, 5), float64)
1376 data.d2jw = zeros((data.num_frq, 5), float64)
1377
1378
1379 data.csa_const_fixed = zeros(data.num_frq, float64)
1380 data.dip_const_fixed = None
1381 calc_fixed_csa(data)
1382 calc_fixed_dip(data)
1383
1384
1385 data.dip_const_func = 0.0
1386 data.dip_const_grad = 0.0
1387 data.dip_const_hess = 0.0
1388 data.csa_const_func = zeros(data.num_frq, float64)
1389 data.csa_const_grad = zeros(data.num_frq, float64)
1390 data.csa_const_hess = zeros(data.num_frq, float64)
1391
1392
1393 data.dip_comps_func = zeros(data.num_ri, float64)
1394 data.csa_comps_func = zeros(data.num_ri, float64)
1395 data.rex_comps_func = zeros(data.num_ri, float64)
1396 data.dip_jw_comps_func = zeros(data.num_ri, float64)
1397 data.csa_jw_comps_func = zeros(data.num_ri, float64)
1398
1399
1400 data.dip_comps_grad = zeros(data.num_ri, float64)
1401 data.csa_comps_grad = zeros(data.num_ri, float64)
1402 data.rex_comps_grad = zeros(data.num_ri, float64)
1403 data.dip_jw_comps_grad = zeros(data.num_ri, float64)
1404 data.csa_jw_comps_grad = zeros(data.num_ri, float64)
1405
1406
1407 data.dip_comps_hess = zeros(data.num_ri, float64)
1408 data.csa_comps_hess = zeros(data.num_ri, float64)
1409 data.rex_comps_hess = zeros(data.num_ri, float64)
1410 data.dip_jw_comps_hess = zeros(data.num_ri, float64)
1411 data.csa_jw_comps_hess = zeros(data.num_ri, float64)
1412
1413
1414 data.ri_prime = zeros((data.num_ri), float64)
1415 data.dri_prime = zeros((data.total_num_params, data.num_ri), float64)
1416 data.d2ri_prime = zeros((data.total_num_params, data.total_num_params, data.num_ri), float64)
1417
1418
1419 data.ri = zeros(data.num_ri, float64)
1420 data.dri = zeros((data.total_num_params, data.num_ri), float64)
1421 data.d2ri = zeros((data.total_num_params, data.total_num_params, data.num_ri), float64)
1422
1423
1424 data.r1 = zeros(data.num_ri, float64)
1425 data.dr1 = zeros((data.total_num_params, data.num_ri), float64)
1426 data.d2r1 = zeros((data.total_num_params, data.total_num_params, data.num_ri), float64)
1427
1428
1429 data.chi2 = 0.0
1430 data.dchi2 = zeros((data.total_num_params), float64)
1431 data.d2chi2 = zeros((data.total_num_params, data.total_num_params), float64)
1432
1433
1435 """Function for initialisation of the R1 data class.
1436
1437 This data class is only used if an NOE data set is collected but no R1 data set
1438 corresponding to the same frequency exists.
1439 """
1440
1441
1442 r1_data = Data()
1443
1444
1445 r1_data.num_frq = data.num_frq
1446 r1_data.dip_const_fixed = data.dip_const_fixed
1447 r1_data.csa_const_fixed = data.csa_const_fixed
1448
1449
1450 r1_data.dip_comps_func = zeros(data.num_ri, float64)
1451 r1_data.csa_comps_func = zeros(data.num_ri, float64)
1452 r1_data.dip_jw_comps_func = zeros(data.num_ri, float64)
1453 r1_data.csa_jw_comps_func = zeros(data.num_ri, float64)
1454
1455
1456 r1_data.dip_comps_grad = zeros(data.num_ri, float64)
1457 r1_data.csa_comps_grad = zeros(data.num_ri, float64)
1458 r1_data.rex_comps_grad = zeros(data.num_ri, float64)
1459 r1_data.dip_jw_comps_grad = zeros(data.num_ri, float64)
1460 r1_data.csa_jw_comps_grad = zeros(data.num_ri, float64)
1461
1462
1463 r1_data.dip_comps_hess = zeros(data.num_ri, float64)
1464 r1_data.csa_comps_hess = zeros(data.num_ri, float64)
1465 r1_data.rex_comps_hess = zeros(data.num_ri, float64)
1466 r1_data.dip_jw_comps_hess = zeros(data.num_ri, float64)
1467 r1_data.csa_jw_comps_hess = zeros(data.num_ri, float64)
1468
1469
1470 r1_data.ri_prime = zeros(data.num_ri, float64)
1471 r1_data.dri_prime = zeros((data.num_ri, data.total_num_params), float64)
1472 r1_data.d2ri_prime = zeros((data.num_ri, data.total_num_params, data.total_num_params), float64)
1473
1474
1475 r1_data.create_dri_prime = data.create_dri_prime
1476 r1_data.create_d2ri_prime = data.create_d2ri_prime
1477
1478
1479 r1_data.csa_i = data.csa_i
1480 r1_data.r_i = data.r_i
1481 r1_data.rex_i = data.rex_i
1482
1483
1484 data.r1_data = r1_data
1485
1486
1488 """Return the function used for Levenberg-Marquardt minimisation."""
1489
1490
1491 if self.model_type == 'mf' or self.model_type == 'local_tm':
1492 dri = self.data[0].dri
1493 elif self.model_type == 'diff':
1494
1495 self.total_dri = self.total_dri * 0.0
1496
1497
1498 ri_start_index = 0
1499 ri_end_index = 0
1500
1501
1502 for i in range(self.num_spins):
1503
1504 data = self.data[i]
1505
1506
1507 ri_end_index = ri_end_index + data.num_ri
1508
1509
1510 self.total_dri[0:self.diff_data.num_params, ri_start_index:ri_end_index] = self.total_dri[0:self.diff_data.num_params, ri_start_index:ri_end_index] + data.dri[0:self.diff_data.num_params]
1511
1512
1513 ri_start_index = ri_start_index + data.num_ri
1514
1515
1516 dri = self.total_dri
1517
1518 elif self.model_type == 'all':
1519
1520 self.total_dri = self.total_dri * 0.0
1521
1522
1523 ri_start_index = 0
1524 ri_end_index = 0
1525
1526
1527 for i in range(self.num_spins):
1528
1529 data = self.data[i]
1530
1531
1532 ri_end_index = ri_end_index + data.num_ri
1533
1534
1535 self.total_dri[0:self.diff_data.num_params, ri_start_index:ri_end_index] = self.total_dri[0:self.diff_data.num_params, ri_start_index:ri_end_index] + data.dri[0:self.diff_data.num_params]
1536
1537
1538 self.total_dri[data.start_index:data.end_index, ri_start_index:ri_end_index] = self.total_dri[data.start_index:data.end_index, ri_start_index:ri_end_index] + data.dri[self.diff_data.num_params:]
1539
1540
1541 ri_start_index = ri_start_index + data.num_ri
1542
1543
1544 dri = self.total_dri
1545
1546
1547 dri = transpose(dri)
1548
1549
1550 if self.scaling_flag:
1551 dri = dot(dri, self.scaling_matrix)
1552
1553
1554 return dri
1555
1556
1558 """Setup all the residue specific equations."""
1559
1560
1561
1562
1563
1564 if self.model_type != 'all':
1565 num_diff_params = 0
1566 elif self.diff_data.type == 'sphere':
1567 num_diff_params = 1
1568 elif self.diff_data.type == 'spheroid':
1569 num_diff_params = 4
1570 elif self.diff_data.type == 'ellipsoid':
1571 num_diff_params = 6
1572
1573
1574 data.tm_i, data.tm_li = None, None
1575 data.s2_i, data.s2_li = None, None
1576 data.s2f_i, data.s2f_li = None, None
1577 data.s2s_i, data.s2s_li = None, None
1578 data.te_i, data.te_li = None, None
1579 data.tf_i, data.tf_li = None, None
1580 data.ts_i, data.ts_li = None, None
1581 data.rex_i, data.rex_li = None, None
1582 data.r_i, data.r_li = None, None
1583 data.csa_i, data.csa_li = None, None
1584
1585
1586
1587
1588
1589 data.calc_djw = []
1590 data.calc_d2jw = []
1591 for i in range(data.total_num_params):
1592 data.calc_djw.append(None)
1593 data.calc_d2jw.append([])
1594 for j in range(data.total_num_params):
1595 data.calc_d2jw[i].append(None)
1596
1597
1598
1599
1600
1601 if data.equations == 'mf_orig':
1602
1603 for i in range(data.num_params):
1604 if data.param_types[i] == 's2':
1605 data.s2_li = num_diff_params + i
1606 data.s2_i = self.param_index + i
1607 elif data.param_types[i] == 'te':
1608 data.te_li = num_diff_params + i
1609 data.te_i = self.param_index + i
1610 elif data.param_types[i] == 'rex':
1611 data.rex_li = num_diff_params + i
1612 data.rex_i = self.param_index + i
1613 elif data.param_types[i] == 'r':
1614 data.r_li = num_diff_params + i
1615 data.r_i = self.param_index + i
1616 elif data.param_types[i] == 'csa':
1617 data.csa_li = num_diff_params + i
1618 data.csa_i = self.param_index + i
1619 elif data.param_types[i] == 'local_tm':
1620 pass
1621 else:
1622 print("Unknown parameter.")
1623 return 0
1624
1625
1626 self.param_index = self.param_index + data.num_params
1627
1628
1629 if self.model_type == 'mf':
1630
1631 if data.s2_i == None and data.te_i == None:
1632
1633 data.calc_jw_comps = None
1634 data.calc_jw = calc_jw
1635
1636
1637 data.calc_djw_comps = None
1638
1639
1640 elif data.s2_i != None and data.te_i == None:
1641
1642 data.calc_jw_comps = None
1643 data.calc_jw = calc_S2_jw
1644
1645
1646 data.calc_djw_comps = None
1647 data.calc_djw[data.s2_li] = calc_S2_djw_dS2
1648
1649
1650 elif data.s2_i != None and data.te_i != None:
1651
1652 data.calc_jw_comps = calc_S2_te_jw_comps
1653 data.calc_jw = calc_S2_te_jw
1654
1655
1656 data.calc_djw_comps = calc_S2_te_djw_comps
1657 data.calc_djw[data.s2_li] = calc_S2_te_djw_dS2
1658 data.calc_djw[data.te_li] = calc_S2_te_djw_dte
1659
1660
1661 data.calc_d2jw[data.s2_li][data.te_li] = data.calc_d2jw[data.te_li][data.s2_li] = calc_S2_te_d2jw_dS2dte
1662 data.calc_d2jw[data.te_li][data.te_li] = calc_S2_te_d2jw_dte2
1663
1664
1665 else:
1666 print("Invalid combination of parameters for the extended model-free equation.")
1667 return 0
1668
1669
1670 else:
1671
1672 if data.s2_i == None and data.te_i == None:
1673
1674 data.calc_jw_comps = None
1675 data.calc_jw = calc_jw
1676
1677
1678 data.calc_djw_comps = calc_diff_djw_comps
1679
1680
1681 if self.diff_data.type == 'sphere':
1682
1683 data.calc_djw[0] = calc_diff_djw_dGj
1684
1685
1686 data.calc_d2jw[0][0] = calc_diff_d2jw_dGjdGk
1687
1688
1689 elif self.diff_data.type == 'spheroid':
1690
1691 data.calc_djw[0] = data.calc_djw[1] = calc_diff_djw_dGj
1692 data.calc_djw[2] = data.calc_djw[3] = calc_diff_djw_dOj
1693
1694
1695 data.calc_d2jw[0][0] = calc_diff_d2jw_dGjdGk
1696 data.calc_d2jw[0][1] = data.calc_d2jw[1][0] = calc_diff_d2jw_dGjdGk
1697 data.calc_d2jw[1][1] = calc_diff_d2jw_dGjdGk
1698
1699 data.calc_d2jw[0][2] = data.calc_d2jw[2][0] = calc_diff_d2jw_dGjdOj
1700 data.calc_d2jw[0][3] = data.calc_d2jw[3][0] = calc_diff_d2jw_dGjdOj
1701 data.calc_d2jw[1][2] = data.calc_d2jw[2][1] = calc_diff_d2jw_dGjdOj
1702 data.calc_d2jw[1][3] = data.calc_d2jw[3][1] = calc_diff_d2jw_dGjdOj
1703
1704 data.calc_d2jw[2][2] = calc_diff_d2jw_dOjdOk
1705 data.calc_d2jw[2][3] = data.calc_d2jw[3][2] = calc_diff_d2jw_dOjdOk
1706 data.calc_d2jw[3][3] = calc_diff_d2jw_dOjdOk
1707
1708
1709 elif self.diff_data.type == 'ellipsoid':
1710
1711 data.calc_djw[0] = data.calc_djw[1] = data.calc_djw[2] = calc_ellipsoid_djw_dGj
1712 data.calc_djw[3] = data.calc_djw[4] = data.calc_djw[5] = calc_diff_djw_dOj
1713
1714
1715 data.calc_d2jw[0][0] = calc_ellipsoid_d2jw_dGjdGk
1716 data.calc_d2jw[0][1] = data.calc_d2jw[1][0] = calc_ellipsoid_d2jw_dGjdGk
1717 data.calc_d2jw[0][2] = data.calc_d2jw[2][0] = calc_ellipsoid_d2jw_dGjdGk
1718 data.calc_d2jw[1][1] = calc_ellipsoid_d2jw_dGjdGk
1719 data.calc_d2jw[1][2] = data.calc_d2jw[2][1] = calc_ellipsoid_d2jw_dGjdGk
1720 data.calc_d2jw[2][2] = calc_ellipsoid_d2jw_dGjdGk
1721
1722 data.calc_d2jw[0][3] = data.calc_d2jw[3][0] = calc_ellipsoid_d2jw_dGjdOj
1723 data.calc_d2jw[0][4] = data.calc_d2jw[4][0] = calc_ellipsoid_d2jw_dGjdOj
1724 data.calc_d2jw[0][5] = data.calc_d2jw[5][0] = calc_ellipsoid_d2jw_dGjdOj
1725 data.calc_d2jw[1][3] = data.calc_d2jw[3][1] = calc_ellipsoid_d2jw_dGjdOj
1726 data.calc_d2jw[1][4] = data.calc_d2jw[4][1] = calc_ellipsoid_d2jw_dGjdOj
1727 data.calc_d2jw[1][5] = data.calc_d2jw[5][1] = calc_ellipsoid_d2jw_dGjdOj
1728 data.calc_d2jw[2][3] = data.calc_d2jw[3][2] = calc_ellipsoid_d2jw_dGjdOj
1729 data.calc_d2jw[2][4] = data.calc_d2jw[4][2] = calc_ellipsoid_d2jw_dGjdOj
1730 data.calc_d2jw[2][5] = data.calc_d2jw[5][2] = calc_ellipsoid_d2jw_dGjdOj
1731
1732 data.calc_d2jw[3][3] = calc_diff_d2jw_dOjdOk
1733 data.calc_d2jw[3][4] = data.calc_d2jw[4][3] = calc_diff_d2jw_dOjdOk
1734 data.calc_d2jw[3][5] = data.calc_d2jw[5][3] = calc_diff_d2jw_dOjdOk
1735 data.calc_d2jw[4][4] = calc_diff_d2jw_dOjdOk
1736 data.calc_d2jw[4][5] = data.calc_d2jw[5][4] = calc_diff_d2jw_dOjdOk
1737 data.calc_d2jw[5][5] = calc_diff_d2jw_dOjdOk
1738
1739
1740 elif data.s2_i != None and data.te_i == None:
1741
1742 data.calc_jw_comps = None
1743 data.calc_jw = calc_S2_jw
1744
1745
1746 data.calc_djw_comps = calc_diff_djw_comps
1747
1748 if self.model_type != 'diff':
1749
1750 data.calc_djw[data.s2_li] = calc_S2_djw_dS2
1751
1752
1753 if self.diff_data.type == 'sphere':
1754
1755 data.calc_djw[0] = calc_diff_S2_djw_dGj
1756
1757
1758 data.calc_d2jw[0][0] = calc_diff_S2_d2jw_dGjdGk
1759 if self.model_type != 'diff':
1760 data.calc_d2jw[0][data.s2_li] = data.calc_d2jw[data.s2_li][0] = calc_diff_S2_d2jw_dGjdS2
1761
1762
1763 elif self.diff_data.type == 'spheroid':
1764
1765 data.calc_djw[0] = data.calc_djw[1] = calc_diff_S2_djw_dGj
1766 data.calc_djw[2] = data.calc_djw[3] = calc_diff_S2_djw_dOj
1767
1768
1769 data.calc_d2jw[0][0] = calc_diff_S2_d2jw_dGjdGk
1770 data.calc_d2jw[0][1] = data.calc_d2jw[1][0] = calc_diff_S2_d2jw_dGjdGk
1771 data.calc_d2jw[1][1] = calc_diff_S2_d2jw_dGjdGk
1772
1773 data.calc_d2jw[0][2] = data.calc_d2jw[2][0] = calc_diff_S2_d2jw_dGjdOj
1774 data.calc_d2jw[0][3] = data.calc_d2jw[3][0] = calc_diff_S2_d2jw_dGjdOj
1775 data.calc_d2jw[1][2] = data.calc_d2jw[2][1] = calc_diff_S2_d2jw_dGjdOj
1776 data.calc_d2jw[1][3] = data.calc_d2jw[3][1] = calc_diff_S2_d2jw_dGjdOj
1777
1778 data.calc_d2jw[2][2] = calc_diff_S2_d2jw_dOjdOk
1779 data.calc_d2jw[2][3] = data.calc_d2jw[3][2] = calc_diff_S2_d2jw_dOjdOk
1780 data.calc_d2jw[3][3] = calc_diff_S2_d2jw_dOjdOk
1781
1782 if self.model_type != 'diff':
1783 data.calc_d2jw[0][data.s2_li] = data.calc_d2jw[data.s2_li][0] = calc_diff_S2_d2jw_dGjdS2
1784 data.calc_d2jw[1][data.s2_li] = data.calc_d2jw[data.s2_li][1] = calc_diff_S2_d2jw_dGjdS2
1785 data.calc_d2jw[2][data.s2_li] = data.calc_d2jw[data.s2_li][2] = calc_diff_S2_d2jw_dOjdS2
1786 data.calc_d2jw[3][data.s2_li] = data.calc_d2jw[data.s2_li][3] = calc_diff_S2_d2jw_dOjdS2
1787
1788
1789 elif self.diff_data.type == 'ellipsoid':
1790
1791 data.calc_djw[0] = data.calc_djw[1] = data.calc_djw[2] = calc_ellipsoid_S2_djw_dGj
1792 data.calc_djw[3] = data.calc_djw[4] = data.calc_djw[5] = calc_diff_S2_djw_dOj
1793
1794
1795 data.calc_d2jw[0][0] = calc_ellipsoid_S2_d2jw_dGjdGk
1796 data.calc_d2jw[0][1] = data.calc_d2jw[1][0] = calc_ellipsoid_S2_d2jw_dGjdGk
1797 data.calc_d2jw[0][2] = data.calc_d2jw[2][0] = calc_ellipsoid_S2_d2jw_dGjdGk
1798 data.calc_d2jw[1][1] = calc_ellipsoid_S2_d2jw_dGjdGk
1799 data.calc_d2jw[1][2] = data.calc_d2jw[2][1] = calc_ellipsoid_S2_d2jw_dGjdGk
1800 data.calc_d2jw[2][2] = calc_ellipsoid_S2_d2jw_dGjdGk
1801
1802 data.calc_d2jw[0][3] = data.calc_d2jw[3][0] = calc_ellipsoid_S2_d2jw_dGjdOj
1803 data.calc_d2jw[0][4] = data.calc_d2jw[4][0] = calc_ellipsoid_S2_d2jw_dGjdOj
1804 data.calc_d2jw[0][5] = data.calc_d2jw[5][0] = calc_ellipsoid_S2_d2jw_dGjdOj
1805 data.calc_d2jw[1][3] = data.calc_d2jw[3][1] = calc_ellipsoid_S2_d2jw_dGjdOj
1806 data.calc_d2jw[1][4] = data.calc_d2jw[4][1] = calc_ellipsoid_S2_d2jw_dGjdOj
1807 data.calc_d2jw[1][5] = data.calc_d2jw[5][1] = calc_ellipsoid_S2_d2jw_dGjdOj
1808 data.calc_d2jw[2][3] = data.calc_d2jw[3][2] = calc_ellipsoid_S2_d2jw_dGjdOj
1809 data.calc_d2jw[2][4] = data.calc_d2jw[4][2] = calc_ellipsoid_S2_d2jw_dGjdOj
1810 data.calc_d2jw[2][5] = data.calc_d2jw[5][2] = calc_ellipsoid_S2_d2jw_dGjdOj
1811
1812 data.calc_d2jw[3][3] = calc_diff_S2_d2jw_dOjdOk
1813 data.calc_d2jw[3][4] = data.calc_d2jw[4][3] = calc_diff_S2_d2jw_dOjdOk
1814 data.calc_d2jw[3][5] = data.calc_d2jw[5][3] = calc_diff_S2_d2jw_dOjdOk
1815 data.calc_d2jw[4][4] = calc_diff_S2_d2jw_dOjdOk
1816 data.calc_d2jw[4][5] = data.calc_d2jw[5][4] = calc_diff_S2_d2jw_dOjdOk
1817 data.calc_d2jw[5][5] = calc_diff_S2_d2jw_dOjdOk
1818
1819 if self.model_type != 'diff':
1820 data.calc_d2jw[0][data.s2_li] = data.calc_d2jw[data.s2_li][0] = calc_ellipsoid_S2_d2jw_dGjdS2
1821 data.calc_d2jw[1][data.s2_li] = data.calc_d2jw[data.s2_li][1] = calc_ellipsoid_S2_d2jw_dGjdS2
1822 data.calc_d2jw[2][data.s2_li] = data.calc_d2jw[data.s2_li][2] = calc_ellipsoid_S2_d2jw_dGjdS2
1823 data.calc_d2jw[3][data.s2_li] = data.calc_d2jw[data.s2_li][3] = calc_diff_S2_d2jw_dOjdS2
1824 data.calc_d2jw[4][data.s2_li] = data.calc_d2jw[data.s2_li][4] = calc_diff_S2_d2jw_dOjdS2
1825 data.calc_d2jw[5][data.s2_li] = data.calc_d2jw[data.s2_li][5] = calc_diff_S2_d2jw_dOjdS2
1826
1827
1828
1829 elif data.s2_i != None and data.te_i != None:
1830
1831 data.calc_jw_comps = calc_S2_te_jw_comps
1832 data.calc_jw = calc_S2_te_jw
1833
1834
1835 data.calc_djw_comps = calc_diff_S2_te_djw_comps
1836
1837 if self.model_type != 'diff':
1838
1839 data.calc_djw[data.s2_li] = calc_S2_te_djw_dS2
1840 data.calc_djw[data.te_li] = calc_S2_te_djw_dte
1841
1842
1843 data.calc_d2jw[data.s2_li][data.te_li] = data.calc_d2jw[data.te_li][data.s2_li] = calc_S2_te_d2jw_dS2dte
1844 data.calc_d2jw[data.te_li][data.te_li] = calc_S2_te_d2jw_dte2
1845
1846
1847 if self.diff_data.type == 'sphere':
1848
1849 data.calc_djw[0] = calc_diff_S2_te_djw_dGj
1850
1851
1852 data.calc_d2jw[0][0] = calc_diff_S2_te_d2jw_dGjdGk
1853 if self.model_type != 'diff':
1854 data.calc_d2jw[0][data.s2_li] = data.calc_d2jw[data.s2_li][0] = calc_diff_S2_te_d2jw_dGjdS2
1855 data.calc_d2jw[0][data.te_li] = data.calc_d2jw[data.te_li][0] = calc_diff_S2_te_d2jw_dGjdte
1856
1857
1858 elif self.diff_data.type == 'spheroid':
1859
1860 data.calc_djw[0] = data.calc_djw[1] = calc_diff_S2_te_djw_dGj
1861 data.calc_djw[2] = data.calc_djw[3] = calc_diff_S2_te_djw_dOj
1862
1863
1864 data.calc_d2jw[0][0] = calc_diff_S2_te_d2jw_dGjdGk
1865 data.calc_d2jw[0][1] = data.calc_d2jw[1][0] = calc_diff_S2_te_d2jw_dGjdGk
1866 data.calc_d2jw[1][1] = calc_diff_S2_te_d2jw_dGjdGk
1867
1868 data.calc_d2jw[0][2] = data.calc_d2jw[2][0] = calc_diff_S2_te_d2jw_dGjdOj
1869 data.calc_d2jw[0][3] = data.calc_d2jw[3][0] = calc_diff_S2_te_d2jw_dGjdOj
1870 data.calc_d2jw[1][2] = data.calc_d2jw[2][1] = calc_diff_S2_te_d2jw_dGjdOj
1871 data.calc_d2jw[1][3] = data.calc_d2jw[3][1] = calc_diff_S2_te_d2jw_dGjdOj
1872
1873 data.calc_d2jw[2][2] = calc_diff_S2_te_d2jw_dOjdOk
1874 data.calc_d2jw[2][3] = data.calc_d2jw[3][2] = calc_diff_S2_te_d2jw_dOjdOk
1875 data.calc_d2jw[3][3] = calc_diff_S2_te_d2jw_dOjdOk
1876
1877 if self.model_type != 'diff':
1878 data.calc_d2jw[0][data.s2_li] = data.calc_d2jw[data.s2_li][0] = calc_diff_S2_te_d2jw_dGjdS2
1879 data.calc_d2jw[1][data.s2_li] = data.calc_d2jw[data.s2_li][1] = calc_diff_S2_te_d2jw_dGjdS2
1880 data.calc_d2jw[2][data.s2_li] = data.calc_d2jw[data.s2_li][2] = calc_diff_S2_te_d2jw_dOjdS2
1881 data.calc_d2jw[3][data.s2_li] = data.calc_d2jw[data.s2_li][3] = calc_diff_S2_te_d2jw_dOjdS2
1882
1883 data.calc_d2jw[0][data.te_li] = data.calc_d2jw[data.te_li][0] = calc_diff_S2_te_d2jw_dGjdte
1884 data.calc_d2jw[1][data.te_li] = data.calc_d2jw[data.te_li][1] = calc_diff_S2_te_d2jw_dGjdte
1885 data.calc_d2jw[2][data.te_li] = data.calc_d2jw[data.te_li][2] = calc_diff_S2_te_d2jw_dOjdte
1886 data.calc_d2jw[3][data.te_li] = data.calc_d2jw[data.te_li][3] = calc_diff_S2_te_d2jw_dOjdte
1887
1888
1889 elif self.diff_data.type == 'ellipsoid':
1890
1891 data.calc_djw[0] = data.calc_djw[1] = data.calc_djw[2] = calc_ellipsoid_S2_te_djw_dGj
1892 data.calc_djw[3] = data.calc_djw[4] = data.calc_djw[5] = calc_diff_S2_te_djw_dOj
1893
1894
1895 data.calc_d2jw[0][0] = calc_ellipsoid_S2_te_d2jw_dGjdGk
1896 data.calc_d2jw[0][1] = data.calc_d2jw[1][0] = calc_ellipsoid_S2_te_d2jw_dGjdGk
1897 data.calc_d2jw[0][2] = data.calc_d2jw[2][0] = calc_ellipsoid_S2_te_d2jw_dGjdGk
1898 data.calc_d2jw[1][1] = calc_ellipsoid_S2_te_d2jw_dGjdGk
1899 data.calc_d2jw[1][2] = data.calc_d2jw[2][1] = calc_ellipsoid_S2_te_d2jw_dGjdGk
1900 data.calc_d2jw[2][2] = calc_ellipsoid_S2_te_d2jw_dGjdGk
1901
1902 data.calc_d2jw[0][3] = data.calc_d2jw[3][0] = calc_ellipsoid_S2_te_d2jw_dGjdOj
1903 data.calc_d2jw[0][4] = data.calc_d2jw[4][0] = calc_ellipsoid_S2_te_d2jw_dGjdOj
1904 data.calc_d2jw[0][5] = data.calc_d2jw[5][0] = calc_ellipsoid_S2_te_d2jw_dGjdOj
1905 data.calc_d2jw[1][3] = data.calc_d2jw[3][1] = calc_ellipsoid_S2_te_d2jw_dGjdOj
1906 data.calc_d2jw[1][4] = data.calc_d2jw[4][1] = calc_ellipsoid_S2_te_d2jw_dGjdOj
1907 data.calc_d2jw[1][5] = data.calc_d2jw[5][1] = calc_ellipsoid_S2_te_d2jw_dGjdOj
1908 data.calc_d2jw[2][3] = data.calc_d2jw[3][2] = calc_ellipsoid_S2_te_d2jw_dGjdOj
1909 data.calc_d2jw[2][4] = data.calc_d2jw[4][2] = calc_ellipsoid_S2_te_d2jw_dGjdOj
1910 data.calc_d2jw[2][5] = data.calc_d2jw[5][2] = calc_ellipsoid_S2_te_d2jw_dGjdOj
1911
1912 data.calc_d2jw[3][3] = calc_diff_S2_te_d2jw_dOjdOk
1913 data.calc_d2jw[3][4] = data.calc_d2jw[4][3] = calc_diff_S2_te_d2jw_dOjdOk
1914 data.calc_d2jw[3][5] = data.calc_d2jw[5][3] = calc_diff_S2_te_d2jw_dOjdOk
1915 data.calc_d2jw[4][4] = calc_diff_S2_te_d2jw_dOjdOk
1916 data.calc_d2jw[4][5] = data.calc_d2jw[5][4] = calc_diff_S2_te_d2jw_dOjdOk
1917 data.calc_d2jw[5][5] = calc_diff_S2_te_d2jw_dOjdOk
1918
1919 if self.model_type != 'diff':
1920 data.calc_d2jw[0][data.s2_li] = data.calc_d2jw[data.s2_li][0] = calc_ellipsoid_S2_te_d2jw_dGjdS2
1921 data.calc_d2jw[1][data.s2_li] = data.calc_d2jw[data.s2_li][1] = calc_ellipsoid_S2_te_d2jw_dGjdS2
1922 data.calc_d2jw[2][data.s2_li] = data.calc_d2jw[data.s2_li][2] = calc_ellipsoid_S2_te_d2jw_dGjdS2
1923 data.calc_d2jw[3][data.s2_li] = data.calc_d2jw[data.s2_li][3] = calc_diff_S2_te_d2jw_dOjdS2
1924 data.calc_d2jw[4][data.s2_li] = data.calc_d2jw[data.s2_li][4] = calc_diff_S2_te_d2jw_dOjdS2
1925 data.calc_d2jw[5][data.s2_li] = data.calc_d2jw[data.s2_li][5] = calc_diff_S2_te_d2jw_dOjdS2
1926
1927 data.calc_d2jw[0][data.te_li] = data.calc_d2jw[data.te_li][0] = calc_ellipsoid_S2_te_d2jw_dGjdte
1928 data.calc_d2jw[1][data.te_li] = data.calc_d2jw[data.te_li][1] = calc_ellipsoid_S2_te_d2jw_dGjdte
1929 data.calc_d2jw[2][data.te_li] = data.calc_d2jw[data.te_li][2] = calc_ellipsoid_S2_te_d2jw_dGjdte
1930 data.calc_d2jw[3][data.te_li] = data.calc_d2jw[data.te_li][3] = calc_diff_S2_te_d2jw_dOjdte
1931 data.calc_d2jw[4][data.te_li] = data.calc_d2jw[data.te_li][4] = calc_diff_S2_te_d2jw_dOjdte
1932 data.calc_d2jw[5][data.te_li] = data.calc_d2jw[data.te_li][5] = calc_diff_S2_te_d2jw_dOjdte
1933
1934
1935 else:
1936 print("Invalid combination of parameters for the extended model-free equation.")
1937 return 0
1938
1939
1940
1941
1942
1943
1944 elif data.equations == 'mf_ext':
1945
1946 for i in range(data.num_params):
1947 if data.param_types[i] == 's2f':
1948 data.s2f_li = num_diff_params + i
1949 data.s2f_i = self.param_index + i
1950 elif data.param_types[i] == 'tf':
1951 data.tf_li = num_diff_params + i
1952 data.tf_i = self.param_index + i
1953 elif data.param_types[i] == 's2':
1954 data.s2_li = num_diff_params + i
1955 data.s2_i = self.param_index + i
1956 elif data.param_types[i] == 'ts':
1957 data.ts_li = num_diff_params + i
1958 data.ts_i = self.param_index + i
1959 elif data.param_types[i] == 'rex':
1960 data.rex_li = num_diff_params + i
1961 data.rex_i = self.param_index + i
1962 elif data.param_types[i] == 'r':
1963 data.r_li = num_diff_params + i
1964 data.r_i = self.param_index + i
1965 elif data.param_types[i] == 'csa':
1966 data.csa_li = num_diff_params + i
1967 data.csa_i = self.param_index + i
1968 elif data.param_types[i] == 'local_tm':
1969 pass
1970 else:
1971 print("Unknown parameter.")
1972 return 0
1973
1974
1975 self.param_index = self.param_index + data.num_params
1976
1977
1978 if self.model_type == 'mf':
1979
1980 if data.s2f_i != None and data.tf_i == None and data.s2_i != None and data.ts_i != None:
1981
1982 data.calc_jw_comps = calc_S2f_S2_ts_jw_comps
1983 data.calc_jw = calc_S2f_S2_ts_jw
1984
1985
1986 data.calc_djw_comps = calc_S2f_S2_ts_djw_comps
1987 data.calc_djw[data.s2f_li] = calc_S2f_S2_ts_djw_dS2f
1988 data.calc_djw[data.s2_li] = calc_S2f_S2_ts_djw_dS2
1989 data.calc_djw[data.ts_li] = calc_S2f_S2_ts_djw_dts
1990
1991
1992 data.calc_d2jw[data.s2f_li][data.ts_li] = data.calc_d2jw[data.ts_li][data.s2f_li] = calc_S2f_S2_ts_d2jw_dS2fdts
1993 data.calc_d2jw[data.s2_li][data.ts_li] = data.calc_d2jw[data.ts_li][data.s2_li] = calc_S2f_S2_ts_d2jw_dS2dts
1994 data.calc_d2jw[data.ts_li][data.ts_li] = calc_S2f_S2_ts_d2jw_dts2
1995
1996
1997 elif data.s2f_i != None and data.tf_i != None and data.s2_i != None and data.ts_i != None:
1998
1999 data.calc_jw_comps = calc_S2f_tf_S2_ts_jw_comps
2000 data.calc_jw = calc_S2f_tf_S2_ts_jw
2001
2002
2003 data.calc_djw_comps = calc_S2f_tf_S2_ts_djw_comps
2004 data.calc_djw[data.s2f_li] = calc_S2f_tf_S2_ts_djw_dS2f
2005 data.calc_djw[data.tf_li] = calc_S2f_tf_S2_ts_djw_dtf
2006 data.calc_djw[data.s2_li] = calc_S2f_S2_ts_djw_dS2
2007 data.calc_djw[data.ts_li] = calc_S2f_S2_ts_djw_dts
2008
2009
2010 data.calc_d2jw[data.s2f_li][data.tf_li] = data.calc_d2jw[data.tf_li][data.s2f_li] = calc_S2f_tf_S2_ts_d2jw_dS2fdtf
2011 data.calc_d2jw[data.s2f_li][data.ts_li] = data.calc_d2jw[data.ts_li][data.s2f_li] = calc_S2f_S2_ts_d2jw_dS2fdts
2012 data.calc_d2jw[data.s2_li][data.ts_li] = data.calc_d2jw[data.ts_li][data.s2_li] = calc_S2f_S2_ts_d2jw_dS2dts
2013 data.calc_d2jw[data.tf_li][data.tf_li] = calc_S2f_tf_S2_ts_d2jw_dtf2
2014 data.calc_d2jw[data.ts_li][data.ts_li] = calc_S2f_S2_ts_d2jw_dts2
2015
2016
2017 else:
2018 print("Invalid combination of parameters for the extended model-free equation.")
2019 return 0
2020
2021
2022 else:
2023
2024 if data.s2f_i != None and data.tf_i == None and data.s2_i != None and data.ts_i != None:
2025
2026 data.calc_jw_comps = calc_S2f_S2_ts_jw_comps
2027 data.calc_jw = calc_S2f_S2_ts_jw
2028
2029
2030 data.calc_djw_comps = calc_diff_S2f_S2_ts_djw_comps
2031
2032 if self.model_type != 'diff':
2033
2034 data.calc_djw[data.s2f_li] = calc_S2f_S2_ts_djw_dS2f
2035 data.calc_djw[data.s2_li] = calc_S2f_S2_ts_djw_dS2
2036 data.calc_djw[data.ts_li] = calc_S2f_S2_ts_djw_dts
2037
2038
2039 data.calc_d2jw[data.s2f_li][data.ts_li] = data.calc_d2jw[data.ts_li][data.s2f_li] = calc_S2f_S2_ts_d2jw_dS2fdts
2040 data.calc_d2jw[data.s2_li][data.ts_li] = data.calc_d2jw[data.ts_li][data.s2_li] = calc_S2f_S2_ts_d2jw_dS2dts
2041 data.calc_d2jw[data.ts_li][data.ts_li] = calc_S2f_S2_ts_d2jw_dts2
2042
2043
2044 if self.diff_data.type == 'sphere':
2045
2046 data.calc_djw[0] = calc_diff_S2f_S2_ts_djw_dGj
2047
2048
2049 data.calc_d2jw[0][0] = calc_diff_S2f_S2_ts_d2jw_dGjdGk
2050 if self.model_type != 'diff':
2051 data.calc_d2jw[0][data.s2f_li] = data.calc_d2jw[data.s2f_li][0] = calc_diff_S2f_S2_ts_d2jw_dGjdS2f
2052 data.calc_d2jw[0][data.s2_li] = data.calc_d2jw[data.s2_li][0] = calc_diff_S2f_S2_ts_d2jw_dGjdS2
2053 data.calc_d2jw[0][data.ts_li] = data.calc_d2jw[data.ts_li][0] = calc_diff_S2f_S2_ts_d2jw_dGjdts
2054
2055
2056 elif self.diff_data.type == 'spheroid':
2057
2058 data.calc_djw[0] = data.calc_djw[1] = calc_diff_S2f_S2_ts_djw_dGj
2059 data.calc_djw[2] = data.calc_djw[3] = calc_diff_S2f_S2_ts_djw_dOj
2060
2061
2062 data.calc_d2jw[0][0] = calc_diff_S2f_S2_ts_d2jw_dGjdGk
2063 data.calc_d2jw[0][1] = data.calc_d2jw[1][0] = calc_diff_S2f_S2_ts_d2jw_dGjdGk
2064 data.calc_d2jw[1][1] = calc_diff_S2f_S2_ts_d2jw_dGjdGk
2065
2066 data.calc_d2jw[0][2] = data.calc_d2jw[2][0] = calc_diff_S2f_S2_ts_d2jw_dGjdOj
2067 data.calc_d2jw[0][3] = data.calc_d2jw[3][0] = calc_diff_S2f_S2_ts_d2jw_dGjdOj
2068 data.calc_d2jw[1][2] = data.calc_d2jw[2][1] = calc_diff_S2f_S2_ts_d2jw_dGjdOj
2069 data.calc_d2jw[1][3] = data.calc_d2jw[3][1] = calc_diff_S2f_S2_ts_d2jw_dGjdOj
2070
2071 data.calc_d2jw[2][2] = calc_diff_S2f_S2_ts_d2jw_dOjdOk
2072 data.calc_d2jw[2][3] = data.calc_d2jw[3][2] = calc_diff_S2f_S2_ts_d2jw_dOjdOk
2073 data.calc_d2jw[3][3] = calc_diff_S2f_S2_ts_d2jw_dOjdOk
2074
2075 if self.model_type != 'diff':
2076 data.calc_d2jw[0][data.s2f_li] = data.calc_d2jw[data.s2f_li][0] = calc_diff_S2f_S2_ts_d2jw_dGjdS2f
2077 data.calc_d2jw[1][data.s2f_li] = data.calc_d2jw[data.s2f_li][1] = calc_diff_S2f_S2_ts_d2jw_dGjdS2f
2078 data.calc_d2jw[2][data.s2f_li] = data.calc_d2jw[data.s2f_li][2] = calc_diff_S2f_S2_ts_d2jw_dOjdS2f
2079 data.calc_d2jw[3][data.s2f_li] = data.calc_d2jw[data.s2f_li][3] = calc_diff_S2f_S2_ts_d2jw_dOjdS2f
2080
2081 data.calc_d2jw[0][data.s2_li] = data.calc_d2jw[data.s2_li][0] = calc_diff_S2f_S2_ts_d2jw_dGjdS2
2082 data.calc_d2jw[1][data.s2_li] = data.calc_d2jw[data.s2_li][1] = calc_diff_S2f_S2_ts_d2jw_dGjdS2
2083 data.calc_d2jw[2][data.s2_li] = data.calc_d2jw[data.s2_li][2] = calc_diff_S2f_S2_ts_d2jw_dOjdS2
2084 data.calc_d2jw[3][data.s2_li] = data.calc_d2jw[data.s2_li][3] = calc_diff_S2f_S2_ts_d2jw_dOjdS2
2085
2086 data.calc_d2jw[0][data.ts_li] = data.calc_d2jw[data.ts_li][0] = calc_diff_S2f_S2_ts_d2jw_dGjdts
2087 data.calc_d2jw[1][data.ts_li] = data.calc_d2jw[data.ts_li][1] = calc_diff_S2f_S2_ts_d2jw_dGjdts
2088 data.calc_d2jw[2][data.ts_li] = data.calc_d2jw[data.ts_li][2] = calc_diff_S2f_S2_ts_d2jw_dOjdts
2089 data.calc_d2jw[3][data.ts_li] = data.calc_d2jw[data.ts_li][3] = calc_diff_S2f_S2_ts_d2jw_dOjdts
2090
2091
2092 elif self.diff_data.type == 'ellipsoid':
2093
2094 data.calc_djw[0] = data.calc_djw[1] = data.calc_djw[2] = calc_ellipsoid_S2f_S2_ts_djw_dGj
2095 data.calc_djw[3] = data.calc_djw[4] = data.calc_djw[5] = calc_diff_S2f_S2_ts_djw_dOj
2096
2097
2098 data.calc_d2jw[0][0] = calc_ellipsoid_S2f_S2_ts_d2jw_dGjdGk
2099 data.calc_d2jw[0][1] = data.calc_d2jw[1][0] = calc_ellipsoid_S2f_S2_ts_d2jw_dGjdGk
2100 data.calc_d2jw[0][2] = data.calc_d2jw[2][0] = calc_ellipsoid_S2f_S2_ts_d2jw_dGjdGk
2101 data.calc_d2jw[1][1] = calc_ellipsoid_S2f_S2_ts_d2jw_dGjdGk
2102 data.calc_d2jw[1][2] = data.calc_d2jw[2][1] = calc_ellipsoid_S2f_S2_ts_d2jw_dGjdGk
2103 data.calc_d2jw[2][2] = calc_ellipsoid_S2f_S2_ts_d2jw_dGjdGk
2104
2105 data.calc_d2jw[0][3] = data.calc_d2jw[3][0] = calc_ellipsoid_S2f_S2_ts_d2jw_dGjdOj
2106 data.calc_d2jw[0][4] = data.calc_d2jw[4][0] = calc_ellipsoid_S2f_S2_ts_d2jw_dGjdOj
2107 data.calc_d2jw[0][5] = data.calc_d2jw[5][0] = calc_ellipsoid_S2f_S2_ts_d2jw_dGjdOj
2108 data.calc_d2jw[1][3] = data.calc_d2jw[3][1] = calc_ellipsoid_S2f_S2_ts_d2jw_dGjdOj
2109 data.calc_d2jw[1][4] = data.calc_d2jw[4][1] = calc_ellipsoid_S2f_S2_ts_d2jw_dGjdOj
2110 data.calc_d2jw[1][5] = data.calc_d2jw[5][1] = calc_ellipsoid_S2f_S2_ts_d2jw_dGjdOj
2111 data.calc_d2jw[2][3] = data.calc_d2jw[3][2] = calc_ellipsoid_S2f_S2_ts_d2jw_dGjdOj
2112 data.calc_d2jw[2][4] = data.calc_d2jw[4][2] = calc_ellipsoid_S2f_S2_ts_d2jw_dGjdOj
2113 data.calc_d2jw[2][5] = data.calc_d2jw[5][2] = calc_ellipsoid_S2f_S2_ts_d2jw_dGjdOj
2114
2115 data.calc_d2jw[3][3] = calc_diff_S2f_S2_ts_d2jw_dOjdOk
2116 data.calc_d2jw[3][4] = data.calc_d2jw[4][3] = calc_diff_S2f_S2_ts_d2jw_dOjdOk
2117 data.calc_d2jw[3][5] = data.calc_d2jw[5][3] = calc_diff_S2f_S2_ts_d2jw_dOjdOk
2118 data.calc_d2jw[4][4] = calc_diff_S2f_S2_ts_d2jw_dOjdOk
2119 data.calc_d2jw[4][5] = data.calc_d2jw[5][4] = calc_diff_S2f_S2_ts_d2jw_dOjdOk
2120 data.calc_d2jw[5][5] = calc_diff_S2f_S2_ts_d2jw_dOjdOk
2121
2122 if self.model_type != 'diff':
2123 data.calc_d2jw[0][data.s2f_li] = data.calc_d2jw[data.s2f_li][0] = calc_ellipsoid_S2f_S2_ts_d2jw_dGjdS2f
2124 data.calc_d2jw[1][data.s2f_li] = data.calc_d2jw[data.s2f_li][1] = calc_ellipsoid_S2f_S2_ts_d2jw_dGjdS2f
2125 data.calc_d2jw[2][data.s2f_li] = data.calc_d2jw[data.s2f_li][2] = calc_ellipsoid_S2f_S2_ts_d2jw_dGjdS2f
2126 data.calc_d2jw[3][data.s2f_li] = data.calc_d2jw[data.s2f_li][3] = calc_diff_S2f_S2_ts_d2jw_dOjdS2f
2127 data.calc_d2jw[4][data.s2f_li] = data.calc_d2jw[data.s2f_li][4] = calc_diff_S2f_S2_ts_d2jw_dOjdS2f
2128 data.calc_d2jw[5][data.s2f_li] = data.calc_d2jw[data.s2f_li][5] = calc_diff_S2f_S2_ts_d2jw_dOjdS2f
2129
2130 data.calc_d2jw[0][data.s2_li] = data.calc_d2jw[data.s2_li][0] = calc_ellipsoid_S2f_S2_ts_d2jw_dGjdS2
2131 data.calc_d2jw[1][data.s2_li] = data.calc_d2jw[data.s2_li][1] = calc_ellipsoid_S2f_S2_ts_d2jw_dGjdS2
2132 data.calc_d2jw[2][data.s2_li] = data.calc_d2jw[data.s2_li][2] = calc_ellipsoid_S2f_S2_ts_d2jw_dGjdS2
2133 data.calc_d2jw[3][data.s2_li] = data.calc_d2jw[data.s2_li][3] = calc_diff_S2f_S2_ts_d2jw_dOjdS2
2134 data.calc_d2jw[4][data.s2_li] = data.calc_d2jw[data.s2_li][4] = calc_diff_S2f_S2_ts_d2jw_dOjdS2
2135 data.calc_d2jw[5][data.s2_li] = data.calc_d2jw[data.s2_li][5] = calc_diff_S2f_S2_ts_d2jw_dOjdS2
2136
2137 data.calc_d2jw[0][data.ts_li] = data.calc_d2jw[data.ts_li][0] = calc_ellipsoid_S2f_S2_ts_d2jw_dGjdts
2138 data.calc_d2jw[1][data.ts_li] = data.calc_d2jw[data.ts_li][1] = calc_ellipsoid_S2f_S2_ts_d2jw_dGjdts
2139 data.calc_d2jw[2][data.ts_li] = data.calc_d2jw[data.ts_li][2] = calc_ellipsoid_S2f_S2_ts_d2jw_dGjdts
2140 data.calc_d2jw[3][data.ts_li] = data.calc_d2jw[data.ts_li][3] = calc_diff_S2f_S2_ts_d2jw_dOjdts
2141 data.calc_d2jw[4][data.ts_li] = data.calc_d2jw[data.ts_li][4] = calc_diff_S2f_S2_ts_d2jw_dOjdts
2142 data.calc_d2jw[5][data.ts_li] = data.calc_d2jw[data.ts_li][5] = calc_diff_S2f_S2_ts_d2jw_dOjdts
2143
2144
2145
2146 elif data.s2f_i != None and data.tf_i != None and data.s2_i != None and data.ts_i != None:
2147
2148 data.calc_jw_comps = calc_S2f_tf_S2_ts_jw_comps
2149 data.calc_jw = calc_S2f_tf_S2_ts_jw
2150
2151
2152 data.calc_djw_comps = calc_diff_S2f_tf_S2_ts_djw_comps
2153
2154 if self.model_type != 'diff':
2155
2156 data.calc_djw[data.s2f_li] = calc_S2f_tf_S2_ts_djw_dS2f
2157 data.calc_djw[data.tf_li] = calc_S2f_tf_S2_ts_djw_dtf
2158 data.calc_djw[data.s2_li] = calc_S2f_S2_ts_djw_dS2
2159 data.calc_djw[data.ts_li] = calc_S2f_S2_ts_djw_dts
2160
2161
2162 data.calc_d2jw[data.s2f_li][data.tf_li] = data.calc_d2jw[data.tf_li][data.s2f_li] = calc_S2f_tf_S2_ts_d2jw_dS2fdtf
2163 data.calc_d2jw[data.s2f_li][data.ts_li] = data.calc_d2jw[data.ts_li][data.s2f_li] = calc_S2f_S2_ts_d2jw_dS2fdts
2164 data.calc_d2jw[data.s2_li][data.ts_li] = data.calc_d2jw[data.ts_li][data.s2_li] = calc_S2f_S2_ts_d2jw_dS2dts
2165 data.calc_d2jw[data.tf_li][data.tf_li] = calc_S2f_tf_S2_ts_d2jw_dtf2
2166 data.calc_d2jw[data.ts_li][data.ts_li] = calc_S2f_S2_ts_d2jw_dts2
2167
2168
2169 if self.diff_data.type == 'sphere':
2170
2171 data.calc_djw[0] = calc_diff_S2f_tf_S2_ts_djw_dGj
2172
2173
2174 data.calc_d2jw[0][0] = calc_diff_S2f_tf_S2_ts_d2jw_dGjdGk
2175 if self.model_type != 'diff':
2176 data.calc_d2jw[0][data.s2f_li] = data.calc_d2jw[data.s2f_li][0] = calc_diff_S2f_tf_S2_ts_d2jw_dGjdS2f
2177 data.calc_d2jw[0][data.tf_li] = data.calc_d2jw[data.tf_li][0] = calc_diff_S2f_tf_S2_ts_d2jw_dGjdtf
2178 data.calc_d2jw[0][data.s2_li] = data.calc_d2jw[data.s2_li][0] = calc_diff_S2f_S2_ts_d2jw_dGjdS2
2179 data.calc_d2jw[0][data.ts_li] = data.calc_d2jw[data.ts_li][0] = calc_diff_S2f_S2_ts_d2jw_dGjdts
2180
2181
2182 elif self.diff_data.type == 'spheroid':
2183
2184 data.calc_djw[0] = data.calc_djw[1] = calc_diff_S2f_tf_S2_ts_djw_dGj
2185 data.calc_djw[2] = data.calc_djw[3] = calc_diff_S2f_tf_S2_ts_djw_dOj
2186
2187
2188 data.calc_d2jw[0][0] = calc_diff_S2f_tf_S2_ts_d2jw_dGjdGk
2189 data.calc_d2jw[0][1] = data.calc_d2jw[1][0] = calc_diff_S2f_tf_S2_ts_d2jw_dGjdGk
2190 data.calc_d2jw[1][1] = calc_diff_S2f_tf_S2_ts_d2jw_dGjdGk
2191
2192 data.calc_d2jw[0][2] = data.calc_d2jw[2][0] = calc_diff_S2f_tf_S2_ts_d2jw_dGjdOj
2193 data.calc_d2jw[0][3] = data.calc_d2jw[3][0] = calc_diff_S2f_tf_S2_ts_d2jw_dGjdOj
2194 data.calc_d2jw[1][2] = data.calc_d2jw[2][1] = calc_diff_S2f_tf_S2_ts_d2jw_dGjdOj
2195 data.calc_d2jw[1][3] = data.calc_d2jw[3][1] = calc_diff_S2f_tf_S2_ts_d2jw_dGjdOj
2196
2197 data.calc_d2jw[2][2] = calc_diff_S2f_tf_S2_ts_d2jw_dOjdOk
2198 data.calc_d2jw[2][3] = data.calc_d2jw[3][2] = calc_diff_S2f_tf_S2_ts_d2jw_dOjdOk
2199 data.calc_d2jw[3][3] = calc_diff_S2f_tf_S2_ts_d2jw_dOjdOk
2200
2201 if self.model_type != 'diff':
2202 data.calc_d2jw[0][data.s2f_li] = data.calc_d2jw[data.s2f_li][0] = calc_diff_S2f_tf_S2_ts_d2jw_dGjdS2f
2203 data.calc_d2jw[1][data.s2f_li] = data.calc_d2jw[data.s2f_li][1] = calc_diff_S2f_tf_S2_ts_d2jw_dGjdS2f
2204 data.calc_d2jw[2][data.s2f_li] = data.calc_d2jw[data.s2f_li][2] = calc_diff_S2f_tf_S2_ts_d2jw_dOjdS2f
2205 data.calc_d2jw[3][data.s2f_li] = data.calc_d2jw[data.s2f_li][3] = calc_diff_S2f_tf_S2_ts_d2jw_dOjdS2f
2206
2207 data.calc_d2jw[0][data.tf_li] = data.calc_d2jw[data.tf_li][0] = calc_diff_S2f_tf_S2_ts_d2jw_dGjdtf
2208 data.calc_d2jw[1][data.tf_li] = data.calc_d2jw[data.tf_li][1] = calc_diff_S2f_tf_S2_ts_d2jw_dGjdtf
2209 data.calc_d2jw[2][data.tf_li] = data.calc_d2jw[data.tf_li][2] = calc_diff_S2f_tf_S2_ts_d2jw_dOjdtf
2210 data.calc_d2jw[3][data.tf_li] = data.calc_d2jw[data.tf_li][3] = calc_diff_S2f_tf_S2_ts_d2jw_dOjdtf
2211
2212 data.calc_d2jw[0][data.s2_li] = data.calc_d2jw[data.s2_li][0] = calc_diff_S2f_S2_ts_d2jw_dGjdS2
2213 data.calc_d2jw[1][data.s2_li] = data.calc_d2jw[data.s2_li][1] = calc_diff_S2f_S2_ts_d2jw_dGjdS2
2214 data.calc_d2jw[2][data.s2_li] = data.calc_d2jw[data.s2_li][2] = calc_diff_S2f_S2_ts_d2jw_dOjdS2
2215 data.calc_d2jw[3][data.s2_li] = data.calc_d2jw[data.s2_li][3] = calc_diff_S2f_S2_ts_d2jw_dOjdS2
2216
2217 data.calc_d2jw[0][data.ts_li] = data.calc_d2jw[data.ts_li][0] = calc_diff_S2f_S2_ts_d2jw_dGjdts
2218 data.calc_d2jw[1][data.ts_li] = data.calc_d2jw[data.ts_li][1] = calc_diff_S2f_S2_ts_d2jw_dGjdts
2219 data.calc_d2jw[2][data.ts_li] = data.calc_d2jw[data.ts_li][2] = calc_diff_S2f_S2_ts_d2jw_dOjdts
2220 data.calc_d2jw[3][data.ts_li] = data.calc_d2jw[data.ts_li][3] = calc_diff_S2f_S2_ts_d2jw_dOjdts
2221
2222
2223 elif self.diff_data.type == 'ellipsoid':
2224
2225 data.calc_djw[0] = data.calc_djw[1] = data.calc_djw[2] = calc_ellipsoid_S2f_tf_S2_ts_djw_dGj
2226 data.calc_djw[3] = data.calc_djw[4] = data.calc_djw[5] = calc_diff_S2f_tf_S2_ts_djw_dOj
2227
2228
2229 data.calc_d2jw[0][0] = calc_ellipsoid_S2f_tf_S2_ts_d2jw_dGjdGk
2230 data.calc_d2jw[0][1] = data.calc_d2jw[1][0] = calc_ellipsoid_S2f_tf_S2_ts_d2jw_dGjdGk
2231 data.calc_d2jw[0][2] = data.calc_d2jw[2][0] = calc_ellipsoid_S2f_tf_S2_ts_d2jw_dGjdGk
2232 data.calc_d2jw[1][1] = calc_ellipsoid_S2f_tf_S2_ts_d2jw_dGjdGk
2233 data.calc_d2jw[1][2] = data.calc_d2jw[2][1] = calc_ellipsoid_S2f_tf_S2_ts_d2jw_dGjdGk
2234 data.calc_d2jw[2][2] = calc_ellipsoid_S2f_tf_S2_ts_d2jw_dGjdGk
2235
2236 data.calc_d2jw[0][3] = data.calc_d2jw[3][0] = calc_ellipsoid_S2f_tf_S2_ts_d2jw_dGjdOj
2237 data.calc_d2jw[0][4] = data.calc_d2jw[4][0] = calc_ellipsoid_S2f_tf_S2_ts_d2jw_dGjdOj
2238 data.calc_d2jw[0][5] = data.calc_d2jw[5][0] = calc_ellipsoid_S2f_tf_S2_ts_d2jw_dGjdOj
2239 data.calc_d2jw[1][3] = data.calc_d2jw[3][1] = calc_ellipsoid_S2f_tf_S2_ts_d2jw_dGjdOj
2240 data.calc_d2jw[1][4] = data.calc_d2jw[4][1] = calc_ellipsoid_S2f_tf_S2_ts_d2jw_dGjdOj
2241 data.calc_d2jw[1][5] = data.calc_d2jw[5][1] = calc_ellipsoid_S2f_tf_S2_ts_d2jw_dGjdOj
2242 data.calc_d2jw[2][3] = data.calc_d2jw[3][2] = calc_ellipsoid_S2f_tf_S2_ts_d2jw_dGjdOj
2243 data.calc_d2jw[2][4] = data.calc_d2jw[4][2] = calc_ellipsoid_S2f_tf_S2_ts_d2jw_dGjdOj
2244 data.calc_d2jw[2][5] = data.calc_d2jw[5][2] = calc_ellipsoid_S2f_tf_S2_ts_d2jw_dGjdOj
2245
2246 data.calc_d2jw[3][3] = calc_diff_S2f_tf_S2_ts_d2jw_dOjdOk
2247 data.calc_d2jw[3][4] = data.calc_d2jw[4][3] = calc_diff_S2f_tf_S2_ts_d2jw_dOjdOk
2248 data.calc_d2jw[3][5] = data.calc_d2jw[5][3] = calc_diff_S2f_tf_S2_ts_d2jw_dOjdOk
2249 data.calc_d2jw[4][4] = calc_diff_S2f_tf_S2_ts_d2jw_dOjdOk
2250 data.calc_d2jw[4][5] = data.calc_d2jw[5][4] = calc_diff_S2f_tf_S2_ts_d2jw_dOjdOk
2251 data.calc_d2jw[5][5] = calc_diff_S2f_tf_S2_ts_d2jw_dOjdOk
2252
2253 if self.model_type != 'diff':
2254 data.calc_d2jw[0][data.s2f_li] = data.calc_d2jw[data.s2f_li][0] = calc_ellipsoid_S2f_tf_S2_ts_d2jw_dGjdS2f
2255 data.calc_d2jw[1][data.s2f_li] = data.calc_d2jw[data.s2f_li][1] = calc_ellipsoid_S2f_tf_S2_ts_d2jw_dGjdS2f
2256 data.calc_d2jw[2][data.s2f_li] = data.calc_d2jw[data.s2f_li][2] = calc_ellipsoid_S2f_tf_S2_ts_d2jw_dGjdS2f
2257 data.calc_d2jw[3][data.s2f_li] = data.calc_d2jw[data.s2f_li][3] = calc_diff_S2f_tf_S2_ts_d2jw_dOjdS2f
2258 data.calc_d2jw[4][data.s2f_li] = data.calc_d2jw[data.s2f_li][4] = calc_diff_S2f_tf_S2_ts_d2jw_dOjdS2f
2259 data.calc_d2jw[5][data.s2f_li] = data.calc_d2jw[data.s2f_li][5] = calc_diff_S2f_tf_S2_ts_d2jw_dOjdS2f
2260
2261 data.calc_d2jw[0][data.tf_li] = data.calc_d2jw[data.tf_li][0] = calc_ellipsoid_S2f_tf_S2_ts_d2jw_dGjdtf
2262 data.calc_d2jw[1][data.tf_li] = data.calc_d2jw[data.tf_li][1] = calc_ellipsoid_S2f_tf_S2_ts_d2jw_dGjdtf
2263 data.calc_d2jw[2][data.tf_li] = data.calc_d2jw[data.tf_li][2] = calc_ellipsoid_S2f_tf_S2_ts_d2jw_dGjdtf
2264 data.calc_d2jw[3][data.tf_li] = data.calc_d2jw[data.tf_li][3] = calc_diff_S2f_tf_S2_ts_d2jw_dOjdtf
2265 data.calc_d2jw[4][data.tf_li] = data.calc_d2jw[data.tf_li][4] = calc_diff_S2f_tf_S2_ts_d2jw_dOjdtf
2266 data.calc_d2jw[5][data.tf_li] = data.calc_d2jw[data.tf_li][5] = calc_diff_S2f_tf_S2_ts_d2jw_dOjdtf
2267
2268 data.calc_d2jw[0][data.s2_li] = data.calc_d2jw[data.s2_li][0] = calc_ellipsoid_S2f_S2_ts_d2jw_dGjdS2
2269 data.calc_d2jw[1][data.s2_li] = data.calc_d2jw[data.s2_li][1] = calc_ellipsoid_S2f_S2_ts_d2jw_dGjdS2
2270 data.calc_d2jw[2][data.s2_li] = data.calc_d2jw[data.s2_li][2] = calc_ellipsoid_S2f_S2_ts_d2jw_dGjdS2
2271 data.calc_d2jw[3][data.s2_li] = data.calc_d2jw[data.s2_li][3] = calc_diff_S2f_S2_ts_d2jw_dOjdS2
2272 data.calc_d2jw[4][data.s2_li] = data.calc_d2jw[data.s2_li][4] = calc_diff_S2f_S2_ts_d2jw_dOjdS2
2273 data.calc_d2jw[5][data.s2_li] = data.calc_d2jw[data.s2_li][5] = calc_diff_S2f_S2_ts_d2jw_dOjdS2
2274
2275 data.calc_d2jw[0][data.ts_li] = data.calc_d2jw[data.ts_li][0] = calc_ellipsoid_S2f_S2_ts_d2jw_dGjdts
2276 data.calc_d2jw[1][data.ts_li] = data.calc_d2jw[data.ts_li][1] = calc_ellipsoid_S2f_S2_ts_d2jw_dGjdts
2277 data.calc_d2jw[2][data.ts_li] = data.calc_d2jw[data.ts_li][2] = calc_ellipsoid_S2f_S2_ts_d2jw_dGjdts
2278 data.calc_d2jw[3][data.ts_li] = data.calc_d2jw[data.ts_li][3] = calc_diff_S2f_S2_ts_d2jw_dOjdts
2279 data.calc_d2jw[4][data.ts_li] = data.calc_d2jw[data.ts_li][4] = calc_diff_S2f_S2_ts_d2jw_dOjdts
2280 data.calc_d2jw[5][data.ts_li] = data.calc_d2jw[data.ts_li][5] = calc_diff_S2f_S2_ts_d2jw_dOjdts
2281
2282
2283 else:
2284 print("Invalid combination of parameters for the extended model-free equation.")
2285 return 0
2286
2287
2288
2289
2290
2291 elif data.equations == 'mf_ext2':
2292
2293 for i in range(data.num_params):
2294 if data.param_types[i] == 's2f':
2295 data.s2f_li = num_diff_params + i
2296 data.s2f_i = self.param_index + i
2297 elif data.param_types[i] == 'tf':
2298 data.tf_li = num_diff_params + i
2299 data.tf_i = self.param_index + i
2300 elif data.param_types[i] == 's2s':
2301 data.s2s_li = num_diff_params + i
2302 data.s2s_i = self.param_index + i
2303 elif data.param_types[i] == 'ts':
2304 data.ts_li = num_diff_params + i
2305 data.ts_i = self.param_index + i
2306 elif data.param_types[i] == 'rex':
2307 data.rex_li = num_diff_params + i
2308 data.rex_i = self.param_index + i
2309 elif data.param_types[i] == 'r':
2310 data.r_li = num_diff_params + i
2311 data.r_i = self.param_index + i
2312 elif data.param_types[i] == 'csa':
2313 data.csa_li = num_diff_params + i
2314 data.csa_i = self.param_index + i
2315 elif data.param_types[i] == 'local_tm':
2316 pass
2317 else:
2318 print("Unknown parameter.")
2319 return 0
2320
2321
2322 self.param_index = self.param_index + data.num_params
2323
2324
2325 if self.model_type == 'mf':
2326
2327 if data.s2f_i != None and data.tf_i == None and data.s2s_i != None and data.ts_i != None:
2328
2329 data.calc_jw_comps = calc_S2f_S2s_ts_jw_comps
2330 data.calc_jw = calc_S2f_S2s_ts_jw
2331
2332
2333 data.calc_djw_comps = calc_S2f_S2s_ts_djw_comps
2334 data.calc_djw[data.s2f_li] = calc_S2f_S2s_ts_djw_dS2f
2335 data.calc_djw[data.s2s_li] = calc_S2f_tf_S2s_ts_djw_dS2s
2336 data.calc_djw[data.ts_li] = calc_S2f_S2s_ts_djw_dts
2337
2338
2339 data.calc_d2jw[data.s2f_li][data.s2s_li] = data.calc_d2jw[data.s2s_li][data.s2f_li] = calc_S2f_S2s_ts_d2jw_dS2fdS2s
2340 data.calc_d2jw[data.s2f_li][data.ts_li] = data.calc_d2jw[data.ts_li][data.s2f_li] = calc_S2f_S2s_ts_d2jw_dS2fdts
2341 data.calc_d2jw[data.s2s_li][data.ts_li] = data.calc_d2jw[data.ts_li][data.s2s_li] = calc_S2f_S2s_ts_d2jw_dS2sdts
2342 data.calc_d2jw[data.ts_li][data.ts_li] = calc_S2f_S2s_ts_d2jw_dts2
2343
2344
2345 elif data.s2f_i != None and data.tf_i != None and data.s2s_i != None and data.ts_i != None:
2346
2347 data.calc_jw_comps = calc_S2f_tf_S2s_ts_jw_comps
2348 data.calc_jw = calc_S2f_tf_S2s_ts_jw
2349
2350
2351 data.calc_djw_comps = calc_S2f_tf_S2s_ts_djw_comps
2352 data.calc_djw[data.s2f_li] = calc_S2f_tf_S2s_ts_djw_dS2f
2353 data.calc_djw[data.tf_li] = calc_S2f_tf_S2s_ts_djw_dtf
2354 data.calc_djw[data.s2s_li] = calc_S2f_tf_S2s_ts_djw_dS2s
2355 data.calc_djw[data.ts_li] = calc_S2f_tf_S2s_ts_djw_dts
2356
2357
2358 data.calc_d2jw[data.s2f_li][data.s2s_li] = data.calc_d2jw[data.s2s_li][data.s2f_li] = calc_S2f_S2s_ts_d2jw_dS2fdS2s
2359 data.calc_d2jw[data.s2f_li][data.tf_li] = data.calc_d2jw[data.tf_li][data.s2f_li] = calc_S2f_tf_S2s_ts_d2jw_dS2fdtf
2360 data.calc_d2jw[data.s2f_li][data.ts_li] = data.calc_d2jw[data.ts_li][data.s2f_li] = calc_S2f_tf_S2s_ts_d2jw_dS2fdts
2361 data.calc_d2jw[data.s2s_li][data.ts_li] = data.calc_d2jw[data.ts_li][data.s2s_li] = calc_S2f_tf_S2s_ts_d2jw_dS2sdts
2362 data.calc_d2jw[data.tf_li][data.tf_li] = calc_S2f_tf_S2s_ts_d2jw_dtf2
2363 data.calc_d2jw[data.ts_li][data.ts_li] = calc_S2f_tf_S2s_ts_d2jw_dts2
2364
2365
2366 else:
2367 print("Invalid combination of parameters for the extended model-free equation.")
2368 return 0
2369
2370
2371 else:
2372
2373 if data.s2f_i != None and data.tf_i == None and data.s2s_i != None and data.ts_i != None:
2374
2375 data.calc_jw_comps = calc_S2f_S2s_ts_jw_comps
2376 data.calc_jw = calc_S2f_S2s_ts_jw
2377
2378
2379 data.calc_djw_comps = calc_diff_S2f_S2s_ts_djw_comps
2380
2381 if self.model_type != 'diff':
2382
2383 data.calc_djw[data.s2f_li] = calc_diff_S2f_S2s_ts_djw_dS2f
2384 data.calc_djw[data.s2s_li] = calc_diff_S2f_S2s_ts_djw_dS2s
2385 data.calc_djw[data.ts_li] = calc_diff_S2f_S2s_ts_djw_dts
2386
2387
2388 data.calc_d2jw[data.s2f_li][data.s2s_li] = data.calc_d2jw[data.s2s_li][data.s2f_li] = calc_S2f_S2s_ts_d2jw_dS2fdS2s
2389 data.calc_d2jw[data.s2f_li][data.ts_li] = data.calc_d2jw[data.ts_li][data.s2f_li] = calc_diff_S2f_S2s_ts_d2jw_dS2fdts
2390 data.calc_d2jw[data.s2s_li][data.ts_li] = data.calc_d2jw[data.ts_li][data.s2s_li] = calc_diff_S2f_S2s_ts_d2jw_dS2sdts
2391 data.calc_d2jw[data.ts_li][data.ts_li] = calc_diff_S2f_S2s_ts_d2jw_dts2
2392
2393
2394 if self.diff_data.type == 'sphere':
2395
2396 data.calc_djw[0] = calc_diff_S2f_S2s_ts_djw_dGj
2397
2398
2399 data.calc_d2jw[0][0] = calc_diff_S2f_S2s_ts_d2jw_dGjdGk
2400 if self.model_type != 'diff':
2401 data.calc_d2jw[0][data.s2f_li] = data.calc_d2jw[data.s2f_li][0] = calc_diff_S2f_S2s_ts_d2jw_dGjdS2f
2402 data.calc_d2jw[0][data.s2s_li] = data.calc_d2jw[data.s2s_li][0] = calc_diff_S2f_S2s_ts_d2jw_dGjdS2s
2403 data.calc_d2jw[0][data.ts_li] = data.calc_d2jw[data.ts_li][0] = calc_diff_S2f_S2s_ts_d2jw_dGjdts
2404
2405
2406 elif self.diff_data.type == 'spheroid':
2407
2408 data.calc_djw[0] = data.calc_djw[1] = calc_diff_S2f_S2s_ts_djw_dGj
2409 data.calc_djw[2] = data.calc_djw[3] = calc_diff_S2f_S2s_ts_djw_dOj
2410
2411
2412 data.calc_d2jw[0][0] = calc_diff_S2f_S2s_ts_d2jw_dGjdGk
2413 data.calc_d2jw[0][1] = data.calc_d2jw[1][0] = calc_diff_S2f_S2s_ts_d2jw_dGjdGk
2414 data.calc_d2jw[1][1] = calc_diff_S2f_S2s_ts_d2jw_dGjdGk
2415
2416 data.calc_d2jw[0][2] = data.calc_d2jw[2][0] = calc_diff_S2f_S2s_ts_d2jw_dGjdOj
2417 data.calc_d2jw[0][3] = data.calc_d2jw[3][0] = calc_diff_S2f_S2s_ts_d2jw_dGjdOj
2418 data.calc_d2jw[1][2] = data.calc_d2jw[2][1] = calc_diff_S2f_S2s_ts_d2jw_dGjdOj
2419 data.calc_d2jw[1][3] = data.calc_d2jw[3][1] = calc_diff_S2f_S2s_ts_d2jw_dGjdOj
2420
2421 data.calc_d2jw[2][2] = calc_diff_S2f_S2s_ts_d2jw_dOjdOk
2422 data.calc_d2jw[2][3] = data.calc_d2jw[3][2] = calc_diff_S2f_S2s_ts_d2jw_dOjdOk
2423 data.calc_d2jw[3][3] = calc_diff_S2f_S2s_ts_d2jw_dOjdOk
2424
2425 if self.model_type != 'diff':
2426 data.calc_d2jw[0][data.s2f_li] = data.calc_d2jw[data.s2f_li][0] = calc_diff_S2f_S2s_ts_d2jw_dGjdS2f
2427 data.calc_d2jw[1][data.s2f_li] = data.calc_d2jw[data.s2f_li][1] = calc_diff_S2f_S2s_ts_d2jw_dGjdS2f
2428 data.calc_d2jw[2][data.s2f_li] = data.calc_d2jw[data.s2f_li][2] = calc_diff_S2f_S2s_ts_d2jw_dOjdS2f
2429 data.calc_d2jw[3][data.s2f_li] = data.calc_d2jw[data.s2f_li][3] = calc_diff_S2f_S2s_ts_d2jw_dOjdS2f
2430
2431 data.calc_d2jw[0][data.s2s_li] = data.calc_d2jw[data.s2s_li][0] = calc_diff_S2f_S2s_ts_d2jw_dGjdS2s
2432 data.calc_d2jw[1][data.s2s_li] = data.calc_d2jw[data.s2s_li][1] = calc_diff_S2f_S2s_ts_d2jw_dGjdS2s
2433 data.calc_d2jw[2][data.s2s_li] = data.calc_d2jw[data.s2s_li][2] = calc_diff_S2f_S2s_ts_d2jw_dOjdS2s
2434 data.calc_d2jw[3][data.s2s_li] = data.calc_d2jw[data.s2s_li][3] = calc_diff_S2f_S2s_ts_d2jw_dOjdS2s
2435
2436 data.calc_d2jw[0][data.ts_li] = data.calc_d2jw[data.ts_li][0] = calc_diff_S2f_S2s_ts_d2jw_dGjdts
2437 data.calc_d2jw[1][data.ts_li] = data.calc_d2jw[data.ts_li][1] = calc_diff_S2f_S2s_ts_d2jw_dGjdts
2438 data.calc_d2jw[2][data.ts_li] = data.calc_d2jw[data.ts_li][2] = calc_diff_S2f_S2s_ts_d2jw_dOjdts
2439 data.calc_d2jw[3][data.ts_li] = data.calc_d2jw[data.ts_li][3] = calc_diff_S2f_S2s_ts_d2jw_dOjdts
2440
2441
2442 elif self.diff_data.type == 'ellipsoid':
2443
2444 data.calc_djw[0] = data.calc_djw[1] = data.calc_djw[2] = calc_ellipsoid_S2f_S2s_ts_djw_dGj
2445 data.calc_djw[3] = data.calc_djw[4] = data.calc_djw[5] = calc_diff_S2f_S2s_ts_djw_dOj
2446
2447
2448 data.calc_d2jw[0][0] = calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdGk
2449 data.calc_d2jw[0][1] = data.calc_d2jw[1][0] = calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdGk
2450 data.calc_d2jw[0][2] = data.calc_d2jw[2][0] = calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdGk
2451 data.calc_d2jw[1][1] = calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdGk
2452 data.calc_d2jw[1][2] = data.calc_d2jw[2][1] = calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdGk
2453 data.calc_d2jw[2][2] = calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdGk
2454
2455 data.calc_d2jw[0][3] = data.calc_d2jw[3][0] = calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdOj
2456 data.calc_d2jw[0][4] = data.calc_d2jw[4][0] = calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdOj
2457 data.calc_d2jw[0][5] = data.calc_d2jw[5][0] = calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdOj
2458 data.calc_d2jw[1][3] = data.calc_d2jw[3][1] = calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdOj
2459 data.calc_d2jw[1][4] = data.calc_d2jw[4][1] = calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdOj
2460 data.calc_d2jw[1][5] = data.calc_d2jw[5][1] = calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdOj
2461 data.calc_d2jw[2][3] = data.calc_d2jw[3][2] = calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdOj
2462 data.calc_d2jw[2][4] = data.calc_d2jw[4][2] = calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdOj
2463 data.calc_d2jw[2][5] = data.calc_d2jw[5][2] = calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdOj
2464
2465 data.calc_d2jw[3][3] = calc_diff_S2f_S2s_ts_d2jw_dOjdOk
2466 data.calc_d2jw[3][4] = data.calc_d2jw[4][3] = calc_diff_S2f_S2s_ts_d2jw_dOjdOk
2467 data.calc_d2jw[3][5] = data.calc_d2jw[5][3] = calc_diff_S2f_S2s_ts_d2jw_dOjdOk
2468 data.calc_d2jw[4][4] = calc_diff_S2f_S2s_ts_d2jw_dOjdOk
2469 data.calc_d2jw[4][5] = data.calc_d2jw[5][4] = calc_diff_S2f_S2s_ts_d2jw_dOjdOk
2470 data.calc_d2jw[5][5] = calc_diff_S2f_S2s_ts_d2jw_dOjdOk
2471
2472 if self.model_type != 'diff':
2473 data.calc_d2jw[0][data.s2f_li] = data.calc_d2jw[data.s2f_li][0] = calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdS2f
2474 data.calc_d2jw[1][data.s2f_li] = data.calc_d2jw[data.s2f_li][1] = calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdS2f
2475 data.calc_d2jw[2][data.s2f_li] = data.calc_d2jw[data.s2f_li][2] = calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdS2f
2476 data.calc_d2jw[3][data.s2f_li] = data.calc_d2jw[data.s2f_li][3] = calc_diff_S2f_S2s_ts_d2jw_dOjdS2f
2477 data.calc_d2jw[4][data.s2f_li] = data.calc_d2jw[data.s2f_li][4] = calc_diff_S2f_S2s_ts_d2jw_dOjdS2f
2478 data.calc_d2jw[5][data.s2f_li] = data.calc_d2jw[data.s2f_li][5] = calc_diff_S2f_S2s_ts_d2jw_dOjdS2f
2479
2480 data.calc_d2jw[0][data.s2s_li] = data.calc_d2jw[data.s2s_li][0] = calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdS2s
2481 data.calc_d2jw[1][data.s2s_li] = data.calc_d2jw[data.s2s_li][1] = calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdS2s
2482 data.calc_d2jw[2][data.s2s_li] = data.calc_d2jw[data.s2s_li][2] = calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdS2s
2483 data.calc_d2jw[3][data.s2s_li] = data.calc_d2jw[data.s2s_li][3] = calc_diff_S2f_S2s_ts_d2jw_dOjdS2s
2484 data.calc_d2jw[4][data.s2s_li] = data.calc_d2jw[data.s2s_li][4] = calc_diff_S2f_S2s_ts_d2jw_dOjdS2s
2485 data.calc_d2jw[5][data.s2s_li] = data.calc_d2jw[data.s2s_li][5] = calc_diff_S2f_S2s_ts_d2jw_dOjdS2s
2486
2487 data.calc_d2jw[0][data.ts_li] = data.calc_d2jw[data.ts_li][0] = calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdts
2488 data.calc_d2jw[1][data.ts_li] = data.calc_d2jw[data.ts_li][1] = calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdts
2489 data.calc_d2jw[2][data.ts_li] = data.calc_d2jw[data.ts_li][2] = calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdts
2490 data.calc_d2jw[3][data.ts_li] = data.calc_d2jw[data.ts_li][3] = calc_diff_S2f_S2s_ts_d2jw_dOjdts
2491 data.calc_d2jw[4][data.ts_li] = data.calc_d2jw[data.ts_li][4] = calc_diff_S2f_S2s_ts_d2jw_dOjdts
2492 data.calc_d2jw[5][data.ts_li] = data.calc_d2jw[data.ts_li][5] = calc_diff_S2f_S2s_ts_d2jw_dOjdts
2493
2494
2495 elif data.s2f_i != None and data.tf_i != None and data.s2s_i != None and data.ts_i != None:
2496
2497 data.calc_jw_comps = calc_S2f_tf_S2s_ts_jw_comps
2498 data.calc_jw = calc_S2f_tf_S2s_ts_jw
2499
2500
2501 data.calc_djw_comps = calc_diff_S2f_tf_S2s_ts_djw_comps
2502
2503 if self.model_type != 'diff':
2504
2505 data.calc_djw[data.s2f_li] = calc_diff_S2f_tf_S2s_ts_djw_dS2f
2506 data.calc_djw[data.tf_li] = calc_diff_S2f_tf_S2s_ts_djw_dtf
2507 data.calc_djw[data.s2s_li] = calc_diff_S2f_tf_S2s_ts_djw_dS2s
2508 data.calc_djw[data.ts_li] = calc_diff_S2f_tf_S2s_ts_djw_dts
2509
2510
2511 data.calc_d2jw[data.s2f_li][data.s2s_li] = data.calc_d2jw[data.s2s_li][data.s2f_li] = calc_S2f_S2s_ts_d2jw_dS2fdS2s
2512 data.calc_d2jw[data.s2f_li][data.tf_li] = data.calc_d2jw[data.tf_li][data.s2f_li] = calc_diff_S2f_tf_S2s_ts_d2jw_dS2fdtf
2513 data.calc_d2jw[data.s2f_li][data.ts_li] = data.calc_d2jw[data.ts_li][data.s2f_li] = calc_diff_S2f_tf_S2s_ts_d2jw_dS2fdts
2514 data.calc_d2jw[data.tf_li][data.tf_li] = calc_diff_S2f_tf_S2s_ts_d2jw_dtf2
2515 data.calc_d2jw[data.s2s_li][data.ts_li] = data.calc_d2jw[data.ts_li][data.s2s_li] = calc_diff_S2f_tf_S2s_ts_d2jw_dS2sdts
2516 data.calc_d2jw[data.ts_li][data.ts_li] = calc_diff_S2f_tf_S2s_ts_d2jw_dts2
2517
2518
2519 if self.diff_data.type == 'sphere':
2520
2521 data.calc_djw[0] = calc_diff_S2f_tf_S2s_ts_djw_dGj
2522
2523
2524 data.calc_d2jw[0][0] = calc_diff_S2f_tf_S2s_ts_d2jw_dGjdGk
2525 if self.model_type != 'diff':
2526 data.calc_d2jw[0][data.s2f_li] = data.calc_d2jw[data.s2f_li][0] = calc_diff_S2f_tf_S2s_ts_d2jw_dGjdS2f
2527 data.calc_d2jw[0][data.tf_li] = data.calc_d2jw[data.tf_li][0] = calc_diff_S2f_tf_S2s_ts_d2jw_dGjdtf
2528 data.calc_d2jw[0][data.s2s_li] = data.calc_d2jw[data.s2s_li][0] = calc_diff_S2f_tf_S2s_ts_d2jw_dGjdS2s
2529 data.calc_d2jw[0][data.ts_li] = data.calc_d2jw[data.ts_li][0] = calc_diff_S2f_tf_S2s_ts_d2jw_dGjdts
2530
2531
2532 elif self.diff_data.type == 'spheroid':
2533
2534 data.calc_djw[0] = data.calc_djw[1] = calc_diff_S2f_tf_S2s_ts_djw_dGj
2535 data.calc_djw[2] = data.calc_djw[3] = calc_diff_S2f_tf_S2s_ts_djw_dOj
2536
2537
2538 data.calc_d2jw[0][0] = calc_diff_S2f_tf_S2s_ts_d2jw_dGjdGk
2539 data.calc_d2jw[0][1] = data.calc_d2jw[1][0] = calc_diff_S2f_tf_S2s_ts_d2jw_dGjdGk
2540 data.calc_d2jw[1][1] = calc_diff_S2f_tf_S2s_ts_d2jw_dGjdGk
2541
2542 data.calc_d2jw[0][2] = data.calc_d2jw[2][0] = calc_diff_S2f_tf_S2s_ts_d2jw_dGjdOj
2543 data.calc_d2jw[0][3] = data.calc_d2jw[3][0] = calc_diff_S2f_tf_S2s_ts_d2jw_dGjdOj
2544 data.calc_d2jw[1][2] = data.calc_d2jw[2][1] = calc_diff_S2f_tf_S2s_ts_d2jw_dGjdOj
2545 data.calc_d2jw[1][3] = data.calc_d2jw[3][1] = calc_diff_S2f_tf_S2s_ts_d2jw_dGjdOj
2546
2547 data.calc_d2jw[2][2] = calc_diff_S2f_tf_S2s_ts_d2jw_dOjdOk
2548 data.calc_d2jw[2][3] = data.calc_d2jw[3][2] = calc_diff_S2f_tf_S2s_ts_d2jw_dOjdOk
2549 data.calc_d2jw[3][3] = calc_diff_S2f_tf_S2s_ts_d2jw_dOjdOk
2550
2551 if self.model_type != 'diff':
2552 data.calc_d2jw[0][data.s2f_li] = data.calc_d2jw[data.s2f_li][0] = calc_diff_S2f_tf_S2s_ts_d2jw_dGjdS2f
2553 data.calc_d2jw[1][data.s2f_li] = data.calc_d2jw[data.s2f_li][1] = calc_diff_S2f_tf_S2s_ts_d2jw_dGjdS2f
2554 data.calc_d2jw[2][data.s2f_li] = data.calc_d2jw[data.s2f_li][2] = calc_diff_S2f_tf_S2s_ts_d2jw_dOjdS2f
2555 data.calc_d2jw[3][data.s2f_li] = data.calc_d2jw[data.s2f_li][3] = calc_diff_S2f_tf_S2s_ts_d2jw_dOjdS2f
2556
2557 data.calc_d2jw[0][data.tf_li] = data.calc_d2jw[data.tf_li][0] = calc_diff_S2f_tf_S2s_ts_d2jw_dGjdtf
2558 data.calc_d2jw[1][data.tf_li] = data.calc_d2jw[data.tf_li][1] = calc_diff_S2f_tf_S2s_ts_d2jw_dGjdtf
2559 data.calc_d2jw[2][data.tf_li] = data.calc_d2jw[data.tf_li][2] = calc_diff_S2f_tf_S2s_ts_d2jw_dOjdtf
2560 data.calc_d2jw[3][data.tf_li] = data.calc_d2jw[data.tf_li][3] = calc_diff_S2f_tf_S2s_ts_d2jw_dOjdtf
2561
2562 data.calc_d2jw[0][data.s2s_li] = data.calc_d2jw[data.s2s_li][0] = calc_diff_S2f_S2s_ts_d2jw_dGjdS2s
2563 data.calc_d2jw[1][data.s2s_li] = data.calc_d2jw[data.s2s_li][1] = calc_diff_S2f_S2s_ts_d2jw_dGjdS2s
2564 data.calc_d2jw[2][data.s2s_li] = data.calc_d2jw[data.s2s_li][2] = calc_diff_S2f_S2s_ts_d2jw_dOjdS2s
2565 data.calc_d2jw[3][data.s2s_li] = data.calc_d2jw[data.s2s_li][3] = calc_diff_S2f_S2s_ts_d2jw_dOjdS2s
2566
2567 data.calc_d2jw[0][data.ts_li] = data.calc_d2jw[data.ts_li][0] = calc_diff_S2f_S2s_ts_d2jw_dGjdts
2568 data.calc_d2jw[1][data.ts_li] = data.calc_d2jw[data.ts_li][1] = calc_diff_S2f_S2s_ts_d2jw_dGjdts
2569 data.calc_d2jw[2][data.ts_li] = data.calc_d2jw[data.ts_li][2] = calc_diff_S2f_S2s_ts_d2jw_dOjdts
2570 data.calc_d2jw[3][data.ts_li] = data.calc_d2jw[data.ts_li][3] = calc_diff_S2f_S2s_ts_d2jw_dOjdts
2571
2572
2573 elif self.diff_data.type == 'ellipsoid':
2574
2575 data.calc_djw[0] = data.calc_djw[1] = data.calc_djw[2] = calc_ellipsoid_S2f_tf_S2s_ts_djw_dGj
2576 data.calc_djw[3] = data.calc_djw[4] = data.calc_djw[5] = calc_diff_S2f_tf_S2s_ts_djw_dOj
2577
2578
2579 data.calc_d2jw[0][0] = calc_ellipsoid_S2f_tf_S2s_ts_d2jw_dGjdGk
2580 data.calc_d2jw[0][1] = data.calc_d2jw[1][0] = calc_ellipsoid_S2f_tf_S2s_ts_d2jw_dGjdGk
2581 data.calc_d2jw[0][2] = data.calc_d2jw[2][0] = calc_ellipsoid_S2f_tf_S2s_ts_d2jw_dGjdGk
2582 data.calc_d2jw[1][1] = calc_ellipsoid_S2f_tf_S2s_ts_d2jw_dGjdGk
2583 data.calc_d2jw[1][2] = data.calc_d2jw[2][1] = calc_ellipsoid_S2f_tf_S2s_ts_d2jw_dGjdGk
2584 data.calc_d2jw[2][2] = calc_ellipsoid_S2f_tf_S2s_ts_d2jw_dGjdGk
2585
2586 data.calc_d2jw[0][3] = data.calc_d2jw[3][0] = calc_ellipsoid_S2f_tf_S2s_ts_d2jw_dGjdOj
2587 data.calc_d2jw[0][4] = data.calc_d2jw[4][0] = calc_ellipsoid_S2f_tf_S2s_ts_d2jw_dGjdOj
2588 data.calc_d2jw[0][5] = data.calc_d2jw[5][0] = calc_ellipsoid_S2f_tf_S2s_ts_d2jw_dGjdOj
2589 data.calc_d2jw[1][3] = data.calc_d2jw[3][1] = calc_ellipsoid_S2f_tf_S2s_ts_d2jw_dGjdOj
2590 data.calc_d2jw[1][4] = data.calc_d2jw[4][1] = calc_ellipsoid_S2f_tf_S2s_ts_d2jw_dGjdOj
2591 data.calc_d2jw[1][5] = data.calc_d2jw[5][1] = calc_ellipsoid_S2f_tf_S2s_ts_d2jw_dGjdOj
2592 data.calc_d2jw[2][3] = data.calc_d2jw[3][2] = calc_ellipsoid_S2f_tf_S2s_ts_d2jw_dGjdOj
2593 data.calc_d2jw[2][4] = data.calc_d2jw[4][2] = calc_ellipsoid_S2f_tf_S2s_ts_d2jw_dGjdOj
2594 data.calc_d2jw[2][5] = data.calc_d2jw[5][2] = calc_ellipsoid_S2f_tf_S2s_ts_d2jw_dGjdOj
2595
2596 data.calc_d2jw[3][3] = calc_diff_S2f_tf_S2s_ts_d2jw_dOjdOk
2597 data.calc_d2jw[3][4] = data.calc_d2jw[4][3] = calc_diff_S2f_tf_S2s_ts_d2jw_dOjdOk
2598 data.calc_d2jw[3][5] = data.calc_d2jw[5][3] = calc_diff_S2f_tf_S2s_ts_d2jw_dOjdOk
2599 data.calc_d2jw[4][4] = calc_diff_S2f_tf_S2s_ts_d2jw_dOjdOk
2600 data.calc_d2jw[4][5] = data.calc_d2jw[5][4] = calc_diff_S2f_tf_S2s_ts_d2jw_dOjdOk
2601 data.calc_d2jw[5][5] = calc_diff_S2f_tf_S2s_ts_d2jw_dOjdOk
2602
2603 if self.model_type != 'diff':
2604 data.calc_d2jw[0][data.s2f_li] = data.calc_d2jw[data.s2f_li][0] = calc_ellipsoid_S2f_tf_S2s_ts_d2jw_dGjdS2f
2605 data.calc_d2jw[1][data.s2f_li] = data.calc_d2jw[data.s2f_li][1] = calc_ellipsoid_S2f_tf_S2s_ts_d2jw_dGjdS2f
2606 data.calc_d2jw[2][data.s2f_li] = data.calc_d2jw[data.s2f_li][2] = calc_ellipsoid_S2f_tf_S2s_ts_d2jw_dGjdS2f
2607 data.calc_d2jw[3][data.s2f_li] = data.calc_d2jw[data.s2f_li][3] = calc_diff_S2f_tf_S2s_ts_d2jw_dOjdS2f
2608 data.calc_d2jw[4][data.s2f_li] = data.calc_d2jw[data.s2f_li][4] = calc_diff_S2f_tf_S2s_ts_d2jw_dOjdS2f
2609 data.calc_d2jw[5][data.s2f_li] = data.calc_d2jw[data.s2f_li][5] = calc_diff_S2f_tf_S2s_ts_d2jw_dOjdS2f
2610
2611 data.calc_d2jw[0][data.tf_li] = data.calc_d2jw[data.tf_li][0] = calc_ellipsoid_S2f_tf_S2s_ts_d2jw_dGjdtf
2612 data.calc_d2jw[1][data.tf_li] = data.calc_d2jw[data.tf_li][1] = calc_ellipsoid_S2f_tf_S2s_ts_d2jw_dGjdtf
2613 data.calc_d2jw[2][data.tf_li] = data.calc_d2jw[data.tf_li][2] = calc_ellipsoid_S2f_tf_S2s_ts_d2jw_dGjdtf
2614 data.calc_d2jw[3][data.tf_li] = data.calc_d2jw[data.tf_li][3] = calc_diff_S2f_tf_S2s_ts_d2jw_dOjdtf
2615 data.calc_d2jw[4][data.tf_li] = data.calc_d2jw[data.tf_li][4] = calc_diff_S2f_tf_S2s_ts_d2jw_dOjdtf
2616 data.calc_d2jw[5][data.tf_li] = data.calc_d2jw[data.tf_li][5] = calc_diff_S2f_tf_S2s_ts_d2jw_dOjdtf
2617
2618 data.calc_d2jw[0][data.s2s_li] = data.calc_d2jw[data.s2s_li][0] = calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdS2s
2619 data.calc_d2jw[1][data.s2s_li] = data.calc_d2jw[data.s2s_li][1] = calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdS2s
2620 data.calc_d2jw[2][data.s2s_li] = data.calc_d2jw[data.s2s_li][2] = calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdS2s
2621 data.calc_d2jw[3][data.s2s_li] = data.calc_d2jw[data.s2s_li][3] = calc_diff_S2f_S2s_ts_d2jw_dOjdS2s
2622 data.calc_d2jw[4][data.s2s_li] = data.calc_d2jw[data.s2s_li][4] = calc_diff_S2f_S2s_ts_d2jw_dOjdS2s
2623 data.calc_d2jw[5][data.s2s_li] = data.calc_d2jw[data.s2s_li][5] = calc_diff_S2f_S2s_ts_d2jw_dOjdS2s
2624
2625 data.calc_d2jw[0][data.ts_li] = data.calc_d2jw[data.ts_li][0] = calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdts
2626 data.calc_d2jw[1][data.ts_li] = data.calc_d2jw[data.ts_li][1] = calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdts
2627 data.calc_d2jw[2][data.ts_li] = data.calc_d2jw[data.ts_li][2] = calc_ellipsoid_S2f_S2s_ts_d2jw_dGjdts
2628 data.calc_d2jw[3][data.ts_li] = data.calc_d2jw[data.ts_li][3] = calc_diff_S2f_S2s_ts_d2jw_dOjdts
2629 data.calc_d2jw[4][data.ts_li] = data.calc_d2jw[data.ts_li][4] = calc_diff_S2f_S2s_ts_d2jw_dOjdts
2630 data.calc_d2jw[5][data.ts_li] = data.calc_d2jw[data.ts_li][5] = calc_diff_S2f_S2s_ts_d2jw_dOjdts
2631
2632
2633 else:
2634 print("Invalid combination of parameters for the extended model-free equation.")
2635 return 0
2636
2637
2638 else:
2639 print("Unknown model-free equation.")
2640 return 0
2641
2642
2643
2644
2645
2646
2647 data.create_dip_func, data.create_dip_grad, data.create_dip_hess = [], [], []
2648 data.create_csa_func, data.create_csa_grad, data.create_csa_hess = [], [], []
2649 data.create_rex_func, data.create_rex_grad = [], []
2650
2651 data.create_dip_jw_func, data.create_dip_jw_grad, data.create_dip_jw_hess = [], [], []
2652 data.create_csa_jw_func, data.create_csa_jw_grad, data.create_csa_jw_hess = [], [], []
2653
2654
2655 data.create_ri_prime = None
2656 data.create_dri_prime = []
2657 data.create_d2ri_prime = []
2658
2659
2660 data.create_ri, data.create_dri, data.create_d2ri = [], [], []
2661 data.get_r1, data.get_dr1, data.get_d2r1 = [], [], []
2662
2663
2664 for i in range(data.num_ri):
2665 data.create_dip_func.append(None)
2666 data.create_dip_grad.append(None)
2667 data.create_dip_hess.append(None)
2668 data.create_csa_func.append(None)
2669 data.create_csa_grad.append(None)
2670 data.create_csa_hess.append(None)
2671 data.create_rex_func.append(None)
2672 data.create_rex_grad.append(None)
2673 data.create_dip_jw_func.append(None)
2674 data.create_dip_jw_grad.append(None)
2675 data.create_dip_jw_hess.append(None)
2676 data.create_csa_jw_func.append(None)
2677 data.create_csa_jw_grad.append(None)
2678 data.create_csa_jw_hess.append(None)
2679 data.create_ri.append(None)
2680 data.create_dri.append(None)
2681 data.create_d2ri.append(None)
2682 data.get_r1.append(None)
2683 data.get_dr1.append(None)
2684 data.get_d2r1.append(None)
2685
2686
2687
2688
2689
2690 for i in range(data.num_ri):
2691
2692 if data.ri_labels[i] == 'R1':
2693 data.create_csa_func[i] = comp_r1_csa_const
2694 data.create_csa_grad[i] = comp_r1_csa_const
2695 data.create_csa_hess[i] = comp_r1_csa_const
2696 data.create_dip_jw_func[i] = comp_r1_dip_jw
2697 data.create_dip_jw_grad[i] = comp_r1_dip_jw
2698 data.create_dip_jw_hess[i] = comp_r1_dip_jw
2699 data.create_csa_jw_func[i] = comp_r1_csa_jw
2700 data.create_csa_jw_grad[i] = comp_r1_csa_jw
2701 data.create_csa_jw_hess[i] = comp_r1_csa_jw
2702
2703
2704 elif data.ri_labels[i] == 'R2':
2705 data.create_dip_func[i] = comp_r2_dip_const
2706 data.create_dip_grad[i] = comp_r2_dip_const
2707 data.create_dip_hess[i] = comp_r2_dip_const
2708 data.create_csa_func[i] = comp_r2_csa_const
2709 data.create_csa_grad[i] = comp_r2_csa_const
2710 data.create_csa_hess[i] = comp_r2_csa_const
2711 data.create_rex_func[i] = comp_rex_const_func
2712 data.create_rex_grad[i] = comp_rex_const_grad
2713 data.create_dip_jw_func[i] = comp_r2_dip_jw
2714 data.create_dip_jw_grad[i] = comp_r2_dip_jw
2715 data.create_dip_jw_hess[i] = comp_r2_dip_jw
2716 data.create_csa_jw_func[i] = comp_r2_csa_jw
2717 data.create_csa_jw_grad[i] = comp_r2_csa_jw
2718 data.create_csa_jw_hess[i] = comp_r2_csa_jw
2719
2720
2721 elif data.ri_labels[i] == 'NOE':
2722 data.create_dip_jw_func[i] = comp_sigma_noe_dip_jw
2723 data.create_dip_jw_grad[i] = comp_sigma_noe_dip_jw
2724 data.create_dip_jw_hess[i] = comp_sigma_noe_dip_jw
2725 data.create_ri[i] = calc_noe
2726 data.create_dri[i] = calc_dnoe
2727 data.create_d2ri[i] = calc_d2noe
2728 if data.noe_r1_table[i] == None:
2729 data.get_r1[i] = calc_r1
2730 data.get_dr1[i] = calc_dr1
2731 data.get_d2r1[i] = calc_d2r1
2732 else:
2733 data.get_r1[i] = extract_r1
2734 data.get_dr1[i] = extract_dr1
2735 data.get_d2r1[i] = extract_d2r1
2736
2737
2738
2739
2740
2741
2742 if data.rex_i == None:
2743 data.create_ri_prime = func_ri_prime
2744 else:
2745 data.create_ri_prime = func_ri_prime_rex
2746
2747
2748 for i in range(data.total_num_params):
2749
2750 if self.model_type == 'diff':
2751
2752 data.create_dri_prime.append(func_dri_djw_prime)
2753
2754
2755 data.create_d2ri_prime.append([])
2756 for j in range(data.total_num_params):
2757 data.create_d2ri_prime[i].append(func_d2ri_djwidjwj_prime)
2758
2759
2760 continue
2761
2762
2763 index = i - num_diff_params
2764 if index < 0:
2765 index = None
2766
2767
2768 if index != None and data.param_types[index] == 'rex':
2769
2770 data.create_dri_prime.append(func_dri_drex_prime)
2771
2772
2773 data.create_d2ri_prime.append([])
2774 for j in range(data.total_num_params):
2775
2776 index2 = j - num_diff_params
2777 if index2 < 0:
2778 index2 = None
2779
2780
2781 if index2 != None and data.param_types[index2] == 'rex':
2782 data.create_d2ri_prime[i].append(None)
2783
2784
2785 elif index2 != None and data.param_types[index2] == 'r':
2786 data.create_d2ri_prime[i].append(None)
2787
2788
2789 elif index2 != None and data.param_types[index2] == 'csa':
2790 data.create_d2ri_prime[i].append(None)
2791
2792
2793 else:
2794 data.create_d2ri_prime[i].append(None)
2795
2796
2797 elif index != None and data.param_types[index] == 'r':
2798
2799 data.create_dri_prime.append(func_dri_dr_prime)
2800
2801
2802 data.create_d2ri_prime.append([])
2803 for j in range(data.total_num_params):
2804
2805 index2 = j - num_diff_params
2806 if index2 < 0:
2807 index2 = None
2808
2809
2810 if index2 != None and data.param_types[index2] == 'rex':
2811 data.create_d2ri_prime[i].append(None)
2812
2813
2814 elif index2 != None and data.param_types[index2] == 'r':
2815 data.create_d2ri_prime[i].append(func_d2ri_dr2_prime)
2816
2817
2818 elif index2 != None and data.param_types[index2] == 'csa':
2819 data.create_d2ri_prime[i].append(None)
2820
2821
2822 else:
2823 data.create_d2ri_prime[i].append(func_d2ri_djwdr_prime)
2824
2825
2826 elif index != None and data.param_types[index] == 'csa':
2827
2828 data.create_dri_prime.append(func_dri_dcsa_prime)
2829
2830
2831 data.create_d2ri_prime.append([])
2832 for j in range(data.total_num_params):
2833
2834 index2 = j - num_diff_params
2835 if index2 < 0:
2836 index2 = None
2837
2838
2839 if index2 != None and data.param_types[index2] == 'rex':
2840 data.create_d2ri_prime[i].append(None)
2841
2842
2843 elif index2 != None and data.param_types[index2] == 'r':
2844 data.create_d2ri_prime[i].append(None)
2845
2846
2847 elif index2 != None and data.param_types[index2] == 'csa':
2848 data.create_d2ri_prime[i].append(func_d2ri_dcsa2_prime)
2849
2850
2851 else:
2852 data.create_d2ri_prime[i].append(func_d2ri_djwdcsa_prime)
2853
2854
2855 else:
2856
2857 data.create_dri_prime.append(func_dri_djw_prime)
2858
2859
2860 data.create_d2ri_prime.append([])
2861 for j in range(data.total_num_params):
2862
2863 index2 = j - num_diff_params
2864 if index2 < 0:
2865 index2 = None
2866
2867
2868 if index2 != None and data.param_types[index2] == 'rex':
2869 data.create_d2ri_prime[i].append(None)
2870
2871
2872 elif index2 != None and data.param_types[index2] == 'r':
2873 data.create_d2ri_prime[i].append(func_d2ri_djwdr_prime)
2874
2875
2876 elif index2 != None and data.param_types[index2] == 'csa':
2877 data.create_d2ri_prime[i].append(func_d2ri_djwdcsa_prime)
2878
2879
2880 else:
2881 data.create_d2ri_prime[i].append(func_d2ri_djwidjwj_prime)
2882
2883
2884
2885
2886
2887 if data.r_i == None and data.csa_i == None:
2888
2889 if data.rex_i == None:
2890 data.create_ri_comps = ri_comps
2891 data.create_dri_comps = dri_comps
2892 data.create_d2ri_comps = d2ri_comps
2893 else:
2894 data.create_ri_comps = ri_comps_rex
2895 data.create_dri_comps = dri_comps_rex
2896 data.create_d2ri_comps = d2ri_comps
2897
2898
2899 comp_dip_const_func(data, data.bond_length)
2900 comp_csa_const_func(data, data.csa)
2901 for i in range(data.num_ri):
2902 data.dip_comps_func[i] = data.dip_const_func
2903 if data.create_dip_func[i]:
2904 data.dip_comps_func[i] = data.create_dip_func[i](data.dip_const_func)
2905 if data.create_csa_func[i]:
2906 data.csa_comps_func[i] = data.create_csa_func[i](data.csa_const_func[data.remap_table[i]])
2907
2908
2909
2910
2911
2912 elif data.r_i != None and data.csa_i == None:
2913
2914 if data.rex_i == None:
2915 data.create_ri_comps = ri_comps_r
2916 data.create_dri_comps = dri_comps_r
2917 data.create_d2ri_comps = d2ri_comps_r
2918 else:
2919 data.create_ri_comps = ri_comps_r_rex
2920 data.create_dri_comps = dri_comps_r_rex
2921 data.create_d2ri_comps = d2ri_comps_r
2922
2923
2924 comp_csa_const_func(data, data.csa)
2925 for i in range(data.num_ri):
2926 if data.create_csa_func[i]:
2927 data.csa_comps_func[i] = data.create_csa_func[i](data.csa_const_func[data.remap_table[i]])
2928
2929
2930
2931
2932
2933 elif data.r_i == None and data.csa_i != None:
2934
2935 if data.rex_i == None:
2936 data.create_ri_comps = ri_comps_csa
2937 data.create_dri_comps = dri_comps_csa
2938 data.create_d2ri_comps = d2ri_comps_csa
2939 else:
2940 data.create_ri_comps = ri_comps_csa_rex
2941 data.create_dri_comps = dri_comps_csa_rex
2942 data.create_d2ri_comps = d2ri_comps_csa
2943
2944
2945 comp_dip_const_func(data, data.bond_length)
2946 for i in range(data.num_ri):
2947 data.dip_comps_func[i] = data.dip_const_func
2948 if data.create_dip_func[i]:
2949 data.dip_comps_func[i] = data.create_dip_func[i](data.dip_const_func)
2950
2951
2952
2953
2954
2955 elif data.r_i != None and data.csa_i != None:
2956
2957 if data.rex_i == None:
2958 data.create_ri_comps = ri_comps_r_csa
2959 data.create_dri_comps = dri_comps_r_csa
2960 data.create_d2ri_comps = d2ri_comps_r_csa
2961 else:
2962 data.create_ri_comps = ri_comps_r_csa_rex
2963 data.create_dri_comps = dri_comps_r_csa_rex
2964 data.create_d2ri_comps = d2ri_comps_r_csa
2965
2966
2967
2968
2969
2970 else:
2971 print("Invalid combination of parameters for the model-free equations.")
2972 return 0
2973
2974 return 1
2975
2976
2979 """Empty container for storing data."""
2980