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 cos, sin
24 from numpy import dot
25
26
27
28
29
30
31
32
33
34
35
37 """Function for calculating the direction cosine dz.
38
39 dz is the dot product between the unit bond vector and the unit vector along Dpar and is given
40 by::
41
42 dz = XH . Dpar.
43
44 The unit Dpar vector is::
45
46 | sin(theta) * cos(phi) |
47 Dpar = | sin(theta) * sin(phi) |
48 | cos(theta) |
49 """
50
51
52 diff_data.sin_theta = sin(diff_data.params[2])
53 diff_data.cos_theta = cos(diff_data.params[2])
54 diff_data.sin_phi = sin(diff_data.params[3])
55 diff_data.cos_phi = cos(diff_data.params[3])
56
57
58 diff_data.dpar[0] = diff_data.sin_theta * diff_data.cos_phi
59 diff_data.dpar[1] = diff_data.sin_theta * diff_data.sin_phi
60 diff_data.dpar[2] = diff_data.cos_theta
61
62
63 data.dz = dot(data.xh_unit_vector, diff_data.dpar)
64
65
66
67
68
69
71 """Function for calculating the partial derivatives of the direction cosine dz.
72
73 The theta partial derivative of the unit Dpar vector is::
74
75 dDpar | cos(theta) * cos(phi) |
76 ------ = | cos(theta) * sin(phi) |
77 dtheta | -sin(theta) |
78
79 The phi partial derivative of the unit Dpar vector is::
80
81 dDpar | -sin(theta) * sin(phi) |
82 ----- = | sin(theta) * cos(phi) |
83 dphi | 0 |
84
85 O is the orientational parameter set {theta, phi}
86 """
87
88
89 diff_data.dpar_dtheta[0] = diff_data.cos_theta * diff_data.cos_phi
90 diff_data.dpar_dtheta[1] = diff_data.cos_theta * diff_data.sin_phi
91 diff_data.dpar_dtheta[2] = -diff_data.sin_theta
92
93
94 diff_data.dpar_dphi[0] = -diff_data.sin_theta * diff_data.sin_phi
95 diff_data.dpar_dphi[1] = diff_data.sin_theta * diff_data.cos_phi
96 diff_data.dpar_dphi[2] = 0.0
97
98
99 data.ddz_dO[0] = dot(data.xh_unit_vector, diff_data.dpar_dtheta)
100 data.ddz_dO[1] = dot(data.xh_unit_vector, diff_data.dpar_dphi)
101
102
103
104
105
106
108 """Function for calculating the second partial derivatives of the direction cosine dz.
109
110 The theta-theta second partial derivative of the unit Dpar vector is::
111
112 d2Dpar | -sin(theta) * cos(phi) |
113 ------- = | -sin(theta) * sin(phi) |
114 dtheta2 | -cos(theta) |
115
116 The theta-phi second partial derivative of the unit Dpar vector is::
117
118 d2Dpar | -cos(theta) * sin(phi) |
119 ----------- = | cos(theta) * cos(phi) |
120 dtheta.dphi | 0 |
121
122 The phi-phi second partial derivative of the unit Dpar vector is::
123
124 dDpar | -sin(theta) * cos(phi) |
125 ----- = | -sin(theta) * sin(phi) |
126 dphi2 | 0 |
127
128 O is the orientational parameter set {theta, phi}
129 """
130
131
132 diff_data.dpar_dtheta2[0] = -diff_data.sin_theta * diff_data.cos_phi
133 diff_data.dpar_dtheta2[1] = -diff_data.sin_theta * diff_data.sin_phi
134 diff_data.dpar_dtheta2[2] = -diff_data.cos_theta
135
136
137 diff_data.dpar_dthetadphi[0] = -diff_data.cos_theta * diff_data.sin_phi
138 diff_data.dpar_dthetadphi[1] = diff_data.cos_theta * diff_data.cos_phi
139 diff_data.dpar_dthetadphi[2] = 0.0
140
141
142 diff_data.dpar_dphi2[0] = -diff_data.sin_theta * diff_data.cos_phi
143 diff_data.dpar_dphi2[1] = -diff_data.sin_theta * diff_data.sin_phi
144 diff_data.dpar_dphi2[2] = 0.0
145
146
147 data.d2dz_dO2[0, 0] = dot(data.xh_unit_vector, diff_data.dpar_dtheta2)
148 data.d2dz_dO2[0, 1] = data.d2dz_dO2[1, 0] = dot(data.xh_unit_vector, diff_data.dpar_dthetadphi)
149 data.d2dz_dO2[1, 1] = dot(data.xh_unit_vector, diff_data.dpar_dphi2)
150
151
152
153
154
155
156
157
158
159
160
161
163 """Function for calculating the direction cosines dx, dy, and dz.
164
165 Direction cosines
166 =================
167
168 dx is the dot product between the unit bond vector and the unit vector along Dx. The
169 equation is::
170
171 dx = XH . Dx
172
173 dy is the dot product between the unit bond vector and the unit vector along Dy. The
174 equation is::
175
176 dy = XH . Dy
177
178 dz is the dot product between the unit bond vector and the unit vector along Dz. The
179 equation is::
180
181 dz = XH . Dz
182
183
184 Unit vectors
185 ============
186
187 The unit Dx vector is::
188
189 | -sin(alpha) * sin(gamma) + cos(alpha) * cos(beta) * cos(gamma) |
190 Dx = | -sin(alpha) * cos(gamma) - cos(alpha) * cos(beta) * sin(gamma) |
191 | cos(alpha) * sin(beta) |
192
193 The unit Dy vector is::
194
195 | cos(alpha) * sin(gamma) + sin(alpha) * cos(beta) * cos(gamma) |
196 Dy = | cos(alpha) * cos(gamma) - sin(alpha) * cos(beta) * sin(gamma) |
197 | sin(alpha) * sin(beta) |
198
199 The unit Dz vector is::
200
201 | -sin(beta) * cos(gamma) |
202 Dz = | sin(beta) * sin(gamma) |
203 | cos(beta) |
204
205 """
206
207
208 data.sin_a = sin(diff_data.params[3])
209 data.sin_b = sin(diff_data.params[4])
210 data.sin_g = sin(diff_data.params[5])
211
212 data.cos_a = cos(diff_data.params[3])
213 data.cos_b = cos(diff_data.params[4])
214 data.cos_g = cos(diff_data.params[5])
215
216
217 diff_data.dx[0] = -data.sin_a * data.sin_g + data.cos_a * data.cos_b * data.cos_g
218 diff_data.dx[1] = -data.sin_a * data.cos_g - data.cos_a * data.cos_b * data.sin_g
219 diff_data.dx[2] = data.cos_a * data.sin_b
220
221
222 diff_data.dy[0] = data.cos_a * data.sin_g + data.sin_a * data.cos_b * data.cos_g
223 diff_data.dy[1] = data.cos_a * data.cos_g - data.sin_a * data.cos_b * data.sin_g
224 diff_data.dy[2] = data.sin_a * data.sin_b
225
226
227 diff_data.dz[0] = -data.sin_b * data.cos_g
228 diff_data.dz[1] = data.sin_b * data.sin_g
229 diff_data.dz[2] = data.cos_b
230
231
232 data.dx = dot(data.xh_unit_vector, diff_data.dx)
233 data.dy = dot(data.xh_unit_vector, diff_data.dy)
234 data.dz = dot(data.xh_unit_vector, diff_data.dz)
235
236
237
238
239
240
242 """Function for calculating the partial derivatives of the direction cosines dx, dy, and dz.
243
244 Dx gradient
245 ===========
246
247 The alpha partial derivative of the unit Dx vector is::
248
249 dDx | -cos(alpha) * sin(gamma) - sin(alpha) * cos(beta) * cos(gamma) |
250 ------ = | -cos(alpha) * cos(gamma) + sin(alpha) * cos(beta) * sin(gamma) |
251 dalpha | -sin(alpha) * sin(beta) |
252
253 The beta partial derivative of the unit Dx vector is::
254
255 dDx | -cos(alpha) * sin(beta) * cos(gamma) |
256 ----- = | cos(alpha) * sin(beta) * sin(gamma) |
257 dbeta | cos(alpha) * cos(beta) |
258
259 The gamma partial derivative of the unit Dx vector is::
260
261 dDx | -sin(alpha) * cos(gamma) - cos(alpha) * cos(beta) * sin(gamma) |
262 ------ = | sin(alpha) * sin(gamma) - cos(alpha) * cos(beta) * cos(gamma) |
263 dgamma | 0 |
264
265
266 Dy gradient
267 ===========
268
269 The alpha partial derivative of the unit Dy vector is::
270
271 dDy | -sin(alpha) * sin(gamma) + cos(alpha) * cos(beta) * cos(gamma) |
272 ------ = | -sin(alpha) * cos(gamma) - cos(alpha) * cos(beta) * sin(gamma) |
273 dalpha | cos(alpha) * sin(beta) |
274
275 The beta partial derivative of the unit Dy vector is::
276
277 dDy | -sin(alpha) * sin(beta) * cos(gamma) |
278 ----- = | sin(alpha) * sin(beta) * sin(gamma) |
279 dbeta | sin(alpha) * cos(beta) |
280
281 The gamma partial derivative of the unit Dy vector is::
282
283 dDy | cos(alpha) * cos(gamma) - sin(alpha) * cos(beta) * sin(gamma) |
284 ------ = | -cos(alpha) * sin(gamma) - sin(alpha) * cos(beta) * cos(gamma) |
285 dgamma | 0 |
286
287
288 Dz gradient
289 ===========
290
291 The alpha partial derivative of the unit Dz vector is::
292
293 dDz | 0 |
294 ------ = | 0 |
295 dalpha | 0 |
296
297 The beta partial derivative of the unit Dz vector is::
298
299 dDz | -cos(beta) * cos(gamma) |
300 ----- = | cos(beta) * sin(gamma) |
301 dbeta | -sin(beta) |
302
303 The gamma partial derivative of the unit Dz vector is::
304
305 dDz | sin(beta) * sin(gamma) |
306 ------ = | sin(beta) * cos(gamma) |
307 dgamma | 0 |
308 """
309
310
311
312
313
314 diff_data.ddx_dalpha[0] = -data.cos_a * data.sin_g - data.sin_a * data.cos_b * data.cos_g
315 diff_data.ddx_dalpha[1] = -data.cos_a * data.cos_g + data.sin_a * data.cos_b * data.sin_g
316 diff_data.ddx_dalpha[2] = -data.sin_a * data.sin_b
317
318
319 diff_data.ddx_dbeta[0] = -data.cos_a * data.sin_b * data.cos_g
320 diff_data.ddx_dbeta[1] = data.cos_a * data.sin_b * data.sin_g
321 diff_data.ddx_dbeta[2] = data.cos_a * data.cos_b
322
323
324 diff_data.ddx_dgamma[0] = -data.sin_a * data.cos_g - data.cos_a * data.cos_b * data.sin_g
325 diff_data.ddx_dgamma[1] = data.sin_a * data.sin_g - data.cos_a * data.cos_b * data.cos_g
326
327
328
329
330
331
332 diff_data.ddy_dalpha[0] = -data.sin_a * data.sin_g + data.cos_a * data.cos_b * data.cos_g
333 diff_data.ddy_dalpha[1] = -data.sin_a * data.cos_g - data.cos_a * data.cos_b * data.sin_g
334 diff_data.ddy_dalpha[2] = data.cos_a * data.sin_b
335
336
337 diff_data.ddy_dbeta[0] = -data.sin_a * data.sin_b * data.cos_g
338 diff_data.ddy_dbeta[1] = data.sin_a * data.sin_b * data.sin_g
339 diff_data.ddy_dbeta[2] = data.sin_a * data.cos_b
340
341
342 diff_data.ddy_dgamma[0] = data.cos_a * data.cos_g - data.sin_a * data.cos_b * data.sin_g
343 diff_data.ddy_dgamma[1] = -data.cos_a * data.sin_g - data.sin_a * data.cos_b * data.cos_g
344
345
346
347
348
349
350 diff_data.ddz_dbeta[0] = -data.cos_b * data.cos_g
351 diff_data.ddz_dbeta[1] = data.cos_b * data.sin_g
352 diff_data.ddz_dbeta[2] = -data.sin_b
353
354
355 diff_data.ddz_dgamma[0] = data.sin_b * data.sin_g
356 diff_data.ddz_dgamma[1] = data.sin_b * data.cos_g
357
358
359
360
361
362 data.ddx_dO[0] = dot(data.xh_unit_vector, diff_data.ddx_dalpha)
363 data.ddx_dO[1] = dot(data.xh_unit_vector, diff_data.ddx_dbeta)
364 data.ddx_dO[2] = dot(data.xh_unit_vector, diff_data.ddx_dgamma)
365
366 data.ddy_dO[0] = dot(data.xh_unit_vector, diff_data.ddy_dalpha)
367 data.ddy_dO[1] = dot(data.xh_unit_vector, diff_data.ddy_dbeta)
368 data.ddy_dO[2] = dot(data.xh_unit_vector, diff_data.ddy_dgamma)
369
370 data.ddz_dO[1] = dot(data.xh_unit_vector, diff_data.ddz_dbeta)
371 data.ddz_dO[2] = dot(data.xh_unit_vector, diff_data.ddz_dgamma)
372
373
374
375
376
377
379 """Function for calculating the second partial derivatives of the direction cosines dx, dy, dz.
380
381 Dx Hessian
382 ==========
383
384 The alpha-alpha second partial derivative of the unit Dx vector is::
385
386 d2Dx | sin(alpha) * sin(gamma) - cos(alpha) * cos(beta) * cos(gamma) |
387 ------- = | sin(alpha) * cos(gamma) + cos(alpha) * cos(beta) * sin(gamma) |
388 dalpha2 | -cos(alpha) * sin(beta) |
389
390 The alpha-beta second partial derivative of the unit Dx vector is::
391
392 d2Dx | sin(alpha) * sin(beta) * cos(gamma) |
393 ------------ = | -sin(alpha) * sin(beta) * sin(gamma) |
394 dalpha.dbeta | -sin(alpha) * cos(beta) |
395
396 The alpha-gamma second partial derivative of the unit Dx vector is::
397
398 d2Dx | -cos(alpha) * cos(gamma) + sin(alpha) * cos(beta) * sin(gamma) |
399 ------------- = | cos(alpha) * sin(gamma) + sin(alpha) * cos(beta) * cos(gamma) |
400 dalpha.dgamma | 0 |
401
402 The beta-beta second partial derivative of the unit Dx vector is::
403
404 d2Dx | -cos(alpha) * cos(beta) * cos(gamma) |
405 ------ = | cos(alpha) * cos(beta) * sin(gamma) |
406 dbeta2 | -cos(alpha) * sin(beta) |
407
408 The beta-gamma second partial derivative of the unit Dx vector is::
409
410 d2Dx | cos(alpha) * sin(beta) * sin(gamma) |
411 ------------ = | cos(alpha) * sin(beta) * cos(gamma) |
412 dbeta.dgamma | 0 |
413
414 The gamma-gamma second partial derivative of the unit Dx vector is::
415
416 d2Dx | sin(alpha) * sin(gamma) - cos(alpha) * cos(beta) * cos(gamma) |
417 ------- = | sin(alpha) * cos(gamma) + cos(alpha) * cos(beta) * sin(gamma) |
418 dgamma2 | 0 |
419
420
421 Dy Hessian
422 ==========
423
424 The alpha-alpha second partial derivative of the unit Dy vector is::
425
426 d2Dy | -cos(alpha) * sin(gamma) - sin(alpha) * cos(beta) * cos(gamma) |
427 ------- = | -cos(alpha) * cos(gamma) + sin(alpha) * cos(beta) * sin(gamma) |
428 dalpha2 | -sin(alpha) * sin(beta) |
429
430 The alpha-beta second partial derivative of the unit Dy vector is::
431
432 d2Dy | -cos(alpha) * sin(beta) * cos(gamma) |
433 ------------ = | cos(alpha) * sin(beta) * sin(gamma) |
434 dalpha.dbeta | cos(alpha) * cos(beta) |
435
436 The alpha-gamma second partial derivative of the unit Dy vector is::
437
438 d2Dy | -sin(alpha) * cos(gamma) - cos(alpha) * cos(beta) * sin(gamma) |
439 ------------- = | sin(alpha) * sin(gamma) - cos(alpha) * cos(beta) * cos(gamma) |
440 dalpha.dgamma | 0 |
441
442 The beta-beta second partial derivative of the unit Dy vector is::
443
444 d2Dy | -sin(alpha) * cos(beta) * cos(gamma) |
445 ------ = | sin(alpha) * cos(beta) * sin(gamma) |
446 dbeta2 | -sin(alpha) * sin(beta) |
447
448 The beta-gamma second partial derivative of the unit Dy vector is::
449
450 d2Dy | sin(alpha) * sin(beta) * sin(gamma) |
451 ------------ = | sin(alpha) * sin(beta) * cos(gamma) |
452 dbeta.dgamma | 0 |
453
454 The gamma-gamma second partial derivative of the unit Dy vector is::
455
456 d2Dy | -cos(alpha) * sin(gamma) - sin(alpha) * cos(beta) * cos(gamma) |
457 ------- = | -cos(alpha) * cos(gamma) + sin(alpha) * cos(beta) * sin(gamma) |
458 dgamma2 | 0 |
459
460
461 Dz Hessian
462 ==========
463
464 The alpha-alpha second partial derivative of the unit Dz vector is::
465
466 d2Dz | 0 |
467 ------- = | 0 |
468 dalpha2 | 0 |
469
470 The alpha-beta second partial derivative of the unit Dz vector is::
471
472 d2Dz | 0 |
473 ------------ = | 0 |
474 dalpha.dbeta | 0 |
475
476 The alpha-gamma second partial derivative of the unit Dz vector is::
477
478 d2Dz | 0 |
479 ------------- = | 0 |
480 dalpha.dgamma | 0 |
481
482 The beta-beta second partial derivative of the unit Dz vector is::
483
484 d2Dz | sin(beta) * cos(gamma) |
485 ------ = | -sin(beta) * sin(gamma) |
486 dbeta2 | -cos(beta) |
487
488 The beta-gamma second partial derivative of the unit Dz vector is::
489
490 d2Dz | cos(beta) * sin(gamma) |
491 ------------ = | cos(beta) * cos(gamma) |
492 dbeta.dgamma | 0 |
493
494 The gamma-gamma second partial derivative of the unit Dz vector is::
495
496 d2Dz | sin(beta) * cos(gamma) |
497 ------- = | -sin(beta) * sin(gamma) |
498 dgamma2 | 0 |
499 """
500
501
502
503
504
505 diff_data.d2dx_dalpha2[0] = data.sin_a * data.sin_g - data.cos_a * data.cos_b * data.cos_g
506 diff_data.d2dx_dalpha2[1] = data.sin_a * data.cos_g + data.cos_a * data.cos_b * data.sin_g
507 diff_data.d2dx_dalpha2[2] = -data.cos_a * data.sin_b
508
509
510 diff_data.d2dx_dalpha_dbeta[0] = data.sin_a * data.sin_b * data.cos_g
511 diff_data.d2dx_dalpha_dbeta[1] = -data.sin_a * data.sin_b * data.sin_g
512 diff_data.d2dx_dalpha_dbeta[2] = -data.sin_a * data.cos_b
513
514
515 diff_data.d2dx_dalpha_dgamma[0] = -data.cos_a * data.cos_g + data.sin_a * data.cos_b * data.sin_g
516 diff_data.d2dx_dalpha_dgamma[1] = data.cos_a * data.sin_g + data.sin_a * data.cos_b * data.cos_g
517
518
519 diff_data.d2dx_dbeta2[0] = -data.cos_a * data.cos_b * data.cos_g
520 diff_data.d2dx_dbeta2[1] = data.cos_a * data.cos_b * data.sin_g
521 diff_data.d2dx_dbeta2[2] = -data.cos_a * data.sin_b
522
523
524 diff_data.d2dx_dbeta_dgamma[0] = data.cos_a * data.sin_b * data.sin_g
525 diff_data.d2dx_dbeta_dgamma[1] = data.cos_a * data.sin_b * data.cos_g
526
527
528 diff_data.d2dx_dgamma2[0] = data.sin_a * data.sin_g - data.cos_a * data.cos_b * data.cos_g
529 diff_data.d2dx_dgamma2[1] = data.sin_a * data.cos_g + data.cos_a * data.cos_b * data.sin_g
530
531
532
533
534
535
536 diff_data.d2dy_dalpha2[0] = -data.cos_a * data.sin_g - data.sin_a * data.cos_b * data.cos_g
537 diff_data.d2dy_dalpha2[1] = -data.cos_a * data.cos_g + data.sin_a * data.cos_b * data.sin_g
538 diff_data.d2dy_dalpha2[2] = -data.sin_a * data.sin_b
539
540
541 diff_data.d2dy_dalpha_dbeta[0] = -data.cos_a * data.sin_b * data.cos_g
542 diff_data.d2dy_dalpha_dbeta[1] = data.cos_a * data.sin_b * data.sin_g
543 diff_data.d2dy_dalpha_dbeta[2] = data.cos_a * data.cos_b
544
545
546 diff_data.d2dy_dalpha_dgamma[0] = -data.sin_a * data.cos_g - data.cos_a * data.cos_b * data.sin_g
547 diff_data.d2dy_dalpha_dgamma[1] = data.sin_a * data.sin_g - data.cos_a * data.cos_b * data.cos_g
548
549
550 diff_data.d2dy_dbeta2[0] = -data.sin_a * data.cos_b * data.cos_g
551 diff_data.d2dy_dbeta2[1] = data.sin_a * data.cos_b * data.sin_g
552 diff_data.d2dy_dbeta2[2] = -data.sin_a * data.sin_b
553
554
555 diff_data.d2dy_dbeta_dgamma[0] = data.sin_a * data.sin_b * data.sin_g
556 diff_data.d2dy_dbeta_dgamma[1] = data.sin_a * data.sin_b * data.cos_g
557
558
559 diff_data.d2dy_dgamma2[0] = -data.cos_a * data.sin_g - data.sin_a * data.cos_b * data.cos_g
560 diff_data.d2dy_dgamma2[1] = -data.cos_a * data.cos_g + data.sin_a * data.cos_b * data.sin_g
561
562
563
564
565
566
567 diff_data.d2dz_dbeta2[0] = data.sin_b * data.cos_g
568 diff_data.d2dz_dbeta2[1] = -data.sin_b * data.sin_g
569 diff_data.d2dz_dbeta2[2] = -data.cos_b
570
571
572 diff_data.d2dz_dbeta_dgamma[0] = data.cos_b * data.sin_g
573 diff_data.d2dz_dbeta_dgamma[1] = data.cos_b * data.cos_g
574
575
576 diff_data.d2dz_dgamma2[0] = data.sin_b * data.cos_g
577 diff_data.d2dz_dgamma2[1] = -data.sin_b * data.sin_g
578
579
580
581
582
583 data.d2dx_dO2[0, 0] = dot(data.xh_unit_vector, diff_data.d2dx_dalpha2)
584 data.d2dx_dO2[0, 1] = data.d2dx_dO2[1, 0] = dot(data.xh_unit_vector, diff_data.d2dx_dalpha_dbeta)
585 data.d2dx_dO2[0, 2] = data.d2dx_dO2[2, 0] = dot(data.xh_unit_vector, diff_data.d2dx_dalpha_dgamma)
586 data.d2dx_dO2[1, 1] = dot(data.xh_unit_vector, diff_data.d2dx_dbeta2)
587 data.d2dx_dO2[1, 2] = data.d2dx_dO2[2, 1] = dot(data.xh_unit_vector, diff_data.d2dx_dbeta_dgamma)
588 data.d2dx_dO2[2, 2] = dot(data.xh_unit_vector, diff_data.d2dx_dgamma2)
589
590 data.d2dy_dO2[0, 0] = dot(data.xh_unit_vector, diff_data.d2dy_dalpha2)
591 data.d2dy_dO2[0, 1] = data.d2dy_dO2[1, 0] = dot(data.xh_unit_vector, diff_data.d2dy_dalpha_dbeta)
592 data.d2dy_dO2[0, 2] = data.d2dy_dO2[2, 0] = dot(data.xh_unit_vector, diff_data.d2dy_dalpha_dgamma)
593 data.d2dy_dO2[1, 1] = dot(data.xh_unit_vector, diff_data.d2dy_dbeta2)
594 data.d2dy_dO2[1, 2] = data.d2dy_dO2[2, 1] = dot(data.xh_unit_vector, diff_data.d2dy_dbeta_dgamma)
595 data.d2dy_dO2[2, 2] = dot(data.xh_unit_vector, diff_data.d2dy_dgamma2)
596
597 data.d2dz_dO2[1, 1] = dot(data.xh_unit_vector, diff_data.d2dz_dbeta2)
598 data.d2dz_dO2[1, 2] = data.d2dz_dO2[2, 1] = dot(data.xh_unit_vector, diff_data.d2dz_dbeta_dgamma)
599 data.d2dz_dO2[2, 2] = dot(data.xh_unit_vector, diff_data.d2dz_dgamma2)
600