Improve hdf_viewer -> spind user interation

Fix #33
This commit is contained in:
usov_i 2021-06-29 18:30:59 +02:00
parent cf6527af13
commit c2bd6c25f5
2 changed files with 106 additions and 48 deletions

View File

@ -36,7 +36,6 @@ from bokeh.models import (
Spacer,
Spinner,
TableColumn,
TextAreaInput,
TextInput,
Title,
WheelZoomTool,
@ -57,6 +56,8 @@ def create():
det_data = {}
cami_meta = {}
num_formatter = NumberFormatter(format="0.00", nan_format="")
def proposal_textinput_callback(_attr, _old, new):
nonlocal cami_meta
proposal = new.strip()
@ -570,18 +571,46 @@ def create():
h, k, l = calculate_hkl(det_data, index)
image_source.data.update(h=[h], k=[k], l=[l])
hkl_button = Button(label="Calculate hkl (slow)", width=210)
hkl_button = Button(label="Calculate hkl (slow)", width=145)
hkl_button.on_click(hkl_button_callback)
def events_list_callback(_attr, _old, new):
doc.events_list_spind.value = new
events_data = dict(
wave=[],
ddist=[],
frame=[],
x_pos=[],
y_pos=[],
intensity=[],
snr_cnts=[],
gamma=[],
omega=[],
chi=[],
phi=[],
nu=[],
)
doc.events_data = events_data
events_list = TextAreaInput(rows=7, width=830)
events_list.on_change("value", events_list_callback)
doc.events_list_hdf_viewer = events_list
events_table_source = ColumnDataSource(events_data)
events_table = DataTable(
source=events_table_source,
columns=[
TableColumn(field="frame", title="Frame", formatter=num_formatter, width=70),
TableColumn(field="x_pos", title="X", formatter=num_formatter, width=70),
TableColumn(field="y_pos", title="Y", formatter=num_formatter, width=70),
TableColumn(field="intensity", title="Intensity", formatter=num_formatter, width=70),
TableColumn(field="gamma", title="Gamma", formatter=num_formatter, width=70),
TableColumn(field="omega", title="Omega", formatter=num_formatter, width=70),
TableColumn(field="chi", title="Chi", formatter=num_formatter, width=70),
TableColumn(field="phi", title="Phi", formatter=num_formatter, width=70),
TableColumn(field="nu", title="Nu", formatter=num_formatter, width=70),
],
height=150,
width=630,
autosize_mode="none",
index_position=None,
)
def add_event_button_callback():
diff_vec = []
p0 = [1.0, 0.0, 1.0]
maxfev = 100000
@ -640,27 +669,36 @@ def create():
coeff, _ = curve_fit(gauss, range(len(projY)), projY, p0=p0, maxfev=maxfev)
y_pos = y0 + coeff[1]
ga, nu = pyzebra.det2pol(ddist, gamma, nu, x_pos, y_pos)
diff_vector = pyzebra.z1frmd(wave, ga, omega, chi, phi, nu)
d_spacing = float(pyzebra.dandth(wave, diff_vector)[0])
diff_vector = diff_vector.flatten() * 1e10
dv1, dv2, dv3 = diff_vector
events_data["wave"].append(wave)
events_data["ddist"].append(ddist)
events_data["frame"].append(frC)
events_data["x_pos"].append(x_pos)
events_data["y_pos"].append(y_pos)
events_data["intensity"].append(intensity)
events_data["snr_cnts"].append(snr_cnts)
events_data["gamma"].append(gamma)
events_data["omega"].append(omega)
events_data["chi"].append(chi)
events_data["phi"].append(phi)
events_data["nu"].append(nu)
diff_vec.append(diff_vector)
events_table_source.data = events_data
if events_list.value and not events_list.value.endswith("\n"):
events_list.value = events_list.value + "\n"
events_list.value = (
events_list.value
+ f"{x_pos} {y_pos} {intensity} {snr_cnts} {dv1} {dv2} {dv3} {d_spacing}"
)
add_event_button = Button(label="Add spind event")
add_event_button = Button(label="Add spind event", width=145)
add_event_button.on_click(add_event_button_callback)
def remove_event_button_callback():
ind2remove = events_table_source.selected.indices
for value in events_data.values():
for ind in reversed(ind2remove):
del value[ind]
events_table_source.data = events_data
remove_event_button = Button(label="Remove spind event", width=145)
remove_event_button.on_click(remove_event_button_callback)
metadata_table_source = ColumnDataSource(dict(geom=[""], temp=[None], mf=[None]))
num_formatter = NumberFormatter(format="0.00", nan_format="")
metadata_table = DataTable(
source=metadata_table_source,
columns=[
@ -687,8 +725,7 @@ def create():
layout_controls = column(
row(metadata_table, index_spinner, column(Spacer(height=25), index_slider)),
row(add_event_button, hkl_button),
row(events_list),
row(column(add_event_button, remove_event_button), events_table),
)
layout_overview = column(
@ -703,7 +740,7 @@ def create():
tab_layout = row(
column(import_layout, colormap_layout),
column(layout_overview, layout_controls),
column(roi_avg_plot, layout_image),
column(roi_avg_plot, layout_image, hkl_button),
)
return Panel(child=tab_layout, title="hdf viewer")

View File

@ -16,17 +16,14 @@ from bokeh.models import (
TextInput,
)
import pyzebra
def create():
doc = curdoc()
events_data = doc.events_data
def events_list_callback(_attr, _old, new):
doc.events_list_hdf_viewer.value = new
events_list = TextAreaInput(title="Spind events:", rows=7, width=1500)
events_list.on_change("value", events_list_callback)
doc.events_list_spind = events_list
npeaks_spinner = Spinner(title="Number of peaks from hdf_view panel:", disabled=True)
lattice_const_textinput = TextInput(
title="Lattice constants:", value="8.3211,8.3211,8.3211,90.00,90.00,90.00"
)
@ -74,9 +71,30 @@ def create():
# prepare an event file
diff_vec = []
with open(temp_event_file, "w") as f:
for event in events_list.value.splitlines():
diff_vec.append(np.array(event.split()[4:7], dtype=float))
f.write(event + "\n")
npeaks = len(next(iter(doc.events_data.values())))
for ind in range(npeaks):
wave = events_data["wave"][ind]
ddist = events_data["ddist"][ind]
x_pos = events_data["x_pos"][ind]
y_pos = events_data["y_pos"][ind]
intensity = events_data["intensity"][ind]
snr_cnts = events_data["snr_cnts"][ind]
gamma = events_data["gamma"][ind]
omega = events_data["omega"][ind]
chi = events_data["chi"][ind]
phi = events_data["phi"][ind]
nu = events_data["nu"][ind]
ga, nu = pyzebra.det2pol(ddist, gamma, nu, x_pos, y_pos)
diff_vector = pyzebra.z1frmd(wave, ga, omega, chi, phi, nu)
d_spacing = float(pyzebra.dandth(wave, diff_vector)[0])
diff_vector = diff_vector.flatten() * 1e10
dv1, dv2, dv3 = diff_vector
diff_vec.append(diff_vector)
f.write(
f"{x_pos} {y_pos} {intensity} {snr_cnts} {dv1} {dv2} {dv3} {d_spacing}\n"
)
print(f"Content of {temp_event_file}:")
with open(temp_event_file) as f:
@ -183,18 +201,21 @@ def create():
results_table_source.selected.on_change("indices", results_table_select_callback)
tab_layout = column(
events_list,
row(
column(
lattice_const_textinput,
row(max_res_spinner, seed_pool_size_spinner),
row(seed_len_tol_spinner, seed_angle_tol_spinner),
row(eval_hkl_tol_spinner),
process_button,
),
column(results_table, row(ub_matrix_textareainput, hkl_textareainput)),
tab_layout = row(
column(
npeaks_spinner,
lattice_const_textinput,
row(max_res_spinner, seed_pool_size_spinner),
row(seed_len_tol_spinner, seed_angle_tol_spinner),
row(eval_hkl_tol_spinner),
process_button,
),
column(results_table, row(ub_matrix_textareainput, hkl_textareainput)),
)
async def update_npeaks_spinner():
npeaks_spinner.value = len(next(iter(doc.events_data.values())))
doc.add_periodic_callback(update_npeaks_spinner, 1000)
return Panel(child=tab_layout, title="spind")