Content
Problem
Meng sees a problem with interpretation of data. She observes in data large sample of events which have 2-peaks in the qH around two most probable positions 1.1 and 1.7 1/Å. In contrast, our model of lattice does not show these peaks simultaneously.
There may be different explanation of this problem:
- errors in generation of lattice,
- errors in generation of look-up table,
- errors in indexing - association of data with look-up table,
- wrong lattice model.
A few crosschecks are presented below in order to address this issue.
Lattice
Triclinic crystal cell primitive vectors
We use a few methods from pyimgalgos.FiberIndexing
to generate lattice:
triclinic_primitive_vectors
- generates triclinic crystal cell primitive vectors:
a= 18.55 # Angstrom
b, c = 1.466*a, 0.262*a # Angstrom
alpha, beta, gamma = 90, 90, 78.47 # 180 - 101.53 degree
a1, a2, a3 = triclinic_primitive_vectors(a, b, c, alpha, beta, gamma)
Test print shows that everything looks as expected:
# 3-d space primitive vectors:
# a1 = ( 18.550000, 0.000000, 0.000000)
# a2 = ( -5.435624, 26.645524, 0.000000)
# a3 = ( 0.000000, 0.000000, 4.860100)
Reciprocal space primitive vectors
b1, b2, b3 = reciprocal_from_bravias(a1, a2, a3)
- converts 3-d primitive vectors to reciprocal space primitive vectors.
Test print shows that everything looks as expected:
# reciprocal space primitive vectors:
# b1 = ( 0.053908, 0.010997, -0.000000)
# b2 = ( 0.000000, 0.037530, 0.000000)
# b3 = ( 0.000000, -0.000000, 0.205757)
Lattice generator and test
Then, call to method
x, y, z, r, h, k, l = lattice(b1, b2, b3, hmax, kmax, lmax, cdtype)
returns 2-d (or 3-d if lmax>0) arrays. They are tested by
hmax, kmax, lmax = 4, 6, 0 # size of lattice to consider
# 2-d lattice test
test_lattice (b1, b2, b3, hmax, kmax, lmax, cdtype=np.float32, do_plot=True, evald_rad=evald_rad, prefix=prefix)
lattice_node_radius(b1, b2, b3, hmax, kmax, lmax, cdtype=np.float32)
Output of this 2-d test looks as expected:
h.shape: (13, 9)
row: -4 -3 -2 -1 0 1 2 3 4
row: -4 -3 -2 -1 0 1 2 3 4
row: -4 -3 -2 -1 0 1 2 3 4
row: -4 -3 -2 -1 0 1 2 3 4
row: -4 -3 -2 -1 0 1 2 3 4
row: -4 -3 -2 -1 0 1 2 3 4
row: -4 -3 -2 -1 0 1 2 3 4
row: -4 -3 -2 -1 0 1 2 3 4
row: -4 -3 -2 -1 0 1 2 3 4
row: -4 -3 -2 -1 0 1 2 3 4
row: -4 -3 -2 -1 0 1 2 3 4
row: -4 -3 -2 -1 0 1 2 3 4
row: -4 -3 -2 -1 0 1 2 3 4
k.shape: (13, 9)
row: -6 -6 -6 -6 -6 -6 -6 -6 -6
row: -5 -5 -5 -5 -5 -5 -5 -5 -5
row: -4 -4 -4 -4 -4 -4 -4 -4 -4
row: -3 -3 -3 -3 -3 -3 -3 -3 -3
row: -2 -2 -2 -2 -2 -2 -2 -2 -2
row: -1 -1 -1 -1 -1 -1 -1 -1 -1
row: 0 0 0 0 0 0 0 0 0
row: 1 1 1 1 1 1 1 1 1
row: 2 2 2 2 2 2 2 2 2
row: 3 3 3 3 3 3 3 3 3
row: 4 4 4 4 4 4 4 4 4
row: 5 5 5 5 5 5 5 5 5
row: 6 6 6 6 6 6 6 6 6
l.shape: (13, 9)
row: 0 0 0 0 0 0 0 0 0
row: 0 0 0 0 0 0 0 0 0
row: 0 0 0 0 0 0 0 0 0
row: 0 0 0 0 0 0 0 0 0
row: 0 0 0 0 0 0 0 0 0
row: 0 0 0 0 0 0 0 0 0
row: 0 0 0 0 0 0 0 0 0
row: 0 0 0 0 0 0 0 0 0
row: 0 0 0 0 0 0 0 0 0
row: 0 0 0 0 0 0 0 0 0
row: 0 0 0 0 0 0 0 0 0
row: 0 0 0 0 0 0 0 0 0
row: 0 0 0 0 0 0 0 0 0
x coords.shape: (13, 9)
row: -0.2156 -0.1617 -0.1078 -0.0539 0.0000 0.0539 0.1078 0.1617 0.2156
row: -0.2156 -0.1617 -0.1078 -0.0539 0.0000 0.0539 0.1078 0.1617 0.2156
row: -0.2156 -0.1617 -0.1078 -0.0539 0.0000 0.0539 0.1078 0.1617 0.2156
row: -0.2156 -0.1617 -0.1078 -0.0539 0.0000 0.0539 0.1078 0.1617 0.2156
row: -0.2156 -0.1617 -0.1078 -0.0539 0.0000 0.0539 0.1078 0.1617 0.2156
row: -0.2156 -0.1617 -0.1078 -0.0539 0.0000 0.0539 0.1078 0.1617 0.2156
row: -0.2156 -0.1617 -0.1078 -0.0539 0.0000 0.0539 0.1078 0.1617 0.2156
row: -0.2156 -0.1617 -0.1078 -0.0539 0.0000 0.0539 0.1078 0.1617 0.2156
row: -0.2156 -0.1617 -0.1078 -0.0539 0.0000 0.0539 0.1078 0.1617 0.2156
row: -0.2156 -0.1617 -0.1078 -0.0539 0.0000 0.0539 0.1078 0.1617 0.2156
row: -0.2156 -0.1617 -0.1078 -0.0539 0.0000 0.0539 0.1078 0.1617 0.2156
row: -0.2156 -0.1617 -0.1078 -0.0539 0.0000 0.0539 0.1078 0.1617 0.2156
row: -0.2156 -0.1617 -0.1078 -0.0539 0.0000 0.0539 0.1078 0.1617 0.2156
y coords.shape: (13, 9)
row: -0.2692 -0.2582 -0.2472 -0.2362 -0.2252 -0.2142 -0.2032 -0.1922 -0.1812
row: -0.2316 -0.2206 -0.2096 -0.1986 -0.1876 -0.1767 -0.1657 -0.1547 -0.1437
row: -0.1941 -0.1831 -0.1721 -0.1611 -0.1501 -0.1391 -0.1281 -0.1171 -0.1061
row: -0.1566 -0.1456 -0.1346 -0.1236 -0.1126 -0.1016 -0.0906 -0.0796 -0.0686
row: -0.1190 -0.1081 -0.0971 -0.0861 -0.0751 -0.0641 -0.0531 -0.0421 -0.0311
row: -0.0815 -0.0705 -0.0595 -0.0485 -0.0375 -0.0265 -0.0155 -0.0045 0.0065
row: -0.0440 -0.0330 -0.0220 -0.0110 0.0000 0.0110 0.0220 0.0330 0.0440
row: -0.0065 0.0045 0.0155 0.0265 0.0375 0.0485 0.0595 0.0705 0.0815
row: 0.0311 0.0421 0.0531 0.0641 0.0751 0.0861 0.0971 0.1081 0.1190
row: 0.0686 0.0796 0.0906 0.1016 0.1126 0.1236 0.1346 0.1456 0.1566
row: 0.1061 0.1171 0.1281 0.1391 0.1501 0.1611 0.1721 0.1831 0.1941
row: 0.1437 0.1547 0.1657 0.1767 0.1876 0.1986 0.2096 0.2206 0.2316
row: 0.1812 0.1922 0.2032 0.2142 0.2252 0.2362 0.2472 0.2582 0.2692
z coords.shape: (13, 9)
row: 0.0000 0.0000 0.0000 0.0000 -0.0000 -0.0000 -0.0000 -0.0000 -0.0000
row: 0.0000 0.0000 0.0000 0.0000 -0.0000 -0.0000 -0.0000 -0.0000 -0.0000
row: 0.0000 0.0000 0.0000 0.0000 -0.0000 -0.0000 -0.0000 -0.0000 -0.0000
row: 0.0000 0.0000 0.0000 0.0000 -0.0000 -0.0000 -0.0000 -0.0000 -0.0000
row: 0.0000 0.0000 0.0000 0.0000 -0.0000 -0.0000 -0.0000 -0.0000 -0.0000
row: 0.0000 0.0000 0.0000 0.0000 -0.0000 -0.0000 -0.0000 -0.0000 -0.0000
row: 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
row: 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
row: 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
row: 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
row: 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
row: 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
row: 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
r of lattice nodes.shape: (13, 9)
row: 0.3449 0.3046 0.2697 0.2423 0.2252 0.2209 0.2300 0.2512 0.2817
row: 0.3165 0.2736 0.2357 0.2058 0.1876 0.1847 0.1977 0.2238 0.2591
row: 0.2901 0.2443 0.2031 0.1699 0.1501 0.1492 0.1675 0.1997 0.2403
row: 0.2665 0.2176 0.1724 0.1348 0.1126 0.1150 0.1408 0.1803 0.2263
row: 0.2463 0.1945 0.1451 0.1015 0.0751 0.0837 0.1202 0.1671 0.2179
row: 0.2305 0.1764 0.1232 0.0725 0.0375 0.0601 0.1089 0.1618 0.2157
row: 0.2201 0.1651 0.1100 0.0550 0.0000 0.0550 0.1100 0.1651 0.2201
row: 0.2157 0.1618 0.1089 0.0601 0.0375 0.0725 0.1232 0.1764 0.2305
row: 0.2179 0.1671 0.1202 0.0837 0.0751 0.1015 0.1451 0.1945 0.2463
row: 0.2263 0.1803 0.1408 0.1150 0.1126 0.1348 0.1724 0.2176 0.2665
row: 0.2403 0.1997 0.1675 0.1492 0.1501 0.1699 0.2031 0.2443 0.2901
row: 0.2591 0.2238 0.1977 0.1847 0.1876 0.2058 0.2357 0.2736 0.3165
row: 0.2817 0.2512 0.2300 0.2209 0.2252 0.2423 0.2697 0.3046 0.3449
Table of lattice node parameters sorted by radius
( h, k) R(h,k)[1/A]
( 0, 0) 0.0000
( 0, 1) 0.0375
( 1, 0) 0.0550
(-1, 1) 0.0601
( 1, 1) 0.0725
( 0, 2) 0.0751
(-1, 2) 0.0837
( 1, 2) 0.1015
(-2, 1) 0.1089
( 2, 0) 0.1100
( 0, 3) 0.1126
(-1, 3) 0.1150
(-2, 2) 0.1202
( 2, 1) 0.1232
( 1, 3) 0.1348
(-2, 3) 0.1408
( 2, 2) 0.1451
(-1, 4) 0.1492
( 0, 4) 0.1501
(-3, 1) 0.1618
( 3, 0) 0.1651
(-3, 2) 0.1671
(-2, 4) 0.1675
( 1, 4) 0.1699
( 2, 3) 0.1724
( 3, 1) 0.1764
(-3, 3) 0.1803
(-1, 5) 0.1847
( 0, 5) 0.1876
( 3, 2) 0.1945
(-2, 5) 0.1977
(-3, 4) 0.1997
( 2, 4) 0.2031
( 1, 5) 0.2058
(-4, 1) 0.2157
( 3, 3) 0.2176
(-4, 2) 0.2179
( 4, 0) 0.2201
(-1, 6) 0.2209
(-3, 5) 0.2238
( 0, 6) 0.2252
(-4, 3) 0.2263
(-2, 6) 0.2300
( 4, 1) 0.2305
( 2, 5) 0.2357
(-4, 4) 0.2403
( 1, 6) 0.2423
( 3, 4) 0.2443
( 4, 2) 0.2463
(-3, 6) 0.2512
(-4, 5) 0.2591
( 4, 3) 0.2665
( 2, 6) 0.2697
( 3, 5) 0.2736
(-4, 6) 0.2817
( 4, 4) 0.2901
( 3, 6) 0.3046
( 4, 5) 0.3165
( 4, 6) 0.3449
Rotation of the crystal lattice
Both in test_lattice
and make_lookup_table
methods crystal lattice in reciprocal space is rotated around Z and Y axes by omega_deg and beta_deg, respectively using calls:
xrot1, yrot1 = rotation(x, y, omega_deg)
xrot2, zrot2 = rotation(xrot1, z, beta_deg)
Rotation in test_lattice
for omega_deg = 30; beta_deg = 15
gives consistent results:
xrot2.shape: (13, 9)
row: -0.0504 -0.0106 0.0292 0.0690 0.1088 0.1485 0.1883 0.2281 0.2679
row: -0.0685 -0.0287 0.0111 0.0508 0.0906 0.1304 0.1702 0.2100 0.2498
row: -0.0866 -0.0469 -0.0071 0.0327 0.0725 0.1123 0.1521 0.1919 0.2316
row: -0.1048 -0.0650 -0.0252 0.0146 0.0544 0.0942 0.1339 0.1737 0.2135
row: -0.1229 -0.0831 -0.0433 -0.0035 0.0363 0.0760 0.1158 0.1556 0.1954
row: -0.1410 -0.1012 -0.0614 -0.0217 0.0181 0.0579 0.0977 0.1375 0.1773
row: -0.1591 -0.1194 -0.0796 -0.0398 0.0000 0.0398 0.0796 0.1194 0.1591
row: -0.1773 -0.1375 -0.0977 -0.0579 -0.0181 0.0217 0.0614 0.1012 0.1410
row: -0.1954 -0.1556 -0.1158 -0.0760 -0.0363 0.0035 0.0433 0.0831 0.1229
row: -0.2135 -0.1737 -0.1339 -0.0942 -0.0544 -0.0146 0.0252 0.0650 0.1048
row: -0.2316 -0.1919 -0.1521 -0.1123 -0.0725 -0.0327 0.0071 0.0469 0.0866
row: -0.2498 -0.2100 -0.1702 -0.1304 -0.0906 -0.0508 -0.0111 0.0287 0.0685
row: -0.2679 -0.2281 -0.1883 -0.1485 -0.1088 -0.0690 -0.0292 0.0106 0.0504
yrot1.shape: (13, 9)
row: -0.3409 -0.3044 -0.2680 -0.2315 -0.1950 -0.1585 -0.1221 -0.0856 -0.0491
row: -0.3084 -0.2719 -0.2355 -0.1990 -0.1625 -0.1260 -0.0896 -0.0531 -0.0166
row: -0.2759 -0.2394 -0.2030 -0.1665 -0.1300 -0.0935 -0.0571 -0.0206 0.0159
row: -0.2434 -0.2069 -0.1705 -0.1340 -0.0975 -0.0610 -0.0245 0.0119 0.0484
row: -0.2109 -0.1744 -0.1380 -0.1015 -0.0650 -0.0285 0.0080 0.0444 0.0809
row: -0.1784 -0.1419 -0.1055 -0.0690 -0.0325 0.0040 0.0405 0.0769 0.1134
row: -0.1459 -0.1094 -0.0730 -0.0365 0.0000 0.0365 0.0730 0.1094 0.1459
row: -0.1134 -0.0769 -0.0405 -0.0040 0.0325 0.0690 0.1055 0.1419 0.1784
row: -0.0809 -0.0444 -0.0080 0.0285 0.0650 0.1015 0.1380 0.1744 0.2109
row: -0.0484 -0.0119 0.0245 0.0610 0.0975 0.1340 0.1705 0.2069 0.2434
row: -0.0159 0.0206 0.0571 0.0935 0.1300 0.1665 0.2030 0.2394 0.2759
row: 0.0166 0.0531 0.0896 0.1260 0.1625 0.1990 0.2355 0.2719 0.3084
row: 0.0491 0.0856 0.1221 0.1585 0.1950 0.2315 0.2680 0.3044 0.3409
zrot2.shape: (13, 9)
row: -0.0135 -0.0028 0.0078 0.0185 0.0291 0.0398 0.0505 0.0611 0.0718
row: -0.0184 -0.0077 0.0030 0.0136 0.0243 0.0349 0.0456 0.0563 0.0669
row: -0.0232 -0.0126 -0.0019 0.0088 0.0194 0.0301 0.0407 0.0514 0.0621
row: -0.0281 -0.0174 -0.0068 0.0039 0.0146 0.0252 0.0359 0.0466 0.0572
row: -0.0329 -0.0223 -0.0116 -0.0009 0.0097 0.0204 0.0310 0.0417 0.0524
row: -0.0378 -0.0271 -0.0165 -0.0058 0.0049 0.0155 0.0262 0.0368 0.0475
row: -0.0426 -0.0320 -0.0213 -0.0107 0.0000 0.0107 0.0213 0.0320 0.0426
row: -0.0475 -0.0368 -0.0262 -0.0155 -0.0049 0.0058 0.0165 0.0271 0.0378
row: -0.0524 -0.0417 -0.0310 -0.0204 -0.0097 0.0009 0.0116 0.0223 0.0329
row: -0.0572 -0.0466 -0.0359 -0.0252 -0.0146 -0.0039 0.0068 0.0174 0.0281
row: -0.0621 -0.0514 -0.0407 -0.0301 -0.0194 -0.0088 0.0019 0.0126 0.0232
row: -0.0669 -0.0563 -0.0456 -0.0349 -0.0243 -0.0136 -0.0030 0.0077 0.0184
row: -0.0718 -0.0611 -0.0505 -0.0398 -0.0291 -0.0185 -0.0078 0.0028 0.0135
Rotation in test_lattice
for omega_deg = 0; beta_deg = 9 produces the plot
Other movies with frame delay 0.4s, 0.4s, 0.8s:
Look-up table
Look-up table is generated in method make_lookup_table
_v2 called as
lut = make_lookup_table_v2(b1, b2, b3, hmax, kmax, lmax, np.float32, evald_rad, sigma_ql, sigma_qt,
fout, bpq, bpomega, bpbeta)
NOTE v2
: In order to tune tolerance separately for angle and detector plane (qh, qv) parameter sigma_q in v2 is split for sigma_ql and sigma_qt
using parameters
# photon energy = 6003.1936 eV
# wavelength = 2.0653 A
# wave number/Evald radius k = 1/lambda = 0.484187 1/A
# sigma_ql = 0.001453 1/A (approximately = k * <pixel size>/
# sigma_qt = 0.000484 1/A (approximately = k * <pixel size>/<sample-to-detector distance> = k*100um/100mm)
# 3*sigma_ql = 0.004358 1/A
# 3*sigma_qt = 0.001453 1/A
for each crystal orientation in omega_deg and beta_deg method
dr, qv, qh = radial_distance(xrot2, yrot1, zrot2, evald_rad)
evaluates
dr [1/A] - distance between lattice node and Evald's sphere along the scattered photon propagation,
qv, qh [1/A] - vertical and horizontal components of scattering vector q.
using a simple code:
# NOTE: X, Y, Z, DX, L, dr, qv, qh, ql are the numpy arrays with shape=(2*hmax+1, 2*kmax+1, 2*lmax+1), evald_rad is a scalar
def radial_distance(X, Y, Z, evald_rad=0.5) :
DX = X + evald_rad
L = np.sqrt(DX*DX + Y*Y + Z*Z)
dr = L - evald_rad
qv = evald_rad * Z/L
ql = evald_rad * (DX/L-1)
qy = evald_rad * Y/L
qh = np.sqrt(ql*ql + qy*qy) * np.select([Y<0], [-1], default=1)
return dr, qv, qh
Finally, in method make_lookup_table
there are two calls:
txt = str_omega_drhkl(ind, beta_deg, omega_deg, dr, r, qv, qh, h, k, l, sigma_ql)
generates text record for file with look-up table, and
lut[iomega,:] += fill_row(dr, qv, qh, h, k, l, sigma_ql, sigma_qt
, bpq)
generates 2-d array, which presents look-up table in 2-d plot and its projection:
Look-up table is generated for bpomega = BinPars((0., 180.), 360,...)
work/lut-cxif5315-r0169-2016-02-03T15:10:48.txt:
# file name: ./v02-lut-cxif5315-r0169-2016-02-03T15:10:48.txt
# photon energy = 6003.1936 eV
# wavelength = 2.0653 A
# wave number/Evald radius k = 1/lambda = 0.484187 1/A
# sigma_ql = 0.001453 1/A (approximately = k * <pixel size>/
# sigma_qt = 0.000484 1/A (approximately = k * <pixel size>/<sample-to-detector distance> = k*100um/100mm)
# 3*sigma_ql = 0.004358 1/A
# 3*sigma_qt = 0.001453 1/A
# Triclinic crystal cell parameters:
# a = 18.55 A
# b = 27.19 A
# c = 4.86 A
# alpha = 90.00 deg
# beta = 90.00 deg
# gamma = 78.47 deg
# 3-d space primitive vectors:
# a1 = ( 18.550000, 0.000000, 0.000000)
# a2 = ( -5.435624, 26.645524, 0.000000)
# a3 = ( 0.000000, 0.000000, 4.860100)
# reciprocal space primitive vectors:
# b1 = ( 0.053908, 0.010997, -0.000000)
# b2 = ( 0.000000, 0.037530, 0.000000)
# b3 = ( 0.000000, -0.000000, 0.205757)
# _________________________________________________________________________________________
# beta 0.00 omega 0.00 degree
# index beta omega h k l dr[1/A] R(h,k,l) qv[1/A] qh[1/A] P(omega)
1 0.00 0.00 0 -1 0 0.001452 0.037530 0.000000 -0.037446 0.606641
1 0.00 0.00 0 1 0 0.001452 0.037530 0.000000 0.037446 0.606641
1 0.00 0.00 -1 6 0 -0.003549 0.220861 0.000000 0.221647 0.050590
# beta 0.00 omega 0.50 degree
# index beta omega h k l dr[1/A] R(h,k,l) qv[1/A] qh[1/A] P(omega)
2 0.00 0.50 0 -1 0 0.001779 0.037530 0.000000 -0.037419 0.472496
2 0.00 0.50 0 1 0 0.001126 0.037530 0.000000 0.037469 0.740615
...
Check for look-up table
Method cxif5315/plot-lattice-from-data.py generates two plots from look-up table;
- intensities for omega vs. qh
- reconstructed lattice from measured omega and qh
Mask
Mask is regenerated for equatorial region as
Wedge 871.5 878 450 383 148 196 1 k False False
Wedge 871.5 878 450 383 -27 21 1 k False False
where parameters
t = pars[0] # figure type, ex. 'Wedge'
x = float(pars[1]) # x coordinate of the wedge center
y = float(pars[2]) # y coordinate of the wedge center
r = float(pars[3]) # 1-st radius of the wedge
w = float(pars[4]) # radial width of the wedge
t1 = float(pars[5]) # 1-st angle
t2 = float(pars[6]) # 2-nd angle
lw = int(pars[7]) # line width
col = str(pars[8]) # color
s = self.dicBool[pars[9].lower()] # isSelected boolean parameter
rem = self.dicBool[pars[10].lower()] # isRemoved - helper parameter
Lattice reconstructed by Meng