Unify proposal id for all tabs

For #36
This commit is contained in:
usov_i 2021-08-24 18:05:59 +02:00
parent 5de09d16ca
commit abf4750030
5 changed files with 93 additions and 58 deletions

View File

@ -4,7 +4,7 @@ from io import StringIO
from bokeh.io import curdoc from bokeh.io import curdoc
from bokeh.layouts import column, row from bokeh.layouts import column, row
from bokeh.models import Tabs, TextAreaInput from bokeh.models import Panel, Tabs, TextAreaInput, TextInput
import panel_ccl_integrate import panel_ccl_integrate
import panel_hdf_anatric import panel_hdf_anatric
@ -13,7 +13,6 @@ import panel_hdf_viewer
import panel_param_study import panel_param_study
import panel_spind import panel_spind
doc = curdoc() doc = curdoc()
sys.stdout = StringIO() sys.stdout = StringIO()
@ -26,11 +25,15 @@ bokeh_logger = logging.getLogger("bokeh")
bokeh_logger.addHandler(bokeh_handler) bokeh_logger.addHandler(bokeh_handler)
bokeh_log_textareainput = TextAreaInput(title="server output:", height=150) bokeh_log_textareainput = TextAreaInput(title="server output:", height=150)
proposal_textinput = TextInput(title="Proposal number:", width=210)
doc.proposal_textinput = proposal_textinput
# Final layout # Final layout
doc.add_root( doc.add_root(
column( column(
Tabs( Tabs(
tabs=[ tabs=[
Panel(child=proposal_textinput, title="user config"),
panel_hdf_viewer.create(), panel_hdf_viewer.create(),
panel_hdf_anatric.create(), panel_hdf_anatric.create(),
panel_ccl_integrate.create(), panel_ccl_integrate.create(),

View File

@ -105,7 +105,7 @@ def create():
def proposal_textinput_callback(_attr, _old, _new): def proposal_textinput_callback(_attr, _old, _new):
file_select_update_for_proposal() file_select_update_for_proposal()
proposal_textinput = TextInput(title="Proposal number:", width=210) proposal_textinput = doc.proposal_textinput
proposal_textinput.on_change("value", proposal_textinput_callback) proposal_textinput.on_change("value", proposal_textinput_callback)
def _init_datatable(): def _init_datatable():
@ -163,7 +163,6 @@ def create():
def upload_button_callback(_attr, _old, new): def upload_button_callback(_attr, _old, new):
nonlocal det_data nonlocal det_data
det_data = [] det_data = []
proposal_textinput.value = ""
for f_str, f_name in zip(new, upload_button.filename): for f_str, f_name in zip(new, upload_button.filename):
with io.StringIO(base64.b64decode(f_str).decode()) as file: with io.StringIO(base64.b64decode(f_str).decode()) as file:
base, ext = os.path.splitext(f_name) base, ext = os.path.splitext(f_name)
@ -598,7 +597,6 @@ def create():
) )
import_layout = column( import_layout = column(
proposal_textinput,
file_select, file_select,
row(file_open_button, file_append_button), row(file_open_button, file_append_button),
upload_div, upload_div,

View File

@ -56,42 +56,60 @@ def create():
num_formatter = NumberFormatter(format="0.00", nan_format="") num_formatter = NumberFormatter(format="0.00", nan_format="")
def file_select_update_for_proposal(): def file_select_update():
proposal = proposal_textinput.value.strip() if data_source.value == "proposal number":
if not proposal: proposal = proposal_textinput.value.strip()
return if not proposal:
file_select.options = []
return
for zebra_proposals_path in pyzebra.ZEBRA_PROPOSALS_PATHS: for zebra_proposals_path in pyzebra.ZEBRA_PROPOSALS_PATHS:
proposal_path = os.path.join(zebra_proposals_path, proposal) proposal_path = os.path.join(zebra_proposals_path, proposal)
if os.path.isdir(proposal_path): if os.path.isdir(proposal_path):
# found it # found it
break break
else: else:
raise ValueError(f"Can not find data for proposal '{proposal}'.") raise ValueError(f"Can not find data for proposal '{proposal}'.")
file_list = [] file_list = []
for file in os.listdir(proposal_path): for file in os.listdir(proposal_path):
if file.endswith(".hdf"): if file.endswith(".hdf"):
file_list.append((os.path.join(proposal_path, file), file)) file_list.append((os.path.join(proposal_path, file), file))
file_select.options = file_list file_select.options = file_list
doc.add_periodic_callback(file_select_update_for_proposal, 5000) 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)
doc.add_periodic_callback(file_select_update, 5000)
def proposal_textinput_callback(_attr, _old, _new): def proposal_textinput_callback(_attr, _old, _new):
nonlocal cami_meta file_select_update()
cami_meta = {}
file_select_update_for_proposal()
proposal_textinput = TextInput(title="Proposal number:", width=210) proposal_textinput = doc.proposal_textinput
proposal_textinput.on_change("value", proposal_textinput_callback) proposal_textinput.on_change("value", proposal_textinput_callback)
def upload_button_callback(_attr, _old, new): def upload_button_callback(_attr, _old, new):
nonlocal cami_meta nonlocal cami_meta
proposal_textinput.value = ""
with io.StringIO(base64.b64decode(new).decode()) as file: with io.StringIO(base64.b64decode(new).decode()) as file:
cami_meta = pyzebra.parse_h5meta(file) cami_meta = pyzebra.parse_h5meta(file)
file_list = cami_meta["filelist"] data_source.value = "cami file"
file_select.options = [(entry, os.path.basename(entry)) for entry in file_list] file_select_update()
upload_div = Div(text="or upload .cami file:", margin=(5, 5, 0, 5)) upload_div = Div(text="or upload .cami file:", margin=(5, 5, 0, 5))
upload_button = FileInput(accept=".cami", width=200) upload_button = FileInput(accept=".cami", width=200)
@ -603,7 +621,7 @@ def create():
# Final layout # Final layout
import_layout = column( import_layout = column(
proposal_textinput, data_source,
upload_div, upload_div,
upload_button, upload_button,
file_select, file_select,

View File

@ -59,42 +59,60 @@ def create():
num_formatter = NumberFormatter(format="0.00", nan_format="") num_formatter = NumberFormatter(format="0.00", nan_format="")
def file_select_update_for_proposal(): def file_select_update():
proposal = proposal_textinput.value.strip() if data_source.value == "proposal number":
if not proposal: proposal = proposal_textinput.value.strip()
return if not proposal:
file_select.options = []
return
for zebra_proposals_path in pyzebra.ZEBRA_PROPOSALS_PATHS: for zebra_proposals_path in pyzebra.ZEBRA_PROPOSALS_PATHS:
proposal_path = os.path.join(zebra_proposals_path, proposal) proposal_path = os.path.join(zebra_proposals_path, proposal)
if os.path.isdir(proposal_path): if os.path.isdir(proposal_path):
# found it # found it
break break
else: else:
raise ValueError(f"Can not find data for proposal '{proposal}'.") raise ValueError(f"Can not find data for proposal '{proposal}'.")
file_list = [] file_list = []
for file in os.listdir(proposal_path): for file in os.listdir(proposal_path):
if file.endswith(".hdf"): if file.endswith(".hdf"):
file_list.append((os.path.join(proposal_path, file), file)) file_list.append((os.path.join(proposal_path, file), file))
file_select.options = file_list file_select.options = file_list
doc.add_periodic_callback(file_select_update_for_proposal, 5000) 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)
doc.add_periodic_callback(file_select_update, 5000)
def proposal_textinput_callback(_attr, _old, _new): def proposal_textinput_callback(_attr, _old, _new):
nonlocal cami_meta file_select_update()
cami_meta = {}
file_select_update_for_proposal()
proposal_textinput = TextInput(title="Proposal number:", width=210) proposal_textinput = doc.proposal_textinput
proposal_textinput.on_change("value", proposal_textinput_callback) proposal_textinput.on_change("value", proposal_textinput_callback)
def upload_button_callback(_attr, _old, new): def upload_button_callback(_attr, _old, new):
nonlocal cami_meta nonlocal cami_meta
proposal_textinput.value = ""
with io.StringIO(base64.b64decode(new).decode()) as file: with io.StringIO(base64.b64decode(new).decode()) as file:
cami_meta = pyzebra.parse_h5meta(file) cami_meta = pyzebra.parse_h5meta(file)
file_list = cami_meta["filelist"] data_source.value = "cami file"
file_select.options = [(entry, os.path.basename(entry)) for entry in file_list] file_select_update()
upload_div = Div(text="or upload .cami file:", margin=(5, 5, 0, 5)) upload_div = Div(text="or upload .cami file:", margin=(5, 5, 0, 5))
upload_button = FileInput(accept=".cami", width=200) upload_button = FileInput(accept=".cami", width=200)
@ -731,7 +749,7 @@ def create():
) )
# Final layout # Final layout
import_layout = column(proposal_textinput, upload_div, upload_button, file_select) import_layout = column(data_source, upload_div, upload_button, file_select)
layout_image = column(gridplot([[proj_v, None], [plot, proj_h]], merge_tools=False)) layout_image = column(gridplot([[proj_v, None], [plot, proj_h]], merge_tools=False))
colormap_layout = column( colormap_layout = column(
colormap, colormap,

View File

@ -115,7 +115,7 @@ def create():
def proposal_textinput_callback(_attr, _old, _new): def proposal_textinput_callback(_attr, _old, _new):
file_select_update_for_proposal() file_select_update_for_proposal()
proposal_textinput = TextInput(title="Proposal number:", width=210) proposal_textinput = doc.proposal_textinput
proposal_textinput.on_change("value", proposal_textinput_callback) proposal_textinput.on_change("value", proposal_textinput_callback)
def _init_datatable(): def _init_datatable():
@ -178,7 +178,6 @@ def create():
def upload_button_callback(_attr, _old, new): def upload_button_callback(_attr, _old, new):
nonlocal det_data nonlocal det_data
det_data = [] det_data = []
proposal_textinput.value = ""
for f_str, f_name in zip(new, upload_button.filename): for f_str, f_name in zip(new, upload_button.filename):
with io.StringIO(base64.b64decode(f_str).decode()) as file: with io.StringIO(base64.b64decode(f_str).decode()) as file:
base, ext = os.path.splitext(f_name) base, ext = os.path.splitext(f_name)
@ -748,7 +747,6 @@ def create():
scan_layout = column(scan_table, row(monitor_spinner, scan_motor_select, param_select)) scan_layout = column(scan_table, row(monitor_spinner, scan_motor_select, param_select))
import_layout = column( import_layout = column(
proposal_textinput,
file_select, file_select,
row(file_open_button, file_append_button), row(file_open_button, file_append_button),
upload_div, upload_div,