Skip to content

Commit

Permalink
mostly refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
CharlesC30 committed Mar 2, 2023
1 parent a9a4c3a commit 07caca3
Show file tree
Hide file tree
Showing 3 changed files with 129 additions and 85 deletions.
62 changes: 62 additions & 0 deletions app_components.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import dash
from dash import html, dcc
import dash_bootstrap_components as dbc

from xas.tiled_io import sort_node_by_metadata_key

def build_scangroup_interactable(scangroup_node):
scan_labels = [html.Div([
html.Div(f"{v.metadata['scan_id']}",
style={"display": "inline-block", "padding": "5px"}),
html.Button("+",
id={"type": "plus_btn",
"uid": k},
style={"background-color": "white"}),
html.Br(),
])
for k, v in scangroup_node.items_indexer
]
return scan_labels


def build_sample_accordion(sample_node):
scangroup_nodes = sort_node_by_metadata_key(sample_node, "monochromator_scan_uid")
sample_accordion_items = [
dbc.AccordionItem(
build_scangroup_interactable(sg_node),
title=f"scan group {i+1}"
)
for i, sg_node in enumerate(scangroup_nodes)
]
return dbc.Accordion(sample_accordion_items, start_collapsed=True, always_open=True)


def build_scan_accordion(scan_node):
sample_nodes, sample_labels = sort_node_by_metadata_key(scan_node, "sample_name", return_values=True)
scan_accordion_items = [
dbc.AccordionItem(
build_scangroup_interactable(smp_node),
title=smp_label
)
for smp_node, smp_label in zip(sample_nodes, sample_labels)
]
return dbc.Accordion(scan_accordion_items, start_collapsed=True, always_open=True)


def build_proposal_accordion(proposal_node, sort_key):
sub_nodes, sub_labels = sort_node_by_metadata_key(proposal_node, sort_key, return_values=True)
if sort_key == "sample_name":
build_sub_accordion = build_sample_accordion
elif sort_key == "monochromator_scan_uid":
build_sub_accordion = build_scan_accordion
else:
raise ValueError("Unsupported sorting key")
proposal_accordion_items = [
dbc.AccordionItem(
build_sub_accordion(sub_node),
title=sub_name
)
for sub_node, sub_name in zip(sub_nodes, sub_labels)
]
return dbc.Accordion(proposal_accordion_items, start_collapsed=True, always_open=True)

141 changes: 58 additions & 83 deletions dash_app.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,72 +7,21 @@
import plotly.graph_objects as go

from tiled.queries import Key
from xas.tiled_io import ISS_SANDBOX, filter_node_for_proposal, sort_node_by_metadata_key, get_df_for_uid
from xas.tiled_io import get_iss_sandbox, filter_node_for_proposal
from xas.analysis import check_scan

from app_components import build_proposal_accordion

app = dash.Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP])
app.title = "new ISS app"


def build_scangroup_interactable(scangroup_node):
scan_labels_and_checklists = [html.Div([
html.Div(f"{v.metadata['scan_id']}", id={"type": "scan_id_disp", "uid": k}),
dcc.Checklist([
{"label": html.Div("mut"), "value": "mut"},
{"label": html.Div("muf"), "value": "muf"},
{"label": html.Div("mur"), "value": "mur"},
],
id={"type": "scan_checklist", "uid": k},
),
html.Br()
])
for k, v in scangroup_node.items_indexer]
return scan_labels_and_checklists


def build_sample_accordion(sample_node):
scangroup_nodes = sort_node_by_metadata_key(sample_node, "monochromator_scan_uid")
sample_accordion_items = [
dbc.AccordionItem(
build_scangroup_interactable(sg_node),
title=f"scan group {i+1}"
)
for i, sg_node in enumerate(scangroup_nodes)
]
return dbc.Accordion(sample_accordion_items, start_collapsed=True)


def build_scan_accordion(scan_node):
sample_nodes, sample_labels = sort_node_by_metadata_key(scan_node, "sample_name", return_values=True)
scan_accordion_items = [
dbc.AccordionItem(
build_scangroup_interactable(smp_node),
title=smp_label
)
for smp_node, smp_label in zip(sample_nodes, sample_labels)
]
return dbc.Accordion(scan_accordion_items, start_collapsed=True)


def build_proposal_accordion(proposal_node, sort_key):
sub_nodes, sub_labels = sort_node_by_metadata_key(proposal_node, sort_key, return_values=True)
if sort_key == "sample_name":
build_sub_accordion = build_sample_accordion
elif sort_key == "monochromator_scan_uid":
build_sub_accordion = build_scan_accordion
else:
raise ValueError("Unsupported sorting key")
proposal_accordion_items = [
dbc.AccordionItem(
build_sub_accordion(sub_node),
title=sub_name
)
for sub_node, sub_name in zip(sub_nodes, sub_labels)
]
return dbc.Accordion(proposal_accordion_items)


app.layout = dbc.Container([
dcc.Store(id="bnl_username"),
dbc.Modal(
dbc.ModalHeader(""),
dbc.ModalBody(dbc.Input(id="username_input")),
),
html.H1("XDash",
style={
"textAlign": "center",
Expand All @@ -88,21 +37,23 @@ def build_proposal_accordion(proposal_node, sort_key):
dbc.Col(dbc.Button("search", id="search_btn", n_clicks=0))
], style={"padding-bottom": "10px"}),
dbc.Row([
dbc.Col(dcc.Dropdown([
{"label": "sample", "value": "sample_name"},
{"label": "scan plan", "value": "monochromator_scan_uid"},
], placeholder="Sort by...", id="sort_dropdown"
)),
dbc.Col(dbc.Button("sort", id="sort_btn")),
dbc.Col(dcc.Dropdown([
{"label": "sample", "value": "sample_name"},
{"label": "scan plan", "value": "monochromator_scan_uid"},
], placeholder="Sort by...", id="sort_dropdown"
)),
dbc.Col(dbc.Button("sort", id="sort_btn")),
], style={"padding-bottom": "10px"}),
dbc.Row(dbc.Col(id="accordion_loc")),
dbc.Row(
dbc.Col(dbc.Spinner(html.Div(id="accordion_loc"), color="primary"))
),
], width=3),
dbc.Col([
dbc.Row(dcc.Graph(id="spectrum_plot")),
dbc.Row(dcc.Graph(figure=go.Figure(layout={"height": 800}), id="spectrum_plot")),
dbc.Row(dbc.Col(
dbc.Button("plot selected spectra", id="plot_btn", class_name="d-grid gap-2 col-3 mx-auto"),
)),
]),
], width=9),
]),
], fluid=True)

Expand All @@ -124,26 +75,50 @@ def show_proposal_accordion(n_search_clicks, n_sort_clicks, dropdown_choice, yea
return build_proposal_accordion(filter_node_for_proposal(ISS_SANDBOX, year, cycle, proposal), sort_key=dropdown_choice)



@app.callback(
Output("spectrum_plot", "figure"),
Input("plot_btn", "n_clicks"),
State({"type": "scan_checklist", "uid": ALL}, "value"),
State({"type": "scan_checklist", "uid": ALL}, "id"),
Input({"type": "plus_btn", "uid": ALL}, "n_clicks"),
State("spectrum_plot", "figure"),
prevent_initial_call=True,
)
def plot_selected_spectra(click, checklist_values, checklist_id_dicts):
fig = go.Figure(layout={"height": 800})
for cv, cd in zip(checklist_values, checklist_id_dicts):
if cv is None:
continue
uid = cd["uid"]
df = ISS_SANDBOX[uid].read()
df["mut"] = -np.log(df["it"] / df["i0"])
df["mur"] = -np.log(df["ir"] / df["it"])
df["muf"] = df["iff"] / df["i0"]
for val in cv:
fig.add_scatter(x=df["energy"], y=df[val])
def add_spectrum_to_plot(click, current_fig):
uid = dash.ctx.triggered_id["uid"]
print(dash.ctx.triggered_id)
fig = go.Figure(current_fig)

df = ISS_SANDBOX[uid].read()
df["mut"] = -np.log(df["it"] / df["i0"])
df["mur"] = -np.log(df["ir"] / df["it"])
df["muf"] = df["iff"] / df["i0"]

for mu in ("mut", "muf", "mur"):
fig.add_scatter(x=df["energy"], y=df[mu])

return fig


# @app.callback(
# Output("spectrum_plot", "figure"),
# Input("plot_btn", "n_clicks"),
# State({"type": "scan_checklist", "uid": ALL}, "value"),
# State({"type": "scan_checklist", "uid": ALL}, "id"),
# )
# def plot_selected_spectra(click, checklist_values, checklist_id_dicts):
# fig = go.Figure(layout={"height": 800})
# for cv, cd in zip(checklist_values, checklist_id_dicts):
# if cv is None:
# continue
# uid = cd["uid"]
# df = ISS_SANDBOX[uid].read()
# df["mut"] = -np.log(df["it"] / df["i0"])
# df["mur"] = -np.log(df["ir"] / df["it"])
# df["muf"] = df["iff"] / df["i0"]
# for val in cv:
# fig.add_scatter(x=df["energy"], y=df[val])
# return fig


if __name__ == "__main__":
ISS_SANDBOX = get_iss_sandbox()
app.run_server(debug=True)
11 changes: 9 additions & 2 deletions xas/tiled_io.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
from tiled.client import from_uri
from tiled.queries import Key
TILED_CATALOG = from_uri("https://localhost:8008", verify=False, username=input("BNL Username: \n"))
ISS_SANDBOX = TILED_CATALOG["iss"]["sandbox"]
# TILED_CATALOG = from_uri("https://localhost:8008", verify=False, username=input("BNL Username: \n"))
# ISS_SANDBOX = TILED_CATALOG["iss"]["sandbox"]


def get_iss_sandbox():
username=input("BNL Username: ")
tiled_catalog = from_uri("https://localhost:8008", verify=False, username=username)
iss_sandbox_node = tiled_catalog["iss"]["sandbox"]
return iss_sandbox_node


def filter_node_for_proposal(node, year, cycle, proposal):
Expand Down

0 comments on commit 07caca3

Please sign in to comment.