Add a possibility to plot (m)hkl with measured data

This commit is contained in:
usov_i 2023-02-08 10:00:14 +01:00
parent 2a27ef7de1
commit bb8c158591
2 changed files with 89 additions and 2 deletions

View File

@ -1,5 +1,6 @@
import base64
import io
import os
import numpy as np
from bokeh.layouts import column, row
@ -31,6 +32,9 @@ def create():
measured_data_div = Div(text="Measured data:")
measured_data = FileInput(accept=".hdf", multiple=True, width=200)
upload_hkl_div = Div(text="Open hkl/mhkl data:")
upload_hkl_fi = FileInput(accept=".hkl,.mhkl", multiple=True, width=200)
def _prepare_plotting():
flag_ub = bool(redef_ub_cb.active)
flag_lattice = bool(redef_lattice_cb.active)
@ -129,6 +133,24 @@ def create():
y_c = np.cross(x_c, o_c)
hkl_in_plane_y.value = " ".join([f"{val:.1f}" for val in y_c])
# Prepare hkl/mhkl data
hkl_coord = []
for j, fname in enumerate(upload_hkl_fi.filename):
with io.StringIO(base64.b64decode(upload_hkl_fi.value[j]).decode()) as file:
_, ext = os.path.splitext(fname)
try:
fdata = pyzebra.parse_hkl(file, ext)
except:
print(f"Error loading {fname}")
return
for ind in range(len(fdata["counts"])):
# Recognize k_flag_vec
hkl = np.array([fdata["h"][ind], fdata["k"][ind], fdata["k"][ind]])
# Save data
hkl_coord.append(hkl)
def _update_slice():
# Where should cut be along orthogonal direction (Mutliplication factor onto orth_dir)
orth_cut = hkl_cut.value
@ -196,6 +218,22 @@ def create():
image=[I.T], x=[min_x], dw=[max_x - min_x], y=[min_y], dh=[max_y - min_y]
)
scan_x, scan_y = [], []
for j in range(len(hkl_coord)):
# Get middle hkl from list
hklm = M @ hkl_coord[j]
# Decide if point is in the cut
proj = np.dot(hklm, o_c)
if abs(proj - orth_cut) >= delta:
continue
# Plot middle point of scan
scan_x.append(hklm[0])
scan_y.append(hklm[1])
scatter_source.data.update(x=scan_x, y=scan_y)
return _update_slice
def plot_file_callback():
@ -219,6 +257,9 @@ def create():
image_source = ColumnDataSource(dict(image=[np.zeros((1, 1))], x=[0], y=[0], dw=[1], dh=[1]))
plot.image(source=image_source, color_mapper=color_mapper)
scatter_source = ColumnDataSource(dict(x=[], y=[]))
plot.scatter(source=scatter_source, size=4, fill_color="green", line_color="green")
hkl_div = Div(text="HKL:", margin=(5, 5, 0, 5))
hkl_normal = TextInput(title="normal", value="0 0 1", width=70)
@ -312,7 +353,10 @@ def create():
)
cm_layout = row(colormap_select, display_min_ni, display_max_ni)
column1_layout = column(
row(measured_data_div, measured_data, plot_file),
row(
column(row(measured_data_div, measured_data), row(upload_hkl_div, upload_hkl_fi)),
plot_file,
),
plot,
column(
hkl_div,

View File

@ -35,6 +35,9 @@ class PlotHKL:
measured_data_div = Div(text="Measured data:")
measured_data = FileInput(accept=".ccl", multiple=True, width=200)
upload_hkl_div = Div(text="Open hkl/mhkl data:")
upload_hkl_fi = FileInput(accept=".hkl,.mhkl", multiple=True, width=200)
min_grid_x = -10
max_grid_x = 10
min_grid_y = -5
@ -218,6 +221,24 @@ class PlotHKL:
x=[x_c[0] / 2, y_c[0] / 2 - 0.1], y=[x_c[1] - 0.1, y_c[1] / 2], text=["h", "k"]
)
# Prepare hkl/mhkl data
hkl_coord2 = []
for j, fname in enumerate(upload_hkl_fi.filename):
with io.StringIO(base64.b64decode(upload_hkl_fi.value[j]).decode()) as file:
_, ext = os.path.splitext(fname)
try:
fdata = pyzebra.parse_hkl(file, ext)
except:
print(f"Error loading {fname}")
return
for ind in range(len(fdata["counts"])):
# Recognize k_flag_vec
hkl = np.array([fdata["h"][ind], fdata["k"][ind], fdata["k"][ind]])
# Save data
hkl_coord2.append(hkl)
def _update_slice():
cut_tol = hkl_delta.value
cut_or = hkl_cut.value
@ -316,6 +337,22 @@ class PlotHKL:
plot.legend.items = legend_items
scan_x2, scan_y2 = [], []
for j in range(len(hkl_coord2)):
# Get middle hkl from list
hklm = M @ hkl_coord2[j]
# Decide if point is in the cut
proj = np.dot(hklm, o_c)
if abs(proj - cut_or) >= cut_tol:
continue
# Plot middle point of scan
scan_x2.append(hklm[0])
scan_y2.append(hklm[1])
scatter_source2.data.update(x=scan_x2, y=scan_y2)
return _update_slice
def plot_file_callback():
@ -362,6 +399,9 @@ class PlotHKL:
source=scan_source, marker="m", size="s", fill_color="c", line_color="c"
)
scatter_source2 = ColumnDataSource(dict(x=[], y=[]))
plot.scatter(source=scatter_source2, size=4, fill_color="green", line_color="green")
plot.add_layout(Legend(items=[], location="top_left", click_policy="hide"))
hkl_div = Div(text="HKL:", margin=(5, 5, 0, 5))
@ -401,7 +441,10 @@ class PlotHKL:
disting_layout = column(disting_opt_div, row(disting_opt_cb, disting_opt_rb))
layout = column(
row(measured_data_div, measured_data, plot_file),
row(
column(row(measured_data_div, measured_data), row(upload_hkl_div, upload_hkl_fi)),
plot_file,
),
plot,
row(hkl_layout, k_vectors),
row(disting_layout, column(tol_k_ni, res_mult_ni)),