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