diff --git a/.gitea/workflows/deploy.yaml b/.gitea/workflows/deploy.yaml
index 57a3c9e..f8abb3f 100644
--- a/.gitea/workflows/deploy.yaml
+++ b/.gitea/workflows/deploy.yaml
@@ -21,7 +21,7 @@ jobs:
uses: actions/checkout@v4
- run: $CONDA/bin/conda build --no-anaconda-upload --output-folder $BUILD_DIR ./conda-recipe
- run: $CONDA/bin/conda remove --name test --all --keep-env -y
- - run: $CONDA/bin/conda install --name test --channel $BUILD_DIR python=3.8 pyzebra -y
+ - run: $CONDA/bin/conda install --name test --channel $BUILD_DIR python=3.10 pyzebra -y
- run: sudo systemctl restart pyzebra-test.service
prod-env:
@@ -34,7 +34,7 @@ jobs:
uses: actions/checkout@v4
- run: $CONDA/bin/conda build --token ${{ secrets.ANACONDA_TOKEN }} --output-folder $BUILD_DIR ./conda-recipe
- run: $CONDA/bin/conda remove --name prod --all --keep-env -y
- - run: $CONDA/bin/conda install --name prod --channel $BUILD_DIR python=3.8 pyzebra -y
+ - run: $CONDA/bin/conda install --name prod --channel $BUILD_DIR python=3.10 pyzebra -y
- run: sudo systemctl restart pyzebra-prod.service
cleanup:
@@ -42,4 +42,4 @@ jobs:
needs: [test-env, prod-env]
if: always()
steps:
- - run: $CONDA/bin/conda build purge-all
\ No newline at end of file
+ - run: $CONDA/bin/conda build purge-all
diff --git a/pyproject.toml b/pyproject.toml
index c221ba0..5f682dd 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -5,12 +5,12 @@ build-backend = "hatchling.build"
[project]
name = "pyzebra"
dynamic = ["version"] # version will be read from __init__.py
-requires-python = ">=3.8"
+requires-python = ">=3.10"
dependencies = [
"numpy",
"scipy",
"h5py",
- "bokeh ~=2.4",
+ "bokeh ~=3.8",
"numba",
"lmfit >=1.0.2",
]
diff --git a/pyzebra/app/main.py b/pyzebra/app/main.py
index 98ecb41..bacd8d2 100644
--- a/pyzebra/app/main.py
+++ b/pyzebra/app/main.py
@@ -3,8 +3,8 @@ import logging
from io import StringIO
from bokeh.io import curdoc
-from bokeh.layouts import column, row
-from bokeh.models import Button, Panel, Tabs, TextAreaInput, TextInput
+from bokeh.layouts import column
+from bokeh.models import Button, TabPanel, Tabs, TextAreaInput, TextInput
import pyzebra
from pyzebra.app import (
@@ -55,14 +55,14 @@ logger.setLevel(logging.INFO)
logger.addHandler(handler)
doc.logger = logger
-log_textareainput = TextAreaInput(title="Logging output:")
+log_textareainput = TextAreaInput(title="Logging output:", sizing_mode="stretch_both")
def proposal_textinput_callback(_attr, _old, _new):
apply_button.disabled = False
-proposal_textinput = TextInput(title="Proposal number:", name="")
+proposal_textinput = TextInput(title="Proposal number:", name="", sizing_mode="stretch_width")
proposal_textinput.on_change("value_input", proposal_textinput_callback)
doc.proposal_textinput = proposal_textinput
@@ -82,7 +82,7 @@ def apply_button_callback():
proposal_textinput.name = proposal_path
-apply_button = Button(label="Apply", button_type="primary")
+apply_button = Button(label="Apply", button_type="primary", width=300)
apply_button.on_click(apply_button_callback)
# Final layout
@@ -90,7 +90,7 @@ doc.add_root(
column(
Tabs(
tabs=[
- Panel(child=column(proposal_textinput, apply_button), title="user config"),
+ TabPanel(child=column(proposal_textinput, apply_button), title="user config"),
panel_hdf_viewer.create(),
panel_hdf_anatric.create(),
panel_ccl_prepare.create(),
@@ -102,7 +102,8 @@ doc.add_root(
panel_spind.create(),
]
),
- row(log_textareainput, sizing_mode="scale_both"),
+ log_textareainput,
+ sizing_mode="stretch_height",
)
)
diff --git a/pyzebra/app/panel_ccl_compare.py b/pyzebra/app/panel_ccl_compare.py
index 0ea7fa3..7462cb8 100644
--- a/pyzebra/app/panel_ccl_compare.py
+++ b/pyzebra/app/panel_ccl_compare.py
@@ -15,13 +15,13 @@ from bokeh.models import (
Div,
FileInput,
MultiSelect,
- Panel,
RadioGroup,
Select,
Spacer,
Span,
Spinner,
TableColumn,
+ TabPanel,
TextAreaInput,
Whisker,
)
@@ -250,7 +250,8 @@ def create():
)
scatter1_source = ColumnDataSource(dict(x=[0], y=[0], y_upper=[0], y_lower=[0]))
- plot.circle(
+ plot.scatter(
+ marker="circle",
source=scatter1_source,
line_color="steelblue",
fill_color="steelblue",
@@ -259,7 +260,8 @@ def create():
plot.add_layout(Whisker(source=scatter1_source, base="x", upper="y_upper", lower="y_lower"))
scatter2_source = ColumnDataSource(dict(x=[0], y=[0], y_upper=[0], y_lower=[0]))
- plot.circle(
+ plot.scatter(
+ marker="circle",
source=scatter2_source,
line_color="firebrick",
fill_color="firebrick",
@@ -535,4 +537,4 @@ def create():
row(fitpeak_controls, app_fitctrl.result_textarea),
)
- return Panel(child=tab_layout, title="ccl compare")
+ return TabPanel(child=tab_layout, title="ccl compare")
diff --git a/pyzebra/app/panel_ccl_integrate.py b/pyzebra/app/panel_ccl_integrate.py
index a067a30..4bcf653 100644
--- a/pyzebra/app/panel_ccl_integrate.py
+++ b/pyzebra/app/panel_ccl_integrate.py
@@ -11,11 +11,11 @@ from bokeh.models import (
ColumnDataSource,
DataTable,
Div,
- Panel,
Select,
Spacer,
Span,
TableColumn,
+ TabPanel,
TextAreaInput,
Whisker,
)
@@ -121,8 +121,12 @@ def create():
)
scatter_source = ColumnDataSource(dict(x=[0], y=[0], y_upper=[0], y_lower=[0]))
- plot.circle(
- source=scatter_source, line_color="steelblue", fill_color="steelblue", legend_label="data"
+ plot.scatter(
+ marker="circle",
+ source=scatter_source,
+ line_color="steelblue",
+ fill_color="steelblue",
+ legend_label="data",
)
plot.add_layout(Whisker(source=scatter_source, base="x", upper="y_upper", lower="y_lower"))
@@ -364,4 +368,4 @@ def create():
row(fitpeak_controls, app_fitctrl.result_textarea),
)
- return Panel(child=tab_layout, title="ccl integrate")
+ return TabPanel(child=tab_layout, title="ccl integrate")
diff --git a/pyzebra/app/panel_ccl_prepare.py b/pyzebra/app/panel_ccl_prepare.py
index d1ec1c2..ae10926 100644
--- a/pyzebra/app/panel_ccl_prepare.py
+++ b/pyzebra/app/panel_ccl_prepare.py
@@ -20,11 +20,11 @@ from bokeh.models import (
MultiSelect,
NormalHead,
NumericInput,
- Panel,
RadioGroup,
Select,
Spacer,
Spinner,
+ TabPanel,
TextAreaInput,
TextInput,
)
@@ -89,7 +89,7 @@ def create():
ang_lims = pyzebra.read_geom_file(fileobj)
_update_ang_lims(ang_lims)
- open_geom_div = Div(text="Open GEOM:")
+ open_geom_div = Div(text="Open GEOM:", margin=(12, 5, 5, 5))
open_geom = FileInput(accept=".geom", width=200)
open_geom.on_change("value", open_geom_callback)
@@ -99,7 +99,7 @@ def create():
params = pyzebra.read_cfl_file(fileobj)
_update_params(params)
- open_cfl_div = Div(text="Open CFL:")
+ open_cfl_div = Div(text="Open CFL:", margin=(12, 5, 5, 5))
open_cfl = FileInput(accept=".cfl", width=200)
open_cfl.on_change("value", open_cfl_callback)
@@ -109,7 +109,7 @@ def create():
cif_data = pyzebra.read_cif_file(fileobj)
_update_params(cif_data)
- open_cif_div = Div(text="Open CIF:")
+ open_cif_div = Div(text="Open CIF:", margin=(12, 5, 5, 5))
open_cif = FileInput(accept=".cif", width=200)
open_cif.on_change("value", open_cif_callback)
@@ -145,7 +145,7 @@ def create():
ub_matrix_calc = Button(label="UB matrix:", button_type="primary", width=100)
ub_matrix_calc.on_click(ub_matrix_calc_callback)
- ub_matrix = TextInput(title="\u200B", width=600)
+ ub_matrix = TextInput(title="\u200b", width=600)
ranges_div = Div(text="Ranges:", margin=(5, 5, 0, 5))
ranges_hkl = TextInput(title="HKL", value="-25 25 -25 25 -25 25", width=250)
@@ -153,7 +153,7 @@ def create():
magstruct_div = Div(text="Magnetic structure:", margin=(5, 5, 0, 5))
magstruct_lattice = TextInput(title="lattice", width=100)
- magstruct_kvec = TextAreaInput(title="k vector", width=150)
+ magstruct_kvec = TextAreaInput(title="k vector", rows=3, width=150)
def sorting0_callback(_attr, _old, new):
sorting_0_dt.value = ANG_CHUNK_DEFAULTS[new]
@@ -321,7 +321,7 @@ def create():
plot_list.on_click(plot_list_callback)
# Plot
- upload_data_div = Div(text="Open hkl/mhkl data:")
+ upload_data_div = Div(text="Open hkl/mhkl data:", margin=(12, 5, 5, 5))
upload_data = FileInput(accept=".hkl,.mhkl", multiple=True, width=200)
min_grid_x = -10
@@ -667,7 +667,7 @@ def create():
)
k_vectors = TextAreaInput(
- title="k vectors:", value="0.0 0.0 0.0\n0.5 0.0 0.0\n0.5 0.5 0.0", width=150
+ title="k vectors:", value="0.0 0.0 0.0\n0.5 0.0 0.0\n0.5 0.5 0.0", rows=3, width=150
)
tol_k_ni = NumericInput(title="k tolerance:", value=0.01, mode="float", width=100)
@@ -721,4 +721,4 @@ def create():
tab_layout = row(column1_layout, column2_layout)
- return Panel(child=tab_layout, title="ccl prepare")
+ return TabPanel(child=tab_layout, title="ccl prepare")
diff --git a/pyzebra/app/panel_hdf_anatric.py b/pyzebra/app/panel_hdf_anatric.py
index e0db141..716a3e2 100644
--- a/pyzebra/app/panel_hdf_anatric.py
+++ b/pyzebra/app/panel_hdf_anatric.py
@@ -10,9 +10,9 @@ from bokeh.models import (
Button,
Div,
FileInput,
- Panel,
Select,
Spacer,
+ TabPanel,
Tabs,
TextAreaInput,
TextInput,
@@ -82,7 +82,7 @@ def create():
with io.BytesIO(base64.b64decode(new)) as file:
_load_config_file(file)
- upload_div = Div(text="Open .xml config:")
+ upload_div = Div(text="Open .xml config:", margin=(12, 5, 5, 5))
upload_button = FileInput(accept=".xml", width=200)
upload_button.on_change("value", upload_button_callback)
@@ -91,7 +91,9 @@ def create():
def logfile_textinput_callback(_attr, _old, new):
config.logfile = new
- logfile_textinput = TextInput(title="Logfile:", value="logfile.log")
+ logfile_textinput = TextInput(
+ title="Logfile:", value="logfile.log", sizing_mode="stretch_width"
+ )
logfile_textinput.on_change("value", logfile_textinput_callback)
def logfile_verbosity_callback(_attr, _old, new):
@@ -104,7 +106,7 @@ def create():
def filelist_type_callback(_attr, _old, new):
config.filelist_type = new
- filelist_type = Select(title="File List:", options=["TRICS", "SINQ"], width=100)
+ filelist_type = Select(title="File List:", options=["TRICS", "SINQ"], value="TRICS", width=100)
filelist_type.on_change("value", filelist_type_callback)
def filelist_format_textinput_callback(_attr, _old, new):
@@ -116,7 +118,7 @@ def create():
def filelist_datapath_textinput_callback(_attr, _old, new):
config.filelist_datapath = new
- filelist_datapath_textinput = TextInput(title="datapath:")
+ filelist_datapath_textinput = TextInput(title="datapath:", sizing_mode="stretch_width")
filelist_datapath_textinput.on_change("value", filelist_datapath_textinput_callback)
def filelist_ranges_textareainput_callback(_attr, _old, new):
@@ -125,7 +127,9 @@ def create():
ranges.append(re.findall(r"\b\d+\b", line))
config.filelist_ranges = ranges
- filelist_ranges_textareainput = TextAreaInput(title="ranges:", rows=1)
+ filelist_ranges_textareainput = TextAreaInput(
+ title="ranges:", rows=1, sizing_mode="stretch_width"
+ )
filelist_ranges_textareainput.on_change("value", filelist_ranges_textareainput_callback)
# ---- crystal
@@ -144,7 +148,7 @@ def create():
def ub_textareainput_callback(_attr, _old, new):
config.crystal_UB = new
- ub_textareainput = TextAreaInput(title="UB matrix:", height=100)
+ ub_textareainput = TextAreaInput(title="UB matrix:", height=100, sizing_mode="stretch_width")
ub_textareainput.on_change("value", ub_textareainput_callback)
def zeroOM_textinput_callback(_attr, _old, new):
@@ -170,7 +174,10 @@ def create():
config.dataFactory_implementation = new
dataFactory_implementation_select = Select(
- title="DataFactory implement.:", options=DATA_FACTORY_IMPLEMENTATION, width=145
+ title="DataFactory implement.:",
+ options=DATA_FACTORY_IMPLEMENTATION,
+ value=DATA_FACTORY_IMPLEMENTATION[0],
+ width=145,
)
dataFactory_implementation_select.on_change("value", dataFactory_implementation_select_callback)
@@ -201,7 +208,10 @@ def create():
config.reflectionPrinter_format = new
reflectionPrinter_format_select = Select(
- title="ReflectionPrinter format:", options=REFLECTION_PRINTER_FORMATS, width=145
+ title="ReflectionPrinter format:",
+ options=REFLECTION_PRINTER_FORMATS,
+ value=REFLECTION_PRINTER_FORMATS[0],
+ width=145,
)
reflectionPrinter_format_select.on_change("value", reflectionPrinter_format_select_callback)
@@ -325,14 +335,14 @@ def create():
algorithm_params = Tabs(
tabs=[
- Panel(
+ TabPanel(
child=column(
row(threshold_textinput, shell_textinput, steepness_textinput),
row(duplicateDistance_textinput, maxequal_textinput, aps_window_textinput),
),
title="Peak Search",
),
- Panel(
+ TabPanel(
child=column(
row(adm_window_textinput, border_textinput, minWindow_textinput),
row(reflectionFile_textinput, targetMonitor_textinput, smoothSize_textinput),
@@ -360,7 +370,7 @@ def create():
with open(os.path.join(temp_dir, config.reflectionPrinter_file)) as f_res:
output_res.value = f_res.read()
- process_button = Button(label="Process", button_type="primary")
+ process_button = Button(label="Process", button_type="primary", width=300)
process_button.on_click(process_button_callback)
output_log = TextAreaInput(title="Logfile output:", height=320, width=465, disabled=True)
@@ -368,8 +378,8 @@ def create():
output_config = TextAreaInput(title="Current config:", height=320, width=465, disabled=True)
general_params_layout = column(
- row(column(Spacer(height=2), upload_div), upload_button),
- row(logfile_textinput, logfile_verbosity),
+ row(upload_div, upload_button),
+ row(logfile_textinput, logfile_verbosity, sizing_mode="stretch_width"),
row(filelist_type, filelist_format_textinput),
filelist_datapath_textinput,
filelist_ranges_textareainput,
@@ -387,7 +397,7 @@ def create():
tab_layout = row(
general_params_layout,
- column(output_config, algorithm_params, row(process_button)),
+ column(output_config, algorithm_params, process_button),
column(output_log, output_res),
)
@@ -396,4 +406,4 @@ def create():
doc.add_periodic_callback(update_config, 1000)
- return Panel(child=tab_layout, title="hdf anatric")
+ return TabPanel(child=tab_layout, title="hdf anatric")
diff --git a/pyzebra/app/panel_hdf_param_study.py b/pyzebra/app/panel_hdf_param_study.py
index 1fcf567..d9aedf5 100644
--- a/pyzebra/app/panel_hdf_param_study.py
+++ b/pyzebra/app/panel_hdf_param_study.py
@@ -4,8 +4,9 @@ import os
import numpy as np
from bokeh.io import curdoc
-from bokeh.layouts import column, gridplot, row
+from bokeh.layouts import column, grid, row
from bokeh.models import (
+ BoxZoomTool,
Button,
CellEditor,
CheckboxGroup,
@@ -17,12 +18,15 @@ from bokeh.models import (
MultiSelect,
NumberEditor,
NumberFormatter,
- Panel,
+ PanTool,
Range1d,
+ ResetTool,
Select,
Spinner,
TableColumn,
+ TabPanel,
Tabs,
+ WheelZoomTool,
)
from bokeh.plotting import figure
@@ -293,6 +297,7 @@ def create():
frame_range = Range1d(0, 1, bounds=(0, 1))
scanning_motor_range = Range1d(0, 1, bounds=(0, 1))
color_mapper_proj = LinearColorMapper()
+ shared_tools = [PanTool(), BoxZoomTool(), WheelZoomTool(maintain_focus=False), ResetTool()]
det_x_range = Range1d(0, IMAGE_W, bounds=(0, IMAGE_W))
proj_x_plot = figure(
@@ -304,12 +309,11 @@ def create():
extra_y_ranges={"scanning_motor": scanning_motor_range},
height=540,
width=IMAGE_PLOT_W - 3,
- tools="pan,box_zoom,wheel_zoom,reset",
- active_scroll="wheel_zoom",
+ tools=shared_tools,
+ toolbar_location=None,
)
proj_x_plot.yaxis.major_label_orientation = "vertical"
- proj_x_plot.toolbar.tools[2].maintain_focus = False
proj_x_image_source = ColumnDataSource(
dict(image=[np.zeros((1, 1), dtype="float32")], x=[0], y=[0], dw=[IMAGE_W], dh=[1])
@@ -328,13 +332,13 @@ def create():
extra_y_ranges={"scanning_motor": scanning_motor_range},
height=540,
width=IMAGE_PLOT_H + 22,
- tools="pan,box_zoom,wheel_zoom,reset",
- active_scroll="wheel_zoom",
+ tools=shared_tools,
+ active_scroll=shared_tools[2],
)
proj_y_plot.yaxis.y_range_name = "scanning_motor"
proj_y_plot.yaxis.major_label_orientation = "vertical"
- proj_y_plot.toolbar.tools[2].maintain_focus = False
+ proj_y_plot.toolbar.logo = None
proj_y_image_source = ColumnDataSource(
dict(image=[np.zeros((1, 1), dtype="float32")], x=[0], y=[0], dw=[IMAGE_H], dh=[1])
@@ -418,7 +422,7 @@ def create():
)
param_scatter_source = ColumnDataSource(dict(x=[], y=[]))
- param_plot.circle(source=param_scatter_source)
+ param_plot.scatter(marker="circle", source=param_scatter_source)
param_plot.toolbar.logo = None
@@ -487,18 +491,13 @@ def create():
proc_all_button,
)
- layout_proj = column(
- gridplot(
- [[proj_x_plot, proj_y_plot]], toolbar_options={"logo": None}, toolbar_location="right"
- ),
- layout_controls,
- )
+ layout_proj = column(grid([[proj_x_plot, proj_y_plot]]), layout_controls)
# Plot tabs
plots = Tabs(
tabs=[
- Panel(child=layout_proj, title="single scan"),
- Panel(child=column(param_plot, row(fit_param_select)), title="parameter plot"),
+ TabPanel(child=layout_proj, title="single scan"),
+ TabPanel(child=column(param_plot, row(fit_param_select)), title="parameter plot"),
]
)
@@ -515,4 +514,4 @@ def create():
tab_layout = column(row(import_layout, scan_layout, plots))
- return Panel(child=tab_layout, title="hdf param study")
+ return TabPanel(child=tab_layout, title="hdf param study")
diff --git a/pyzebra/app/panel_hdf_viewer.py b/pyzebra/app/panel_hdf_viewer.py
index cc6381e..0eb41b0 100644
--- a/pyzebra/app/panel_hdf_viewer.py
+++ b/pyzebra/app/panel_hdf_viewer.py
@@ -5,9 +5,10 @@ import os
import numpy as np
from bokeh.events import MouseEnter
from bokeh.io import curdoc
-from bokeh.layouts import column, gridplot, row
+from bokeh.layouts import column, grid, row
from bokeh.models import (
BoxEditTool,
+ BoxZoomTool,
Button,
CellEditor,
CheckboxGroup,
@@ -21,15 +22,18 @@ from bokeh.models import (
LogColorMapper,
MultiSelect,
NumberFormatter,
- Panel,
+ PanTool,
RadioGroup,
Range1d,
+ ResetTool,
Select,
Slider,
Spacer,
Spinner,
TableColumn,
+ TabPanel,
Tabs,
+ WheelZoomTool,
)
from bokeh.plotting import figure
@@ -579,6 +583,7 @@ def create():
scanning_motor_range = Range1d(0, 1, bounds=(0, 1))
lin_color_mapper_proj = LinearColorMapper(low=0, high=1)
log_color_mapper_proj = LogColorMapper(low=0, high=1)
+ shared_tools = [PanTool(), BoxZoomTool(), WheelZoomTool(maintain_focus=False), ResetTool()]
det_x_range = Range1d(0, IMAGE_W, bounds=(0, IMAGE_W))
gamma_range = Range1d(0, 1, bounds=(0, 1))
@@ -592,12 +597,11 @@ def create():
extra_y_ranges={"scanning_motor": scanning_motor_range},
height=540,
width=IMAGE_PLOT_W - 3,
- tools="pan,box_zoom,wheel_zoom,reset",
- active_scroll="wheel_zoom",
+ tools=shared_tools,
+ toolbar_location=None,
)
proj_x_plot.yaxis.major_label_orientation = "vertical"
- proj_x_plot.toolbar.tools[2].maintain_focus = False
proj_x_plot.add_layout(LinearAxis(x_range_name="gamma", axis_label="Gamma, deg"), place="above")
@@ -620,13 +624,13 @@ def create():
extra_y_ranges={"scanning_motor": scanning_motor_range},
height=540,
width=IMAGE_PLOT_H + 22,
- tools="pan,box_zoom,wheel_zoom,reset",
- active_scroll="wheel_zoom",
+ tools=shared_tools,
+ active_scroll=shared_tools[2],
)
proj_y_plot.yaxis.y_range_name = "scanning_motor"
proj_y_plot.yaxis.major_label_orientation = "vertical"
- proj_y_plot.toolbar.tools[2].maintain_focus = False
+ proj_y_plot.toolbar.logo = None
proj_y_plot.add_layout(LinearAxis(x_range_name="nu", axis_label="Nu, deg"), place="above")
@@ -890,8 +894,8 @@ def create():
# Final layout
peak_tables = Tabs(
tabs=[
- Panel(child=events_table, title="Actual peak center"),
- Panel(child=detcenter_table, title="Peak in the detector center"),
+ TabPanel(child=events_table, title="Actual peak center"),
+ TabPanel(child=detcenter_table, title="Peak in the detector center"),
]
)
@@ -905,7 +909,7 @@ def create():
row(file_open_button, file_append_button),
)
- layout_image = column(gridplot([[proj_v, None], [plot, proj_h]], merge_tools=False))
+ layout_image = column(grid([[proj_v, None], [plot, proj_h]]))
colormap_layout = column(
row(colormap_select, column(Spacer(height=15), colormap_scale_rg)),
main_auto_checkbox,
@@ -919,11 +923,7 @@ def create():
row(column(add_event_button, remove_event_button), peak_tables),
)
- layout_proj = column(
- gridplot(
- [[proj_x_plot, proj_y_plot]], toolbar_options={"logo": None}, toolbar_location="right"
- )
- )
+ layout_proj = grid([[proj_x_plot, proj_y_plot]])
scan_layout = column(
scan_table,
@@ -937,7 +937,7 @@ def create():
column(roi_avg_plot, layout_image),
)
- return Panel(child=tab_layout, title="hdf viewer")
+ return TabPanel(child=tab_layout, title="hdf viewer")
def calculate_hkl(scan, index):
diff --git a/pyzebra/app/panel_param_study.py b/pyzebra/app/panel_param_study.py
index 5a8fe6f..903e02b 100644
--- a/pyzebra/app/panel_param_study.py
+++ b/pyzebra/app/panel_param_study.py
@@ -15,12 +15,12 @@ from bokeh.models import (
HoverTool,
LinearColorMapper,
NumberEditor,
- Panel,
Range1d,
Select,
Spacer,
Span,
TableColumn,
+ TabPanel,
Tabs,
TextAreaInput,
Whisker,
@@ -218,8 +218,12 @@ def create():
)
scatter_source = ColumnDataSource(dict(x=[0], y=[0], y_upper=[0], y_lower=[0]))
- plot.circle(
- source=scatter_source, line_color="steelblue", fill_color="steelblue", legend_label="data"
+ plot.scatter(
+ marker="circle",
+ source=scatter_source,
+ line_color="steelblue",
+ fill_color="steelblue",
+ legend_label="data",
)
plot.add_layout(Whisker(source=scatter_source, base="x", upper="y_upper", lower="y_lower"))
@@ -274,7 +278,7 @@ def create():
ov_param_plot.image(source=ov_param_image_source, color_mapper=color_mapper)
ov_param_scatter_source = ColumnDataSource(dict(x=[], y=[]))
- ov_param_plot.dot(source=ov_param_scatter_source, size=15, color="black")
+ ov_param_plot.scatter(marker="dot", source=ov_param_scatter_source, size=15, color="black")
ov_param_plot.toolbar.logo = None
@@ -288,7 +292,7 @@ def create():
)
param_scatter_source = ColumnDataSource(dict(x=[], y=[], y_upper=[], y_lower=[]))
- param_plot.circle(source=param_scatter_source)
+ param_plot.scatter(marker="circle", source=param_scatter_source)
param_plot.add_layout(
Whisker(source=param_scatter_source, base="x", upper="y_upper", lower="y_lower")
)
@@ -304,10 +308,10 @@ def create():
# Plot tabs
plots = Tabs(
tabs=[
- Panel(child=plot, title="single scan"),
- Panel(child=ov_plot, title="overview"),
- Panel(child=ov_param_plot, title="overview map"),
- Panel(child=column(param_plot, row(fit_param_select)), title="parameter plot"),
+ TabPanel(child=plot, title="single scan"),
+ TabPanel(child=ov_plot, title="overview"),
+ TabPanel(child=ov_param_plot, title="overview map"),
+ TabPanel(child=column(param_plot, row(fit_param_select)), title="parameter plot"),
]
)
@@ -515,4 +519,4 @@ def create():
row(fitpeak_controls, app_fitctrl.result_textarea),
)
- return Panel(child=tab_layout, title="param study")
+ return TabPanel(child=tab_layout, title="param study")
diff --git a/pyzebra/app/panel_plot_data.py b/pyzebra/app/panel_plot_data.py
index cc40f78..dc1d3ec 100644
--- a/pyzebra/app/panel_plot_data.py
+++ b/pyzebra/app/panel_plot_data.py
@@ -16,11 +16,11 @@ from bokeh.models import (
LinearColorMapper,
LogColorMapper,
NumericInput,
- Panel,
RadioGroup,
Select,
Spacer,
Spinner,
+ TabPanel,
TextInput,
)
from bokeh.plotting import figure
@@ -35,10 +35,10 @@ def create():
doc = curdoc()
log = doc.logger
_update_slice = None
- measured_data_div = Div(text="Measured HDF data:")
+ measured_data_div = Div(text="Measured HDF data:", margin=(12, 5, 5, 5))
measured_data = FileInput(accept=".hdf", multiple=True, width=200)
- upload_hkl_div = Div(text="Open hkl/mhkl data:")
+ upload_hkl_div = Div(text="Open hkl/mhkl data:", margin=(12, 5, 5, 5))
upload_hkl_fi = FileInput(accept=".hkl,.mhkl", multiple=True, width=200)
def _prepare_plotting():
@@ -439,4 +439,4 @@ def create():
tab_layout = row(column1_layout, Spacer(width=50), column2_layout)
- return Panel(child=tab_layout, title="plot data")
+ return TabPanel(child=tab_layout, title="plot data")
diff --git a/pyzebra/app/panel_spind.py b/pyzebra/app/panel_spind.py
index b3f2c22..4a79aa3 100644
--- a/pyzebra/app/panel_spind.py
+++ b/pyzebra/app/panel_spind.py
@@ -9,9 +9,9 @@ from bokeh.models import (
Button,
ColumnDataSource,
DataTable,
- Panel,
Spinner,
TableColumn,
+ TabPanel,
TextAreaInput,
TextInput,
)
@@ -156,7 +156,7 @@ def create():
results_table_source.data.update(spind_res)
- process_button = Button(label="Process", button_type="primary")
+ process_button = Button(label="Process", button_type="primary", width=300)
process_button.on_click(process_button_callback)
if doc.spind_path is None:
@@ -220,4 +220,4 @@ def create():
doc.add_periodic_callback(update_npeaks_spinner, 1000)
- return Panel(child=tab_layout, title="spind")
+ return TabPanel(child=tab_layout, title="spind")
diff --git a/pyzebra/app/plot_hkl.py b/pyzebra/app/plot_hkl.py
index f4349df..c3841b9 100644
--- a/pyzebra/app/plot_hkl.py
+++ b/pyzebra/app/plot_hkl.py
@@ -35,10 +35,10 @@ class PlotHKL:
log = doc.logger
_update_slice = None
- measured_data_div = Div(text="Measured CCL data:")
+ measured_data_div = Div(text="Measured CCL data:", margin=(12, 5, 5, 5))
measured_data = FileInput(accept=".ccl", multiple=True, width=200)
- upload_hkl_div = Div(text="Open hkl/mhkl data:")
+ upload_hkl_div = Div(text="Open hkl/mhkl data:", margin=(12, 5, 5, 5))
upload_hkl_fi = FileInput(accept=".hkl,.mhkl", multiple=True, width=200)
min_grid_x = -10
@@ -515,7 +515,7 @@ class PlotHKL:
)
k_vectors = TextAreaInput(
- title="k vectors:", value="0.0 0.0 0.0\n0.5 0.0 0.0\n0.5 0.5 0.0", width=150
+ title="k vectors:", value="0.0 0.0 0.0\n0.5 0.0 0.0\n0.5 0.5 0.0", rows=3, width=150
)
res_mult_ni = NumericInput(title="Resolution mult:", value=10, mode="int", width=100)
tol_k_ni = NumericInput(title="k tolerance:", value=0.01, mode="float", width=100)