Utility renames and hdf_param_study simplification
This commit is contained in:
parent
10bcabd7f9
commit
bcd594fa7e
@ -72,8 +72,8 @@ for (let i = 0; i < js_data.data['fname'].length; i++) {
|
|||||||
|
|
||||||
def create():
|
def create():
|
||||||
doc = curdoc()
|
doc = curdoc()
|
||||||
det_data1 = []
|
dataset1 = []
|
||||||
det_data2 = []
|
dataset2 = []
|
||||||
fit_params = {}
|
fit_params = {}
|
||||||
js_data = ColumnDataSource(data=dict(content=["", ""], fname=["", ""], ext=["", ""]))
|
js_data = ColumnDataSource(data=dict(content=["", ""], fname=["", ""], ext=["", ""]))
|
||||||
|
|
||||||
@ -99,17 +99,17 @@ def create():
|
|||||||
proposal_textinput.on_change("name", proposal_textinput_callback)
|
proposal_textinput.on_change("name", proposal_textinput_callback)
|
||||||
|
|
||||||
def _init_datatable():
|
def _init_datatable():
|
||||||
# det_data2 should have the same metadata to det_data1
|
# dataset2 should have the same metadata as dataset1
|
||||||
scan_list = [s["idx"] for s in det_data1]
|
scan_list = [s["idx"] for s in dataset1]
|
||||||
hkl = [f'{s["h"]} {s["k"]} {s["l"]}' for s in det_data1]
|
hkl = [f'{s["h"]} {s["k"]} {s["l"]}' for s in dataset1]
|
||||||
export = [s["export"] for s in det_data1]
|
export = [s["export"] for s in dataset1]
|
||||||
|
|
||||||
twotheta = [np.median(s["twotheta"]) if "twotheta" in s else None for s in det_data1]
|
twotheta = [np.median(s["twotheta"]) if "twotheta" in s else None for s in dataset1]
|
||||||
gamma = [np.median(s["gamma"]) if "gamma" in s else None for s in det_data1]
|
gamma = [np.median(s["gamma"]) if "gamma" in s else None for s in dataset1]
|
||||||
omega = [np.median(s["omega"]) if "omega" in s else None for s in det_data1]
|
omega = [np.median(s["omega"]) if "omega" in s else None for s in dataset1]
|
||||||
chi = [np.median(s["chi"]) if "chi" in s else None for s in det_data1]
|
chi = [np.median(s["chi"]) if "chi" in s else None for s in dataset1]
|
||||||
phi = [np.median(s["phi"]) if "phi" in s else None for s in det_data1]
|
phi = [np.median(s["phi"]) if "phi" in s else None for s in dataset1]
|
||||||
nu = [np.median(s["nu"]) if "nu" in s else None for s in det_data1]
|
nu = [np.median(s["nu"]) if "nu" in s else None for s in dataset1]
|
||||||
|
|
||||||
scan_table_source.data.update(
|
scan_table_source.data.update(
|
||||||
scan=scan_list,
|
scan=scan_list,
|
||||||
@ -163,9 +163,9 @@ def create():
|
|||||||
new_data1 = new_data1[:min_len]
|
new_data1 = new_data1[:min_len]
|
||||||
new_data2 = new_data2[:min_len]
|
new_data2 = new_data2[:min_len]
|
||||||
|
|
||||||
nonlocal det_data1, det_data2
|
nonlocal dataset1, dataset2
|
||||||
det_data1 = new_data1
|
dataset1 = new_data1
|
||||||
det_data2 = new_data2
|
dataset2 = new_data2
|
||||||
_init_datatable()
|
_init_datatable()
|
||||||
|
|
||||||
file_open_button = Button(label="Open New", width=100, disabled=True)
|
file_open_button = Button(label="Open New", width=100, disabled=True)
|
||||||
@ -201,9 +201,9 @@ def create():
|
|||||||
new_data1 = new_data1[:min_len]
|
new_data1 = new_data1[:min_len]
|
||||||
new_data2 = new_data2[:min_len]
|
new_data2 = new_data2[:min_len]
|
||||||
|
|
||||||
nonlocal det_data1, det_data2
|
nonlocal dataset1, dataset2
|
||||||
det_data1 = new_data1
|
dataset1 = new_data1
|
||||||
det_data2 = new_data2
|
dataset2 = new_data2
|
||||||
_init_datatable()
|
_init_datatable()
|
||||||
|
|
||||||
upload_div = Div(text="or upload 2 .ccl files:", margin=(5, 5, 0, 5))
|
upload_div = Div(text="or upload 2 .ccl files:", margin=(5, 5, 0, 5))
|
||||||
@ -213,17 +213,17 @@ def create():
|
|||||||
upload_button.on_change("filename", upload_button_callback)
|
upload_button.on_change("filename", upload_button_callback)
|
||||||
|
|
||||||
def monitor_spinner_callback(_attr, old, new):
|
def monitor_spinner_callback(_attr, old, new):
|
||||||
if det_data1 and det_data2:
|
if dataset1 and dataset2:
|
||||||
pyzebra.normalize_dataset(det_data1, new)
|
pyzebra.normalize_dataset(dataset1, new)
|
||||||
pyzebra.normalize_dataset(det_data2, new)
|
pyzebra.normalize_dataset(dataset2, new)
|
||||||
_update_plot()
|
_update_plot()
|
||||||
|
|
||||||
monitor_spinner = Spinner(title="Monitor:", mode="int", value=100_000, low=1, width=145)
|
monitor_spinner = Spinner(title="Monitor:", mode="int", value=100_000, low=1, width=145)
|
||||||
monitor_spinner.on_change("value", monitor_spinner_callback)
|
monitor_spinner.on_change("value", monitor_spinner_callback)
|
||||||
|
|
||||||
def _update_table():
|
def _update_table():
|
||||||
fit_ok = [(1 if "fit" in scan else 0) for scan in det_data1]
|
fit_ok = [(1 if "fit" in scan else 0) for scan in dataset1]
|
||||||
export = [scan["export"] for scan in det_data1]
|
export = [scan["export"] for scan in dataset1]
|
||||||
scan_table_source.data.update(fit=fit_ok, export=export)
|
scan_table_source.data.update(fit=fit_ok, export=export)
|
||||||
|
|
||||||
def _update_plot():
|
def _update_plot():
|
||||||
@ -382,7 +382,7 @@ def create():
|
|||||||
def scan_table_source_callback(_attr, _old, new):
|
def scan_table_source_callback(_attr, _old, new):
|
||||||
# unfortunately, we don't know if the change comes from data update or user input
|
# unfortunately, we don't know if the change comes from data update or user input
|
||||||
# also `old` and `new` are the same for non-scalars
|
# also `old` and `new` are the same for non-scalars
|
||||||
for scan1, scan2, export in zip(det_data1, det_data2, new["export"]):
|
for scan1, scan2, export in zip(dataset1, dataset2, new["export"]):
|
||||||
scan1["export"] = export
|
scan1["export"] = export
|
||||||
scan2["export"] = export
|
scan2["export"] = export
|
||||||
_update_preview()
|
_update_preview()
|
||||||
@ -426,14 +426,14 @@ def create():
|
|||||||
|
|
||||||
def _get_selected_scan():
|
def _get_selected_scan():
|
||||||
ind = scan_table_source.selected.indices[0]
|
ind = scan_table_source.selected.indices[0]
|
||||||
return det_data1[ind], det_data2[ind]
|
return dataset1[ind], dataset2[ind]
|
||||||
|
|
||||||
merge_from_select = Select(title="scan:", width=145)
|
merge_from_select = Select(title="scan:", width=145)
|
||||||
|
|
||||||
def merge_button_callback():
|
def merge_button_callback():
|
||||||
scan_into1, scan_into2 = _get_selected_scan()
|
scan_into1, scan_into2 = _get_selected_scan()
|
||||||
scan_from1 = det_data1[int(merge_from_select.value)]
|
scan_from1 = dataset1[int(merge_from_select.value)]
|
||||||
scan_from2 = det_data2[int(merge_from_select.value)]
|
scan_from2 = dataset2[int(merge_from_select.value)]
|
||||||
|
|
||||||
if scan_into1 is scan_from1:
|
if scan_into1 is scan_from1:
|
||||||
print("WARNING: Selected scans for merging are identical")
|
print("WARNING: Selected scans for merging are identical")
|
||||||
@ -577,7 +577,7 @@ def create():
|
|||||||
fit_output_textinput = TextAreaInput(title="Fit results:", width=750, height=200)
|
fit_output_textinput = TextAreaInput(title="Fit results:", width=750, height=200)
|
||||||
|
|
||||||
def proc_all_button_callback():
|
def proc_all_button_callback():
|
||||||
for scan in [*det_data1, *det_data2]:
|
for scan in [*dataset1, *dataset2]:
|
||||||
if scan["export"]:
|
if scan["export"]:
|
||||||
pyzebra.fit_scan(
|
pyzebra.fit_scan(
|
||||||
scan, fit_params, fit_from=fit_from_spinner.value, fit_to=fit_to_spinner.value
|
scan, fit_params, fit_from=fit_from_spinner.value, fit_to=fit_to_spinner.value
|
||||||
@ -628,7 +628,7 @@ def create():
|
|||||||
temp_file = temp_dir + "/temp"
|
temp_file = temp_dir + "/temp"
|
||||||
export_data1 = []
|
export_data1 = []
|
||||||
export_data2 = []
|
export_data2 = []
|
||||||
for scan1, scan2 in zip(det_data1, det_data2):
|
for scan1, scan2 in zip(dataset1, dataset2):
|
||||||
if scan1["export"]:
|
if scan1["export"]:
|
||||||
export_data1.append(scan1)
|
export_data1.append(scan1)
|
||||||
export_data2.append(scan2)
|
export_data2.append(scan2)
|
||||||
|
@ -72,7 +72,7 @@ for (let i = 0; i < js_data.data['fname'].length; i++) {
|
|||||||
|
|
||||||
def create():
|
def create():
|
||||||
doc = curdoc()
|
doc = curdoc()
|
||||||
det_data = []
|
dataset = []
|
||||||
fit_params = {}
|
fit_params = {}
|
||||||
js_data = ColumnDataSource(data=dict(content=["", ""], fname=["", ""], ext=["", ""]))
|
js_data = ColumnDataSource(data=dict(content=["", ""], fname=["", ""], ext=["", ""]))
|
||||||
|
|
||||||
@ -100,16 +100,16 @@ def create():
|
|||||||
proposal_textinput.on_change("name", proposal_textinput_callback)
|
proposal_textinput.on_change("name", proposal_textinput_callback)
|
||||||
|
|
||||||
def _init_datatable():
|
def _init_datatable():
|
||||||
scan_list = [s["idx"] for s in det_data]
|
scan_list = [s["idx"] for s in dataset]
|
||||||
hkl = [f'{s["h"]} {s["k"]} {s["l"]}' for s in det_data]
|
hkl = [f'{s["h"]} {s["k"]} {s["l"]}' for s in dataset]
|
||||||
export = [s["export"] for s in det_data]
|
export = [s["export"] for s in dataset]
|
||||||
|
|
||||||
twotheta = [np.median(s["twotheta"]) if "twotheta" in s else None for s in det_data]
|
twotheta = [np.median(s["twotheta"]) if "twotheta" in s else None for s in dataset]
|
||||||
gamma = [np.median(s["gamma"]) if "gamma" in s else None for s in det_data]
|
gamma = [np.median(s["gamma"]) if "gamma" in s else None for s in dataset]
|
||||||
omega = [np.median(s["omega"]) if "omega" in s else None for s in det_data]
|
omega = [np.median(s["omega"]) if "omega" in s else None for s in dataset]
|
||||||
chi = [np.median(s["chi"]) if "chi" in s else None for s in det_data]
|
chi = [np.median(s["chi"]) if "chi" in s else None for s in dataset]
|
||||||
phi = [np.median(s["phi"]) if "phi" in s else None for s in det_data]
|
phi = [np.median(s["phi"]) if "phi" in s else None for s in dataset]
|
||||||
nu = [np.median(s["nu"]) if "nu" in s else None for s in det_data]
|
nu = [np.median(s["nu"]) if "nu" in s else None for s in dataset]
|
||||||
|
|
||||||
scan_table_source.data.update(
|
scan_table_source.data.update(
|
||||||
scan=scan_list,
|
scan=scan_list,
|
||||||
@ -133,7 +133,7 @@ def create():
|
|||||||
file_select = MultiSelect(title="Available .ccl/.dat files:", width=210, height=250)
|
file_select = MultiSelect(title="Available .ccl/.dat files:", width=210, height=250)
|
||||||
|
|
||||||
def file_open_button_callback():
|
def file_open_button_callback():
|
||||||
nonlocal det_data
|
nonlocal dataset
|
||||||
new_data = []
|
new_data = []
|
||||||
for f_path in file_select.value:
|
for f_path in file_select.value:
|
||||||
with open(f_path) as file:
|
with open(f_path) as file:
|
||||||
@ -155,7 +155,7 @@ def create():
|
|||||||
pyzebra.merge_datasets(new_data, file_data)
|
pyzebra.merge_datasets(new_data, file_data)
|
||||||
|
|
||||||
if new_data:
|
if new_data:
|
||||||
det_data = new_data
|
dataset = new_data
|
||||||
_init_datatable()
|
_init_datatable()
|
||||||
append_upload_button.disabled = False
|
append_upload_button.disabled = False
|
||||||
|
|
||||||
@ -175,7 +175,7 @@ def create():
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
pyzebra.normalize_dataset(file_data, monitor_spinner.value)
|
pyzebra.normalize_dataset(file_data, monitor_spinner.value)
|
||||||
pyzebra.merge_datasets(det_data, file_data)
|
pyzebra.merge_datasets(dataset, file_data)
|
||||||
|
|
||||||
if file_data:
|
if file_data:
|
||||||
_init_datatable()
|
_init_datatable()
|
||||||
@ -184,7 +184,7 @@ def create():
|
|||||||
file_append_button.on_click(file_append_button_callback)
|
file_append_button.on_click(file_append_button_callback)
|
||||||
|
|
||||||
def upload_button_callback(_attr, _old, _new):
|
def upload_button_callback(_attr, _old, _new):
|
||||||
nonlocal det_data
|
nonlocal dataset
|
||||||
new_data = []
|
new_data = []
|
||||||
for f_str, f_name in zip(upload_button.value, upload_button.filename):
|
for f_str, f_name in zip(upload_button.value, upload_button.filename):
|
||||||
with io.StringIO(base64.b64decode(f_str).decode()) as file:
|
with io.StringIO(base64.b64decode(f_str).decode()) as file:
|
||||||
@ -205,7 +205,7 @@ def create():
|
|||||||
pyzebra.merge_datasets(new_data, file_data)
|
pyzebra.merge_datasets(new_data, file_data)
|
||||||
|
|
||||||
if new_data:
|
if new_data:
|
||||||
det_data = new_data
|
dataset = new_data
|
||||||
_init_datatable()
|
_init_datatable()
|
||||||
append_upload_button.disabled = False
|
append_upload_button.disabled = False
|
||||||
|
|
||||||
@ -227,7 +227,7 @@ def create():
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
pyzebra.normalize_dataset(file_data, monitor_spinner.value)
|
pyzebra.normalize_dataset(file_data, monitor_spinner.value)
|
||||||
pyzebra.merge_datasets(det_data, file_data)
|
pyzebra.merge_datasets(dataset, file_data)
|
||||||
|
|
||||||
if file_data:
|
if file_data:
|
||||||
_init_datatable()
|
_init_datatable()
|
||||||
@ -239,16 +239,16 @@ def create():
|
|||||||
append_upload_button.on_change("filename", append_upload_button_callback)
|
append_upload_button.on_change("filename", append_upload_button_callback)
|
||||||
|
|
||||||
def monitor_spinner_callback(_attr, old, new):
|
def monitor_spinner_callback(_attr, old, new):
|
||||||
if det_data:
|
if dataset:
|
||||||
pyzebra.normalize_dataset(det_data, new)
|
pyzebra.normalize_dataset(dataset, new)
|
||||||
_update_plot()
|
_update_plot()
|
||||||
|
|
||||||
monitor_spinner = Spinner(title="Monitor:", mode="int", value=100_000, low=1, width=145)
|
monitor_spinner = Spinner(title="Monitor:", mode="int", value=100_000, low=1, width=145)
|
||||||
monitor_spinner.on_change("value", monitor_spinner_callback)
|
monitor_spinner.on_change("value", monitor_spinner_callback)
|
||||||
|
|
||||||
def _update_table():
|
def _update_table():
|
||||||
fit_ok = [(1 if "fit" in scan else 0) for scan in det_data]
|
fit_ok = [(1 if "fit" in scan else 0) for scan in dataset]
|
||||||
export = [scan["export"] for scan in det_data]
|
export = [scan["export"] for scan in dataset]
|
||||||
scan_table_source.data.update(fit=fit_ok, export=export)
|
scan_table_source.data.update(fit=fit_ok, export=export)
|
||||||
|
|
||||||
def _update_plot():
|
def _update_plot():
|
||||||
@ -368,7 +368,7 @@ def create():
|
|||||||
def scan_table_source_callback(_attr, _old, new):
|
def scan_table_source_callback(_attr, _old, new):
|
||||||
# unfortunately, we don't know if the change comes from data update or user input
|
# unfortunately, we don't know if the change comes from data update or user input
|
||||||
# also `old` and `new` are the same for non-scalars
|
# also `old` and `new` are the same for non-scalars
|
||||||
for scan, export in zip(det_data, new["export"]):
|
for scan, export in zip(dataset, new["export"]):
|
||||||
scan["export"] = export
|
scan["export"] = export
|
||||||
_update_preview()
|
_update_preview()
|
||||||
|
|
||||||
@ -410,13 +410,13 @@ def create():
|
|||||||
)
|
)
|
||||||
|
|
||||||
def _get_selected_scan():
|
def _get_selected_scan():
|
||||||
return det_data[scan_table_source.selected.indices[0]]
|
return dataset[scan_table_source.selected.indices[0]]
|
||||||
|
|
||||||
merge_from_select = Select(title="scan:", width=145)
|
merge_from_select = Select(title="scan:", width=145)
|
||||||
|
|
||||||
def merge_button_callback():
|
def merge_button_callback():
|
||||||
scan_into = _get_selected_scan()
|
scan_into = _get_selected_scan()
|
||||||
scan_from = det_data[int(merge_from_select.value)]
|
scan_from = dataset[int(merge_from_select.value)]
|
||||||
|
|
||||||
if scan_into is scan_from:
|
if scan_into is scan_from:
|
||||||
print("WARNING: Selected scans for merging are identical")
|
print("WARNING: Selected scans for merging are identical")
|
||||||
@ -557,7 +557,7 @@ def create():
|
|||||||
fit_output_textinput = TextAreaInput(title="Fit results:", width=750, height=200)
|
fit_output_textinput = TextAreaInput(title="Fit results:", width=750, height=200)
|
||||||
|
|
||||||
def proc_all_button_callback():
|
def proc_all_button_callback():
|
||||||
for scan in det_data:
|
for scan in dataset:
|
||||||
if scan["export"]:
|
if scan["export"]:
|
||||||
pyzebra.fit_scan(
|
pyzebra.fit_scan(
|
||||||
scan, fit_params, fit_from=fit_from_spinner.value, fit_to=fit_to_spinner.value
|
scan, fit_params, fit_from=fit_from_spinner.value, fit_to=fit_to_spinner.value
|
||||||
@ -602,7 +602,7 @@ def create():
|
|||||||
with tempfile.TemporaryDirectory() as temp_dir:
|
with tempfile.TemporaryDirectory() as temp_dir:
|
||||||
temp_file = temp_dir + "/temp"
|
temp_file = temp_dir + "/temp"
|
||||||
export_data = []
|
export_data = []
|
||||||
for scan in det_data:
|
for scan in dataset:
|
||||||
if scan["export"]:
|
if scan["export"]:
|
||||||
export_data.append(scan)
|
export_data.append(scan)
|
||||||
|
|
||||||
|
@ -48,8 +48,7 @@ IMAGE_PLOT_H = int(IMAGE_H * 2) + 27
|
|||||||
|
|
||||||
def create():
|
def create():
|
||||||
doc = curdoc()
|
doc = curdoc()
|
||||||
zebra_data = []
|
dataset = []
|
||||||
det_data = {}
|
|
||||||
cami_meta = {}
|
cami_meta = {}
|
||||||
|
|
||||||
num_formatter = NumberFormatter(format="0.00", nan_format="")
|
num_formatter = NumberFormatter(format="0.00", nan_format="")
|
||||||
@ -108,15 +107,15 @@ def create():
|
|||||||
|
|
||||||
def _init_datatable():
|
def _init_datatable():
|
||||||
file_list = []
|
file_list = []
|
||||||
for scan in zebra_data:
|
for scan in dataset:
|
||||||
file_list.append(os.path.basename(scan["original_filename"]))
|
file_list.append(os.path.basename(scan["original_filename"]))
|
||||||
|
|
||||||
scan_table_source.data.update(
|
scan_table_source.data.update(
|
||||||
file=file_list,
|
file=file_list,
|
||||||
param=[None] * len(zebra_data),
|
param=[None] * len(dataset),
|
||||||
frame=[None] * len(zebra_data),
|
frame=[None] * len(dataset),
|
||||||
x_pos=[None] * len(zebra_data),
|
x_pos=[None] * len(dataset),
|
||||||
y_pos=[None] * len(zebra_data),
|
y_pos=[None] * len(dataset),
|
||||||
)
|
)
|
||||||
scan_table_source.selected.indices = []
|
scan_table_source.selected.indices = []
|
||||||
scan_table_source.selected.indices = [0]
|
scan_table_source.selected.indices = [0]
|
||||||
@ -127,7 +126,7 @@ def create():
|
|||||||
frame = []
|
frame = []
|
||||||
x_pos = []
|
x_pos = []
|
||||||
y_pos = []
|
y_pos = []
|
||||||
for scan in zebra_data:
|
for scan in dataset:
|
||||||
if "fit" in scan:
|
if "fit" in scan:
|
||||||
framei = scan["fit"]["frame"]
|
framei = scan["fit"]["frame"]
|
||||||
x_posi = scan["fit"]["x_pos"]
|
x_posi = scan["fit"]["x_pos"]
|
||||||
@ -150,13 +149,13 @@ def create():
|
|||||||
print("Could not read data from the file.")
|
print("Could not read data from the file.")
|
||||||
return
|
return
|
||||||
|
|
||||||
zebra_data.extend(new_data)
|
dataset.extend(new_data)
|
||||||
|
|
||||||
_init_datatable()
|
_init_datatable()
|
||||||
|
|
||||||
def file_open_button_callback():
|
def file_open_button_callback():
|
||||||
nonlocal zebra_data
|
nonlocal dataset
|
||||||
zebra_data = []
|
dataset = []
|
||||||
_file_open()
|
_file_open()
|
||||||
|
|
||||||
file_open_button = Button(label="Open New", width=100)
|
file_open_button = Button(label="Open New", width=100)
|
||||||
@ -170,8 +169,6 @@ def create():
|
|||||||
|
|
||||||
# Scan select
|
# Scan select
|
||||||
def scan_table_select_callback(_attr, old, new):
|
def scan_table_select_callback(_attr, old, new):
|
||||||
nonlocal det_data
|
|
||||||
|
|
||||||
if not new:
|
if not new:
|
||||||
# skip empty selections
|
# skip empty selections
|
||||||
return
|
return
|
||||||
@ -186,21 +183,21 @@ def create():
|
|||||||
# skip unnecessary update caused by selection drop
|
# skip unnecessary update caused by selection drop
|
||||||
return
|
return
|
||||||
|
|
||||||
det_data = zebra_data[new[0]]
|
scan = dataset[new[0]]
|
||||||
|
|
||||||
zebra_mode = det_data["zebra_mode"]
|
zebra_mode = scan["zebra_mode"]
|
||||||
if zebra_mode == "nb":
|
if zebra_mode == "nb":
|
||||||
metadata_table_source.data.update(geom=["normal beam"])
|
metadata_table_source.data.update(geom=["normal beam"])
|
||||||
else: # zebra_mode == "bi"
|
else: # zebra_mode == "bi"
|
||||||
metadata_table_source.data.update(geom=["bisecting"])
|
metadata_table_source.data.update(geom=["bisecting"])
|
||||||
|
|
||||||
if "mf" in det_data:
|
if "mf" in scan:
|
||||||
metadata_table_source.data.update(mf=[det_data["mf"][0]])
|
metadata_table_source.data.update(mf=[scan["mf"][0]])
|
||||||
else:
|
else:
|
||||||
metadata_table_source.data.update(mf=[None])
|
metadata_table_source.data.update(mf=[None])
|
||||||
|
|
||||||
if "temp" in det_data:
|
if "temp" in scan:
|
||||||
metadata_table_source.data.update(temp=[det_data["temp"][0]])
|
metadata_table_source.data.update(temp=[scan["temp"][0]])
|
||||||
else:
|
else:
|
||||||
metadata_table_source.data.update(temp=[None])
|
metadata_table_source.data.update(temp=[None])
|
||||||
|
|
||||||
@ -240,12 +237,15 @@ def create():
|
|||||||
autosize_mode="none",
|
autosize_mode="none",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def _get_selected_scan():
|
||||||
|
return dataset[scan_table_source.selected.indices[0]]
|
||||||
|
|
||||||
def param_select_callback(_attr, _old, new):
|
def param_select_callback(_attr, _old, new):
|
||||||
if new == "user defined":
|
if new == "user defined":
|
||||||
param = [None] * len(zebra_data)
|
param = [None] * len(dataset)
|
||||||
else:
|
else:
|
||||||
# TODO: which value to take?
|
# TODO: which value to take?
|
||||||
param = [scan[new][0] for scan in zebra_data]
|
param = [scan[new][0] for scan in dataset]
|
||||||
|
|
||||||
scan_table_source.data["param"] = param
|
scan_table_source.data["param"] = param
|
||||||
_update_param_plot()
|
_update_param_plot()
|
||||||
@ -259,7 +259,8 @@ def create():
|
|||||||
param_select.on_change("value", param_select_callback)
|
param_select.on_change("value", param_select_callback)
|
||||||
|
|
||||||
def update_overview_plot():
|
def update_overview_plot():
|
||||||
h5_data = det_data["data"]
|
scan = _get_selected_scan()
|
||||||
|
h5_data = scan["data"]
|
||||||
n_im, n_y, n_x = h5_data.shape
|
n_im, n_y, n_x = h5_data.shape
|
||||||
overview_x = np.mean(h5_data, axis=1)
|
overview_x = np.mean(h5_data, axis=1)
|
||||||
overview_y = np.mean(h5_data, axis=2)
|
overview_y = np.mean(h5_data, axis=2)
|
||||||
@ -290,10 +291,10 @@ def create():
|
|||||||
frame_range.reset_end = n_im
|
frame_range.reset_end = n_im
|
||||||
frame_range.bounds = (0, n_im)
|
frame_range.bounds = (0, n_im)
|
||||||
|
|
||||||
scan_motor = det_data["scan_motor"]
|
scan_motor = scan["scan_motor"]
|
||||||
overview_plot_y.axis[1].axis_label = f"Scanning motor, {scan_motor}"
|
overview_plot_y.axis[1].axis_label = f"Scanning motor, {scan_motor}"
|
||||||
|
|
||||||
var = det_data[scan_motor]
|
var = scan[scan_motor]
|
||||||
var_start = var[0]
|
var_start = var[0]
|
||||||
var_end = var[-1] + (var[-1] - var[0]) / (n_im - 1)
|
var_end = var[-1] + (var[-1] - var[0]) / (n_im - 1)
|
||||||
|
|
||||||
@ -470,7 +471,7 @@ def create():
|
|||||||
x = []
|
x = []
|
||||||
y = []
|
y = []
|
||||||
fit_param = fit_param_select.value
|
fit_param = fit_param_select.value
|
||||||
for s, p in zip(zebra_data, scan_table_source.data["param"]):
|
for s, p in zip(dataset, scan_table_source.data["param"]):
|
||||||
if "fit" in s and fit_param:
|
if "fit" in s and fit_param:
|
||||||
x.append(p)
|
x.append(p)
|
||||||
y.append(s["fit"][fit_param])
|
y.append(s["fit"][fit_param])
|
||||||
@ -498,7 +499,7 @@ def create():
|
|||||||
fit_param_select.on_change("value", fit_param_select_callback)
|
fit_param_select.on_change("value", fit_param_select_callback)
|
||||||
|
|
||||||
def proc_all_button_callback():
|
def proc_all_button_callback():
|
||||||
for scan in zebra_data:
|
for scan in dataset:
|
||||||
pyzebra.fit_event(
|
pyzebra.fit_event(
|
||||||
scan,
|
scan,
|
||||||
int(np.floor(frame_range.start)),
|
int(np.floor(frame_range.start)),
|
||||||
@ -511,7 +512,7 @@ def create():
|
|||||||
|
|
||||||
_update_table()
|
_update_table()
|
||||||
|
|
||||||
for scan in zebra_data:
|
for scan in dataset:
|
||||||
if "fit" in scan:
|
if "fit" in scan:
|
||||||
options = list(scan["fit"].keys())
|
options = list(scan["fit"].keys())
|
||||||
fit_param_select.options = options
|
fit_param_select.options = options
|
||||||
@ -524,8 +525,9 @@ def create():
|
|||||||
proc_all_button.on_click(proc_all_button_callback)
|
proc_all_button.on_click(proc_all_button_callback)
|
||||||
|
|
||||||
def proc_button_callback():
|
def proc_button_callback():
|
||||||
|
scan = _get_selected_scan()
|
||||||
pyzebra.fit_event(
|
pyzebra.fit_event(
|
||||||
det_data,
|
scan,
|
||||||
int(np.floor(frame_range.start)),
|
int(np.floor(frame_range.start)),
|
||||||
int(np.ceil(frame_range.end)),
|
int(np.ceil(frame_range.end)),
|
||||||
int(np.floor(det_y_range.start)),
|
int(np.floor(det_y_range.start)),
|
||||||
@ -536,7 +538,7 @@ def create():
|
|||||||
|
|
||||||
_update_table()
|
_update_table()
|
||||||
|
|
||||||
for scan in zebra_data:
|
for scan in dataset:
|
||||||
if "fit" in scan:
|
if "fit" in scan:
|
||||||
options = list(scan["fit"].keys())
|
options = list(scan["fit"].keys())
|
||||||
fit_param_select.options = options
|
fit_param_select.options = options
|
||||||
|
@ -52,7 +52,7 @@ IMAGE_PLOT_H = int(IMAGE_H * 2) + 27
|
|||||||
|
|
||||||
def create():
|
def create():
|
||||||
doc = curdoc()
|
doc = curdoc()
|
||||||
det_data = {}
|
scan = {}
|
||||||
cami_meta = {}
|
cami_meta = {}
|
||||||
|
|
||||||
num_formatter = NumberFormatter(format="0.00", nan_format="")
|
num_formatter = NumberFormatter(format="0.00", nan_format="")
|
||||||
@ -108,14 +108,14 @@ def create():
|
|||||||
upload_cami_button.on_change("value", upload_cami_button_callback)
|
upload_cami_button.on_change("value", upload_cami_button_callback)
|
||||||
|
|
||||||
def _file_open(file, cami_meta):
|
def _file_open(file, cami_meta):
|
||||||
nonlocal det_data
|
nonlocal scan
|
||||||
try:
|
try:
|
||||||
det_data = pyzebra.read_detector_data(file, cami_meta)
|
scan = pyzebra.read_detector_data(file, cami_meta)
|
||||||
except KeyError:
|
except KeyError:
|
||||||
print("Could not read data from the file.")
|
print("Could not read data from the file.")
|
||||||
return
|
return
|
||||||
|
|
||||||
last_im_index = det_data["data"].shape[0] - 1
|
last_im_index = scan["data"].shape[0] - 1
|
||||||
|
|
||||||
index_spinner.value = 0
|
index_spinner.value = 0
|
||||||
index_spinner.high = last_im_index
|
index_spinner.high = last_im_index
|
||||||
@ -125,7 +125,7 @@ def create():
|
|||||||
index_slider.disabled = False
|
index_slider.disabled = False
|
||||||
index_slider.end = last_im_index
|
index_slider.end = last_im_index
|
||||||
|
|
||||||
zebra_mode = det_data["zebra_mode"]
|
zebra_mode = scan["zebra_mode"]
|
||||||
if zebra_mode == "nb":
|
if zebra_mode == "nb":
|
||||||
metadata_table_source.data.update(geom=["normal beam"])
|
metadata_table_source.data.update(geom=["normal beam"])
|
||||||
else: # zebra_mode == "bi"
|
else: # zebra_mode == "bi"
|
||||||
@ -157,7 +157,7 @@ def create():
|
|||||||
if index is None:
|
if index is None:
|
||||||
index = index_spinner.value
|
index = index_spinner.value
|
||||||
|
|
||||||
current_image = det_data["data"][index]
|
current_image = scan["data"][index]
|
||||||
proj_v_line_source.data.update(
|
proj_v_line_source.data.update(
|
||||||
x=np.arange(0, IMAGE_W) + 0.5, y=np.mean(current_image, axis=0)
|
x=np.arange(0, IMAGE_W) + 0.5, y=np.mean(current_image, axis=0)
|
||||||
)
|
)
|
||||||
@ -180,24 +180,24 @@ def create():
|
|||||||
image_glyph.color_mapper.low = im_min
|
image_glyph.color_mapper.low = im_min
|
||||||
image_glyph.color_mapper.high = im_max
|
image_glyph.color_mapper.high = im_max
|
||||||
|
|
||||||
if "mf" in det_data:
|
if "mf" in scan:
|
||||||
metadata_table_source.data.update(mf=[det_data["mf"][index]])
|
metadata_table_source.data.update(mf=[scan["mf"][index]])
|
||||||
else:
|
else:
|
||||||
metadata_table_source.data.update(mf=[None])
|
metadata_table_source.data.update(mf=[None])
|
||||||
|
|
||||||
if "temp" in det_data:
|
if "temp" in scan:
|
||||||
metadata_table_source.data.update(temp=[det_data["temp"][index]])
|
metadata_table_source.data.update(temp=[scan["temp"][index]])
|
||||||
else:
|
else:
|
||||||
metadata_table_source.data.update(temp=[None])
|
metadata_table_source.data.update(temp=[None])
|
||||||
|
|
||||||
gamma, nu = calculate_pol(det_data, index)
|
gamma, nu = calculate_pol(scan, index)
|
||||||
omega = np.ones((IMAGE_H, IMAGE_W)) * det_data["omega"][index]
|
omega = np.ones((IMAGE_H, IMAGE_W)) * scan["omega"][index]
|
||||||
image_source.data.update(gamma=[gamma], nu=[nu], omega=[omega])
|
image_source.data.update(gamma=[gamma], nu=[nu], omega=[omega])
|
||||||
|
|
||||||
# update detector center angles
|
# update detector center angles
|
||||||
det_c_x = int(IMAGE_W / 2)
|
det_c_x = int(IMAGE_W / 2)
|
||||||
det_c_y = int(IMAGE_H / 2)
|
det_c_y = int(IMAGE_H / 2)
|
||||||
if det_data["zebra_mode"] == "nb":
|
if scan["zebra_mode"] == "nb":
|
||||||
gamma_c = gamma[det_c_y, det_c_x]
|
gamma_c = gamma[det_c_y, det_c_x]
|
||||||
nu_c = nu[det_c_y, det_c_x]
|
nu_c = nu[det_c_y, det_c_x]
|
||||||
omega_c = omega[det_c_y, det_c_x]
|
omega_c = omega[det_c_y, det_c_x]
|
||||||
@ -205,13 +205,13 @@ def create():
|
|||||||
phi_c = None
|
phi_c = None
|
||||||
|
|
||||||
else: # zebra_mode == "bi"
|
else: # zebra_mode == "bi"
|
||||||
wave = det_data["wave"]
|
wave = scan["wave"]
|
||||||
ddist = det_data["ddist"]
|
ddist = scan["ddist"]
|
||||||
gammad = det_data["gamma"][index]
|
gammad = scan["gamma"][index]
|
||||||
om = det_data["omega"][index]
|
om = scan["omega"][index]
|
||||||
ch = det_data["chi"][index]
|
ch = scan["chi"][index]
|
||||||
ph = det_data["phi"][index]
|
ph = scan["phi"][index]
|
||||||
nud = det_data["nu"]
|
nud = scan["nu"]
|
||||||
|
|
||||||
nu_c = 0
|
nu_c = 0
|
||||||
chi_c, phi_c, gamma_c, omega_c = pyzebra.ang_proc(
|
chi_c, phi_c, gamma_c, omega_c = pyzebra.ang_proc(
|
||||||
@ -223,7 +223,7 @@ def create():
|
|||||||
)
|
)
|
||||||
|
|
||||||
def update_overview_plot():
|
def update_overview_plot():
|
||||||
h5_data = det_data["data"]
|
h5_data = scan["data"]
|
||||||
n_im, n_y, n_x = h5_data.shape
|
n_im, n_y, n_x = h5_data.shape
|
||||||
overview_x = np.mean(h5_data, axis=1)
|
overview_x = np.mean(h5_data, axis=1)
|
||||||
overview_y = np.mean(h5_data, axis=2)
|
overview_y = np.mean(h5_data, axis=2)
|
||||||
@ -254,10 +254,10 @@ def create():
|
|||||||
frame_range.reset_end = n_im
|
frame_range.reset_end = n_im
|
||||||
frame_range.bounds = (0, n_im)
|
frame_range.bounds = (0, n_im)
|
||||||
|
|
||||||
scan_motor = det_data["scan_motor"]
|
scan_motor = scan["scan_motor"]
|
||||||
overview_plot_y.axis[1].axis_label = f"Scanning motor, {scan_motor}"
|
overview_plot_y.axis[1].axis_label = f"Scanning motor, {scan_motor}"
|
||||||
|
|
||||||
var = det_data[scan_motor]
|
var = scan[scan_motor]
|
||||||
var_start = var[0]
|
var_start = var[0]
|
||||||
var_end = var[-1] + (var[-1] - var[0]) / (n_im - 1) if n_im != 1 else var_start + 1
|
var_end = var[-1] + (var[-1] - var[0]) / (n_im - 1) if n_im != 1 else var_start + 1
|
||||||
|
|
||||||
@ -374,9 +374,9 @@ def create():
|
|||||||
|
|
||||||
# calculate hkl-indices of first mouse entry
|
# calculate hkl-indices of first mouse entry
|
||||||
def mouse_enter_callback(_event):
|
def mouse_enter_callback(_event):
|
||||||
if det_data and np.array_equal(image_source.data["h"][0], np.zeros((1, 1))):
|
if scan and np.array_equal(image_source.data["h"][0], np.zeros((1, 1))):
|
||||||
index = index_spinner.value
|
index = index_spinner.value
|
||||||
h, k, l = calculate_hkl(det_data, index)
|
h, k, l = calculate_hkl(scan, index)
|
||||||
image_source.data.update(h=[h], k=[k], l=[l])
|
image_source.data.update(h=[h], k=[k], l=[l])
|
||||||
|
|
||||||
plot.on_event(MouseEnter, mouse_enter_callback)
|
plot.on_event(MouseEnter, mouse_enter_callback)
|
||||||
@ -438,7 +438,7 @@ def create():
|
|||||||
|
|
||||||
def box_edit_callback(_attr, _old, new):
|
def box_edit_callback(_attr, _old, new):
|
||||||
if new["x"]:
|
if new["x"]:
|
||||||
h5_data = det_data["data"]
|
h5_data = scan["data"]
|
||||||
x_val = np.arange(h5_data.shape[0])
|
x_val = np.arange(h5_data.shape[0])
|
||||||
left = int(np.floor(new["x"][0]))
|
left = int(np.floor(new["x"][0]))
|
||||||
right = int(np.ceil(new["x"][0] + new["width"][0]))
|
right = int(np.ceil(new["x"][0] + new["width"][0]))
|
||||||
@ -739,7 +739,7 @@ def create():
|
|||||||
|
|
||||||
def add_event_button_callback():
|
def add_event_button_callback():
|
||||||
pyzebra.fit_event(
|
pyzebra.fit_event(
|
||||||
det_data,
|
scan,
|
||||||
int(np.floor(frame_range.start)),
|
int(np.floor(frame_range.start)),
|
||||||
int(np.ceil(frame_range.end)),
|
int(np.ceil(frame_range.end)),
|
||||||
int(np.floor(det_y_range.start)),
|
int(np.floor(det_y_range.start)),
|
||||||
@ -748,21 +748,21 @@ def create():
|
|||||||
int(np.ceil(det_x_range.end)),
|
int(np.ceil(det_x_range.end)),
|
||||||
)
|
)
|
||||||
|
|
||||||
wave = det_data["wave"]
|
wave = scan["wave"]
|
||||||
ddist = det_data["ddist"]
|
ddist = scan["ddist"]
|
||||||
cell = det_data["cell"]
|
cell = scan["cell"]
|
||||||
|
|
||||||
gamma = det_data["gamma"][0]
|
gamma = scan["gamma"][0]
|
||||||
omega = det_data["omega"][0]
|
omega = scan["omega"][0]
|
||||||
nu = det_data["nu"][0]
|
nu = scan["nu"][0]
|
||||||
chi = det_data["chi"][0]
|
chi = scan["chi"][0]
|
||||||
phi = det_data["phi"][0]
|
phi = scan["phi"][0]
|
||||||
|
|
||||||
scan_motor = det_data["scan_motor"]
|
scan_motor = scan["scan_motor"]
|
||||||
var_angle = det_data[scan_motor]
|
var_angle = scan[scan_motor]
|
||||||
|
|
||||||
snr_cnts = det_data["fit"]["snr"]
|
snr_cnts = scan["fit"]["snr"]
|
||||||
frC = det_data["fit"]["frame"]
|
frC = scan["fit"]["frame"]
|
||||||
|
|
||||||
var_F = var_angle[int(np.floor(frC))]
|
var_F = var_angle[int(np.floor(frC))]
|
||||||
var_C = var_angle[int(np.ceil(frC))]
|
var_C = var_angle[int(np.ceil(frC))]
|
||||||
@ -781,11 +781,11 @@ def create():
|
|||||||
elif scan_motor == "phi":
|
elif scan_motor == "phi":
|
||||||
phi = var_p
|
phi = var_p
|
||||||
|
|
||||||
intensity = det_data["fit"]["intensity"]
|
intensity = scan["fit"]["intensity"]
|
||||||
x_pos = det_data["fit"]["x_pos"]
|
x_pos = scan["fit"]["x_pos"]
|
||||||
y_pos = det_data["fit"]["y_pos"]
|
y_pos = scan["fit"]["y_pos"]
|
||||||
|
|
||||||
if det_data["zebra_mode"] == "nb":
|
if scan["zebra_mode"] == "nb":
|
||||||
chi = None
|
chi = None
|
||||||
phi = None
|
phi = None
|
||||||
|
|
||||||
@ -883,22 +883,22 @@ def create():
|
|||||||
return Panel(child=tab_layout, title="hdf viewer")
|
return Panel(child=tab_layout, title="hdf viewer")
|
||||||
|
|
||||||
|
|
||||||
def calculate_hkl(det_data, index):
|
def calculate_hkl(scan, index):
|
||||||
h = np.empty(shape=(IMAGE_H, IMAGE_W))
|
h = np.empty(shape=(IMAGE_H, IMAGE_W))
|
||||||
k = np.empty(shape=(IMAGE_H, IMAGE_W))
|
k = np.empty(shape=(IMAGE_H, IMAGE_W))
|
||||||
l = np.empty(shape=(IMAGE_H, IMAGE_W))
|
l = np.empty(shape=(IMAGE_H, IMAGE_W))
|
||||||
|
|
||||||
wave = det_data["wave"]
|
wave = scan["wave"]
|
||||||
ddist = det_data["ddist"]
|
ddist = scan["ddist"]
|
||||||
gammad = det_data["gamma"][index]
|
gammad = scan["gamma"][index]
|
||||||
om = det_data["omega"][index]
|
om = scan["omega"][index]
|
||||||
nud = det_data["nu"]
|
nud = scan["nu"]
|
||||||
ub = det_data["ub"]
|
ub = scan["ub"]
|
||||||
geometry = det_data["zebra_mode"]
|
geometry = scan["zebra_mode"]
|
||||||
|
|
||||||
if geometry == "bi":
|
if geometry == "bi":
|
||||||
chi = det_data["chi"][index]
|
chi = scan["chi"][index]
|
||||||
phi = det_data["phi"][index]
|
phi = scan["phi"][index]
|
||||||
elif geometry == "nb":
|
elif geometry == "nb":
|
||||||
chi = 0
|
chi = 0
|
||||||
phi = 0
|
phi = 0
|
||||||
@ -914,10 +914,10 @@ def calculate_hkl(det_data, index):
|
|||||||
return h, k, l
|
return h, k, l
|
||||||
|
|
||||||
|
|
||||||
def calculate_pol(det_data, index):
|
def calculate_pol(scan, index):
|
||||||
ddist = det_data["ddist"]
|
ddist = scan["ddist"]
|
||||||
gammad = det_data["gamma"][index]
|
gammad = scan["gamma"][index]
|
||||||
nud = det_data["nu"]
|
nud = scan["nu"]
|
||||||
yi, xi = np.ogrid[:IMAGE_H, :IMAGE_W]
|
yi, xi = np.ogrid[:IMAGE_H, :IMAGE_W]
|
||||||
gamma, nu = pyzebra.det2pol(ddist, gammad, nud, xi, yi)
|
gamma, nu = pyzebra.det2pol(ddist, gammad, nud, xi, yi)
|
||||||
|
|
||||||
|
@ -83,7 +83,7 @@ def color_palette(n_colors):
|
|||||||
|
|
||||||
def create():
|
def create():
|
||||||
doc = curdoc()
|
doc = curdoc()
|
||||||
det_data = []
|
dataset = []
|
||||||
fit_params = {}
|
fit_params = {}
|
||||||
js_data = ColumnDataSource(data=dict(content=[""], fname=[""], ext=[""]))
|
js_data = ColumnDataSource(data=dict(content=[""], fname=[""], ext=[""]))
|
||||||
|
|
||||||
@ -111,15 +111,15 @@ def create():
|
|||||||
proposal_textinput.on_change("name", proposal_textinput_callback)
|
proposal_textinput.on_change("name", proposal_textinput_callback)
|
||||||
|
|
||||||
def _init_datatable():
|
def _init_datatable():
|
||||||
scan_list = [s["idx"] for s in det_data]
|
scan_list = [s["idx"] for s in dataset]
|
||||||
export = [s["export"] for s in det_data]
|
export = [s["export"] for s in dataset]
|
||||||
if param_select.value == "user defined":
|
if param_select.value == "user defined":
|
||||||
param = [None] * len(det_data)
|
param = [None] * len(dataset)
|
||||||
else:
|
else:
|
||||||
param = [scan[param_select.value] for scan in det_data]
|
param = [scan[param_select.value] for scan in dataset]
|
||||||
|
|
||||||
file_list = []
|
file_list = []
|
||||||
for scan in det_data:
|
for scan in dataset:
|
||||||
file_list.append(os.path.basename(scan["original_filename"]))
|
file_list.append(os.path.basename(scan["original_filename"]))
|
||||||
|
|
||||||
scan_table_source.data.update(
|
scan_table_source.data.update(
|
||||||
@ -128,8 +128,8 @@ def create():
|
|||||||
scan_table_source.selected.indices = []
|
scan_table_source.selected.indices = []
|
||||||
scan_table_source.selected.indices = [0]
|
scan_table_source.selected.indices = [0]
|
||||||
|
|
||||||
scan_motor_select.options = det_data[0]["scan_motors"]
|
scan_motor_select.options = dataset[0]["scan_motors"]
|
||||||
scan_motor_select.value = det_data[0]["scan_motor"]
|
scan_motor_select.value = dataset[0]["scan_motor"]
|
||||||
|
|
||||||
merge_options = [(str(i), f"{i} ({idx})") for i, idx in enumerate(scan_list)]
|
merge_options = [(str(i), f"{i} ({idx})") for i, idx in enumerate(scan_list)]
|
||||||
merge_from_select.options = merge_options
|
merge_from_select.options = merge_options
|
||||||
@ -138,7 +138,7 @@ def create():
|
|||||||
file_select = MultiSelect(title="Available .ccl/.dat files:", width=210, height=250)
|
file_select = MultiSelect(title="Available .ccl/.dat files:", width=210, height=250)
|
||||||
|
|
||||||
def file_open_button_callback():
|
def file_open_button_callback():
|
||||||
nonlocal det_data
|
nonlocal dataset
|
||||||
new_data = []
|
new_data = []
|
||||||
for f_path in file_select.value:
|
for f_path in file_select.value:
|
||||||
with open(f_path) as file:
|
with open(f_path) as file:
|
||||||
@ -160,7 +160,7 @@ def create():
|
|||||||
pyzebra.merge_datasets(new_data, file_data)
|
pyzebra.merge_datasets(new_data, file_data)
|
||||||
|
|
||||||
if new_data:
|
if new_data:
|
||||||
det_data = new_data
|
dataset = new_data
|
||||||
_init_datatable()
|
_init_datatable()
|
||||||
append_upload_button.disabled = False
|
append_upload_button.disabled = False
|
||||||
|
|
||||||
@ -180,7 +180,7 @@ def create():
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
pyzebra.normalize_dataset(file_data, monitor_spinner.value)
|
pyzebra.normalize_dataset(file_data, monitor_spinner.value)
|
||||||
pyzebra.merge_datasets(det_data, file_data)
|
pyzebra.merge_datasets(dataset, file_data)
|
||||||
|
|
||||||
if file_data:
|
if file_data:
|
||||||
_init_datatable()
|
_init_datatable()
|
||||||
@ -189,7 +189,7 @@ def create():
|
|||||||
file_append_button.on_click(file_append_button_callback)
|
file_append_button.on_click(file_append_button_callback)
|
||||||
|
|
||||||
def upload_button_callback(_attr, _old, _new):
|
def upload_button_callback(_attr, _old, _new):
|
||||||
nonlocal det_data
|
nonlocal dataset
|
||||||
new_data = []
|
new_data = []
|
||||||
for f_str, f_name in zip(upload_button.value, upload_button.filename):
|
for f_str, f_name in zip(upload_button.value, upload_button.filename):
|
||||||
with io.StringIO(base64.b64decode(f_str).decode()) as file:
|
with io.StringIO(base64.b64decode(f_str).decode()) as file:
|
||||||
@ -210,7 +210,7 @@ def create():
|
|||||||
pyzebra.merge_datasets(new_data, file_data)
|
pyzebra.merge_datasets(new_data, file_data)
|
||||||
|
|
||||||
if new_data:
|
if new_data:
|
||||||
det_data = new_data
|
dataset = new_data
|
||||||
_init_datatable()
|
_init_datatable()
|
||||||
append_upload_button.disabled = False
|
append_upload_button.disabled = False
|
||||||
|
|
||||||
@ -232,7 +232,7 @@ def create():
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
pyzebra.normalize_dataset(file_data, monitor_spinner.value)
|
pyzebra.normalize_dataset(file_data, monitor_spinner.value)
|
||||||
pyzebra.merge_datasets(det_data, file_data)
|
pyzebra.merge_datasets(dataset, file_data)
|
||||||
|
|
||||||
if file_data:
|
if file_data:
|
||||||
_init_datatable()
|
_init_datatable()
|
||||||
@ -244,8 +244,8 @@ def create():
|
|||||||
append_upload_button.on_change("filename", append_upload_button_callback)
|
append_upload_button.on_change("filename", append_upload_button_callback)
|
||||||
|
|
||||||
def monitor_spinner_callback(_attr, _old, new):
|
def monitor_spinner_callback(_attr, _old, new):
|
||||||
if det_data:
|
if dataset:
|
||||||
pyzebra.normalize_dataset(det_data, new)
|
pyzebra.normalize_dataset(dataset, new)
|
||||||
_update_single_scan_plot()
|
_update_single_scan_plot()
|
||||||
_update_overview()
|
_update_overview()
|
||||||
|
|
||||||
@ -253,8 +253,8 @@ def create():
|
|||||||
monitor_spinner.on_change("value", monitor_spinner_callback)
|
monitor_spinner.on_change("value", monitor_spinner_callback)
|
||||||
|
|
||||||
def scan_motor_select_callback(_attr, _old, new):
|
def scan_motor_select_callback(_attr, _old, new):
|
||||||
if det_data:
|
if dataset:
|
||||||
for scan in det_data:
|
for scan in dataset:
|
||||||
scan["scan_motor"] = new
|
scan["scan_motor"] = new
|
||||||
_update_single_scan_plot()
|
_update_single_scan_plot()
|
||||||
_update_overview()
|
_update_overview()
|
||||||
@ -263,12 +263,12 @@ def create():
|
|||||||
scan_motor_select.on_change("value", scan_motor_select_callback)
|
scan_motor_select.on_change("value", scan_motor_select_callback)
|
||||||
|
|
||||||
def _update_table():
|
def _update_table():
|
||||||
fit_ok = [(1 if "fit" in scan else 0) for scan in det_data]
|
fit_ok = [(1 if "fit" in scan else 0) for scan in dataset]
|
||||||
export = [scan["export"] for scan in det_data]
|
export = [scan["export"] for scan in dataset]
|
||||||
if param_select.value == "user defined":
|
if param_select.value == "user defined":
|
||||||
param = [None] * len(det_data)
|
param = [None] * len(dataset)
|
||||||
else:
|
else:
|
||||||
param = [scan[param_select.value] for scan in det_data]
|
param = [scan[param_select.value] for scan in dataset]
|
||||||
|
|
||||||
scan_table_source.data.update(fit=fit_ok, export=export, param=param)
|
scan_table_source.data.update(fit=fit_ok, export=export, param=param)
|
||||||
|
|
||||||
@ -322,7 +322,7 @@ def create():
|
|||||||
par = []
|
par = []
|
||||||
for s, p in enumerate(scan_table_source.data["param"]):
|
for s, p in enumerate(scan_table_source.data["param"]):
|
||||||
if p is not None:
|
if p is not None:
|
||||||
scan = det_data[s]
|
scan = dataset[s]
|
||||||
scan_motor = scan["scan_motor"]
|
scan_motor = scan["scan_motor"]
|
||||||
xs.append(scan[scan_motor])
|
xs.append(scan[scan_motor])
|
||||||
x.extend(scan[scan_motor])
|
x.extend(scan[scan_motor])
|
||||||
@ -331,8 +331,8 @@ def create():
|
|||||||
param.append(float(p))
|
param.append(float(p))
|
||||||
par.extend(scan["counts"])
|
par.extend(scan["counts"])
|
||||||
|
|
||||||
if det_data:
|
if dataset:
|
||||||
scan_motor = det_data[0]["scan_motor"]
|
scan_motor = dataset[0]["scan_motor"]
|
||||||
ov_plot.axis[0].axis_label = scan_motor
|
ov_plot.axis[0].axis_label = scan_motor
|
||||||
ov_param_plot.axis[0].axis_label = scan_motor
|
ov_param_plot.axis[0].axis_label = scan_motor
|
||||||
|
|
||||||
@ -371,7 +371,7 @@ def create():
|
|||||||
y_lower = []
|
y_lower = []
|
||||||
y_upper = []
|
y_upper = []
|
||||||
fit_param = fit_param_select.value
|
fit_param = fit_param_select.value
|
||||||
for s, p in zip(det_data, scan_table_source.data["param"]):
|
for s, p in zip(dataset, scan_table_source.data["param"]):
|
||||||
if "fit" in s and fit_param:
|
if "fit" in s and fit_param:
|
||||||
x.append(p)
|
x.append(p)
|
||||||
param_fit_val = s["fit"].params[fit_param].value
|
param_fit_val = s["fit"].params[fit_param].value
|
||||||
@ -534,7 +534,7 @@ def create():
|
|||||||
def scan_table_source_callback(_attr, _old, new):
|
def scan_table_source_callback(_attr, _old, new):
|
||||||
# unfortunately, we don't know if the change comes from data update or user input
|
# unfortunately, we don't know if the change comes from data update or user input
|
||||||
# also `old` and `new` are the same for non-scalars
|
# also `old` and `new` are the same for non-scalars
|
||||||
for scan, export in zip(det_data, new["export"]):
|
for scan, export in zip(dataset, new["export"]):
|
||||||
scan["export"] = export
|
scan["export"] = export
|
||||||
_update_overview()
|
_update_overview()
|
||||||
_update_param_plot()
|
_update_param_plot()
|
||||||
@ -563,7 +563,7 @@ def create():
|
|||||||
|
|
||||||
def merge_button_callback():
|
def merge_button_callback():
|
||||||
scan_into = _get_selected_scan()
|
scan_into = _get_selected_scan()
|
||||||
scan_from = det_data[int(merge_from_select.value)]
|
scan_from = dataset[int(merge_from_select.value)]
|
||||||
|
|
||||||
if scan_into is scan_from:
|
if scan_into is scan_from:
|
||||||
print("WARNING: Selected scans for merging are identical")
|
print("WARNING: Selected scans for merging are identical")
|
||||||
@ -587,7 +587,7 @@ def create():
|
|||||||
restore_button.on_click(restore_button_callback)
|
restore_button.on_click(restore_button_callback)
|
||||||
|
|
||||||
def _get_selected_scan():
|
def _get_selected_scan():
|
||||||
return det_data[scan_table_source.selected.indices[0]]
|
return dataset[scan_table_source.selected.indices[0]]
|
||||||
|
|
||||||
def param_select_callback(_attr, _old, _new):
|
def param_select_callback(_attr, _old, _new):
|
||||||
_update_table()
|
_update_table()
|
||||||
@ -720,7 +720,7 @@ def create():
|
|||||||
fit_output_textinput = TextAreaInput(title="Fit results:", width=750, height=200)
|
fit_output_textinput = TextAreaInput(title="Fit results:", width=750, height=200)
|
||||||
|
|
||||||
def proc_all_button_callback():
|
def proc_all_button_callback():
|
||||||
for scan in det_data:
|
for scan in dataset:
|
||||||
if scan["export"]:
|
if scan["export"]:
|
||||||
pyzebra.fit_scan(
|
pyzebra.fit_scan(
|
||||||
scan, fit_params, fit_from=fit_from_spinner.value, fit_to=fit_to_spinner.value
|
scan, fit_params, fit_from=fit_from_spinner.value, fit_to=fit_to_spinner.value
|
||||||
@ -735,7 +735,7 @@ def create():
|
|||||||
_update_overview()
|
_update_overview()
|
||||||
_update_table()
|
_update_table()
|
||||||
|
|
||||||
for scan in det_data:
|
for scan in dataset:
|
||||||
if "fit" in scan:
|
if "fit" in scan:
|
||||||
options = list(scan["fit"].params.keys())
|
options = list(scan["fit"].params.keys())
|
||||||
fit_param_select.options = options
|
fit_param_select.options = options
|
||||||
@ -760,7 +760,7 @@ def create():
|
|||||||
_update_overview()
|
_update_overview()
|
||||||
_update_table()
|
_update_table()
|
||||||
|
|
||||||
for scan in det_data:
|
for scan in dataset:
|
||||||
if "fit" in scan:
|
if "fit" in scan:
|
||||||
options = list(scan["fit"].params.keys())
|
options = list(scan["fit"].params.keys())
|
||||||
fit_param_select.options = options
|
fit_param_select.options = options
|
||||||
@ -782,7 +782,7 @@ def create():
|
|||||||
temp_file = temp_dir + "/temp"
|
temp_file = temp_dir + "/temp"
|
||||||
export_data = []
|
export_data = []
|
||||||
param_data = []
|
param_data = []
|
||||||
for scan, param in zip(det_data, scan_table_source.data["param"]):
|
for scan, param in zip(dataset, scan_table_source.data["param"]):
|
||||||
if scan["export"] and param:
|
if scan["export"] and param:
|
||||||
export_data.append(scan)
|
export_data.append(scan)
|
||||||
param_data.append(param)
|
param_data.append(param)
|
||||||
|
@ -93,9 +93,9 @@ def load_1D(filepath):
|
|||||||
"""
|
"""
|
||||||
with open(filepath, "r") as infile:
|
with open(filepath, "r") as infile:
|
||||||
_, ext = os.path.splitext(filepath)
|
_, ext = os.path.splitext(filepath)
|
||||||
det_variables = parse_1D(infile, data_type=ext)
|
dataset = parse_1D(infile, data_type=ext)
|
||||||
|
|
||||||
return det_variables
|
return dataset
|
||||||
|
|
||||||
|
|
||||||
def parse_1D(fileobj, data_type):
|
def parse_1D(fileobj, data_type):
|
||||||
@ -133,7 +133,7 @@ def parse_1D(fileobj, data_type):
|
|||||||
metadata["zebra_mode"] = "nb"
|
metadata["zebra_mode"] = "nb"
|
||||||
|
|
||||||
# read data
|
# read data
|
||||||
scan = []
|
dataset = []
|
||||||
if data_type == ".ccl":
|
if data_type == ".ccl":
|
||||||
ccl_first_line = CCL_FIRST_LINE + CCL_ANGLES[metadata["zebra_mode"]]
|
ccl_first_line = CCL_FIRST_LINE + CCL_ANGLES[metadata["zebra_mode"]]
|
||||||
ccl_second_line = CCL_SECOND_LINE
|
ccl_second_line = CCL_SECOND_LINE
|
||||||
@ -143,47 +143,49 @@ def parse_1D(fileobj, data_type):
|
|||||||
if not line or line.isspace():
|
if not line or line.isspace():
|
||||||
continue
|
continue
|
||||||
|
|
||||||
s = {}
|
scan = {}
|
||||||
s["export"] = True
|
scan["export"] = True
|
||||||
|
|
||||||
# first line
|
# first line
|
||||||
for param, (param_name, param_type) in zip(line.split(), ccl_first_line):
|
for param, (param_name, param_type) in zip(line.split(), ccl_first_line):
|
||||||
s[param_name] = param_type(param)
|
scan[param_name] = param_type(param)
|
||||||
|
|
||||||
# second line
|
# second line
|
||||||
next_line = next(fileobj)
|
next_line = next(fileobj)
|
||||||
for param, (param_name, param_type) in zip(next_line.split(), ccl_second_line):
|
for param, (param_name, param_type) in zip(next_line.split(), ccl_second_line):
|
||||||
s[param_name] = param_type(param)
|
scan[param_name] = param_type(param)
|
||||||
|
|
||||||
if s["scan_motor"] != "om":
|
if scan["scan_motor"] != "om":
|
||||||
raise Exception("Unsupported variable name in ccl file.")
|
raise Exception("Unsupported variable name in ccl file.")
|
||||||
|
|
||||||
# "om" -> "omega"
|
# "om" -> "omega"
|
||||||
s["scan_motor"] = "omega"
|
scan["scan_motor"] = "omega"
|
||||||
s["scan_motors"] = ["omega", ]
|
scan["scan_motors"] = ["omega", ]
|
||||||
# overwrite metadata, because it only refers to the scan center
|
# overwrite metadata, because it only refers to the scan center
|
||||||
half_dist = (s["n_points"] - 1) / 2 * s["angle_step"]
|
half_dist = (scan["n_points"] - 1) / 2 * scan["angle_step"]
|
||||||
s["omega"] = np.linspace(s["omega"] - half_dist, s["omega"] + half_dist, s["n_points"])
|
scan["omega"] = np.linspace(
|
||||||
|
scan["omega"] - half_dist, scan["omega"] + half_dist, scan["n_points"]
|
||||||
|
)
|
||||||
|
|
||||||
# subsequent lines with counts
|
# subsequent lines with counts
|
||||||
counts = []
|
counts = []
|
||||||
while len(counts) < s["n_points"]:
|
while len(counts) < scan["n_points"]:
|
||||||
counts.extend(map(float, next(fileobj).split()))
|
counts.extend(map(float, next(fileobj).split()))
|
||||||
s["counts"] = np.array(counts)
|
scan["counts"] = np.array(counts)
|
||||||
s["counts_err"] = np.sqrt(np.maximum(s["counts"], 1))
|
scan["counts_err"] = np.sqrt(np.maximum(scan["counts"], 1))
|
||||||
|
|
||||||
if s["h"].is_integer() and s["k"].is_integer() and s["l"].is_integer():
|
if scan["h"].is_integer() and scan["k"].is_integer() and scan["l"].is_integer():
|
||||||
s["h"], s["k"], s["l"] = map(int, (s["h"], s["k"], s["l"]))
|
scan["h"], scan["k"], scan["l"] = map(int, (scan["h"], scan["k"], scan["l"]))
|
||||||
|
|
||||||
scan.append({**metadata, **s})
|
dataset.append({**metadata, **scan})
|
||||||
|
|
||||||
elif data_type == ".dat":
|
elif data_type == ".dat":
|
||||||
# TODO: this might need to be adapted in the future, when "gamma" will be added to dat files
|
# TODO: this might need to be adapted in the future, when "gamma" will be added to dat files
|
||||||
if metadata["zebra_mode"] == "nb":
|
if metadata["zebra_mode"] == "nb":
|
||||||
metadata["gamma"] = metadata["twotheta"]
|
metadata["gamma"] = metadata["twotheta"]
|
||||||
|
|
||||||
s = defaultdict(list)
|
scan = defaultdict(list)
|
||||||
s["export"] = True
|
scan["export"] = True
|
||||||
|
|
||||||
match = re.search("Scanning Variables: (.*), Steps: (.*)", next(fileobj))
|
match = re.search("Scanning Variables: (.*), Steps: (.*)", next(fileobj))
|
||||||
motors = [motor.lower() for motor in match.group(1).split(", ")]
|
motors = [motor.lower() for motor in match.group(1).split(", ")]
|
||||||
@ -192,8 +194,8 @@ def parse_1D(fileobj, data_type):
|
|||||||
match = re.search("(.*) Points, Mode: (.*), Preset (.*)", next(fileobj))
|
match = re.search("(.*) Points, Mode: (.*), Preset (.*)", next(fileobj))
|
||||||
if match.group(2) != "Monitor":
|
if match.group(2) != "Monitor":
|
||||||
raise Exception("Unknown mode in dat file.")
|
raise Exception("Unknown mode in dat file.")
|
||||||
s["n_points"] = int(match.group(1))
|
scan["n_points"] = int(match.group(1))
|
||||||
s["monitor"] = float(match.group(3))
|
scan["monitor"] = float(match.group(3))
|
||||||
|
|
||||||
col_names = list(map(str.lower, next(fileobj).split()))
|
col_names = list(map(str.lower, next(fileobj).split()))
|
||||||
|
|
||||||
@ -203,56 +205,56 @@ def parse_1D(fileobj, data_type):
|
|||||||
break
|
break
|
||||||
|
|
||||||
for name, val in zip(col_names, line.split()):
|
for name, val in zip(col_names, line.split()):
|
||||||
s[name].append(float(val))
|
scan[name].append(float(val))
|
||||||
|
|
||||||
for name in col_names:
|
for name in col_names:
|
||||||
s[name] = np.array(s[name])
|
scan[name] = np.array(scan[name])
|
||||||
|
|
||||||
s["counts_err"] = np.sqrt(np.maximum(s["counts"], 1))
|
scan["counts_err"] = np.sqrt(np.maximum(scan["counts"], 1))
|
||||||
|
|
||||||
s["scan_motors"] = []
|
scan["scan_motors"] = []
|
||||||
for motor, step in zip(motors, steps):
|
for motor, step in zip(motors, steps):
|
||||||
if step == 0:
|
if step == 0:
|
||||||
# it's not a scan motor, so keep only the median value
|
# it's not a scan motor, so keep only the median value
|
||||||
s[motor] = np.median(s[motor])
|
scan[motor] = np.median(scan[motor])
|
||||||
else:
|
else:
|
||||||
s["scan_motors"].append(motor)
|
scan["scan_motors"].append(motor)
|
||||||
|
|
||||||
# "om" -> "omega"
|
# "om" -> "omega"
|
||||||
if "om" in s["scan_motors"]:
|
if "om" in scan["scan_motors"]:
|
||||||
s["scan_motors"][s["scan_motors"].index("om")] = "omega"
|
scan["scan_motors"][scan["scan_motors"].index("om")] = "omega"
|
||||||
s["omega"] = s["om"]
|
scan["omega"] = scan["om"]
|
||||||
del s["om"]
|
del scan["om"]
|
||||||
|
|
||||||
# "tt" -> "temp"
|
# "tt" -> "temp"
|
||||||
if "tt" in s["scan_motors"]:
|
if "tt" in scan["scan_motors"]:
|
||||||
s["scan_motors"][s["scan_motors"].index("tt")] = "temp"
|
scan["scan_motors"][scan["scan_motors"].index("tt")] = "temp"
|
||||||
s["temp"] = s["tt"]
|
scan["temp"] = scan["tt"]
|
||||||
del s["tt"]
|
del scan["tt"]
|
||||||
|
|
||||||
# "mf" stays "mf"
|
# "mf" stays "mf"
|
||||||
# "phi" stays "phi"
|
# "phi" stays "phi"
|
||||||
|
|
||||||
s["scan_motor"] = s["scan_motors"][0]
|
scan["scan_motor"] = scan["scan_motors"][0]
|
||||||
|
|
||||||
if "h" not in s:
|
if "h" not in scan:
|
||||||
s["h"] = s["k"] = s["l"] = float("nan")
|
scan["h"] = scan["k"] = scan["l"] = float("nan")
|
||||||
|
|
||||||
for param in ("mf", "temp"):
|
for param in ("mf", "temp"):
|
||||||
if param not in metadata:
|
if param not in metadata:
|
||||||
s[param] = 0
|
scan[param] = 0
|
||||||
|
|
||||||
s["idx"] = 1
|
scan["idx"] = 1
|
||||||
|
|
||||||
scan.append({**metadata, **s})
|
dataset.append({**metadata, **scan})
|
||||||
|
|
||||||
else:
|
else:
|
||||||
print("Unknown file extention")
|
print("Unknown file extention")
|
||||||
|
|
||||||
return scan
|
return dataset
|
||||||
|
|
||||||
|
|
||||||
def export_1D(data, path, export_target, hkl_precision=2):
|
def export_1D(dataset, path, export_target, hkl_precision=2):
|
||||||
"""Exports data in the .comm/.incomm format for fullprof or .col/.incol format for jana.
|
"""Exports data in the .comm/.incomm format for fullprof or .col/.incol format for jana.
|
||||||
|
|
||||||
Scans with integer/real hkl values are saved in .comm/.incomm or .col/.incol files
|
Scans with integer/real hkl values are saved in .comm/.incomm or .col/.incol files
|
||||||
@ -262,11 +264,11 @@ def export_1D(data, path, export_target, hkl_precision=2):
|
|||||||
if export_target not in EXPORT_TARGETS:
|
if export_target not in EXPORT_TARGETS:
|
||||||
raise ValueError(f"Unknown export target: {export_target}.")
|
raise ValueError(f"Unknown export target: {export_target}.")
|
||||||
|
|
||||||
zebra_mode = data[0]["zebra_mode"]
|
zebra_mode = dataset[0]["zebra_mode"]
|
||||||
exts = EXPORT_TARGETS[export_target]
|
exts = EXPORT_TARGETS[export_target]
|
||||||
file_content = {ext: [] for ext in exts}
|
file_content = {ext: [] for ext in exts}
|
||||||
|
|
||||||
for scan in data:
|
for scan in dataset:
|
||||||
if "fit" not in scan:
|
if "fit" not in scan:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@ -306,7 +308,7 @@ def export_1D(data, path, export_target, hkl_precision=2):
|
|||||||
out_file.writelines(content)
|
out_file.writelines(content)
|
||||||
|
|
||||||
|
|
||||||
def export_ccl_compare(data1, data2, path, export_target, hkl_precision=2):
|
def export_ccl_compare(dataset1, dataset2, path, export_target, hkl_precision=2):
|
||||||
"""Exports compare data in the .comm/.incomm format for fullprof or .col/.incol format for jana.
|
"""Exports compare data in the .comm/.incomm format for fullprof or .col/.incol format for jana.
|
||||||
|
|
||||||
Scans with integer/real hkl values are saved in .comm/.incomm or .col/.incol files
|
Scans with integer/real hkl values are saved in .comm/.incomm or .col/.incol files
|
||||||
@ -316,11 +318,11 @@ def export_ccl_compare(data1, data2, path, export_target, hkl_precision=2):
|
|||||||
if export_target not in EXPORT_TARGETS:
|
if export_target not in EXPORT_TARGETS:
|
||||||
raise ValueError(f"Unknown export target: {export_target}.")
|
raise ValueError(f"Unknown export target: {export_target}.")
|
||||||
|
|
||||||
zebra_mode = data1[0]["zebra_mode"]
|
zebra_mode = dataset1[0]["zebra_mode"]
|
||||||
exts = EXPORT_TARGETS[export_target]
|
exts = EXPORT_TARGETS[export_target]
|
||||||
file_content = {ext: [] for ext in exts}
|
file_content = {ext: [] for ext in exts}
|
||||||
|
|
||||||
for scan1, scan2 in zip(data1, data2):
|
for scan1, scan2 in zip(dataset1, dataset2):
|
||||||
if "fit" not in scan1:
|
if "fit" not in scan1:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@ -363,9 +365,9 @@ def export_ccl_compare(data1, data2, path, export_target, hkl_precision=2):
|
|||||||
out_file.writelines(content)
|
out_file.writelines(content)
|
||||||
|
|
||||||
|
|
||||||
def export_param_study(data, param_data, path):
|
def export_param_study(dataset, param_data, path):
|
||||||
file_content = []
|
file_content = []
|
||||||
for scan, param in zip(data, param_data):
|
for scan, param in zip(dataset, param_data):
|
||||||
if "fit" not in scan:
|
if "fit" not in scan:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import os
|
import os
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
from lmfit.models import Gaussian2dModel, GaussianModel, LinearModel, PseudoVoigtModel, VoigtModel
|
from lmfit.models import GaussianModel, LinearModel, PseudoVoigtModel, VoigtModel
|
||||||
from scipy.integrate import simpson, trapezoid
|
from scipy.integrate import simpson, trapezoid
|
||||||
|
|
||||||
from .ccl_io import CCL_ANGLES
|
from .ccl_io import CCL_ANGLES
|
||||||
@ -259,31 +259,3 @@ def get_area(scan, area_method, lorentz):
|
|||||||
area_s = np.abs(area_s * corr_factor)
|
area_s = np.abs(area_s * corr_factor)
|
||||||
|
|
||||||
scan["area"] = (area_v, area_s)
|
scan["area"] = (area_v, area_s)
|
||||||
|
|
||||||
|
|
||||||
def fit_event(scan, fr_from, fr_to, y_from, y_to, x_from, x_to):
|
|
||||||
data_roi = scan["data"][fr_from:fr_to, y_from:y_to, x_from:x_to]
|
|
||||||
|
|
||||||
model = GaussianModel()
|
|
||||||
fr = np.arange(fr_from, fr_to)
|
|
||||||
counts_per_fr = np.sum(data_roi, axis=(1, 2))
|
|
||||||
params = model.guess(counts_per_fr, fr)
|
|
||||||
result = model.fit(counts_per_fr, x=fr, params=params)
|
|
||||||
frC = result.params["center"].value
|
|
||||||
intensity = result.params["height"].value
|
|
||||||
|
|
||||||
counts_std = counts_per_fr.std()
|
|
||||||
counts_mean = counts_per_fr.mean()
|
|
||||||
snr = 0 if counts_std == 0 else counts_mean / counts_std
|
|
||||||
|
|
||||||
model = Gaussian2dModel()
|
|
||||||
xs, ys = np.meshgrid(np.arange(x_from, x_to), np.arange(y_from, y_to))
|
|
||||||
xs = xs.flatten()
|
|
||||||
ys = ys.flatten()
|
|
||||||
counts = np.sum(data_roi, axis=0).flatten()
|
|
||||||
params = model.guess(counts, xs, ys)
|
|
||||||
result = model.fit(counts, x=xs, y=ys, params=params)
|
|
||||||
xC = result.params["centerx"].value
|
|
||||||
yC = result.params["centery"].value
|
|
||||||
|
|
||||||
scan["fit"] = {"frame": frC, "x_pos": xC, "y_pos": yC, "intensity": intensity, "snr": snr}
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import h5py
|
import h5py
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
from lmfit.models import Gaussian2dModel, GaussianModel
|
||||||
|
|
||||||
META_MATRIX = ("UB")
|
META_MATRIX = ("UB")
|
||||||
META_CELL = ("cell")
|
META_CELL = ("cell")
|
||||||
@ -74,69 +74,97 @@ def read_detector_data(filepath, cami_meta=None):
|
|||||||
n, cols, rows = data.shape
|
n, cols, rows = data.shape
|
||||||
data = data.reshape(n, rows, cols)
|
data = data.reshape(n, rows, cols)
|
||||||
|
|
||||||
det_data = {"data": data}
|
scan = {"data": data}
|
||||||
det_data["original_filename"] = filepath
|
scan["original_filename"] = filepath
|
||||||
|
|
||||||
if "/entry1/zebra_mode" in h5f:
|
if "/entry1/zebra_mode" in h5f:
|
||||||
det_data["zebra_mode"] = h5f["/entry1/zebra_mode"][0].decode()
|
scan["zebra_mode"] = h5f["/entry1/zebra_mode"][0].decode()
|
||||||
else:
|
else:
|
||||||
det_data["zebra_mode"] = "nb"
|
scan["zebra_mode"] = "nb"
|
||||||
|
|
||||||
# overwrite zebra_mode from cami
|
# overwrite zebra_mode from cami
|
||||||
if cami_meta is not None:
|
if cami_meta is not None:
|
||||||
if "zebra_mode" in cami_meta:
|
if "zebra_mode" in cami_meta:
|
||||||
det_data["zebra_mode"] = cami_meta["zebra_mode"][0]
|
scan["zebra_mode"] = cami_meta["zebra_mode"][0]
|
||||||
|
|
||||||
# om, sometimes ph
|
# om, sometimes ph
|
||||||
if det_data["zebra_mode"] == "nb":
|
if scan["zebra_mode"] == "nb":
|
||||||
det_data["omega"] = h5f["/entry1/area_detector2/rotation_angle"][:]
|
scan["omega"] = h5f["/entry1/area_detector2/rotation_angle"][:]
|
||||||
else: # bi
|
else: # bi
|
||||||
det_data["omega"] = h5f["/entry1/sample/rotation_angle"][:]
|
scan["omega"] = h5f["/entry1/sample/rotation_angle"][:]
|
||||||
|
|
||||||
det_data["gamma"] = h5f["/entry1/ZEBRA/area_detector2/polar_angle"][:] # gammad
|
scan["gamma"] = h5f["/entry1/ZEBRA/area_detector2/polar_angle"][:] # gammad
|
||||||
det_data["nu"] = h5f["/entry1/ZEBRA/area_detector2/tilt_angle"][:] # nud
|
scan["nu"] = h5f["/entry1/ZEBRA/area_detector2/tilt_angle"][:] # nud
|
||||||
det_data["ddist"] = h5f["/entry1/ZEBRA/area_detector2/distance"][:]
|
scan["ddist"] = h5f["/entry1/ZEBRA/area_detector2/distance"][:]
|
||||||
det_data["wave"] = h5f["/entry1/ZEBRA/monochromator/wavelength"][:]
|
scan["wave"] = h5f["/entry1/ZEBRA/monochromator/wavelength"][:]
|
||||||
det_data["chi"] = h5f["/entry1/sample/chi"][:] # ch
|
scan["chi"] = h5f["/entry1/sample/chi"][:] # ch
|
||||||
det_data["phi"] = h5f["/entry1/sample/phi"][:] # ph
|
scan["phi"] = h5f["/entry1/sample/phi"][:] # ph
|
||||||
det_data["ub"] = h5f["/entry1/sample/UB"][:].reshape(3, 3)
|
scan["ub"] = h5f["/entry1/sample/UB"][:].reshape(3, 3)
|
||||||
det_data["name"] = h5f["/entry1/sample/name"][0].decode()
|
scan["name"] = h5f["/entry1/sample/name"][0].decode()
|
||||||
det_data["cell"] = h5f["/entry1/sample/cell"][:]
|
scan["cell"] = h5f["/entry1/sample/cell"][:]
|
||||||
|
|
||||||
if n == 1:
|
if n == 1:
|
||||||
# a default motor for a single frame file
|
# a default motor for a single frame file
|
||||||
det_data["scan_motor"] = "omega"
|
scan["scan_motor"] = "omega"
|
||||||
else:
|
else:
|
||||||
for var in ("omega", "gamma", "nu", "chi", "phi"):
|
for var in ("omega", "gamma", "nu", "chi", "phi"):
|
||||||
if abs(det_data[var][0] - det_data[var][-1]) > 0.1:
|
if abs(scan[var][0] - scan[var][-1]) > 0.1:
|
||||||
det_data["scan_motor"] = var
|
scan["scan_motor"] = var
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
raise ValueError("No angles that vary")
|
raise ValueError("No angles that vary")
|
||||||
|
|
||||||
# optional parameters
|
# optional parameters
|
||||||
if "/entry1/sample/magnetic_field" in h5f:
|
if "/entry1/sample/magnetic_field" in h5f:
|
||||||
det_data["mf"] = h5f["/entry1/sample/magnetic_field"][:]
|
scan["mf"] = h5f["/entry1/sample/magnetic_field"][:]
|
||||||
|
|
||||||
if "/entry1/sample/temperature" in h5f:
|
if "/entry1/sample/temperature" in h5f:
|
||||||
det_data["temp"] = h5f["/entry1/sample/temperature"][:]
|
scan["temp"] = h5f["/entry1/sample/temperature"][:]
|
||||||
|
|
||||||
# overwrite metadata from .cami
|
# overwrite metadata from .cami
|
||||||
if cami_meta is not None:
|
if cami_meta is not None:
|
||||||
if "crystal" in cami_meta:
|
if "crystal" in cami_meta:
|
||||||
cami_meta_crystal = cami_meta["crystal"]
|
cami_meta_crystal = cami_meta["crystal"]
|
||||||
if "name" in cami_meta_crystal:
|
if "name" in cami_meta_crystal:
|
||||||
det_data["name"] = cami_meta_crystal["name"]
|
scan["name"] = cami_meta_crystal["name"]
|
||||||
if "UB" in cami_meta_crystal:
|
if "UB" in cami_meta_crystal:
|
||||||
det_data["ub"] = cami_meta_crystal["UB"]
|
scan["ub"] = cami_meta_crystal["UB"]
|
||||||
if "cell" in cami_meta_crystal:
|
if "cell" in cami_meta_crystal:
|
||||||
det_data["cell"] = cami_meta_crystal["cell"]
|
scan["cell"] = cami_meta_crystal["cell"]
|
||||||
if "lambda" in cami_meta_crystal:
|
if "lambda" in cami_meta_crystal:
|
||||||
det_data["wave"] = cami_meta_crystal["lambda"]
|
scan["wave"] = cami_meta_crystal["lambda"]
|
||||||
|
|
||||||
if "detector parameters" in cami_meta:
|
if "detector parameters" in cami_meta:
|
||||||
cami_meta_detparam = cami_meta["detector parameters"]
|
cami_meta_detparam = cami_meta["detector parameters"]
|
||||||
if "dist2" in cami_meta_detparam:
|
if "dist2" in cami_meta_detparam:
|
||||||
det_data["ddist"] = cami_meta_detparam["dist2"]
|
scan["ddist"] = cami_meta_detparam["dist2"]
|
||||||
|
|
||||||
return det_data
|
return scan
|
||||||
|
|
||||||
|
|
||||||
|
def fit_event(scan, fr_from, fr_to, y_from, y_to, x_from, x_to):
|
||||||
|
data_roi = scan["data"][fr_from:fr_to, y_from:y_to, x_from:x_to]
|
||||||
|
|
||||||
|
model = GaussianModel()
|
||||||
|
fr = np.arange(fr_from, fr_to)
|
||||||
|
counts_per_fr = np.sum(data_roi, axis=(1, 2))
|
||||||
|
params = model.guess(counts_per_fr, fr)
|
||||||
|
result = model.fit(counts_per_fr, x=fr, params=params)
|
||||||
|
frC = result.params["center"].value
|
||||||
|
intensity = result.params["height"].value
|
||||||
|
|
||||||
|
counts_std = counts_per_fr.std()
|
||||||
|
counts_mean = counts_per_fr.mean()
|
||||||
|
snr = 0 if counts_std == 0 else counts_mean / counts_std
|
||||||
|
|
||||||
|
model = Gaussian2dModel()
|
||||||
|
xs, ys = np.meshgrid(np.arange(x_from, x_to), np.arange(y_from, y_to))
|
||||||
|
xs = xs.flatten()
|
||||||
|
ys = ys.flatten()
|
||||||
|
counts = np.sum(data_roi, axis=0).flatten()
|
||||||
|
params = model.guess(counts, xs, ys)
|
||||||
|
result = model.fit(counts, x=xs, y=ys, params=params)
|
||||||
|
xC = result.params["centerx"].value
|
||||||
|
yC = result.params["centery"].value
|
||||||
|
|
||||||
|
scan["fit"] = {"frame": frC, "x_pos": xC, "y_pos": yC, "intensity": intensity, "snr": snr}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user