1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 from math import sqrt
24
25
26
27
28
30 """Diffusional correlation times for isotropic diffusion.
31
32 t0 = tm
33 """
34
35 data.ti[0] = diff_data.params[0]
36
37
38
39
40
41
43 """Partial derivatives of the diffusional correlation times.
44
45 The tm partial derivatives are:
46
47 dt0
48 --- = 1
49 dtm
50 """
51
52 data.dti[0] = 1.0
53
54
55
56
57
58
60 """Diffusional correlation times.
61
62 The equations for the parameters {Dper, Dpar} are:
63
64 1
65 t0 = -----
66 6Dper
67
68 1
69 t1 = ------------
70 5Dper + Dpar
71
72 1
73 t2 = -------------
74 2Dper + 4Dpar
75
76
77 The equations for the parameters {Diso, Da} are:
78
79 t0 = 1/6 (Diso - Da)**-1
80
81 t1 = 1/6 (Diso - Da/2)**-1
82
83 t2 = 1/6 (Diso + Da)**-1
84
85 The diffusion parameter set in data.diff_params is {tm, Da, theta, phi}.
86 """
87
88
89 if diff_data.params[0] == 0.0:
90 data.Diso = 1e99
91 else:
92 data.Diso = 1.0 / (6.0 * diff_data.params[0])
93
94
95 data.t_0_comp = data.Diso - diff_data.params[1]
96 data.t_1_comp = data.Diso - 0.5 * diff_data.params[1]
97 data.t_2_comp = data.Diso + diff_data.params[1]
98
99
100 data.ti[0] = 6.0 * data.t_0_comp
101 if data.ti[0] == 0.0:
102 data.ti[0] = 1e99
103 else:
104 data.ti[0] = 1.0 / data.ti[0]
105
106
107 data.ti[1] = 6.0 * data.t_1_comp
108 if data.ti[1] == 0.0:
109 data.ti[1] = 1e99
110 else:
111 data.ti[1] = 1.0 / data.ti[1]
112
113
114 data.ti[2] = 6.0 * data.t_2_comp
115 if data.ti[2] == 0.0:
116 data.ti[2] = 1e99
117 else:
118 data.ti[2] = 1.0 / data.ti[2]
119
120
121
122
123
124
125
127 """Diffusional correlation time gradients.
128
129 tm partial derivatives
130 ~~~~~~~~~~~~~~~~~~~~~~
131
132 dt0 1 dDiso
133 --- = - - ----- (Diso - Da)**-2
134 dtm 6 dtm
135
136 dt1 1 dDiso
137 --- = - - ----- (Diso - Da/2)**-2
138 dtm 6 dtm
139
140 dt2 1 dDiso
141 --- = - - ----- (Diso + Da)**-2
142 dtm 6 dtm
143
144
145 dDiso
146 ----- = -1/6 * tm**-2
147 dtm
148
149
150 Da partial derivatives
151 ~~~~~~~~~~~~~~~~~~~~~~
152
153 dt0
154 --- = 1/6 (Diso - Da)**-2
155 dDa
156
157 dt1
158 --- = 1/12 (Diso - Da/2)**-2
159 dDa
160
161 dt2
162 --- = -1/6 (Diso + Da)**-2
163 dDa
164
165
166 The diffusion parameter set in data.diff_params is {tm, Da, theta, phi}.
167 """
168
169
170 data.t_0_comp_sqrd = data.t_0_comp**2
171 data.t_1_comp_sqrd = data.t_1_comp**2
172 data.t_2_comp_sqrd = data.t_2_comp**2
173
174
175
176
177
178
179 data.inv_dDiso_dtm = -6.0 * diff_data.params[0]**2
180
181
182 data.dti[0, 0] = -6.0 * data.inv_dDiso_dtm * data.t_0_comp_sqrd
183 if data.dti[0, 0] == 0.0:
184 data.dti[0, 0] = 1e99
185 else:
186 data.dti[0, 0] = 1.0 / data.dti[0, 0]
187
188
189 data.dti[0, 1] = -6.0 * data.inv_dDiso_dtm * data.t_1_comp_sqrd
190 if data.dti[0, 1] == 0.0:
191 data.dti[0, 1] = 1e99
192 else:
193 data.dti[0, 1] = 1.0 / data.dti[0, 1]
194
195
196 data.dti[0, 2] = -6.0 * data.inv_dDiso_dtm * data.t_2_comp_sqrd
197 if data.dti[0, 2] == 0.0:
198 data.dti[0, 2] = 1e99
199 else:
200 data.dti[0, 2] = 1.0 / data.dti[0, 2]
201
202
203
204
205
206
207 data.dti[1, 0] = 6.0 * data.t_0_comp_sqrd
208 if data.dti[1, 0] == 0.0:
209 if data.mu != 0.0:
210 data.dti[1, 0] = 1e99
211 else:
212 data.dti[1, 0] = 1.0 / data.dti[1, 0]
213
214
215 data.dti[1, 1] = 12.0 * data.t_1_comp_sqrd
216 if data.dti[1, 1] == 0.0:
217 data.dti[1, 1] = 1e99
218 else:
219 data.dti[1, 1] = 1.0 / data.dti[1, 1]
220
221
222 data.dti[1, 2] = -6.0 * data.t_2_comp_sqrd
223 if data.dti[1, 2] == 0.0:
224 if data.mu != 0.0:
225 data.dti[1, 2] = 1e99
226 else:
227 data.dti[1, 2] = 1.0 / data.dti[1, 2]
228
229
230
231
232
234 """Diffusional correlation time Hessians.
235
236 tm-tm partial derivatives
237 ~~~~~~~~~~~~~~~~~~~~~~~~~
238
239 d2t0 1 / dDiso \ 2 1 d2Diso
240 ---- = - | ----- | (Diso - Da)**-3 - - ------ (Diso - Da)**-2
241 dtm2 3 \ dtm / 6 dtm2
242
243 d2t1 1 / dDiso \ 2 1 d2Diso
244 ---- = - | ----- | (Diso - Da/2)**-3 - - ------ (Diso - Da/2)**-2
245 dtm2 3 \ dtm / 6 dtm2
246
247 d2t2 1 / dDiso \ 2 1 d2Diso
248 ---- = - | ----- | (Diso + Da)**-3 - - ------ (Diso + Da)**-2
249 dtm2 3 \ dtm / 6 dtm2
250
251
252 d2Diso
253 ------ = 1/3 * tm**-3
254 dtm2
255
256
257 tm-Da partial derivatives
258 ~~~~~~~~~~~~~~~~~~~~~~~~~
259
260 d2t0 1 dDiso
261 ------- = - - ----- (Diso - Da)**-3
262 dtm.dDa 3 dtm
263
264 d2t1 1 dDiso
265 ------- = - - ----- (Diso - Da/2)**-3
266 dtm.dDa 6 dtm
267
268 d2t2 1 dDiso
269 ------- = - ----- (Diso + Da)**-3
270 dtm.dDa 3 dtm
271
272
273 Da-Da partial derivatives
274 ~~~~~~~~~~~~~~~~~~~~~~~~~
275
276 d2t0
277 ---- = 1/3 (Diso - Da)**-3
278 dDa2
279
280 d2t1
281 ---- = 1/12 (Diso - Da/2)**-3
282 dDa2
283
284 d2t2
285 ---- = 1/3 (Diso + Da)**-3
286 dDa2
287
288
289 The diffusion parameter set in data.diff_params is {tm, Da, theta, phi}.
290 """
291
292
293 data.t_0_comp_cubed = data.t_0_comp**3
294 data.t_1_comp_cubed = data.t_1_comp**3
295 data.t_2_comp_cubed = data.t_2_comp**3
296
297
298
299
300
301
302 data.inv_d2Diso_dtm2 = 3.0 * diff_data.params[0]**3
303
304
305 a = 3.0 * data.inv_dDiso_dtm**2 * data.t_0_comp_cubed
306 b = -6.0 * data.inv_d2Diso_dtm2 * data.t_0_comp_sqrd
307 if a == 0.0 or b == 0.0:
308 data.d2ti[0, 0, 0] = 1e99
309 else:
310 data.d2ti[0, 0, 0] = 1.0 / a + 1.0 / b
311
312
313 a = 3.0 * data.inv_dDiso_dtm**2 * data.t_1_comp_cubed
314 b = -6.0 * data.inv_d2Diso_dtm2 * data.t_1_comp_sqrd
315 if a == 0.0 or b == 0.0:
316 data.d2ti[0, 0, 1] = 1e99
317 else:
318 data.d2ti[0, 0, 1] = 1.0 / a + 1.0 / b
319
320
321 a = 3.0 * data.inv_dDiso_dtm**2 * data.t_2_comp_cubed
322 b = -6.0 * data.inv_d2Diso_dtm2 * data.t_2_comp_sqrd
323 if a == 0.0 or b == 0.0:
324 data.d2ti[0, 0, 2] = 1e99
325 else:
326 data.d2ti[0, 0, 2] = 1.0 / a + 1.0 / b
327
328
329
330
331
332
333 a = -3.0 * data.inv_dDiso_dtm * data.t_0_comp_cubed
334 if a == 0.0:
335 data.d2ti[0, 1, 0] = data.d2ti[1, 0, 0] = 1e99
336 else:
337 data.d2ti[0, 1, 0] = data.d2ti[1, 0, 0] = 1.0 / a
338
339
340 a = -6.0 * data.inv_dDiso_dtm * data.t_1_comp_cubed
341 if a == 0.0:
342 data.d2ti[0, 1, 1] = data.d2ti[1, 0, 1] = 1e99
343 else:
344 data.d2ti[0, 1, 1] = data.d2ti[1, 0, 1] = 1.0 / a
345
346
347 a = 3.0 * data.inv_dDiso_dtm * data.t_2_comp_cubed
348 if a == 0.0:
349 data.d2ti[0, 1, 2] = data.d2ti[1, 0, 2] = 1e99
350 else:
351 data.d2ti[0, 1, 2] = data.d2ti[1, 0, 2] = 1.0 / a
352
353
354
355
356
357
358 a = 3.0 * data.t_0_comp_cubed
359 if a == 0.0:
360 data.d2ti[1, 1, 0] = 1e99
361 else:
362 data.d2ti[1, 1, 0] = 1.0 / a
363
364
365 a = 12.0 * data.t_1_comp_cubed
366 if a == 0.0:
367 data.d2ti[1, 1, 1] = 1e99
368 else:
369 data.d2ti[1, 1, 1] = 1.0 / a
370
371
372 a = 3.0 * data.t_2_comp_cubed
373 if a == 0.0:
374 data.d2ti[1, 1, 2] = 1e99
375 else:
376 data.d2ti[1, 1, 2] = 1.0 / a
377
378
379
380
381
382
383
385 """Diffusional correlation times.
386
387 The equations for the parameters {Diso, Da, Dr} are:
388
389 t-2 = 1/6 (Diso + Da)**-1
390
391 t-1 = 1/6 (Diso - (Da + Dr)/2)**-1
392
393 t0 = 1/6 (Diso - mu)**-1
394
395 t1 = 1/6 (Diso - (Da - Dr)/2)**-1
396
397 t2 = 1/6 (Diso + mu)**-1
398
399 where:
400 __________________
401 mu = \/ Da**2 + Dr**2 / 3
402
403 The diffusion parameter set in data.diff_params is {tm, Da, Dr, alpha, beta, gamma}.
404 """
405
406
407 if diff_data.params[0] == 0.0:
408 data.Diso = 1e99
409 else:
410 data.Diso = 1.0 / (6.0 * diff_data.params[0])
411
412
413 data.mu = sqrt(diff_data.params[1]**2 + diff_data.params[2]**2 / 3.0)
414
415
416 data.t_m2_comp = data.Diso + diff_data.params[1]
417 data.t_m1_comp = data.Diso - 0.5 * (diff_data.params[1] + diff_data.params[2])
418 data.t_0_comp = data.Diso - data.mu
419 data.t_1_comp = data.Diso - 0.5 * (diff_data.params[1] - diff_data.params[2])
420 data.t_2_comp = data.Diso + data.mu
421
422
423 data.ti[0] = 6.0 * data.t_m2_comp
424 if data.ti[0] == 0.0:
425 data.ti[0] = 1e99
426 else:
427 data.ti[0] = 1.0 / data.ti[0]
428
429
430 data.ti[1] = 6.0 * data.t_m1_comp
431 if data.ti[1] == 0.0:
432 data.ti[1] = 1e99
433 else:
434 data.ti[1] = 1.0 / data.ti[1]
435
436
437 data.ti[2] = 6.0 * data.t_0_comp
438 if data.ti[2] == 0.0:
439 data.ti[2] = 1e99
440 else:
441 data.ti[2] = 1.0 / data.ti[2]
442
443
444 data.ti[3] = 6.0 * data.t_1_comp
445 if data.ti[3] == 0.0:
446 data.ti[3] = 1e99
447 else:
448 data.ti[3] = 1.0 / data.ti[3]
449
450
451 data.ti[4] = 6.0 * data.t_2_comp
452 if data.ti[4] == 0.0:
453 data.ti[4] = 1e99
454 else:
455 data.ti[4] = 1.0 / data.ti[4]
456
457
458
459
460
461
463 """Diffusional correlation time gradients.
464
465 tm partial derivatives
466 ~~~~~~~~~~~~~~~~~~~~~~
467
468 dt-2 1 dDiso
469 ---- = - - ----- (Diso + Da)**-2
470 dtm 6 dtm
471
472 dt-1 1 dDiso
473 ---- = - - ----- (Diso - (Da + Dr)/2)**-2
474 dtm 6 dtm
475
476 dt0 1 dDiso
477 --- = - - ----- (Diso - mu)**-2
478 dtm 6 dtm
479
480 dt1 1 dDiso
481 --- = - - ----- (Diso - (Da - Dr)/2)**-2
482 dtm 6 dtm
483
484 dt2 1 dDiso
485 --- = - - ----- (Diso + mu)**-2
486 dtm 6 dtm
487
488
489 dDiso
490 ----- = -1/6 * tm**-2
491 dtm
492
493
494 Da partial derivatives
495 ~~~~~~~~~~~~~~~~~~~~~~
496
497 dt-2
498 ---- = -1/6 (Diso + Da)**-2
499 dDa
500
501 dt-1
502 ---- = 1/12 (Diso - (Da + Dr)/2)**-2
503 dDa
504
505 dt0
506 --- = 1/6 Da/mu (Diso - mu)**-2
507 dDa
508
509 dt1
510 --- = 1/12 (Diso - (Da - Dr)/2)**-2
511 dDa
512
513 dt2
514 --- = -1/6 Da/mu (Diso + mu)**-2
515 dDa
516
517
518 Dr partial derivatives
519 ~~~~~~~~~~~~~~~~~~~~~~
520
521 dt-2
522 ---- = 0
523 dDr
524
525 dt-1
526 ---- = 1/12 (Diso - (Da + Dr)/2)**-2
527 dDr
528
529 dt0
530 --- = 1/18 Dr/mu (Diso - mu)**-2
531 dDr
532
533 dt1
534 --- = -1/12 (Diso - (Da - Dr)/2)**-2
535 dDr
536
537 dt2
538 --- = -1/18 Dr/mu (Diso + mu)**-2
539 dDr
540
541 The diffusion parameter set in data.diff_params is {tm, Da, Dr, alpha, beta, gamma}.
542 """
543
544
545 data.t_m2_comp_sqrd = data.t_m2_comp**2
546 data.t_m1_comp_sqrd = data.t_m1_comp**2
547 data.t_0_comp_sqrd = data.t_0_comp**2
548 data.t_1_comp_sqrd = data.t_1_comp**2
549 data.t_2_comp_sqrd = data.t_2_comp**2
550
551
552
553
554
555
556 data.inv_dDiso_dtm = -6.0 * diff_data.params[0]**2
557
558
559 data.dti[0, 0] = -6.0 * data.inv_dDiso_dtm * data.t_m2_comp_sqrd
560 if data.dti[0, 0] == 0.0:
561 data.dti[0, 0] = 1e99
562 else:
563 data.dti[0, 0] = 1.0 / data.dti[0, 0]
564
565
566 data.dti[0, 1] = -6.0 * data.inv_dDiso_dtm * data.t_m1_comp_sqrd
567 if data.dti[0, 1] == 0.0:
568 data.dti[0, 1] = 1e99
569 else:
570 data.dti[0, 1] = 1.0 / data.dti[0, 1]
571
572
573 data.dti[0, 2] = -6.0 * data.inv_dDiso_dtm * data.t_0_comp_sqrd
574 if data.dti[0, 2] == 0.0:
575 data.dti[0, 2] = 1e99
576 else:
577 data.dti[0, 2] = 1.0 / data.dti[0, 2]
578
579
580 data.dti[0, 3] = -6.0 * data.inv_dDiso_dtm * data.t_1_comp_sqrd
581 if data.dti[0, 3] == 0.0:
582 data.dti[0, 3] = 1e99
583 else:
584 data.dti[0, 3] = 1.0 / data.dti[0, 3]
585
586
587 data.dti[0, 4] = -6.0 * data.inv_dDiso_dtm * data.t_2_comp_sqrd
588 if data.dti[0, 4] == 0.0:
589 data.dti[0, 4] = 1e99
590 else:
591 data.dti[0, 4] = 1.0 / data.dti[0, 4]
592
593
594
595
596
597
598 data.dti[1, 0] = -6.0 * data.t_m2_comp_sqrd
599 if data.dti[1, 0] == 0.0:
600 data.dti[1, 0] = 1e99
601 else:
602 data.dti[1, 0] = 1.0 / data.dti[1, 0]
603
604
605 data.dti[1, 1] = 12.0 * data.t_m1_comp_sqrd
606 if data.dti[1, 1] == 0.0:
607 data.dti[1, 1] = 1e99
608 else:
609 data.dti[1, 1] = 1.0 / data.dti[1, 1]
610
611
612 data.dti[1, 2] = 6.0 * data.mu * data.t_0_comp_sqrd
613 if data.dti[1, 2] == 0.0:
614 if data.mu != 0.0:
615 data.dti[1, 2] = 1e99
616 else:
617 data.dti[1, 2] = 0.0
618 else:
619 data.dti[1, 2] = diff_data.params[1] / data.dti[1, 2]
620
621
622 data.dti[1, 3] = 12.0 * data.t_1_comp_sqrd
623 if data.dti[1, 3] == 0.0:
624 data.dti[1, 3] = 1e99
625 else:
626 data.dti[1, 3] = 1.0 / data.dti[1, 3]
627
628
629 data.dti[1, 4] = -6.0 * data.mu * data.t_2_comp_sqrd
630 if data.dti[1, 4] == 0.0:
631 if data.mu != 0.0:
632 data.dti[1, 4] = 1e99
633 else:
634 data.dti[1, 4] = 0.0
635 else:
636 data.dti[1, 4] = diff_data.params[1] / data.dti[1, 4]
637
638
639
640
641
642
643 data.dti[2, 1] = 12.0 * data.t_m1_comp_sqrd
644 if data.dti[2, 1] == 0.0:
645 data.dti[2, 1] = 1e99
646 else:
647 data.dti[2, 1] = 1.0 / data.dti[2, 1]
648
649
650 data.dti[2, 2] = 18.0 * data.mu * data.t_0_comp_sqrd
651 if data.dti[2, 2] == 0.0:
652 if data.mu != 0.0:
653 data.dti[2, 2] = 1e99
654 else:
655 data.dti[2, 2] = 0.0
656 else:
657 data.dti[2, 2] = diff_data.params[2] / data.dti[2, 2]
658
659
660 data.dti[2, 3] = -12.0 * data.t_1_comp_sqrd
661 if data.dti[2, 3] == 0.0:
662 data.dti[2, 3] = 1e99
663 else:
664 data.dti[2, 3] = 1.0 / data.dti[2, 3]
665
666
667 data.dti[2, 4] = -18.0 * data.mu * data.t_2_comp_sqrd
668 if data.dti[2, 4] == 0.0:
669 if data.mu != 0.0:
670 data.dti[2, 4] = 1e99
671 else:
672 data.dti[2, 4] = 0.0
673 else:
674 data.dti[2, 4] = diff_data.params[2] / data.dti[2, 4]
675
676
677
678
679
680
682 """Diffusional correlation time Hessians.
683
684 tm-tm partial derivatives
685 ~~~~~~~~~~~~~~~~~~~~~~~~~
686
687 d2t-2 1 / dDiso \ 2 1 d2Diso
688 ----- = - | ----- | (Diso + Da)**-3 - - ------ (Diso + Da)**-2
689 dtm2 3 \ dtm / 6 dtm2
690
691 d2t-1 1 / dDiso \ 2 1 d2Diso
692 ----- = - | ----- | (Diso - (Da + Dr)/2)**-3 - - ------ (Diso - (Da + Dr)/2)**-2
693 dtm2 3 \ dtm / 6 dtm2
694
695 d2t0 1 / dDiso \ 2 1 d2Diso
696 ---- = - | ----- | (Diso - mu)**-3 - - ------ (Diso - mu)**-2
697 dtm2 3 \ dtm / 6 dtm2
698
699 d2t1 1 / dDiso \ 2 1 d2Diso
700 ---- = - | ----- | (Diso - (Da - Dr)/2)**-3 - - ------ (Diso - (Da - Dr)/2)**-2
701 dtm2 3 \ dtm / 6 dtm2
702
703 d2t2 1 / dDiso \ 2 1 d2Diso
704 ---- = - | ----- | (Diso + mu)**-3 - - ------ (Diso + mu)**-2
705 dtm2 3 \ dtm / 6 dtm2
706
707
708 d2Diso
709 ------ = 1/3 * tm**-3
710 dtm2
711
712
713 tm-Da partial derivatives
714 ~~~~~~~~~~~~~~~~~~~~~~~~~
715
716 d2t-2 1 dDiso
717 ------- = - ----- (Diso + Da)**-3
718 dtm.dDa 3 dtm
719
720 d2t-1 1 dDiso
721 ------- = - - ----- (Diso - (Da + Dr)/2)**-3
722 dtm.dDa 6 dtm
723
724 d2t0 1 dDiso Da
725 ------- = - - ----- -- (Diso - mu)**-3
726 dtm.dDa 3 dtm mu
727
728 d2t1 1 dDiso
729 ------- = - - ----- (Diso - (Da - Dr)/2)**-3
730 dtm.dDa 6 dtm
731
732 d2t2 1 dDiso Da
733 ------- = - ----- -- (Diso + mu)**-3
734 dtm.dDa 3 dtm mu
735
736
737 tm-Dr partial derivatives
738 ~~~~~~~~~~~~~~~~~~~~~~~~~
739
740 d2t-2
741 ------- = 0
742 dtm.dDr
743
744 d2t-1 1 dDiso
745 ------- = - - ----- (Diso - (Da + Dr)/2)**-3
746 dtm.dDr 6 dtm
747
748 d2t0 1 dDiso Dr
749 ------- = - - ----- -- (Diso - mu)**-3
750 dtm.dDr 9 dtm mu
751
752 d2t1 1 dDiso
753 ------- = - ----- (Diso - (Da - Dr)/2)**-3
754 dtm.dDr 6 dtm
755
756 d2t2 1 dDiso Dr
757 ------- = - ----- -- (Diso + mu)**-3
758 dtm.dDr 9 dtm mu
759
760
761 Da-Da partial derivatives
762 ~~~~~~~~~~~~~~~~~~~~~~~~~
763
764 d2t-2
765 ----- = 1/3 (Diso + Da)**-3
766 dDa2
767
768 d2t-1
769 ----- = 1/12 (Diso - (Da + Dr)/2)**-3
770 dDa2
771
772 d2t0 1 Da**2 1 / Da**2 \
773 ---- = - ----- (Diso - mu)**-3 - --- | ----- - 1 | (Diso - mu)**-2
774 dDa2 3 mu**2 6mu \ mu**2 /
775
776 d2t1
777 ---- = 1/12 (Diso - (Da - Dr)/2)**-3
778 dDa2
779
780 d2t2 1 Da**2 1 / Da**2 \
781 ---- = - ----- (Diso + mu)**-3 + --- | ----- - 1 | (Diso + mu)**-2
782 dDa2 3 mu**2 6mu \ mu**2 /
783
784
785 Da-Dr partial derivatives
786 ~~~~~~~~~~~~~~~~~~~~~~~~~
787
788 d2t-2
789 ------- = 0
790 dDa.dDr
791
792 d2t-1
793 ------- = 1/12 (Diso - (Da + Dr)/2)**-3
794 dDa.dDr
795
796 d2t0 1 Da.Dr 1 Da.Dr
797 ------- = - ----- (Diso - mu)**-3 - -- ----- (Diso - mu)**-2
798 dDa.dDr 9 mu**2 18 mu**3
799
800 d2t1
801 ------- = -1/12 (Diso - (Da - Dr)/2)**-3
802 dDa.dDr
803
804 d2t2 1 Da.Dr 1 Da.Dr
805 ------- = - ----- (Diso + mu)**-3 + -- ----- (Diso + mu)**-2
806 dDa.dDr 9 mu**2 18 mu**3
807
808
809 Dr-Dr partial derivatives
810 ~~~~~~~~~~~~~~~~~~~~~~~~~
811
812 d2t-2
813 ----- = 0
814 dDr2
815
816 d2t-1
817 ----- = 1/12 (Diso - (Da + Dr)/2)**-3
818 dDr2
819
820 d2t0 1 Dr**2 1 / Dr**2 \
821 ---- = -- ----- (Diso - mu)**-3 - ---- | ------ - 1 | (Diso - mu)**-2
822 dDr2 27 mu**2 18mu \ 3mu**2 /
823
824 d2t1
825 ---- = 1/12 (Diso - (Da - Dr)/2)**-3
826 dDr2
827
828 d2t2 1 Dr**2 1 / Dr**2 \
829 ---- = -- ----- (Diso + mu)**-3 + ---- | ------ - 1 | (Diso + mu)**-2
830 dDr2 27 mu**2 18mu \ 3mu**2 /
831
832
833 The diffusion parameter set in data.diff_params is {tm, Da, Dr, alpha, beta, gamma}.
834 """
835
836
837 data.t_m2_comp_cubed = data.t_m2_comp**3
838 data.t_m1_comp_cubed = data.t_m1_comp**3
839 data.t_0_comp_cubed = data.t_0_comp**3
840 data.t_1_comp_cubed = data.t_1_comp**3
841 data.t_2_comp_cubed = data.t_2_comp**3
842
843
844
845
846
847
848 data.inv_d2Diso_dtm2 = 3.0 * diff_data.params[0]**3
849
850
851 a = 3.0 * data.inv_dDiso_dtm**2 * data.t_m2_comp_cubed
852 b = -6.0 * data.inv_d2Diso_dtm2 * data.t_m2_comp_sqrd
853 if a == 0.0 or b == 0.0:
854 data.d2ti[0, 0, 0] = 1e99
855 else:
856 data.d2ti[0, 0, 0] = 1.0 / a + 1.0 / b
857
858
859 a = 3.0 * data.inv_dDiso_dtm**2 * data.t_m1_comp_cubed
860 b = -6.0 * data.inv_d2Diso_dtm2 * data.t_m1_comp_sqrd
861 if a == 0.0 or b == 0.0:
862 data.d2ti[0, 0, 1] = 1e99
863 else:
864 data.d2ti[0, 0, 1] = 1.0 / a + 1.0 / b
865
866
867 a = 3.0 * data.inv_dDiso_dtm**2 * data.t_0_comp_cubed
868 b = -6.0 * data.inv_d2Diso_dtm2 * data.t_0_comp_sqrd
869 if a == 0.0 or b == 0.0:
870 data.d2ti[0, 0, 2] = 1e99
871 else:
872 data.d2ti[0, 0, 2] = 1.0 / a + 1.0 / b
873
874
875 a = 3.0 * data.inv_dDiso_dtm**2 * data.t_1_comp_cubed
876 b = -6.0 * data.inv_d2Diso_dtm2 * data.t_1_comp_sqrd
877 if a == 0.0 or b == 0.0:
878 data.d2ti[0, 0, 3] = 1e99
879 else:
880 data.d2ti[0, 0, 3] = 1.0 / a + 1.0 / b
881
882
883 a = 3.0 * data.inv_dDiso_dtm**2 * data.t_2_comp_cubed
884 b = -6.0 * data.inv_d2Diso_dtm2 * data.t_2_comp_sqrd
885 if a == 0.0 or b == 0.0:
886 data.d2ti[0, 0, 4] = 1e99
887 else:
888 data.d2ti[0, 0, 4] = 1.0 / a + 1.0 / b
889
890
891
892
893
894
895 a = 3.0 * data.inv_dDiso_dtm * data.t_m2_comp_cubed
896 if a == 0.0:
897 data.d2ti[0, 1, 0] = data.d2ti[1, 0, 0] = 1e99
898 else:
899 data.d2ti[0, 1, 0] = data.d2ti[1, 0, 0] = 1.0 / a
900
901
902 a = -6.0 * data.inv_dDiso_dtm * data.t_m1_comp_cubed
903 if a == 0.0:
904 data.d2ti[0, 1, 1] = data.d2ti[1, 0, 1] = 1e99
905 else:
906 data.d2ti[0, 1, 1] = data.d2ti[1, 0, 1] = 1.0 / a
907
908
909 a = -3.0 * data.inv_dDiso_dtm * data.mu * data.t_0_comp_cubed
910 if a == 0.0:
911 data.d2ti[0, 1, 2] = data.d2ti[1, 0, 2] = 1e99
912 else:
913 data.d2ti[0, 1, 2] = data.d2ti[1, 0, 2] = diff_data.params[1] / a
914
915
916 a = -6.0 * data.inv_dDiso_dtm * data.t_1_comp_cubed
917 if a == 0.0:
918 data.d2ti[0, 1, 3] = data.d2ti[1, 0, 3] = 1e99
919 else:
920 data.d2ti[0, 1, 3] = data.d2ti[1, 0, 3] = 1.0 / a
921
922
923 a = 3.0 * data.inv_dDiso_dtm * data.mu * data.t_2_comp_cubed
924 if a == 0.0:
925 data.d2ti[0, 1, 4] = data.d2ti[1, 0, 4] = 1e99
926 else:
927 data.d2ti[0, 1, 4] = data.d2ti[1, 0, 4] = diff_data.params[1] / a
928
929
930
931
932
933
934 a = -6.0 * data.inv_dDiso_dtm * data.t_m1_comp_cubed
935 if a == 0.0:
936 data.d2ti[0, 2, 1] = data.d2ti[2, 0, 1] = 1e99
937 else:
938 data.d2ti[0, 2, 1] = data.d2ti[2, 0, 1] = 1.0 / a
939
940
941 a = -9.0 * data.inv_dDiso_dtm * data.mu * data.t_0_comp_cubed
942 if a == 0.0:
943 data.d2ti[0, 2, 2] = data.d2ti[2, 0, 2] = 1e99
944 else:
945 data.d2ti[0, 2, 2] = data.d2ti[2, 0, 2] = diff_data.params[2] / a
946
947
948 a = 6.0 * data.inv_dDiso_dtm * data.t_1_comp_cubed
949 if a == 0.0:
950 data.d2ti[0, 2, 3] = data.d2ti[2, 0, 3] = 1e99
951 else:
952 data.d2ti[0, 2, 3] = data.d2ti[2, 0, 3] = 1.0 / a
953
954
955 a = 9.0 * data.inv_dDiso_dtm * data.mu * data.t_2_comp_cubed
956 if a == 0.0:
957 data.d2ti[0, 2, 4] = data.d2ti[2, 0, 4] = 1e99
958 else:
959 data.d2ti[0, 2, 4] = data.d2ti[2, 0, 4] = diff_data.params[2] / a
960
961
962
963
964
965
966 a = 3.0 * data.t_m2_comp_cubed
967 if a == 0.0:
968 data.d2ti[1, 1, 0] = 1e99
969 else:
970 data.d2ti[1, 1, 0] = 1.0 / a
971
972
973 a = 12.0 * data.t_m1_comp_cubed
974 if a == 0.0:
975 data.d2ti[1, 1, 1] = 1e99
976 else:
977 data.d2ti[1, 1, 1] = 1.0 / a
978
979
980 a = 3.0 * data.mu**2 * data.t_0_comp_cubed
981 b = -6.0 * data.mu * data.t_0_comp_sqrd
982 if a == 0.0 or b == 0.0:
983 data.d2ti[1, 1, 2] = 1e99
984 else:
985 data.d2ti[1, 1, 2] = diff_data.params[1]**2 / a + (diff_data.params[1]**2 / data.mu**2 - 1.0) / b
986
987
988 a = 12.0 * data.t_1_comp_cubed
989 if a == 0.0:
990 data.d2ti[1, 1, 3] = 1e99
991 else:
992 data.d2ti[1, 1, 3] = 1.0 / a
993
994
995 a = 3.0 * data.mu**2 * data.t_2_comp_cubed
996 b = 6.0 * data.mu * data.t_2_comp_sqrd
997 if a == 0.0 or b == 0.0:
998 data.d2ti[1, 1, 4] = 1e99
999 else:
1000 data.d2ti[1, 1, 4] = diff_data.params[1]**2 / a + (diff_data.params[1]**2 / data.mu**2 - 1.0) / b
1001
1002
1003
1004
1005
1006
1007 a = 12.0 * data.t_m1_comp_cubed
1008 if a == 0.0:
1009 data.d2ti[1, 2, 1] = data.d2ti[2, 1, 1] = 1e99
1010 else:
1011 data.d2ti[1, 2, 1] = data.d2ti[2, 1, 1] = 1.0 / a
1012
1013
1014 a = 9.0 * data.mu**2 * data.t_0_comp_cubed
1015 b = -18.0 * data.mu**3 * data.t_0_comp_sqrd
1016 if a == 0.0 or b == 0.0:
1017 data.d2ti[1, 2, 2] = data.d2ti[2, 1, 2] = 1e99
1018 else:
1019 data.d2ti[1, 2, 2] = data.d2ti[2, 1, 2] = diff_data.params[1] * diff_data.params[2] / a + diff_data.params[1] * diff_data.params[2] / b
1020
1021
1022 a = -12.0 * data.t_1_comp_cubed
1023 if a == 0.0:
1024 data.d2ti[1, 2, 3] = data.d2ti[2, 1, 3] = 1e99
1025 else:
1026 data.d2ti[1, 2, 3] = data.d2ti[2, 1, 3] = 1.0 / a
1027
1028
1029 a = 9.0 * data.mu**2 * data.t_2_comp_cubed
1030 b = 18.0 * data.mu**3 * data.t_2_comp_sqrd
1031 if a == 0.0 or b == 0.0:
1032 data.d2ti[1, 2, 4] = data.d2ti[2, 1, 4] = 1e99
1033 else:
1034 data.d2ti[1, 2, 4] = data.d2ti[2, 1, 4] = diff_data.params[1] * diff_data.params[2] / a + diff_data.params[1] * diff_data.params[2] / b
1035
1036
1037
1038
1039
1040
1041 a = 12.0 * data.t_m1_comp_cubed
1042 if a == 0.0:
1043 data.d2ti[1, 1, 1] = 1e99
1044 else:
1045 data.d2ti[1, 1, 1] = 1.0 / a
1046
1047
1048 a = 27.0 * data.mu**2 * data.t_0_comp_cubed
1049 b = -18.0 * data.mu * data.t_0_comp_sqrd
1050 if a == 0.0 or b == 0.0:
1051 data.d2ti[1, 1, 2] = 1e99
1052 else:
1053 data.d2ti[1, 1, 2] = diff_data.params[2]**2 / a + (diff_data.params[2]**2 / (3.0 * data.mu**2) - 1.0) / b
1054
1055
1056 a = 12.0 * data.t_1_comp_cubed
1057 if a == 0.0:
1058 data.d2ti[1, 1, 3] = 1e99
1059 else:
1060 data.d2ti[1, 1, 3] = 1.0 / a
1061
1062
1063 a = 27.0 * data.mu**2 * data.t_2_comp_cubed
1064 b = 18.0 * data.mu * data.t_2_comp_sqrd
1065 if a == 0.0 or b == 0.0:
1066 data.d2ti[1, 1, 4] = 1e99
1067 else:
1068 data.d2ti[1, 1, 4] = diff_data.params[2]**2 / a + (diff_data.params[2]**2 / (3.0 * data.mu**2) - 1.0) / b
1069