Skip to content

Commit e8a6cfc

Browse files
committed
Finish UI except for plots
1 parent 3c84c55 commit e8a6cfc

3 files changed

Lines changed: 153 additions & 55 deletions

File tree

src/exphub/app/models/css_status.py

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,17 @@
22

33
from typing import Any, Dict
44

5-
from plotly.data import iris
65
from pydantic import BaseModel, Field
76

8-
IRIS_DATA = iris()
9-
10-
7+
# TODO: remove this, just for reference
118
bl12cssstatus_urlsrc = "https://status.sns.ornl.gov/dbwr/view.jsp?display=https%3A//webopi.sns.gov/bl12/files/bl12/opi/BL12_ADnED_2D_4x4.bob&macros=%7B%26quot%3BDET1%26quot%3B%3A%26quot%3BMain%20Detector%26quot%3B%2C%26quot%3BDET2%26quot%3B%3A%26quot%3BMain%20d-Space%26quot%3B%2C%26quot%3BDET3%26quot%3B%3A%26quot%3BMain%20q-Space%26quot%3B%2C%26quot%3BDET4%26quot%3B%3A%26quot%3BMain%204x4%20and%20ROI%20d-Space%26quot%3B%2C%26quot%3BDET5%26quot%3B%3A%26quot%3BMain%20ROI%20q-Space%26quot%3B%2C%26quot%3BIOCSTATS%26quot%3B%3A%26quot%3BBL12%3ACS%3AADnED%3A%26quot%3B%2C%26quot%3BP%26quot%3B%3A%26quot%3BBL12%3ADet%3A%26quot%3B%2C%26quot%3BR%26quot%3B%3A%26quot%3BN1%3A%26quot%3B%2C%26quot%3BTAB%26quot%3B%3A%26quot%3BMain%20Detector%26quot%3B%2C%26quot%3BTOPR%26quot%3B%3A%26quot%3BN1%3A%26quot%3B%2C%26quot%3BBL%26quot%3B%3A%26quot%3BBL12%26quot%3B%2C%26quot%3BDID%26quot%3B%3A%26quot%3BDID305%26quot%3B%2C%26quot%3BS%26quot%3B%3A%26quot%3BBL12%26quot%3B%7D"
129

1310

1411
class CSSStatusModel(BaseModel):
1512
"""Pydantic class for CSS status."""
1613

17-
plot_type: str = Field(default="Detector", title="Plot Type")
18-
# plot_type: str = Field(default="Preview", title="Plot Type")
19-
# plot_type_options: list[str] = ["heatmap", "scatter"]
20-
plot_type_options: list[str] = ["Detector", "D-space"]
21-
# init_image: bytes = save_webpage_as_image(bl12cssstatus_urlsrc)
22-
# plot_type_options: list[str] = ["Detector", "D-space", "Q-space", "4x4 and ROI D-space", "ROI Q-space", "IOCSTATS", "Det", "N1", "Main Detector", "N1", "BL12", "DID", "S"] # noqa
23-
# fig: go.Figure = Field(default=go.Figure(), title="Figure")
24-
screenshot: str = Field(default="")
25-
26-
# @computed_field # type: ignore
27-
# @property
28-
# def get_css_status(self) -> str:
29-
timestamp: float = Field(default=0.0, title="timestamp")
14+
active_plot: str = Field(default="0")
15+
active_details_plot: str = Field(default="3")
3016

17+
# TODO: would like a better way to handle this.
3118
pv_data: Dict[str, Any] = Field(default={})

src/exphub/app/views/css_status.py

Lines changed: 131 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from nova.trame.view.components import InputField
66
from nova.trame.view.layouts import GridLayout, HBoxLayout, VBoxLayout
7-
from trame.widgets import plotly
7+
from trame.widgets import client, plotly
88
from trame.widgets import vuetify3 as vuetify
99
from trame_client.widgets.core import AbstractElement
1010

@@ -29,13 +29,7 @@ def __new__(cls, pv_name: str, append: str = "", **kwargs: Any) -> AbstractEleme
2929

3030
return element
3131

32-
return super().__new__(
33-
cls,
34-
v_if=f"'{pv_name}' in model_cssstatus.pv_data",
35-
v_model=f"model_cssstatus.pv_data['{pv_name}']",
36-
readonly=readonly,
37-
**kwargs,
38-
)
32+
return super().__new__(cls, v_model=f"model_cssstatus.pv_data['{pv_name}']", readonly=readonly, **kwargs)
3933

4034

4135
class CSSStatusView:
@@ -49,7 +43,17 @@ def __init__(self, view_model: MainViewModel) -> None:
4943

5044
def create_ui(self) -> None:
5145
with VBoxLayout(classes="border-md mb-1 px-2 py-1", stretch=True):
52-
plotly.Figure()
46+
with client.DeepReactive("model_cssstatus"):
47+
with vuetify.VTabs(
48+
v_model="model_cssstatus.active_plot", classes="mb-1", style="height: 40px !important;"
49+
):
50+
vuetify.VTab("Detector", value=0)
51+
vuetify.VTab("d-Space", value=1)
52+
53+
with VBoxLayout(v_show="model_cssstatus.active_plot == 0", stretch=True):
54+
plotly.Figure()
55+
with VBoxLayout(v_show="model_cssstatus.active_plot == 1", stretch=True):
56+
plotly.Figure()
5357

5458
with HBoxLayout():
5559
PVInput("BL12:Det:N1:Det4:XY:Scale:ManualMin", label="Min")
@@ -78,30 +82,127 @@ def create_ui(self) -> None:
7882

7983
with GridLayout(columns=3, gap="0.25em", stretch=True):
8084
with VBoxLayout(classes="border-md pa-1", column_span=2):
81-
with vuetify.VTabs(classes="mb-1", style="height: 40px !important;"):
82-
vuetify.VTab("TOF (All Modules)")
83-
vuetify.VTab("d-Space (All Modules)")
84-
vuetify.VTab("q-Space (All Modules)")
85-
vuetify.VTab("d-Space (ROI Filtered)")
86-
vuetify.VTab("q-Space (ROI Filtered)")
87-
88-
with HBoxLayout():
89-
vuetify.VBtn("Linear")
90-
vuetify.VSpacer()
91-
vuetify.VBtn("More Detail")
92-
93-
plotly.Figure()
85+
with client.DeepReactive("model_cssstatus"):
86+
with vuetify.VTabs(
87+
v_model="model_cssstatus.active_details_plot", classes="mb-1", style="height: 40px !important;"
88+
):
89+
vuetify.VTab("TOF (All Modules)", value=0)
90+
vuetify.VTab("d-Space (All Modules)", value=1)
91+
vuetify.VTab("q-Space (All Modules)", value=2)
92+
vuetify.VTab("d-Space (ROI Filtered)", value=3)
93+
vuetify.VTab("q-Space (ROI Filtered)", value=4)
94+
95+
with VBoxLayout(v_show="model_cssstatus.active_details_plot == 0", stretch=True):
96+
with HBoxLayout(halign="end"):
97+
vuetify.VBtn(
98+
"More Detail",
99+
href="https://status.sns.ornl.gov/dbwr/view.jsp?display=https%3A//webopi.sns.gov/bl12/files/bl12/opi/../../share/opi/ADnEDv3/ADnED_TOFArray.bob&macros=%7B%26quot%3BDET2%26quot%3B%3A%26quot%3BMain%20d-Space%26quot%3B%2C%26quot%3BDET1%26quot%3B%3A%26quot%3BMain%20Detector%26quot%3B%2C%26quot%3BBL%26quot%3B%3A%26quot%3BBL12%26quot%3B%2C%26quot%3BIOCSTATS%26quot%3B%3A%26quot%3BBL12%3ACS%3AADnED%3A%26quot%3B%2C%26quot%3BP%26quot%3B%3A%26quot%3BBL12%3ADet%3A%26quot%3B%2C%26quot%3BR%26quot%3B%3A%26quot%3BN1%3A%26quot%3B%2C%26quot%3BS%26quot%3B%3A%26quot%3BBL12%26quot%3B%2C%26quot%3BTAB%26quot%3B%3A%26quot%3BMain%20Detector%26quot%3B%2C%26quot%3BTOPR%26quot%3B%3A%26quot%3BN1%3A%26quot%3B%2C%26quot%3BDET5%26quot%3B%3A%26quot%3BMain%20ROI%20q-Space%26quot%3B%2C%26quot%3BDID%26quot%3B%3A%26quot%3BDID154%26quot%3B%2C%26quot%3BDET4%26quot%3B%3A%26quot%3BMain%204x4%20and%20ROI%20d-Space%26quot%3B%2C%26quot%3BDET3%26quot%3B%3A%26quot%3BMain%20q-Space%26quot%3B%2C%26quot%3BAXIS_TITLE%26quot%3B%3A%26quot%3BTime%20Of%20Flight%20(ms)%26quot%3B%2C%26quot%3BDET%26quot%3B%3A%26quot%3B1%26quot%3B%2C%26quot%3BDETNAME%26quot%3B%3A%26quot%3BMain%20TOF%26quot%3B%2C%26quot%3BNAME%26quot%3B%3A%26quot%3BTime%20Of%20Flight%20(All%20Modules)%26quot%3B%7D",
100+
target="_blank",
101+
)
102+
103+
with HBoxLayout(stretch=True):
104+
plotly.Figure()
105+
106+
with HBoxLayout(gap="0.25em"):
107+
vuetify.VLabel("ROI")
108+
PVInput("BL12:Det:N1:Det1:TOF:ROI:1:Min", label="Start")
109+
PVInput("BL12:Det:N1:Det1:TOF:ROI:1:Size", label="Size")
110+
PVInput("BL12:Det:N1:Det1:TOF:ROI:1:MinValue_RBV", label="Min")
111+
PVInput("BL12:Det:N1:Det1:TOF:ROI:1:MaxValue_RBV", label="Max")
112+
PVInput("BL12:Det:N1:Det1:TOF:ROI:1:MeanValue_RBV", label="Mean")
113+
PVInput("BL12:Det:N1:Det1:TOF:ROI:1:Total_RBV", label="Total")
114+
with VBoxLayout(v_show="model_cssstatus.active_details_plot == 1", stretch=True):
115+
with HBoxLayout(halign="end"):
116+
vuetify.VBtn(
117+
"More Detail",
118+
href="https://status.sns.ornl.gov/dbwr/view.jsp?display=https%3A//webopi.sns.gov/bl12/files/bl12/opi/../../share/opi/ADnEDv3/ADnED_TOFArray.bob&macros=%7B%26quot%3BDET2%26quot%3B%3A%26quot%3BMain%20d-Space%26quot%3B%2C%26quot%3BDET1%26quot%3B%3A%26quot%3BMain%20Detector%26quot%3B%2C%26quot%3BBL%26quot%3B%3A%26quot%3BBL12%26quot%3B%2C%26quot%3BIOCSTATS%26quot%3B%3A%26quot%3BBL12%3ACS%3AADnED%3A%26quot%3B%2C%26quot%3BP%26quot%3B%3A%26quot%3BBL12%3ADet%3A%26quot%3B%2C%26quot%3BR%26quot%3B%3A%26quot%3BN1%3A%26quot%3B%2C%26quot%3BS%26quot%3B%3A%26quot%3BBL12%26quot%3B%2C%26quot%3BTAB%26quot%3B%3A%26quot%3BMain%20Detector%26quot%3B%2C%26quot%3BTOPR%26quot%3B%3A%26quot%3BN1%3A%26quot%3B%2C%26quot%3BDET5%26quot%3B%3A%26quot%3BMain%20ROI%20q-Space%26quot%3B%2C%26quot%3BDID%26quot%3B%3A%26quot%3BDID154%26quot%3B%2C%26quot%3BDET4%26quot%3B%3A%26quot%3BMain%204x4%20and%20ROI%20d-Space%26quot%3B%2C%26quot%3BDET3%26quot%3B%3A%26quot%3BMain%20q-Space%26quot%3B%2C%26quot%3BAXIS_TITLE%26quot%3B%3A%26quot%3Bd-Space%20(A)%26quot%3B%2C%26quot%3BDET%26quot%3B%3A%26quot%3B2%26quot%3B%2C%26quot%3BDETNAME%26quot%3B%3A%26quot%3BMain%20d-Space%26quot%3B%2C%26quot%3BNAME%26quot%3B%3A%26quot%3Bd-Space%20(All%20Modules)%26quot%3B%7D",
119+
target="_blank",
120+
)
121+
122+
with HBoxLayout(stretch=True):
123+
plotly.Figure()
124+
125+
with HBoxLayout(gap="0.25em"):
126+
vuetify.VLabel("ROI")
127+
PVInput("BL12:Det:N1:Det2:TOF:ROI:1:Min", label="Start")
128+
PVInput("BL12:Det:N1:Det2:TOF:ROI:1:Size", label="Size")
129+
PVInput("BL12:Det:N1:Det2:TOF:ROI:1:MinValue_RBV", label="Min")
130+
PVInput("BL12:Det:N1:Det2:TOF:ROI:1:MaxValue_RBV", label="Max")
131+
PVInput("BL12:Det:N1:Det2:TOF:ROI:1:MeanValue_RBV", label="Mean")
132+
PVInput("BL12:Det:N1:Det2:TOF:ROI:1:Total_RBV", label="Total")
133+
with VBoxLayout(v_show="model_cssstatus.active_details_plot == 2", stretch=True):
134+
with HBoxLayout(halign="end"):
135+
vuetify.VBtn(
136+
"More Detail",
137+
href="https://status.sns.ornl.gov/dbwr/view.jsp?display=https%3A//webopi.sns.gov/bl12/files/bl12/opi/../../share/opi/ADnEDv3/ADnED_TOFArray.bob&macros=%7B%26quot%3BDET2%26quot%3B%3A%26quot%3BMain%20d-Space%26quot%3B%2C%26quot%3BDET1%26quot%3B%3A%26quot%3BMain%20Detector%26quot%3B%2C%26quot%3BBL%26quot%3B%3A%26quot%3BBL12%26quot%3B%2C%26quot%3BIOCSTATS%26quot%3B%3A%26quot%3BBL12%3ACS%3AADnED%3A%26quot%3B%2C%26quot%3BP%26quot%3B%3A%26quot%3BBL12%3ADet%3A%26quot%3B%2C%26quot%3BR%26quot%3B%3A%26quot%3BN1%3A%26quot%3B%2C%26quot%3BS%26quot%3B%3A%26quot%3BBL12%26quot%3B%2C%26quot%3BTAB%26quot%3B%3A%26quot%3BMain%20Detector%26quot%3B%2C%26quot%3BTOPR%26quot%3B%3A%26quot%3BN1%3A%26quot%3B%2C%26quot%3BDET5%26quot%3B%3A%26quot%3BMain%20ROI%20q-Space%26quot%3B%2C%26quot%3BDID%26quot%3B%3A%26quot%3BDID154%26quot%3B%2C%26quot%3BDET4%26quot%3B%3A%26quot%3BMain%204x4%20and%20ROI%20d-Space%26quot%3B%2C%26quot%3BDET3%26quot%3B%3A%26quot%3BMain%20q-Space%26quot%3B%2C%26quot%3BAXIS_TITLE%26quot%3B%3A%26quot%3Bq-Space%26quot%3B%2C%26quot%3BDET%26quot%3B%3A%26quot%3B3%26quot%3B%2C%26quot%3BDETNAME%26quot%3B%3A%26quot%3BMain%20q-Space%26quot%3B%2C%26quot%3BNAME%26quot%3B%3A%26quot%3Bq-Space%20(All%20Modules)%26quot%3B%7D",
138+
target="_blank",
139+
)
140+
141+
with HBoxLayout(stretch=True):
142+
plotly.Figure()
143+
144+
with HBoxLayout(gap="0.25em"):
145+
vuetify.VLabel("ROI")
146+
PVInput("BL12:Det:N1:Det3:TOF:ROI:1:Min", label="Start")
147+
PVInput("BL12:Det:N1:Det3:TOF:ROI:1:Size", label="Size")
148+
PVInput("BL12:Det:N1:Det3:TOF:ROI:1:MinValue_RBV", label="Min")
149+
PVInput("BL12:Det:N1:Det3:TOF:ROI:1:MaxValue_RBV", label="Max")
150+
PVInput("BL12:Det:N1:Det3:TOF:ROI:1:MeanValue_RBV", label="Mean")
151+
PVInput("BL12:Det:N1:Det3:TOF:ROI:1:Total_RBV", label="Total")
152+
with VBoxLayout(v_show="model_cssstatus.active_details_plot == 3", stretch=True):
153+
with HBoxLayout(halign="end"):
154+
vuetify.VBtn(
155+
"More Detail",
156+
target="_blank",
157+
)
158+
159+
with HBoxLayout(stretch=True):
160+
plotly.Figure()
161+
162+
with HBoxLayout(gap="0.25em"):
163+
vuetify.VLabel("ROI")
164+
PVInput("BL12:Det:N1:Det4:TOF:ROI:1:Min", label="Start")
165+
PVInput("BL12:Det:N1:Det4:TOF:ROI:1:Size", label="Size")
166+
PVInput("BL12:Det:N1:Det4:TOF:ROI:1:MinValue_RBV", label="Min")
167+
PVInput("BL12:Det:N1:Det4:TOF:ROI:1:MaxValue_RBV", label="Max")
168+
PVInput("BL12:Det:N1:Det4:TOF:ROI:1:MeanValue_RBV", label="Mean")
169+
PVInput("BL12:Det:N1:Det4:TOF:ROI:1:Total_RBV", label="Total")
170+
with VBoxLayout(v_show="model_cssstatus.active_details_plot == 4", stretch=True):
171+
with HBoxLayout(halign="end"):
172+
vuetify.VBtn(
173+
"More Detail",
174+
href="https://status.sns.ornl.gov/dbwr/view.jsp?display=https%3A//webopi.sns.gov/bl12/files/bl12/opi/../../share/opi/ADnEDv3/ADnED_TOFArray.bob&macros=%7B%26quot%3BDET2%26quot%3B%3A%26quot%3BMain%20d-Space%26quot%3B%2C%26quot%3BDET1%26quot%3B%3A%26quot%3BMain%20Detector%26quot%3B%2C%26quot%3BBL%26quot%3B%3A%26quot%3BBL12%26quot%3B%2C%26quot%3BIOCSTATS%26quot%3B%3A%26quot%3BBL12%3ACS%3AADnED%3A%26quot%3B%2C%26quot%3BP%26quot%3B%3A%26quot%3BBL12%3ADet%3A%26quot%3B%2C%26quot%3BR%26quot%3B%3A%26quot%3BN1%3A%26quot%3B%2C%26quot%3BS%26quot%3B%3A%26quot%3BBL12%26quot%3B%2C%26quot%3BTAB%26quot%3B%3A%26quot%3BMain%20Detector%26quot%3B%2C%26quot%3BTOPR%26quot%3B%3A%26quot%3BN1%3A%26quot%3B%2C%26quot%3BDET5%26quot%3B%3A%26quot%3BMain%20ROI%20q-Space%26quot%3B%2C%26quot%3BDID%26quot%3B%3A%26quot%3BDID154%26quot%3B%2C%26quot%3BDET4%26quot%3B%3A%26quot%3BMain%204x4%20and%20ROI%20d-Space%26quot%3B%2C%26quot%3BDET3%26quot%3B%3A%26quot%3BMain%20q-Space%26quot%3B%2C%26quot%3BAXIS_TITLE%26quot%3B%3A%26quot%3Bd-Space%20(A)%26quot%3B%2C%26quot%3BDET%26quot%3B%3A%26quot%3B4%26quot%3B%2C%26quot%3BDETNAME%26quot%3B%3A%26quot%3BROI%20d-Space%26quot%3B%2C%26quot%3BNAME%26quot%3B%3A%26quot%3BROI%20d-Space%20(filtered%20based%20on%202D%20ROI)%26quot%3B%7D",
175+
target="_blank",
176+
)
177+
178+
with HBoxLayout(stretch=True):
179+
plotly.Figure()
180+
181+
with HBoxLayout(gap="0.25em"):
182+
vuetify.VLabel("ROI")
183+
PVInput("BL12:Det:N1:Det5:TOF:ROI:1:Min", label="Start")
184+
PVInput("BL12:Det:N1:Det5:TOF:ROI:1:Size", label="Size")
185+
PVInput("BL12:Det:N1:Det5:TOF:ROI:1:MinValue_RBV", label="Min")
186+
PVInput("BL12:Det:N1:Det5:TOF:ROI:1:MaxValue_RBV", label="Max")
187+
PVInput("BL12:Det:N1:Det5:TOF:ROI:1:MeanValue_RBV", label="Mean")
188+
PVInput("BL12:Det:N1:Det5:TOF:ROI:1:Total_RBV", label="Total")
94189

95190
with VBoxLayout(stretch=True):
96191
with VBoxLayout(classes="border-md pa-1", stretch=True):
97192
plotly.Figure()
98-
vuetify.VBtn("Cursor Detail")
193+
vuetify.VBtn(
194+
"Cursor Detail",
195+
href="https://status.sns.ornl.gov/dbwr/view.jsp?display=https%3A//webopi.sns.gov/bl12/files/bl12/opi/../../share/opi/ADnEDv3/ADnED_TOFArray.bob&macros=%7B%26quot%3BDET2%26quot%3B%3A%26quot%3BMain%20d-Space%26quot%3B%2C%26quot%3BDET1%26quot%3B%3A%26quot%3BMain%20Detector%26quot%3B%2C%26quot%3BBL%26quot%3B%3A%26quot%3BBL12%26quot%3B%2C%26quot%3BIOCSTATS%26quot%3B%3A%26quot%3BBL12%3ACS%3AADnED%3A%26quot%3B%2C%26quot%3BP%26quot%3B%3A%26quot%3BBL12%3ADet%3A%26quot%3B%2C%26quot%3BR%26quot%3B%3A%26quot%3BN1%3A%26quot%3B%2C%26quot%3BS%26quot%3B%3A%26quot%3BBL12%26quot%3B%2C%26quot%3BTAB%26quot%3B%3A%26quot%3BMain%20Detector%26quot%3B%2C%26quot%3BTOPR%26quot%3B%3A%26quot%3BN1%3A%26quot%3B%2C%26quot%3BDET5%26quot%3B%3A%26quot%3BMain%20ROI%20q-Space%26quot%3B%2C%26quot%3BDID%26quot%3B%3A%26quot%3BDID154%26quot%3B%2C%26quot%3BDET4%26quot%3B%3A%26quot%3BMain%204x4%20and%20ROI%20d-Space%26quot%3B%2C%26quot%3BDET3%26quot%3B%3A%26quot%3BMain%20q-Space%26quot%3B%2C%26quot%3BAXIS_TITLE%26quot%3B%3A%26quot%3Bq-Space%26quot%3B%2C%26quot%3BDET%26quot%3B%3A%26quot%3B5%26quot%3B%2C%26quot%3BDETNAME%26quot%3B%3A%26quot%3BROI%20q-Space%26quot%3B%2C%26quot%3BNAME%26quot%3B%3A%26quot%3BROI%20q-Space%20(filtered%20based%20on%202D%20ROI)%26quot%3B%7D",
196+
raw_attrs=['target="_blank"'],
197+
)
99198

100199
with GridLayout(classes="border-md pa-1", columns=2):
101-
InputField()
102-
InputField()
103-
InputField()
104-
InputField()
105-
InputField()
106-
InputField()
107-
vuetify.VLabel("Running")
200+
PVInput("BL12:Det:N1:DetectorState_RBV", label="Data Collection State")
201+
InputField(
202+
model_value=("model_cssstatus.pv_data['BL12:Det:N1:Pause'] ? 'Paused' : 'Not Paused'",),
203+
label="Pause",
204+
)
205+
PVInput("BL12:Det:Neutrons", label="Total Counts")
206+
PVInput("BL12:Det:N1:Det1:EventRate_RBV", append="e/s", label="Counts/sec")
207+
PVInput("BL12:Det:PCharge:C", append="C", label="Proton Charge")
208+
PVInput("BL12:Det:rtdl:BeamPowerAvg", append="MW", label="Beam Power")

0 commit comments

Comments
 (0)