From ccc075975f5f0cd96782b7f1a0e3dc6b2c8ebde9 Mon Sep 17 00:00:00 2001 From: Ivan Usov Date: Mon, 12 Apr 2021 16:35:30 +0200 Subject: [PATCH] Unify data files discovery via proposal number --- pyzebra/app/panel_ccl_integrate.py | 4 --- pyzebra/app/panel_hdf_viewer.py | 58 ++++++++++++++++-------------- pyzebra/app/panel_param_study.py | 4 --- 3 files changed, 32 insertions(+), 34 deletions(-) diff --git a/pyzebra/app/panel_ccl_integrate.py b/pyzebra/app/panel_ccl_integrate.py index 3dac9e7..b301a2b 100644 --- a/pyzebra/app/panel_ccl_integrate.py +++ b/pyzebra/app/panel_ccl_integrate.py @@ -97,11 +97,7 @@ def create(): merge_dest_select.options = merge_options merge_dest_select.value = merge_options[0][0] - def ccl_file_select_callback(_attr, _old, _new): - pass - file_select = MultiSelect(title="Available .ccl/.dat files:", width=210, height=250) - file_select.on_change("value", ccl_file_select_callback) def file_open_button_callback(): nonlocal det_data diff --git a/pyzebra/app/panel_hdf_viewer.py b/pyzebra/app/panel_hdf_viewer.py index df90884..a9c5dda 100644 --- a/pyzebra/app/panel_hdf_viewer.py +++ b/pyzebra/app/panel_hdf_viewer.py @@ -15,6 +15,7 @@ from bokeh.models import ( Div, FileInput, Grid, + MultiSelect, HoverTool, Image, Line, @@ -40,8 +41,8 @@ import pyzebra IMAGE_W = 256 IMAGE_H = 128 -IMAGE_PLOT_W = int(IMAGE_W * 2.5) -IMAGE_PLOT_H = int(IMAGE_H * 2.5) +IMAGE_PLOT_W = int(IMAGE_W * 2) + 52 +IMAGE_PLOT_H = int(IMAGE_H * 2) + 27 def create(): @@ -56,21 +57,19 @@ def create(): for file in os.listdir(proposal_path): if file.endswith(".hdf"): file_list.append((os.path.join(proposal_path, file), file)) - filelist.options = file_list - filelist.value = file_list[0][0] + file_select.options = file_list - proposal_textinput = TextInput(title="Enter proposal number:", width=145) + proposal_textinput = TextInput(title="Proposal number:", width=210) proposal_textinput.on_change("value", proposal_textinput_callback) def upload_button_callback(_attr, _old, new): with io.StringIO(base64.b64decode(new).decode()) as file: h5meta_list = pyzebra.parse_h5meta(file) file_list = h5meta_list["filelist"] - filelist.options = [(entry, os.path.basename(entry)) for entry in file_list] - filelist.value = file_list[0] + file_select.options = [(entry, os.path.basename(entry)) for entry in file_list] upload_div = Div(text="or upload .cami file:", margin=(5, 5, 0, 5)) - upload_button = FileInput(accept=".cami") + upload_button = FileInput(accept=".cami", width=200) upload_button.on_change("value", upload_button_callback) def update_image(index=None): @@ -154,9 +153,23 @@ def create(): scanning_motor_range.reset_end = var_end scanning_motor_range.bounds = (var_start, var_end) - def filelist_callback(_attr, _old, new): + def file_select_callback(_attr, old, new): nonlocal det_data - det_data = pyzebra.read_detector_data(new) + if not new: + # skip empty selections + return + + # Avoid selection of multiple indicies (via Shift+Click or Ctrl+Click) + if len(new) > 1: + # drop selection to the previous one + file_select.value = old + return + + if len(old) > 1: + # skip unnecessary update caused by selection drop + return + + det_data = pyzebra.read_detector_data(new[0]) index_spinner.value = 0 index_spinner.high = det_data["data"].shape[0] - 1 @@ -170,8 +183,8 @@ def create(): update_image(0) update_overview_plot() - filelist = Select(title="Available .hdf files:") - filelist.on_change("value", filelist_callback) + file_select = MultiSelect(title="Available .hdf files:", width=210, height=250) + file_select.on_change("value", file_select_callback) def index_spinner_callback(_attr, _old, new): update_image(new) @@ -321,7 +334,7 @@ def create(): y_range=frame_range, extra_y_ranges={"scanning_motor": scanning_motor_range}, plot_height=400, - plot_width=IMAGE_PLOT_W, + plot_width=IMAGE_PLOT_W - 3, ) # ---- tools @@ -359,7 +372,7 @@ def create(): y_range=frame_range, extra_y_ranges={"scanning_motor": scanning_motor_range}, plot_height=400, - plot_width=IMAGE_PLOT_H, + plot_width=IMAGE_PLOT_H + 22, ) # ---- tools @@ -398,7 +411,7 @@ def create(): roi_avg_plot = Plot( x_range=DataRange1d(), y_range=DataRange1d(), - plot_height=200, + plot_height=150, plot_width=IMAGE_PLOT_W, toolbar_location="left", ) @@ -548,7 +561,7 @@ def create(): int(np.ceil(frame_range.end)), ] - filename_id = filelist.value[-8:-4] + filename_id = file_select.value[0][-8:-4] if filename_id in roi_selection: roi_selection[f"{filename_id}"].append(selection) else: @@ -564,6 +577,7 @@ def create(): geometry_textinput = TextInput(title="Geometry:", width=120, disabled=True) # Final layout + import_layout = column(proposal_textinput, upload_div, upload_button, file_select) layout_image = column(gridplot([[proj_v, None], [plot, proj_h]], merge_tools=False)) colormap_layout = column( colormap, @@ -575,9 +589,6 @@ def create(): layout_controls = row( column(selection_button, selection_list), - Spacer(width=20), - column(colormap_layout), - Spacer(width=20), column(row(mf_spinner, temp_spinner), row(geometry_textinput, index_spinner), hkl_button), ) @@ -591,13 +602,8 @@ def create(): ) tab_layout = row( - column( - row( - proposal_textinput, filelist, Spacer(width=100), column(upload_div, upload_button), - ), - layout_overview, - layout_controls, - ), + column(import_layout, colormap_layout), + column(layout_overview, layout_controls), column(roi_avg_plot, layout_image), ) diff --git a/pyzebra/app/panel_param_study.py b/pyzebra/app/panel_param_study.py index ea174bf..06f06fa 100644 --- a/pyzebra/app/panel_param_study.py +++ b/pyzebra/app/panel_param_study.py @@ -108,11 +108,7 @@ def create(): param_select.value = "user defined" - def file_select_callback(_attr, _old, _new): - pass - file_select = MultiSelect(title="Available .dat files:", width=210, height=250) - file_select.on_change("value", file_select_callback) def file_open_button_callback(): nonlocal det_data