Remove .cami support

For #70
This commit is contained in:
2026-05-12 10:52:25 +02:00
parent 4e4de0be8f
commit 22d1229384
3 changed files with 25 additions and 129 deletions
+10 -52
View File
@@ -1,5 +1,3 @@
import base64
import io
import os
import numpy as np
@@ -12,8 +10,6 @@ from bokeh.models import (
CheckboxGroup,
ColumnDataSource,
DataTable,
Div,
FileInput,
LinearColorMapper,
MultiSelect,
NumberEditor,
@@ -42,40 +38,19 @@ def create():
doc = curdoc()
log = doc.logger
dataset = []
cami_meta = {}
num_formatter = NumberFormatter(format="0.00", nan_format="")
def file_select_update():
if data_source.value == "proposal number":
proposal_path = proposal_textinput.name
if proposal_path:
file_list = []
for file in os.listdir(proposal_path):
if file.endswith(".hdf"):
file_list.append((os.path.join(proposal_path, file), file))
file_select.options = file_list
else:
file_select.options = []
else: # "cami file"
if not cami_meta:
file_select.options = []
return
file_list = cami_meta["filelist"]
file_select.options = [(entry, os.path.basename(entry)) for entry in file_list]
def data_source_callback(_attr, _old, _new):
file_select_update()
data_source = Select(
title="Data Source:",
value="proposal number",
options=["proposal number", "cami file"],
width=210,
)
data_source.on_change("value", data_source_callback)
proposal_path = proposal_textinput.name
if proposal_path:
file_list = []
for file in os.listdir(proposal_path):
if file.endswith(".hdf"):
file_list.append((os.path.join(proposal_path, file), file))
file_select.options = file_list
else:
file_select.options = []
doc.add_periodic_callback(file_select_update, 5000)
@@ -85,17 +60,6 @@ def create():
proposal_textinput = doc.proposal_textinput
proposal_textinput.on_change("name", proposal_textinput_callback)
def upload_button_callback(_attr, _old, new):
nonlocal cami_meta
with io.StringIO(base64.b64decode(new).decode()) as file:
cami_meta = pyzebra.parse_h5meta(file)
data_source.value = "cami file"
file_select_update()
upload_div = Div(text="or upload .cami file:", margin=(5, 5, 0, 5))
upload_button = FileInput(accept=".cami", width=200)
upload_button.on_change("value", upload_button_callback)
file_select = MultiSelect(title="Available .hdf files:", width=210, height=320)
def _init_datatable():
@@ -502,13 +466,7 @@ def create():
)
# Final layout
import_layout = column(
data_source,
upload_div,
upload_button,
file_select,
row(file_open_button, file_append_button),
)
import_layout = column(file_select, row(file_open_button, file_append_button))
scan_layout = column(scan_table, row(param_select, metadata_table))
+14 -53
View File
@@ -49,40 +49,19 @@ def create():
doc = curdoc()
log = doc.logger
dataset = []
cami_meta = {}
num_formatter = NumberFormatter(format="0.00", nan_format="")
def file_select_update():
if data_source.value == "proposal number":
proposal_path = proposal_textinput.name
if proposal_path:
file_list = []
for file in os.listdir(proposal_path):
if file.endswith(".hdf"):
file_list.append((os.path.join(proposal_path, file), file))
file_select.options = file_list
else:
file_select.options = []
else: # "cami file"
if not cami_meta:
file_select.options = []
return
file_list = cami_meta["filelist"]
file_select.options = [(entry, os.path.basename(entry)) for entry in file_list]
def data_source_callback(_attr, _old, _new):
file_select_update()
data_source = Select(
title="Data Source:",
value="proposal number",
options=["proposal number", "cami file"],
width=210,
)
data_source.on_change("value", data_source_callback)
proposal_path = proposal_textinput.name
if proposal_path:
file_list = []
for file in os.listdir(proposal_path):
if file.endswith(".hdf"):
file_list.append((os.path.join(proposal_path, file), file))
file_select.options = file_list
else:
file_select.options = []
doc.add_periodic_callback(file_select_update, 5000)
@@ -92,21 +71,10 @@ def create():
proposal_textinput = doc.proposal_textinput
proposal_textinput.on_change("name", proposal_textinput_callback)
def upload_cami_button_callback(_attr, _old, new):
nonlocal cami_meta
with io.StringIO(base64.b64decode(new).decode()) as file:
cami_meta = pyzebra.parse_h5meta(file)
data_source.value = "cami file"
file_select_update()
upload_cami_div = Div(text="or upload .cami file:", margin=(5, 5, 0, 5))
upload_cami_button = FileInput(accept=".cami", width=200)
upload_cami_button.on_change("value", upload_cami_button_callback)
def upload_hdf_button_callback(_attr, _old, new):
nonlocal dataset
try:
scan = pyzebra.read_detector_data(io.BytesIO(base64.b64decode(new)), None)
scan = pyzebra.read_detector_data(io.BytesIO(base64.b64decode(new)))
except Exception as e:
log.exception(e)
return
@@ -130,18 +98,17 @@ def create():
_init_datatable()
upload_hdf_div = Div(text="or upload .hdf file:", margin=(5, 5, 0, 5))
upload_hdf_div = Div(text="Upload .hdf file:", margin=(5, 5, 0, 5))
upload_hdf_button = FileInput(accept=".hdf", width=200)
upload_hdf_button.on_change("value", upload_hdf_button_callback)
def file_open_button_callback():
nonlocal dataset
new_data = []
cm = cami_meta if data_source.value == "cami file" else None
for f_path in file_select.value:
f_name = os.path.basename(f_path)
try:
file_data = [pyzebra.read_detector_data(f_path, cm)]
file_data = [pyzebra.read_detector_data(f_path)]
except Exception as e:
log.exception(e)
continue
@@ -165,7 +132,7 @@ def create():
for f_path in file_select.value:
f_name = os.path.basename(f_path)
try:
file_data = [pyzebra.read_detector_data(f_path, None)]
file_data = [pyzebra.read_detector_data(f_path)]
except Exception as e:
log.exception(e)
continue
@@ -900,13 +867,7 @@ def create():
)
import_layout = column(
data_source,
upload_cami_div,
upload_cami_button,
upload_hdf_div,
upload_hdf_button,
file_select,
row(file_open_button, file_append_button),
upload_hdf_div, upload_hdf_button, file_select, row(file_open_button, file_append_button)
)
layout_image = column(grid([[proj_v, None], [plot, proj_h]]))
+1 -24
View File
@@ -59,7 +59,7 @@ def parse_h5meta(file):
return content
def read_detector_data(filepath, cami_meta=None):
def read_detector_data(filepath):
"""Read detector data and angles from an h5 file.
Args:
@@ -87,11 +87,6 @@ def read_detector_data(filepath, cami_meta=None):
else:
scan["zebra_mode"] = "nb"
# overwrite zebra_mode from cami
if cami_meta is not None:
if "zebra_mode" in cami_meta:
scan["zebra_mode"] = cami_meta["zebra_mode"][0]
if "/entry1/control/Monitor" in h5f:
scan["monitor"] = h5f["/entry1/control/Monitor"][0]
else: # old path
@@ -163,24 +158,6 @@ def read_detector_data(filepath, cami_meta=None):
# this is not a great solution, but makes it safe to use the array in bokeh
scan["temp"] = np.where(np.isnan(scan["temp"]), None, scan["temp"])
# overwrite metadata from .cami
if cami_meta is not None:
if "crystal" in cami_meta:
cami_meta_crystal = cami_meta["crystal"]
if "name" in cami_meta_crystal:
scan["name"] = cami_meta_crystal["name"]
if "UB" in cami_meta_crystal:
scan["ub"] = cami_meta_crystal["UB"]
if "cell" in cami_meta_crystal:
scan["cell"] = cami_meta_crystal["cell"]
if "lambda" in cami_meta_crystal:
scan["wave"] = cami_meta_crystal["lambda"]
if "detector parameters" in cami_meta:
cami_meta_detparam = cami_meta["detector parameters"]
if "dist2" in cami_meta_detparam:
scan["ddist"] = cami_meta_detparam["dist2"]
return scan